可燃气体报警器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
可燃气体报警器元器件清单
单片机源程序:
- #include<reg51.h> //包含单片机寄存器的头文件
- #include<intrins.h> //包含_nop_()函数定义的头文件
- unsigned char flag=0; //紧急报警标示位
- unsigned char flag1=0; //传感器检测报警标示位
- unsigned int after_AD_val=0; //储存浓度数值范围是100-10000
- unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f共阴极
- unsigned int TIME_1;
- sbit CS=P1^0; //将CS位定义为P3.4引脚0xc0,
- sbit CLK=P1^1; //将CLK位定义为P1.0引脚
- sbit DIO=P1^2; //将DIO位定义为P1.1引脚
- sbit K1=P2^4;
- sbit LED1=P2^0; //警情指示灯
- sbit LED2=P2^1; //正常指示灯
- sbit BEEP=P2^2;
- sbit wei1=P3^0;
- sbit wei2=P3^1;
- sbit wei3=P3^2;
- sbit wei4=P3^3;
- unsigned int wan,qian,bai,shi,ge;
- void delay1ms()
- {
- unsigned char i,j;
- for(i=0;i<10;i++)
- for(j=0;j<33;j++)
- ;
- }
- void delay2ms()
- {
- unsigned char i,j;
- for(i=0;i<120;i++)
- for(j=0;j<33;j++)
- ;
- }
- void delaynms(unsigned char n)
- {
- unsigned char i;
- for(i=0;i<n;i++)
- delay1ms();
- }
- void key()
- {
- if(K1==0)
- {
- delaynms(5);
- if(K1==0)
- {
- while(!K1);
- flag++;
- if(flag==2)
- flag=0;
- }
- }
- }
- /*****************************************************
- 函数功能:报警子程序
- *****************************************************/
- void baojing()
- {
- if(flag==1||flag1==1)
- {
- LED2=1;
- LED1=0;
- BEEP=0;
- delaynms(10);
- BEEP=1;
- delaynms(10);
- }
- if(flag==0&&flag1==0)
- {
- LED2=0;
- LED1=1;
- BEEP=1;
- }
- }
- void display()
- {
- //unsigned sel;
- wan=after_AD_val/10000;
- qian=(after_AD_val/1000)%10;
- bai=(after_AD_val/100)%10;
- shi=(after_AD_val/10)%10;
- ge=after_AD_val%10;
- //sel=0x01;
- //P0=table[wan];
- // P3=sel;
- // delaynms(3);
- //P3=0x00;
- //sel=sel<<1;
- P0=table[qian];
- wei1=1;
- delaynms(1);
- wei1=0;
- //sel=sel<<1;
- P0=table[bai];
- wei2=1;
- delaynms(3);
- wei2=0;
- //sel=sel<<1;
- P0=table[shi];
- wei3=1;
- delaynms(3);
- wei3=0;
- //sel=sel<<1;
- P0=table[ge];
- wei4=1;
- delaynms(3);
- wei4=0;
- //sel=sel<<1;
-
- }
- /*****************************************************
- 函数功能:将模拟信号转换成数字信号
- ***************************************************/
- unsigned int A_D()
- {
- unsigned char i,dat;
- CS=1; //一个转换周期开始
- CLK=0; //为第一个脉冲作准备
- CS=0; //CS置0,片选有效
- DIO=1; //DIO置1,规定的起始信号
- CLK=1; //第一个脉冲
- CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
- DIO=1; //DIO置1, 通道选择信号
- CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
- CLK=0; //第二个脉冲下降沿
- DIO=0; //DI置0,选择通道0
- CLK=1; //第三个脉冲
- CLK=0; //第三个脉冲下降沿
- DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
- CLK=1; //第四个脉冲
- for(i=0;i<8;i++) //高位在前
- {
- CLK=1; //第四个脉冲
- CLK=0;
- dat<<=1; //将下面储存的低位数据向右移
- dat|=(unsigned char)DIO; //将输出数据DIO通过或运算储存在dat最低位
- }
- CS=1; //片选无效
- return dat; //将读书的数据返回
- }
- /*****************************************************
- 函数功能:警情检测子程序
- *****************************************************/
- unsigned int jq()
- {
- unsigned int AD_val; //储存A/D转换后的值
- AD_val=A_D(); //进行A/D转换
- if(AD_val>=30)
- flag1=1;
- else
- flag1=0;
-
- after_AD_val=(9900/256)*AD_val+100;
-
- return AD_val;
- }
- /*****************************************************
- 函数功能:主函数
- ***************************************************/
- void timer1() interrupt 3
- {
-
- TH1=(65536-65535)/256;
- TL1=(65536-65535)%256;
- TIME_1++;
-
- if(TIME_1 > 8)
- {TIME_1=0;
- jq();
- }
- }
-
- main(void)
- {
- LED2=1;
- LED1=1;
- BEEP=1;
- EA=1;
- TMOD=0X10;
- TH1=(65536-60000)/256;
- TL1=(65536-60000)%256;
- ET1=1;
- TR1=1;
-
- while(1)
- {
- //jq();
- display();
- key();
- baojing();
-
-
- }
-
- }
复制代码
全部资料51hei下载地址:
可燃气体报警器.zip
(185.43 KB, 下载次数: 282)
|