|
本人上周才完成了单片机的可燃气体报警传感器。
用了一周时间才算完成。附件中包含了源码程序以及PCB电路设计。
皆为原创作品 请大家多多指导。- /*头文件*/
- #include<reg52.h>
- #include <intrins.h>
- /*AD寄存器定义*/
- sfr ADC_CONTR=0xBC;
- sfr ADC_DATA=0xBD;
- sfr ADC_LOW2=0xBE;
- sfr P1_ADC_EN=0x9D;
- sfr P4=0xC0;
- /*****************宏定义******************/
- #define uint unsigned int
- #define uchar unsigned char
- #define ADC_POWER 0x80
- #define ADC_FLAG 0x10
- #define ADC_START 0x08
- #define ADC_SPEEDHH 0x00
- #define ADC_SPEEDH 0x20
- #define ADC_SPEEDL 0x40
- #define ADC_SPEEDLL 0x60
- #define uint unsigned int
- #define uchar unsigned char
- uint ad_value,NH4_value;
- float AN_value;
- /***********位操作端口定义**************/
- sbit set_key=P1^4; //“设置”键 K1
- sbit add_key=P1^5; //“加”键 K2
- sbit cut_key=P1^7; // “减”键 K3
- sbit speak=P3^7; // 蜂鸣器
- sbit JK=P3^6; // 继电器
- sbit qian_wei=P1^0;
- sbit bai_wei=P1^1;
- sbit shi_wei=P1^2;
- sbit ge_wei=P1^3;
- uchar y_data[4]; //储存烟雾的数据
- int set_data=50; //报警初始值的设定
- uchar temp[4]={0,0,0,0};
- uchar bianma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar flog4;
- void delay_1ms(uchar i)
- {
- uint x,y;
- for(x=i;x>0;x--)
- for(y=124;y>0;y--);
- }
- void display()
- {
- qian_wei=0;
- bai_wei=1;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[y_data[0]];
- delay_1ms(5);
- qian_wei=1;
- bai_wei=0;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[y_data[1]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1;
- shi_wei=0;
- ge_wei=1;
- P2=bianma[y_data[2]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1;
- shi_wei=1;
- ge_wei=0;
- P2=bianma[y_data[3]];
- delay_1ms(5);
- P2=0xff;
- }
- void display2()
- {
- temp[0]=set_data/1000;
- temp[1]=(set_data%1000)/100;
- temp[2]=(set_data%100)/10;
- temp[3]=set_data%10;
- qian_wei=0;
- bai_wei=1;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[temp[0]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=0;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[temp[1]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1 ;
- shi_wei=0;
- ge_wei=1;
- P2=bianma[temp[2]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1;
- shi_wei=1;
- ge_wei=0;
- P2=bianma[temp[3]];
- delay_1ms(5);
- P2=0xff;
- }
- /********** 模数转换初始换函数******************/
- void init_ADC()
- {
- P1_ADC_EN=0x40;
- ADC_DATA=0;
- ADC_LOW2=0;
- ADC_CONTR=ADC_SPEEDLL|ADC_POWER;
- delay_1ms(20);
- }
- /********** 模数转换函数******************/
- uint ADC(uchar num) //参数num用于指定是哪个模拟量转换
- {
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL|num|ADC_START;
- _nop_();_nop_();_nop_();_nop_();
- while(!(ADC_CONTR&ADC_FLAG));
- ADC_CONTR&=~ADC_FLAG;
- ad_value=ADC_DATA*4+ADC_LOW2; //转换的结果是十位的 高八位放在ADC_DATA中 低两位放在ADC_LOW2
- return ad_value; // 将转换后的数字量返回
- }
- /********** 模数转换后数据处理函数******************/
- void pos_AD()
- {
- AN_value=ADC(6); // 装换氨气的浓度 把转换后的数字量结果赋给AN_value
- delay_1ms(5);
- // /***对转换后的数字量进行矫正***/
- if(AN_value>900)
- {
- AN_value=900;
- }
- NH4_value=(900-AN_value)*0.9765625;
- y_data[0]=NH4_value/1000; //将气体浓度值的个位 十位 百位 千位 分开 用于显示
- y_data[1]=(NH4_value%1000)/100;
- y_data[2]=(NH4_value%100)/10;
- y_data[3]=NH4_value%10;
- }
- /********** 报警处理函数******************/
- void baojing()
- {
- if(set_data<NH4_value) //判断是否有报警 如果有就进入函数
- {
- speak=0;
- JK=0;
- }
- else //没有报警情况的出现
- {
- speak=1;
- JK=1;
- }
- }
- /**********主函数******************/
- void main()
- {
- init_ADC(); //模数转换初始化
- speak=1;
- JK=1;
- while(1)
- {
- if(set_key==0)
- {
- delay_1ms(5);
- if(set_key==0)
- {
- flog4=!flog4;
- while(set_key==0);
- }
- }
- if(flog4==1)
- {
- if(add_key==0)
- {
- delay_1ms(5);
- if(add_key==0)
- {
- set_data=set_data+1;
- while(add_key==0);
- if(set_data>5000)
- {
- set_data=5000;
- }
- }
- }
- if(cut_key==0)
- {
- delay_1ms(5);
- if(cut_key==0)
- {
- set_data=set_data-1;
- while(cut_key==0);
- if(set_data<=0)
- {
- set_data=0;
- }
- }
- }
- display2();
- }
- else
- {
- pos_AD();
- display();
- baojing();
- }
- }
- }
复制代码
|
-
-
原理图.pdf
153.37 KB, 下载次数: 40, 下载积分: 黑币 -5
原理图
-
-
烟雾报警器.rar
1.56 KB, 下载次数: 34, 下载积分: 黑币 -5
源码
|