久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13291|回復: 8
打印 上一主題 下一主題
收起左側

單片機+ADC0832+MQ2溫度煙霧報警控制PCB原理圖+源程序

  [復制鏈接]
跳轉到指定樓層
樓主
大家好:
          偶然翻出上大學時候做的設計,因為篇幅有限,節省時間和資源所以壓縮包里邊有我歸納總結的心得以及詳細的制作流程。
話不多說 ,有圖有真相。

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整機程序
  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=P3^4;
  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=P2^0;
  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. sbit DIAN = P2^5;        //小數點
  25. uint abc;
  26. uchar x=4;      //計數器
  27. signed char m;     //溫度值全局變量
  28. uchar n;      //溫度值全局變量
  29. uchar data disdata[5];
  30. uchar code LEDData[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
  31. uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; // 攝氏溫度符號
  32. /*****初始化定時器0*****/
  33. void InitTimer(void)
  34. {
  35. TMOD=0x1;
  36. TH0=0x4c;
  37. TL0=0x00;     //50ms(晶振11.0592M)
  38. }
  39. /*****定時器0中斷服務程序*****/
  40. void timer0(void) interrupt 1
  41. {
  42. TH0=0x4c;
  43. TL0=0x00;
  44. x++;
  45. }
  46. /*****讀取溫度*****/
  47. void check_wendu(void)
  48. {
  49. uint a,b,c;
  50. c=ReadTemperature()-5; //獲取溫度值并減去DS18B20的溫漂誤差
  51. a=c/100;     //計算得到十位數字
  52. b=c/10-a*10;    //計算得到個位數字
  53. m=c/10;      //計算得到整數位
  54. n=c-a*100-b*10;    //計算得到小數位
  55. if(m<0){m=0;n=0;}   //設置溫度顯示上限
  56. if(m>99){m=99;n=9;}   //設置溫度顯示上限   
  57. }
  58. /*************************lcd1602程序**************************/
  59. void delay1ms(uint ms)//延時1毫秒(不夠精確的)
  60. {  uint i,j;
  61.    for(i=0;i<ms;i++)
  62.     for(j=0;j<100;j++);
  63. }
  64. unsigned char rolmove(unsigned  char m)
  65. {
  66.   
  67.   unsigned char   a,b,c,d,e,f,g,h;               
  68. a=(m&0x01)<<7;
  69. b=(m&0x02)<<5;
  70. c=(m&0x04)<<3;
  71. d=(m&0x08)<<1;
  72. e=(m&0x10)>>1;
  73. f=(m&0x20)>>3;
  74. g=(m&0x40)>>5;
  75. h=(m&0x80)>>7;
  76. m=a|b|c|d|e|f|g|h;
  77. return m;
  78. }
  79. void wr_com(uchar com)//寫指令//
  80. { delay1ms(1);
  81.    RS=0;
  82.    RW=0;
  83.    EN=0;
  84.    P0=rolmove(com);
  85.    delay1ms(1);
  86.    EN=1;
  87.    delay1ms(1);
  88.    EN=0;
  89. }
  90. void wr_dat(uchar dat)//寫數據//
  91. { delay1ms(1);;
  92.    RS=1;
  93.    RW=0;
  94.    EN=0;
  95.    P0=rolmove(dat);
  96.    delay1ms(1);
  97.    EN=1;
  98.    delay1ms(1);
  99.    EN=0;
  100. }
  101. void wr_new()    //寫新字符
  102. {
  103. uchar i;
  104. wr_com(0x40);
  105. for(i=0;i<8;i++)
  106. {
  107.   wr_dat(table[i]);
  108. }
  109. }
  110. void lcd_init()//初始化設置//
  111. { delay1ms(15);
  112. wr_com(0x38);delay1ms(5);
  113. wr_com(0x08);delay1ms(5);
  114. wr_com(0x01);delay1ms(5);
  115.   wr_com(0x06);delay1ms(5);
  116. wr_com(0x0c);delay1ms(5);
  117. wr_new();
  118. wr_com(0x80);
  119.     wr_dat('S');//A
  120. wr_com(0x81);
  121.     wr_dat('m');//:
  122.    wr_com(0x82);
  123.     wr_dat('o');
  124.    wr_com(0x83);
  125.     wr_dat('k');
  126. wr_com(0x84);
  127.     wr_dat('e');
  128.    wr_com(0x85);
  129.     wr_dat(':');
  130.    wr_com(0x87);
  131.     wr_dat('T');
  132. wr_com(0x88);
  133.     wr_dat('e');
  134.    wr_com(0x89);
  135.     wr_dat('m');
  136.    wr_com(0x8a);
  137.     wr_dat(':');
  138. wr_com(0x8d);
  139.     wr_dat('.');
  140. wr_com(0x8f);
  141.     wr_dat('C');
  142.    
  143. wr_com(0xc0);
  144.     wr_dat('A');
  145. wr_com(0xc1);
  146.     wr_dat('l');
  147. wr_com(0xc2);
  148.     wr_dat('a');
  149.    wr_com(0xc3);
  150.     wr_dat('r');
  151. wr_com(0xc4);
  152.     wr_dat('m');
  153. wr_com(0xc5);
  154.     wr_dat(':');
  155. wr_com(0xcb);
  156.     wr_dat('-');
  157.    wr_com(0xce);
  158.     wr_dat('C');   
  159. }
  160. /*****************顯示函數******************************/
  161. void disp()//溫度值顯示
  162. {
  163.      disdata[0]=m/10+0x30;//十位數
  164.      disdata[1]=m%10+0x30;//個位數
  165.      disdata[2]=n+0x30;//小數位
  166.      disdata[3]=abc+0x30;//煙霧濃度
  167.     wr_com(0x8b);
  168.     wr_dat(disdata[0]);//顯示十位
  169.     wr_com(0x8c);
  170.     wr_dat(disdata[1]);//顯示個位
  171.     wr_com(0x8e);
  172.     wr_dat(disdata[2]);//顯示小數位
  173.     wr_com(0x86);
  174.     wr_dat(disdata[3]);
  175. }
  176. void baojing()
  177. {
  178. wr_com(0xc9);
  179.     wr_dat(tab[0]+0x30);
  180. wr_com(0xca);
  181.     wr_dat(tab[1]+0x30);
  182. wr_com(0xcc);
  183.     wr_dat(tab[2]+0x30);
  184. wr_com(0xcd);
  185.     wr_dat(tab[3]+0x30);
  186. wr_com(0xc6);
  187.     wr_dat(tab[4]+0x30);
  188. }
  189. /*****報警子程序*****/
  190. void Alarm()
  191. {
  192. if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=1;
  193. else if(abc>=nongdu&&beep_st==1) BEEP=1;
  194. else BEEP=0;
  195. if(m>=shangxian||m<xiaxian) {led_h=0;led_l=1;JDQ=0;}
  196. else if(abc>=nongdu) {led_h=0;led_l=1;JDQ=0;}
  197. else {led_h=1;led_l=0;JDQ=1;}
  198. if(x>=10){beep_st=~beep_st;x=0;}
  199. }
  200. void Alarm1()
  201. {
  202. led_h=0;
  203. led_l=1;
  204. if(x>=10){beep_st=~beep_st;x=0;}
  205. if(beep_st==1)BEEP=1;
  206. else BEEP=0;
  207. led_h=0;
  208. led_l=1;
  209. JDQ=0;
  210. }
  211. uchar ADC0832(bit mode,bit channel)     //AD轉換,返回結果
  212. {
  213. uchar i,dat,ndat;

  214. ADCS = 0;//拉低CS端
  215. _nop_();
  216. _nop_();

  217. ADDI = 1; //第1個下降沿為高電平
  218. ADCLK = 1;//拉高CLK端
  219. _nop_();
  220. _nop_();
  221. ADCLK = 0;//拉低CLK端,形成下降沿1
  222. _nop_();
  223. _nop_();

  224. ADDI = mode; //低電平為差分模式,高電平為單通道模式。
  225. ADCLK = 1;//拉高CLK端
  226. _nop_();
  227. _nop_();
  228. ADCLK = 0;//拉低CLK端,形成下降沿2
  229. _nop_();
  230. _nop_();

  231. ADDI = channel; //低電平為CH0,高電平為CH1
  232. ADCLK = 1;//拉高CLK端
  233. _nop_();
  234. _nop_();
  235. ADCLK = 0;//拉低CLK端,形成下降沿3

  236. ADDI = 1;//控制命令結束(經試驗必需)
  237. dat = 0;
  238. //下面開始讀取轉換后的數據,從最高位開始依次輸出(D7~D0)
  239. for(i = 0;i < 8;i++)
  240. {
  241.   dat <<= 1;
  242.   ADCLK=1;//拉高時鐘端
  243.   _nop_();
  244.   _nop_();
  245.   ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
  246.   _nop_();
  247.   _nop_();
  248.   dat |= ADDO;
  249. }
  250. ndat = 0;     //記錄D0
  251. if(ADDO == 1)
  252. ndat |= 0x80;
  253. //下面開始繼續讀取反序的數據(從D1到D7)
  254. for(i = 0;i < 7;i++)
  255. {
  256.   ndat >>= 1;
  257.   ADCLK = 1;//拉高時鐘端
  258.   _nop_();
  259.   _nop_();
  260.   ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
  261.   _nop_();
  262.   _nop_();
  263.   if(ADDO==1)
  264.   ndat |= 0x80;
  265. }   
  266. ADCS=1;//拉高CS端,結束轉換
  267. ADCLK=0;//拉低CLK端
  268. ADDI=1;//拉高數據端,回到初始狀態
  269. if(dat==ndat)
  270. return(dat);
  271. else
  272. return 0;   
  273. }
  274. /*****主函數*****/
  275. void main(void)
  276. {
  277. InitTimer();    //初始化定時器
  278. EA=1;      //全局中斷開關
  279. TR0=1;
  280. ET0=1;      //開啟定時器0
  281. BEEP=0;
  282. led_h=1;
  283. led_l=1;
  284. JDQ=1;
  285. check_wendu();
  286. check_wendu();
  287. lcd_init();//初始化顯示
  288. delay1ms(100);
  289. lcd_init();//初始化顯示
  290. delay1ms(100);
  291. while(1)
  292. {
  293. if(hujiao==0)
  294. {
  295.    Delay(2000);
  296.    do{}while(hujiao==0);
  297.    flag=~flag;
  298. }
  299. checkkey();
  300.   abc = ADC0832(1,0);  //差分模式,CH0-CH1
  301.   abc = abc*19.607843; //轉換為實際電壓便于顯示
  302.   abc=abc/1000%10;
  303.     check_wendu();
  304. disp();
  305. baojing();
  306. if(flag==1){Alarm1();JDQ=0;}
  307. else    Alarm();   //報警檢測
  308. if(set_st==0) wr_com(0x0c);
  309. if(set_st==1)
  310. {
  311. wr_com(0xc6);
  312. wr_com(0x0d);
  313. delay1ms(150);
  314. }
  315. if(set_st==2)
  316. {
  317. wr_com(0xca);
  318. wr_com(0x0d);
  319. delay1ms(150);
  320. }
  321. if(set_st==3)
  322. {
  323. wr_com(0xcd);
  324. wr_com(0x0d);
  325. delay1ms(150);
  326. }
  327. }
  328. }/*****END*****/
復制代碼

全部資料51hei下載地址:
單片機溫度煙霧控制器設計(液晶版).7z (1.45 MB, 下載次數: 447)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂1 踩
回復

使用道具 舉報

來自 2#
ID:262 發表于 2022-2-27 18:25 | 只看該作者
2933367366 發表于 2022-2-27 13:04
不知道什么原因,仿真圖沒結果,1602不顯示任何東西

樓主用的是Proteus7.5版本的仿真軟件  我幫你轉成了Proteus8.8版本的你用8.8打開就可以了

51hei.gif (118.32 KB, 下載次數: 56)

51hei.gif

Proteus8.8版本.7z

24.91 KB, 下載次數: 51, 下載積分: 黑幣 -5

回復

使用道具 舉報

板凳
ID:456792 發表于 2019-10-22 20:07 | 只看該作者
樓主繼電器是什么封裝的 感謝分享
回復

使用道具 舉報

地板
ID:599674 發表于 2019-10-25 11:12 | 只看該作者
感謝樓主的分享
回復

使用道具 舉報

5#
ID:640274 發表于 2019-11-19 11:56 | 只看該作者
感謝分享
回復

使用道具 舉報

6#
ID:758176 發表于 2020-7-10 10:08 | 只看該作者
謝謝樓主 可真是太棒了呢!
回復

使用道具 舉報

7#
ID:826327 發表于 2020-10-6 19:43 | 只看該作者
請問這個還可以再有一個輸出給esp8266嗎
回復

使用道具 舉報

8#
ID:833323 發表于 2020-11-10 16:32 | 只看該作者
液晶屏改為2004的或者12864的咋改,求告知
回復

使用道具 舉報

9#
ID:792989 發表于 2022-2-27 13:04 | 只看該作者
不知道什么原因,仿真圖沒結果,1602不顯示任何東西
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美精品一区二区三区 | 久久99精品久久久久婷婷 | 91看片视频 | 一区二区三区四区视频 | 日日干日日射 | 亚洲a网| 婷婷综合色 | 日本精品免费 | 国产综合在线视频 | 成人午夜av| 国产午夜精品久久 | 成人伊人 | 狠狠的干 | 国产美女黄色片 | 国产成人99久久亚洲综合精品 | 美女一级a毛片免费观看97 | 国产伦一区二区三区 | 国产精品一区久久久 | 尤物在线视频 | 成人免费视频 | 久久九 | 日本一区二区不卡 | 国产一区二区在线免费 | 日韩精品一区二区不卡 | 国产特级毛片aaaaaa喷潮 | 亚洲精品久久 | 成人三区四区 | 亚洲一区在线播放 | 超碰av在线 | 男女网站免费观看 | 国产精品久久久久久久一区探花 | 97久久精品 | 国产精品高潮呻吟久久aⅴ码 | 国产精品久久久久一区二区 | 亚洲综合激情 | 国产a级毛片 | 国产精品亚洲一区 | 午夜视频一区 | 69av在线视频 | 国产精品久久久久久久久久久久久 | 亚洲在线一区 |