历史上的今天
今天是:2024年10月25日(星期五)
2019年10月25日 | 单片机+ADC0832+MQ2温度烟雾报警控制
2019-10-25 来源:51hei
1,实物照片
2,Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
元件清单:
1. AT89C52
2. 40P底座
3. 8P底座
4. 5MM LED*2(红色、绿色)
5. 3MM LED(黄色)
6. 12M晶振
7. 30P瓷片电容*2
8. 10uf电解电容
9. 10K电阻*2
10. 1K电阻*5
11. 16P液晶底座
12. 103电位器*2
13. 9*15万用板
14. ADC0832芯片
15. 1602液晶
16. 按键*5
17. 继电器
18. 蜂鸣器
19. MQ2
20. MQ2底座
21. DS18B20
22. 3P圆孔母座
23. 8550三极管
24. 8050三极管
25. 自锁开关
26. DC电源插口
27. 导线
28. USB电源线
3整机程序
#include #include #include #include "DS18B20.h" #define uint unsigned int #define uchar unsigned char //宏定义 #define BEEP P3_4 //定义蜂鸣器 #define hujiao P1_3 sbit BEEP=P3^4; sbit hujiao=P1^3; sbit RS=P2^5; sbit RW=P2^6; sbit EN=P2^7; sbit led_h=P1^4; sbit led_l=P1^5; sbit JDQ=P2^0; sbit ADCS = P3^7; sbit ADCLK = P3^5; sbit ADDI = P3^6; sbit ADDO = P3^6; bit shanshuo_st; //闪烁间隔标志 bit beep_st; //蜂鸣器间隔标志 bit flag=0;//紧急呼叫标志 sbit DIAN = P2^5; //小数点 uint abc; uchar x=4; //计数器 signed char m; //温度值全局变量 uchar n; //温度值全局变量 uchar data disdata[5]; uchar code LEDData[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0}; uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; // 摄氏温度符号 /*****初始化定时器0*****/ void InitTimer(void) { TMOD=0x1; TH0=0x4c; TL0=0x00; //50ms(晶振11.0592M) } /*****定时器0中断服务程序*****/ void timer0(void) interrupt 1 { TH0=0x4c; TL0=0x00; x++; } /*****读取温度*****/ void check_wendu(void) { uint a,b,c; c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 a=c/100; //计算得到十位数字 b=c/10-a*10; //计算得到个位数字 m=c/10; //计算得到整数位 n=c-a*100-b*10; //计算得到小数位 if(m<0){m=0;n=0;} //设置温度显示上限 if(m>99){m=99;n=9;} //设置温度显示上限 } /*************************lcd1602程序**************************/ void delay1ms(uint ms)//延时1毫秒(不够精确的) { uint i,j; for(i=0;i } unsigned char rolmove(unsigned char m) { unsigned char a,b,c,d,e,f,g,h; a=(m&0x01)<<7; b=(m&0x02)<<5; c=(m&0x04)<<3; d=(m&0x08)<<1; e=(m&0x10)>>1; f=(m&0x20)>>3; g=(m&0x40)>>5; h=(m&0x80)>>7; m=a|b|c|d|e|f|g|h; return m; } void wr_com(uchar com)//写指令// { delay1ms(1); RS=0; RW=0; EN=0; P0=rolmove(com); delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_dat(uchar dat)//写数据// { delay1ms(1);; RS=1; RW=0; EN=0; P0=rolmove(dat); delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_new() //写新字符 { uchar i; wr_com(0x40); for(i=0;i<8;i++) { wr_dat(table[i]); } } void lcd_init()//初始化设置// { delay1ms(15); wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); wr_new(); wr_com(0x80); wr_dat('S');//A wr_com(0x81); wr_dat('m');//: wr_com(0x82); wr_dat('o'); wr_com(0x83); wr_dat('k'); wr_com(0x84); wr_dat('e'); wr_com(0x85); wr_dat(':'); wr_com(0x87); wr_dat('T'); wr_com(0x88); wr_dat('e'); wr_com(0x89); wr_dat('m'); wr_com(0x8a); wr_dat(':'); wr_com(0x8d); wr_dat('.'); wr_com(0x8f); wr_dat('C'); wr_com(0xc0); wr_dat('A'); wr_com(0xc1); wr_dat('l'); wr_com(0xc2); wr_dat('a'); wr_com(0xc3); wr_dat('r'); wr_com(0xc4); wr_dat('m'); wr_com(0xc5); wr_dat(':'); wr_com(0xcb); wr_dat('-'); wr_com(0xce); wr_dat('C'); } /*****************显示函数******************************/ void disp()//温度值显示 { disdata[0]=m/10+0x30;//十位数 disdata[1]=m%10+0x30;//个位数 disdata[2]=n+0x30;//小数位 disdata[3]=abc+0x30;//烟雾浓度 wr_com(0x8b); wr_dat(disdata[0]);//显示十位 wr_com(0x8c); wr_dat(disdata[1]);//显示个位 wr_com(0x8e); wr_dat(disdata[2]);//显示小数位 wr_com(0x86); wr_dat(disdata[3]); } void baojing() { wr_com(0xc9); wr_dat(tab[0]+0x30); wr_com(0xca); wr_dat(tab[1]+0x30); wr_com(0xcc); wr_dat(tab[2]+0x30); wr_com(0xcd); wr_dat(tab[3]+0x30); wr_com(0xc6); wr_dat(tab[4]+0x30); } /*****报警子程序*****/ void Alarm() { if((m>=shangxian&&beep_st==1)||(m else BEEP=0; if(m>=shangxian||m else {led_h=1;led_l=0;JDQ=1;} if(x>=10){beep_st=~beep_st;x=0;} } void Alarm1() { led_h=0; led_l=1; if(x>=10){beep_st=~beep_st;x=0;} if(beep_st==1)BEEP=1; else BEEP=0; led_h=0; led_l=1; JDQ=0; } uchar ADC0832(bit mode,bit channel) //AD转换,返回结果 { uchar i,dat,ndat; ADCS = 0;//拉低CS端 _nop_(); _nop_(); ADDI = 1; //第1个下降沿为高电平 ADCLK = 1;//拉高CLK端 _nop_(); _nop_(); ADCLK = 0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADDI = mode; //低电平为差分模式,高电平为单通道模式。 ADCLK = 1;//拉高CLK端 _nop_(); _nop_(); ADCLK = 0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADDI = channel; //低电平为CH0,高电平为CH1 ADCLK = 1;//拉高CLK端 _nop_(); _nop_(); ADCLK = 0;//拉低CLK端,形成下降沿3 ADDI = 1;//控制命令结束(经试验必需) dat = 0; //下面开始读取转换后的数据,从最高位开始依次输出(D7~D0) for(i = 0;i < 8;i++) { dat <<= 1; ADCLK=1;//拉高时钟端 _nop_(); _nop_(); ADCLK=0;//拉低时钟端形成一次时钟脉冲 _nop_(); _nop_(); dat |= ADDO; } ndat = 0; //记录D0 if(ADDO == 1) ndat |= 0x80; //下面开始继续读取反序的数据(从D1到D7) for(i = 0;i < 7;i++) { ndat >>= 1; ADCLK = 1;//拉高时钟端 _nop_(); _nop_(); ADCLK=0;//拉低时钟端形成一次时钟脉冲 _nop_(); _nop_(); if(ADDO==1) ndat |= 0x80; } ADCS=1;//拉高CS端,结束转换 ADCLK=0;//拉低CLK端 ADDI=1;//拉高数据端,回到初始状态 if(dat==ndat) return(dat); else return 0; } /*****主函数*****/ void main(void) { InitTimer(); //初始化定时器 EA=1; //全局中断开关 TR0=1; ET0=1; //开启定时器0 BEEP=0; led_h=1; led_l=1; JDQ=1; check_wendu(); check_wendu(); lcd_init();//初始化显示 delay1ms(100); lcd_init();//初始化显示 delay1ms(100); while(1) { if(hujiao==0) { Delay(2000); do{}while(hujiao==0); flag=~flag; } checkkey(); abc = ADC0832(1,0); //差分模式,CH0-CH1 abc = abc*19.607843; //转换为实际电压便于显示 abc=abc/1000%10; check_wendu(); disp(); baojing(); if(flag==1){Alarm1();JDQ=0;} else Alarm(); //报警检测 if(set_st==0) wr_com(0x0c); if(set_st==1) { wr_com(0xc6); wr_com(0x0d); delay1ms(150); } if(set_st==2) { wr_com(0xca); wr_com(0x0d); delay1ms(150); } if(set_st==3) { wr_com(0xcd); wr_com(0x0d); delay1ms(150); } } }/*****END*****/
史海拾趣
|
前段时间比较忙,没来得及分析LM3S8962串口问题。今天花了一上午时间搞定了,原来是232片子坏了,换了个新的,串口能调通了。顺便发点LM3S8962串口的资料,大家共同学习进步。 [ 本帖最后由 beyondvv 于 2010-9-25 22:27 编辑 ]… 查看全部问答> |
|
图中是一个产生500V左右高压的稳幅振荡电路,其中振荡电路点部分有一个磁罐,其中绕线如下图所示,磁罐输出端是100匝绕线,500V高压,和三极管 连接的是1匝和4匝绕线,电感分别是0.2uH和1.1uH左右,分别接在三极管的发射级和集电极,发射极的2个电 ...… 查看全部问答> |
|
就是防止程序被读出来,看手册上有一种是通过设置flash寄存器加密。但是有看见别人提到利用96位的stm32芯片ID号加 ...… 查看全部问答> |
|
使用msp430f5418+HT1621B驱动段式液晶 先调试了两块样机 一切正常 但是后来把样机发给客户之后 客户再回发给我后 我想再做一些相关测试 供电一段时间后发现显示忽然不正常了 灰度很暗很暗 随后又焊接两块板子进行调试 都是一样的症状 最后进行相关 ...… 查看全部问答> |




