基于51单片机的报警器(模拟量,上下限,数码管,次数,ADC0832)原理图 PCB 仿真 源代码及proteus 软件

课程设计 请添加图片描述

环境监测,单一物理量的上下限报警器
1、通过AD芯片测量待测物理量(有害气体等)
2、设置上下限报警值,测量值超过阀值报警
3、记录报警次数

请添加图片描述
请添加图片描述
请添加图片描述

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit CLK=	P1^0;//时钟,初始状态为0
sbit DI=	P1^1;//数据输入
sbit DO=	P1^2; // 数据输出
sbit CS=	P1^3;
sbit smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;
sbit smg7=P2^6;
sbit smg8=P2^7;
sbit smg9=P1^5;
sbit smg10=P1^6;
sbit smg11=P1^7;
sbit k1=P3^2;//按钮
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;
sbit k5=P3^0;
sbit k6=P3^1;
sbit beep=P3^7;//蜂鸣器
sbit out=P3^6;
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar time=0;//定时
uchar cishu=0;//报警次数
uint set1=100,set2=300;//阀值
uint gas=0;//浓度
uchar flag=0;
/*********************************************
读取ADC
**********************************************/
uchar ADC(uchar ch)//通道ch	 1,2
{
	uchar temp0,temp1,i;
	CS=0;
	temp0=0;
	temp1=0;
	_nop_();
	_nop_();
	DI=1;//开始位
	_nop_();
	_nop_();
	CLK=1;
	_nop_();
	_nop_();
	CLK=0;
	_nop_();
	_nop_();
	DI=0;
	_nop_();
	_nop_();
//选择通道0
	DI=1;
	_nop_();
	CLK=1;//上升沿DI=1
	_nop_();
	CLK=0;//1个下降沿DI=1
	_nop_();
	if(ch==1)
	DI=0;
	if(ch==2)
	DI=1;
	_nop_();
	CLK=1;
	_nop_();
	CLK=0;//第3个上升沿DI=0
	_nop_();
   	DI=1;
//********通道选择结束开始读取转换后的二进制数****
//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++)
   {
	temp0=temp0<<1;
	CLK=1;
    if(DO)
   	temp0++;
   	_nop_();
   	CLK=0;
   }
for(i=0;i<8;i++)
   {
	temp1=temp1>>1;
	CLK=1;
    if(DO)
   	temp1=temp1 +0x80;
   	_nop_();
   	CLK=0;
   }
	 CS=1;
   return temp0;
}

//延时
void delay(uint i)
{
	while(i--);
}
//主函数
void main()
{
	uchar k=0;
	TMOD|=0X01;
	TH0=0X3C;
	TL0=0XB0;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器
	while(1)
	{
		//按键
		if(!k1 &&(k!=1))
		{
			k=1;
			if(set1<set2)
				set1++;
		} 
		if(!k2 &&(k!=2))
		{
			k=2;
			if(set1>0)
				set1--;
		} 
		if(!k5 &&(k!=5))
		{
			k=5;
			if(set2<999)
				set2++;
		} 
		if(!k6 &&(k!=6))
		{
			k=6;
			if(set2>set1)
				set2--;
		}
		if(!k3 &&(k!=3))
		{
			k=3;
			beep=1;
		} 
		if(!k4 &&(k!=4))
		{
			k=4;
			beep=1;
			cishu=0;
		} 
		if(k1 && k2 && k3 && k4 && k5 && k6)
			k=0;
		//显示
		P0=smgduan[gas/100];smg1=0;delay(100);smg1=1;
		P0=smgduan[gas%100/10];smg2=0;delay(100);smg2=1;
		P0=smgduan[gas%10];smg3=0;delay(100);smg3=1;

		P0=smgduan[set2/100];smg4=0;delay(100);smg4=1;
		P0=smgduan[set2%100/10];smg5=0;delay(100);smg5=1;
		P0=smgduan[set2%10];smg6=0;delay(100);smg6=1;

		P0=smgduan[set1/100];smg9=0;delay(100);smg9=1;
		P0=smgduan[set1%100/10];smg10=0;delay(100);smg10=1;
		P0=smgduan[set1%10];smg11=0;delay(100);smg11=1;

		P0=smgduan[cishu/10];smg7=0;delay(100);smg7=1;
		P0=smgduan[cishu%10];smg8=0;delay(100);smg8=1;
		
	}
}
//定时器中断
void Timer0() interrupt 1
{
	uint i;
	if(time<10)//0.5s
		time++;
	else
	{
		time=0;
		i=ADC(1);//测量
		gas=500*i/127;
		//报警
		if(((gas>set2)||(gas<set1))&&(flag==0))
		{
			flag=1;
			beep=0;
			cishu++;
		}
		if((gas>set1-1)&&(gas<set2+1))
		{
			flag=0;
			beep=1;
		}
		//电闸控制
		if(cishu>10)
		{
			beep=1;
			out=0;
		}
		else
		{
			out=1;
		}
	}
	TH0=0X3C;
	TL0=0XB0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值