找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7485|回复: 3
收起左侧

单片机ADC0832转换MQ2烟雾报警器Proteus仿真程序+PCB文件

[复制链接]
ID:745786 发表于 2021-1-27 16:36 | 显示全部楼层 |阅读模式
  第一次发帖,这是之前做的一个烟雾报警器,废话少说。直接上图。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
2.png 3.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>                                                                                          
  3. #define u8 unsigned char  
  4. #define u16 unsigned int
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. uchar wendu=0;                        
  8. uchar yanwu=0;                          
  9. uint shezhiwendu;
  10. uchar shezhiyanwu;  
  11. uchar Mode=0;                                                         
  12. sbit LedRed=P2^2;                 
  13. sbit LedYellow=P2^4;               
  14. sbit Buzzer=P2^0;
  15. sbit LCDRS=P2^7;                 
  16. sbit LCDEN=P2^6;
  17. sbit D0= P0^0;
  18. sbit D1= P0^1;
  19. sbit D2= P0^2;
  20. sbit D3= P0^3;
  21. sbit D4= P0^4;
  22. sbit D5= P0^5;
  23. sbit D6= P0^6;
  24. sbit D7= P0^7;               
  25. void delay(uint z)   
  26. {
  27.         uint i,j;
  28.         for(i=0;i<z;i++)
  29.                 for(j=0;j<110;j++);
  30. }
  31. void LCDdelay(uint z)
  32. {
  33.   uint x,y;
  34.   for(x=z;x>0;x--)
  35.     for(y=10;y>0;y--);
  36. }
  37. void LCD_WriteData(u8 dat)         
  38. {
  39.         if(dat&0x01)D0=1;else D0=0;
  40.         if(dat&0x02)D1=1;else D1=0;
  41.         if(dat&0x04)D2=1;else D2=0;
  42.         if(dat&0x08)D3=1;else D3=0;
  43.         if(dat&0x10)D4=1;else D4=0;
  44.         if(dat&0x20)D5=1;else D5=0;
  45.         if(dat&0x40)D6=1;else D6=0;
  46.         if(dat&0x80)D7=1;else D7=0;
  47. }
  48. void write_com(uchar com)
  49. {
  50.   LCDRS=0;                                 
  51.         LCD_WriteData(com);
  52.   LCDdelay(5);
  53.   LCDEN=1;
  54.   LCDdelay(5);
  55.   LCDEN=0;
  56. }
  57. void write_data(uchar date)
  58. {
  59.   LCDRS=1;
  60. LCD_WriteData(date);
  61.   LCDdelay(5);
  62.   LCDEN=1;
  63.   LCDdelay(5);
  64.   LCDEN=0;
  65. }
  66. void SelectPosition(unsigned char x,unsigned char y)
  67. {     
  68.         if (x==0)
  69.         {     
  70.                 write_com(0x80+y);   
  71.         }
  72.         else
  73.         {      
  74.                 write_com(0xC0+y);     
  75.         }        
  76. }
  77. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  78. {     
  79.         SelectPosition(x,y) ;
  80.         while (*s)
  81.         {     
  82.                 write_data( *s);     
  83.                 s ++;     
  84.         }
  85. }
  86. void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  87. {     
  88.         SelectPosition(x,y) ;
  89.         if(l>=5)
  90.                 write_data(0x30+s/10000%10);        
  91.         if(l>=4)
  92.                 write_data(0x30+s/1000%10);        
  93.         if(l>=3)
  94.                 write_data(0x30+s/100%10);        
  95.         if(l>=2)
  96.                 write_data(0x30+s/10%10);               
  97.         if(l>=1)
  98.                 write_data(0x30+s%10);        

  99. }

  100. void Init1602()         
  101. {
  102.   uchar i=0;
  103.   write_com(0x38);
  104.   write_com(0x0c);
  105.   write_com(0x06);
  106.   write_com(0x01);
  107.         
  108. }

  109. void Display_1602(shezhiwendu,shezhiyanwu,c,temp)
  110. {
  111.         LCD_Write_Char(0,6,shezhiwendu,2) ;        
  112.         LCD_Write_Char(0,13,shezhiyanwu,3) ;
  113. //wendu
  114.         LCD_Write_Char(1,6,c/10,2) ;
  115.         write_data('.');
  116.         LCD_Write_Char(1,9,c%10,1) ;
  117. //yanwu
  118.         LCD_Write_Char(1,13,temp,3) ;
  119. }
  120. //ad0832        函数        
  121. sbit ADCS         =P1^5;
  122. sbit ADCLK  =P1^2;
  123. sbit ADDI         =P1^3;
  124. sbit ADDO         =P1^3;
  125. unsigned int Adc0832(unsigned char channel)
  126. {
  127.         uchar i=0;
  128.         uchar j;
  129.         uint dat=0;
  130.         uchar ndat=0;
  131.         uchar  Vot=0;

  132.         if(channel==0)channel=2;
  133.         if(channel==1)channel=3;
  134.         ADDI=1;
  135.         _nop_();
  136.         _nop_();
  137.         ADCS=0;//拉低CS端
  138.         _nop_();
  139.         _nop_();
  140.         ADCLK=1;//拉高CLK端
  141.         _nop_();
  142.         _nop_();
  143.         ADCLK=0;//拉低CLK端,形成下降沿1
  144.         _nop_();
  145.         _nop_();
  146.         ADCLK=1;//拉高CLK端
  147.         ADDI=channel&0x1;
  148.         _nop_();
  149.         _nop_();
  150.         ADCLK=0;//拉低CLK端,形成下降沿2
  151.         _nop_();
  152.         _nop_();
  153.         ADCLK=1;//拉高CLK端
  154.         ADDI=(channel>>1)&0x1;
  155.         _nop_();
  156.         _nop_();
  157.         ADCLK=0;//拉低CLK端,形成下降沿3
  158.         ADDI=1;//控制命令结束
  159.         _nop_();
  160.         _nop_();
  161.         dat=0;
  162.         for(i=0;i<8;i++)
  163.         {
  164.                 dat|=ADDO;//收数据
  165.                 ADCLK=1;
  166.                 _nop_();
  167.                 _nop_();
  168.                 ADCLK=0;//形成一次时钟脉冲
  169.                 _nop_();
  170.                 _nop_();
  171.                 dat<<=1;
  172.                 if(i==7)dat|=ADDO;
  173.         }
  174.         for(i=0;i<8;i++)
  175.         {
  176.                 j=0;
  177.                 j=j|ADDO;//收数据
  178.                 ADCLK=1;
  179.                 _nop_();
  180.                 _nop_();
  181.                 ADCLK=0;//形成一次时钟脉冲
  182.                 _nop_();
  183.                 _nop_();
  184.                 j=j<<7;
  185.                 ndat=ndat|j;
  186.                 if(i<7)ndat>>=1;
  187.         }
  188.         ADCS=1;//拉低CS端
  189.         ADCLK=0;//拉低CLK端
  190.         ADDO=1;//拉高数据端,回到初始状态
  191.         dat<<=8;
  192.         dat|=ndat;

  193.         return(dat);            //return ad data
  194. }

  195. // 温度传感器模块代码          单片机教材
  196. sbit DQ = P1^0;                                 
  197. void Delay_DS18B20(int num)
  198. {
  199.   while(num--) ;
  200. }
  201. void Init_DS18B20(void)
  202. {
  203.   unsigned char x=0;
  204.   DQ = 1;      
  205.   Delay_DS18B20(8);  
  206.   DQ = 0;      
  207.   Delay_DS18B20(80);  
  208.   DQ = 1;        
  209.   Delay_DS18B20(14);
  210.   x = DQ;         
  211.   Delay_DS18B20(20);
  212. }
  213. unsigned char ReadOneChar(void)
  214. {
  215.   unsigned char i=0;
  216.   unsigned char dat = 0;
  217.   for (i=8;i>0;i--)
  218.   {
  219.     DQ = 0;   
  220.     dat>>=1;
  221.     DQ = 1;     
  222.     if(DQ)
  223.     dat|=0x80;
  224.     Delay_DS18B20(4);
  225.   }
  226.   return(dat);
  227. }
  228. void WriteOneChar(unsigned char dat)
  229. {
  230.   unsigned char i=0;
  231.   for (i=8; i>0; i--)
  232.   {
  233.     DQ = 0;
  234.     DQ = dat&0x01;
  235.     Delay_DS18B20(5);
  236.     DQ = 1;
  237.     dat>>=1;
  238.   }
  239. }
  240. unsigned int ReadTemperature(void)
  241. {
  242.   unsigned char a=0;
  243.   unsigned char b=0;
  244.   unsigned int t=0;
  245.   float tt=0;
  246.   Init_DS18B20();
  247.   WriteOneChar(0xCC);  
  248.   WriteOneChar(0x44);  
  249.   Init_DS18B20();
  250.   WriteOneChar(0xCC);
  251.   WriteOneChar(0xBE);
  252.   a=ReadOneChar();  
  253.   b=ReadOneChar();  
  254.   t=b;
  255.   t<<=8;
  256.   t=t|a;
  257.   tt=t*0.0625;
  258.   t= tt*10+0.5;     //放大10倍输出并四舍五入
  259.   return(t);
  260. }

  261. u16 check_wendu(void)
  262. {
  263.         u16 c;
  264.         c=ReadTemperature()-5;                  
  265.         if(c<1) c=0;
  266.         if(c>=999) c=999;
  267.         return c;
  268. }
  269. //按键
  270. sbit Key1=P1^6;                        
  271. sbit Key2=P1^7;                        
  272. sbit Key3=P3^2;                        
  273. #define KEY_SET                 1        
  274. #define KEY_ADD                        2        
  275. #define KEY_MINUS                3        
  276. u8 Key_Scan()
  277. {                 static u8 key_up=1;
  278.         if(key_up&&(Key1==0||Key2==0||Key3==0))
  279.         {
  280.                 delay(10);
  281.                 key_up=0;
  282.                 if(Key1==0)                        return 1;
  283.                 else if(Key2==0)return 2;
  284.                 else if(Key3==0)return 3;
  285.         }
  286.         else if(Key1==1&&Key2==1&&Key3==1)
  287.                 key_up=1;            
  288.          return 0;
  289. }



  290. void main (void)
  291. {
  292.         u8 key;
  293.         wendu=check_wendu();               
  294.         Init1602();                        
  295.         LCD_Write_String(0,0,"SET T:00   E:000");  
  296.         LCD_Write_String(1,0,"NOW T:00.0 E:000");  
  297.         delay(1000);
  298.         wendu=check_wendu();
  299.                         
  300.         while (1)                                       
  301.         {
  302.                 key=Key_Scan();                                
  303.                 yanwu=Adc0832(0);                                
  304.                 wendu=check_wendu();         
  305.                
  306.                 if(key==KEY_SET)
  307.                 {
  308.                         Mode++;
  309.                 }
  310.                
  311.                 switch(Mode)                                       
  312.                 {
  313.                         case 0:                                                        
  314.                         {
  315.                                 Display_1602(shezhiwendu,shezhiyanwu,wendu,yanwu);  
  316.                                 if(yanwu>=shezhiyanwu)                         //温度大于预设温度
  317.                                 {
  318.                                         LedRed=0;                          
  319.                                         Buzzer=0;                        //报警器报警
  320.                                 }
  321.                                 else                                                  
  322.                                 {
  323.                                         LedRed=1;                                          //关掉报警灯
  324.                                 }
  325.                                 if(wendu>=(shezhiwendu*10))          //温度大于等于预设温度值时
  326.                                 
  327.                                 {
  328.                                         Buzzer=0;                                          
  329.                                         LedYellow=0;                                 
  330.                                 }
  331.                                 else                                                                          
  332.                                 {
  333.                                         LedYellow=1;                                 
  334.                                 }
  335.                                 if((yanwu<shezhiyanwu)&&(wendu<(shezhiwendu*10)))
  336.                                 {
  337.                                         Buzzer=1;                                          
  338.                                 }
  339.                                 break;
  340.                         }
  341.                         case 1://预设温度模式
  342.                         {
  343.                                 SelectPosition(0,5) ;                                
  344.                            write_com(0x0d);                                                
  345.                                 if(key==KEY_ADD)                                       
  346.                                 {
  347.                                         shezhiwendu++;                                          
  348.                                         if(shezhiwendu>=99)                                 
  349.                                         shezhiwendu=99;                                                
  350. ……………………

  351. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
所有资料51hei提供下载:
新建文件夹 (10).rar (3.34 MB, 下载次数: 230)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:864442 发表于 2021-6-25 13:10 | 显示全部楼层
有点问题
回复

使用道具 举报

ID:950257 发表于 2021-7-20 17:01 | 显示全部楼层
程序里面问题不少,有点la
回复

使用道具 举报

ID:859852 发表于 2021-7-20 22:55 来自手机 | 显示全部楼层
#define u8 unsigned char #define u16 unsigned int #define uchar unsigned char #define uint unsigned int重复了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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