找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1618|回复: 1
收起左侧

单片机烟雾报警器程序设计

[复制链接]
ID:1026441 发表于 2022-5-14 13:12 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <key.h>
  4. #include "DS18B20.h"   
  5. #define uint unsigned int
  6. #define uchar unsigned char   //宏定义
  7. //#define BEEP P3_4    //定义蜂鸣器
  8. //#define hujiao P1_3
  9. sbit BEEP=P1^6;
  10. sbit hujiao=P1^3;
  11. sbit RS=P2^5;
  12. sbit RW=P2^6;
  13. sbit EN=P2^7;
  14. sbit led_h=P1^4;
  15. sbit led_l=P1^5;
  16. sbit JDQ=P1^7;
  17. sbit ADCS = P3^7;
  18. sbit ADCLK = P3^5;
  19. sbit ADDI = P3^6;
  20. sbit ADDO = P3^6;
  21. bit shanshuo_st;    //闪烁间隔标志
  22. bit beep_st;     //蜂鸣器间隔标志
  23. bit flag=0;//紧急呼叫标志
  24. uint abc;
  25. uchar x=4;      //计数器
  26. signed char m;     //温度值全局变量
  27. uchar n;      //温度值全局变量
  28. uchar data disdata[5];

  29. uchar code LEDData[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
  30. uchar code table[]={0x18,0x18,0x00,0x07,0x08,0x08,0x07,0x00};        // 摄氏温度符号

  31. /*****初始化定时器0*****/
  32. void InitTimer(void)
  33. {
  34.         TMOD=0x01;
  35.         TH0=0x3c;
  36.         TL0=0xb0;     //50ms(晶振12M)
  37. }
  38. /*****定时器0中断服务程序*****/
  39. void timer0(void) interrupt 1
  40. {
  41.         TH0=0x3c;
  42.         TL0=0xb0;
  43.         x++;
  44. }
  45. /*****读取温度*****/
  46. void check_wendu(void)
  47. {
  48.         uint a,b,c;
  49.         c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差
  50.         a=c/100;     //计算得到十位数字
  51.         b=c/10-a*10;    //计算得到个位数字
  52.         m=c/10;      //计算得到整数位
  53.         n=c-a*100-b*10;    //计算得到小数位
  54.         if(m<0){m=0;n=0;}   //设置温度显示上限
  55.         if(m>99){m=99;n=9;}   //设置温度显示上限   
  56. }
  57. /*************************lcd1602程序**************************/
  58. void delay1ms(uint ms)//延时1毫秒(不够精确的)
  59. {  uint i,j;
  60.    for(i=0;i<ms;i++)
  61.     for(j=0;j<100;j++);
  62. }

  63. void wr_com(uchar com)//写指令//
  64. {
  65.    RS=0;
  66.    RW=0;
  67.    P0=com;
  68.    delay1ms(1);
  69.    EN=1;
  70.    delay1ms(1);
  71.    EN=0;
  72. }

  73. void wr_dat(uchar dat)//写数据//
  74. {
  75.    RS=1;
  76.    RW=0;
  77.    P0=dat;
  78.    delay1ms(1);
  79.    EN=1;
  80.    delay1ms(1);
  81.    EN=0;
  82. }
  83. //自定义字符集
  84. void Lcd_ram()      
  85. {
  86.         uint i,j,k=0,temp=0x40;
  87.         for(i=0;i<1;i++)
  88.         {
  89.            for(j=0;j<8;j++)
  90.            {
  91.             wr_com(temp+j);
  92.             wr_dat(table[k]);
  93.             k++;
  94.            }
  95.            temp=temp+8;
  96.         }
  97. }
  98. void lcd_init()//初始化设置//
  99. {
  100.         wr_com(0x38);
  101.         wr_com(0x0c);
  102.         wr_com(0x06);
  103.         wr_com(0x01);
  104.         Lcd_ram();
  105.         wr_com(0x80);
  106.     wr_dat('S');//A
  107.     wr_dat('m');//:
  108.     wr_dat('o');
  109.     wr_dat('k');
  110.     wr_dat('e');
  111.     wr_dat(':');

  112.           wr_com(0x89);
  113.     wr_dat('T');
  114.     wr_dat(':');
  115.         wr_com(0x8d);
  116.     wr_dat('.');
  117.         wr_com(0x8f);
  118.     wr_dat(0);
  119.    
  120.         wr_com(0xc0);
  121.     wr_dat('A');
  122.     wr_dat('l');
  123.     wr_dat('a');
  124.     wr_dat('r');
  125.     wr_dat('m');
  126.     wr_dat(':');

  127.         wr_com(0xcc);
  128.     wr_dat('-');
  129.           wr_com(0xcf);
  130.     wr_dat(0);         
  131. }
  132. /*****************显示函数******************************/
  133. void disp()//温度值显示
  134. {
  135.         disdata[0]=m/10+0x30;//十位数
  136.         disdata[1]=m%10+0x30;//个位数
  137.         disdata[2]=n+0x30;//小数位
  138.         disdata[3]=abc/10+0x30;//烟雾浓度
  139.         disdata[4]=abc%10+0x30;//烟雾浓度
  140.        
  141.         wr_com(0x8b);
  142.         wr_dat(disdata[0]);//显示十位
  143.         wr_dat(disdata[1]);//显示个位
  144.         wr_com(0x8e);
  145.         wr_dat(disdata[2]);//显示小数位
  146.         wr_com(0x86);
  147.         wr_dat(disdata[3]);
  148.         wr_dat(disdata[4]);
  149. }
  150. void baojing()
  151. {
  152.         wr_com(0xca);
  153.     wr_dat(tab[0]+0x30);
  154.     wr_dat(tab[1]+0x30);
  155.         wr_com(0xcd);
  156.     wr_dat(tab[2]+0x30);
  157.     wr_dat(tab[3]+0x30);
  158.         wr_com(0xc6);
  159.     wr_dat(tab[4]/10+0x30);
  160.         wr_dat(tab[4]%10+0x30);
  161. }

  162. /*****报警子程序*****/
  163. void Alarm()
  164. {
  165.         if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))        BEEP=0;
  166.         else if(abc>=nongdu&&beep_st==1)        BEEP=0;
  167.         else BEEP=1;
  168.         if(m>=shangxian||m<xiaxian)        {led_h=0;led_l=1;JDQ=0;}
  169.         else if(abc>=nongdu)        {led_h=0;led_l=1;JDQ=0;}
  170.         else        {led_h=1;led_l=0;JDQ=1;}
  171.         if(x>=10)        {beep_st=~beep_st;x=0;}
  172. }
  173. void Alarm1()
  174. {
  175.         led_h=0;
  176.         led_l=1;
  177.         if(x>=10){beep_st=~beep_st;x=0;}
  178.         if(beep_st==1)BEEP=0;
  179.         else BEEP=1;
  180.         led_h=0;
  181.         led_l=1;
  182.         JDQ=0;
  183. }
  184. uchar ADC0832(bit mode,bit channel)     //AD转换,返回结果
  185. {
  186.         uchar i,dat,ndat;
  187.        
  188.         ADCS = 0;//拉低CS端
  189.         _nop_();
  190.         _nop_();
  191.        
  192.         ADDI = 1;        //第1个下降沿为高电平
  193.         ADCLK = 1;//拉高CLK端
  194.         _nop_();
  195.         _nop_();
  196.         ADCLK = 0;//拉低CLK端,形成下降沿1
  197.         _nop_();
  198.         _nop_();
  199.        
  200.         ADDI = mode;        //低电平为差分模式,高电平为单通道模式。       
  201.         ADCLK = 1;//拉高CLK端
  202.         _nop_();
  203.         _nop_();
  204.         ADCLK = 0;//拉低CLK端,形成下降沿2
  205.         _nop_();
  206.         _nop_();
  207.        
  208.         ADDI = channel;        //低电平为CH0,高电平为CH1       
  209.         ADCLK = 1;//拉高CLK端
  210.         _nop_();
  211.         _nop_();
  212.         ADCLK = 0;//拉低CLK端,形成下降沿3
  213.        
  214.         ADDI = 1;//控制命令结束(经试验必需)
  215.         dat = 0;
  216.         //下面开始读取转换后的数据,从最高位开始依次输出(D7~D0)
  217.         for(i = 0;i < 8;i++)
  218.         {
  219.                 dat <<= 1;
  220.                 ADCLK=1;//拉高时钟端
  221.                 _nop_();
  222.                 _nop_();
  223.                 ADCLK=0;//拉低时钟端形成一次时钟脉冲
  224.                 _nop_();
  225.                 _nop_();
  226.                 dat |= ADDO;
  227.         }
  228.         ndat = 0;            //记录D0
  229.         if(ADDO == 1)
  230.         ndat |= 0x80;
  231.         //下面开始继续读取反序的数据(从D1到D7)
  232.         for(i = 0;i < 7;i++)
  233.         {
  234.                 ndat >>= 1;
  235.                 ADCLK = 1;//拉高时钟端
  236.                 _nop_();
  237.                 _nop_();
  238.                 ADCLK=0;//拉低时钟端形成一次时钟脉冲
  239.                 _nop_();
  240.                 _nop_();
  241.                 if(ADDO==1)
  242.                 ndat |= 0x80;
  243.         }          
  244.         ADCS=1;//拉高CS端,结束转换
  245.         ADCLK=0;//拉低CLK端
  246.         ADDI=1;//拉高数据端,回到初始状态
  247.         if(dat==ndat)
  248.         return(dat);
  249.         else
  250.         return 0;   
  251. }
  252. /*****主函数*****/
  253. void main(void)
  254. {
  255.         InitTimer();    //初始化定时器
  256.         EA=1;      //全局中断开关
  257.         TR0=1;
  258.         ET0=1;      //开启定时器0
  259.         BEEP=0;
  260.         led_h=1;
  261.         led_l=1;
  262.         JDQ=1;
  263.         check_wendu();
  264.         check_wendu();
  265.         delay1ms(100);
  266.         lcd_init();//初始化显示
  267.         while(1)
  268.         {
  269.                 if(hujiao==0)
  270.                 {
  271.                         Delay(2000);
  272.                         do{}while(hujiao==0);
  273.                         flag=~flag;
  274.                 }
  275.                 checkkey();
  276.                 abc = ADC0832(1,0);  //差分模式,CH0-CH1
  277.                 abc = abc*100/255; //转换为百分比便于显示
  278. //                abc=abc/1000%10;
  279.                 check_wendu();
  280.                 disp();
  281.                 baojing();
  282.                 if(flag==1){Alarm1();JDQ=0;}
  283.                 else    Alarm();   //报警检测
  284.        
  285.                 if(set_st==0) wr_com(0x0c);
  286.                 if(set_st==1)
  287.                 {
  288.                         wr_com(0xc7);
  289.                         wr_com(0x0d);
  290.                         delay1ms(150);
  291.                 }
  292.                 if(set_st==2)
  293.                 {
  294.                         wr_com(0xcb);
  295.                         wr_com(0x0d);
  296.                         delay1ms(150);
  297.                 }
  298.                 if(set_st==3)
  299.                 {
  300.                         wr_com(0xce);
  301.                         wr_com(0x0d);
  302.                         delay1ms(150);
  303.                 }
  304.         }
  305. }/*****END*****/
复制代码


1-烟雾温度检测报警程序.zip

208.38 KB, 下载次数: 9, 下载积分: 黑币 -5

回复

使用道具 举报

ID:472504 发表于 2022-5-16 09:15 | 显示全部楼层
看别人代码,头大。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表