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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8228|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機18b20溫度上下限 蜂鳴器報警程序與實物制作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:212343 發(fā)表于 2017-8-2 19:10 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這個新手可以看一下,做一個溫度檢測。下面是實物圖:

下面是程序
  1. #include <reg52.h>
  2. #include "eepom52.h"
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. //數(shù)碼管段選定義      0     1    2    3    4    5        6         7          8           9        
  6. uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  7.                                            0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};         //斷碼
  8. //數(shù)碼管位選定義
  9. uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
  10. uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};        
  11. uchar smg_i = 3;    //顯示數(shù)碼管的個位數(shù)
  12. sbit dq = P2^4;                //18b20IO 口的定義

  13. uint temperature ;  //
  14. bit flag_300ms ;
  15. uchar key_can;                 //按鍵值的變量
  16. uchar menu_1;        //菜單設(shè)計的變量
  17. uint t_high = 300,t_low = 100;
  18. bit flag_lj_en;                 //按鍵連加使能
  19. bit flag_lj_3_en;         //按鍵連3次連加后使能 加的數(shù)就越大了
  20. uchar key_time,flag_value;      //用做連加的中間變量
  21. bit key_500ms  ;



  22. /***********************1ms延時函數(shù)*****************************/
  23. void delay_1ms(uint q)
  24. {
  25.         uint i,j;
  26.         for(i=0;i<q;i++)
  27.                 for(j=0;j<110;j++);
  28. }

  29. /***********************小延時函數(shù)*****************************/
  30. void delay_uint(uint q)
  31. {
  32.         while(q--);
  33. }


  34. /***********************數(shù)碼顯示函數(shù)*****************************/
  35. void display()
  36. {
  37.         uchar i;
  38.         for(i=0;i<smg_i;i++)
  39.         {        
  40.                                                   
  41.                 P3 = smg_we[i];                          //位選
  42.                 P1 = dis_smg[i];                 //段選            
  43.                 delay_1ms(1);                        
  44.                 P3 = 0xff;                          //位選
  45.                 P1 = 0xff;                         //消隱
  46.                
  47.         }        
  48. }


  49. /***********************18b20初始化函數(shù)*****************************/
  50. void init_18b20()
  51. {
  52.         bit q;
  53.         dq = 1;                                //把總線拿高
  54.         delay_uint(1);            //15us
  55.         dq = 0;                                //給復(fù)位脈沖
  56.         delay_uint(80);                //750us
  57.         dq = 1;                                //把總線拿高 等待
  58.         delay_uint(10);                //110us
  59.         q = dq;                                //讀取18b20初始化信號
  60.         delay_uint(20);                //200us
  61.         dq = 1;                                //把總線拿高 釋放總線
  62. }

  63. /*************寫18b20內(nèi)的數(shù)據(jù)***************/
  64. void write_18b20(uchar dat)
  65. {
  66.         uchar i;
  67.         for(i=0;i<8;i++)
  68.         {                                         //寫數(shù)據(jù)是低位開始
  69.                 dq = 0;                         //把總線拿低寫時間隙開始
  70.                 dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
  71.                 delay_uint(5);         // 60us
  72.                 dq = 1;                         //釋放總線
  73.                 dat >>= 1;
  74.         }        
  75. }

  76. /*************讀取18b20內(nèi)的數(shù)據(jù)***************/
  77. uchar read_18b20()
  78. {
  79.         uchar i,value;
  80.         for(i=0;i<8;i++)
  81.         {
  82.                 dq = 0;                         //把總線拿低讀時間隙開始
  83.                 value >>= 1;         //讀數(shù)據(jù)是低位開始
  84.                 dq = 1;                         //釋放總線
  85.                 if(dq == 1)                 //開始讀寫數(shù)據(jù)
  86.                         value |= 0x80;
  87.                 delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
  88.         }
  89.         return value;                 //返回數(shù)據(jù)
  90. }

  91. /*************讀取溫度的值 讀出來的是小數(shù)***************/
  92. uint read_temp()
  93. {
  94.         uint value;
  95.         uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會影響到18b20的時序
  96.         init_18b20();                   //初始化18b20
  97.         write_18b20(0xcc);           //跳過64位ROM
  98.         write_18b20(0x44);           //啟動一次溫度轉(zhuǎn)換命令
  99.         delay_uint(50);                   //500us

  100.         init_18b20();                   //初始化18b20
  101.         write_18b20(0xcc);           //跳過64位ROM
  102.         write_18b20(0xbe);           //發(fā)出讀取暫存器命令

  103.         low = read_18b20();           //讀溫度低字節(jié)
  104.         value = read_18b20();  //讀溫度高字節(jié)

  105.         value <<= 8;                   //把溫度的高位左移8位
  106.         value |= low;                   //把讀出的溫度低位放到value的低八位中
  107.         value *= 0.625;               //轉(zhuǎn)換到溫度值 小數(shù)
  108.         return value;                   //返回讀出的溫度 帶小數(shù)
  109. }

  110. /*************定時器0初始化程序***************/
  111. void time_init()         
  112. {
  113.         EA   = 1;                   //開總中斷
  114.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  115.         ET0  = 1;                  //開定時器0中斷
  116.         TR0  = 1;                  //允許定時器0定時
  117. }

  118. /****************獨立按鍵處理函數(shù)************************/
  119. void key()
  120. {
  121.         static uchar key_new = 0,key_old = 0,key_value = 0;
  122.         if(key_new == 0)                        
  123.         {                                                   //按鍵松開的時候做松手檢測
  124.                 if((P2 & 0x0f) == 0x0f)
  125.                         key_value ++;
  126.                 else
  127.                         key_value = 0;
  128.                 if(key_value >= 10)
  129.                 {
  130.                         key_value = 0;
  131.                         key_new = 1;
  132.                         flag_lj_en = 0;
  133.                         flag_lj_3_en = 0;
  134.                         flag_value = 0;
  135.                 }
  136.         }
  137.         else
  138.         {
  139.                 if((P2 & 0x0f) != 0x0f)
  140.                         key_value ++;  //按鍵按下的時候
  141.                 else
  142.                         key_value = 0;
  143.                 if(key_value >= 7)
  144.                 {
  145.                         key_value = 0;
  146.                         key_new = 0;
  147.                         flag_lj_en = 1;         //連加使能
  148.                 }
  149.         }
  150.         key_can = 20;
  151.         if(key_500ms == 1)
  152.         {
  153.                 key_500ms = 0;
  154.                 key_new = 0;
  155.                 key_old = 1;
  156.         }
  157.         if((key_new == 0) && (key_old == 1))
  158.         {
  159.                 switch(P2 & 0x0f)
  160.                 {
  161.                         case 0x0e: key_can = 4; break;           //得到k1鍵值
  162.                         case 0x0d: key_can = 3; break;           //得到k2鍵值
  163.                         case 0x0b: key_can = 2; break;           //得到k3鍵值
  164.                         case 0x07: key_can = 1; break;           //得到k4鍵值
  165.                 }
  166. //                dis_smg[3] = smg_du[key_can];
  167.         }                        
  168.         key_old = key_new;         
  169. }

  170. /****************按鍵處理數(shù)碼管顯示函數(shù)***************/
  171. void key_with()
  172. {
  173.         if(key_can == 4)
  174.         {
  175.                 menu_1 ++;
  176.                 if(menu_1 >= 3)
  177.                 {
  178.                         menu_1 = 0;
  179.                 }
  180.                 if(menu_1 == 0)
  181.                 {
  182.                         dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示
  183.                         dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取溫度的個位顯示
  184.                         dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示
  185.                         smg_i = 3;
  186.                 }
  187.                 if(menu_1 == 1)
  188.                 {
  189.                         dis_smg[0] = smg_du[t_high % 10];                   //取溫度的小數(shù)顯示
  190.                         dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f;  //取溫度的個位顯示
  191.                         dis_smg[2] = smg_du[t_high / 100 % 10] ;           //取溫度的十位顯示
  192.                         dis_smg[3] = 0x89;        
  193.                         smg_i = 4;
  194.                 }
  195.                 if(menu_1 == 2)
  196.                 {
  197.                         dis_smg[0] = smg_du[t_low % 10];                   //取溫度的小數(shù)顯示
  198.                         dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f;  //取溫度的個位顯示
  199.                         dis_smg[2] = smg_du[t_low / 100 % 10] ;           //取溫度的十位顯示
  200.                         dis_smg[3] = 0xc7;        
  201.                         smg_i = 4;
  202.                 }
  203.         }
  204.         if(menu_1 == 1)                        //設(shè)置高溫報警
  205.         {
  206.                 if(key_can == 3)
  207.                 {
  208.                         if(flag_lj_3_en == 0)
  209.                                 t_high ++ ;                        
  210.                         else
  211.                                 t_high += 10;
  212.                         if(t_high > 990)
  213.                                 t_high = 990;
  214.                         dis_smg[0] = smg_du[t_high % 10];                   //取溫度的小數(shù)顯示
  215.                         dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f;  //取溫度的個位顯示
  216.                         dis_smg[2] = smg_du[t_high / 100 % 10] ;           //取溫度的十位顯示
  217.                         dis_smg[3] = 0x89;
  218.                 }
  219.                 if(key_can == 1)
  220.                 {
  221.                         if(flag_lj_3_en == 0)
  222.                                 t_high -- ;                        
  223.                         else
  224.                                 t_high -= 10;
  225.                         if(t_high < t_low)
  226.                                 t_high = t_low;
  227.                         dis_smg[0] = smg_du[t_high % 10];                   //取溫度的小數(shù)顯示
  228.                         dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f;  //取溫度的個位顯示
  229.                         dis_smg[2] = smg_du[t_high / 100 % 10] ;           //取溫度的十位顯示
  230.                         dis_smg[3] = 0x89;
  231.                 }
  232.         }        
  233.         if(menu_1 == 2)                        //設(shè)置高溫報警
  234.         {
  235.                 if(key_can == 3)
  236.                 {
  237.                         if(flag_lj_3_en == 0)
  238.                                 t_low ++ ;                        
  239.                         else
  240.                                 t_low += 10;
  241.                         if(t_low >= t_high)
  242.                                 t_low = t_high - 1;
  243.                         dis_smg[0] = smg_du[t_low % 10];                   //取溫度的小數(shù)顯示
  244.                         dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f;  //取溫度的個位顯示
  245.                         dis_smg[2] = smg_du[t_low / 100 % 10] ;           //取溫度的十位顯示
  246.                         dis_smg[3] = 0xc7;
  247.                 }
  248.                 if(key_can == 1)
  249.                 {
  250.                         if(flag_lj_3_en == 0)
  251.                                 t_low -- ;                        
  252.                         else
  253.                                 t_low -= 10;
  254.                         if(t_low <= 10)
  255.                                 t_low = 11;
  256.                         dis_smg[0] = smg_du[t_low % 10];                   //取溫度的小數(shù)顯示
  257.                         dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f;  //取溫度的個位顯示
  258.                         dis_smg[2] = smg_du[t_low / 100 % 10] ;           //取溫度的十位顯示
  259.                         dis_smg[3] = 0xc7;
  260.                 }
  261.         }        
  262. }

  263. void main()
  264. {        
  265.         time_init();     //初始化定時器
  266.         while(1)
  267.         {
  268.                 display();
  269.                 key();        
  270.                 if(key_can < 10)
  271.                 {
  272.                         key_with();                                
  273.                 }
  274.                 temperature= read_temp();                //先讀出溫度的值
  275.                 if(flag_300ms == 1)                //300ms 處理一次溫度程序
  276.                 {
  277.                         flag_300ms = 0;        
  278.                         if(menu_1 == 0)
  279.                         {        
  280.                                 dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示
  281.                                 dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取溫度的個位顯示
  282.                                 dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示
  283.                         }
  284.                 }
  285.         }
  286. }

  287. /*************定時器0中斷服務(wù)程序***************/
  288. void time0_int() interrupt 1
  289. {        
  290.         static uchar value;
  291.         TH0 = 0x3c;
  292.         TL0 = 0xb0;     // 50ms
  293.         value ++;         
  294.         if(value % 6 == 0)
  295.         {
  296.                 flag_300ms = 1;           //300ms
  297.                 value = 0;
  298.         }
  299.         if(flag_lj_en == 1)
  300.         {
  301.                 key_time ++;
  302.                 if(key_time >= 10)
  303.                 {
  304.                         key_time = 0;
  305.                         key_500ms = 1;
  306.                         flag_value ++;
  307.                         if(flag_value > 3)
  308.                         {
  309.                                 flag_value = 10;
  310.                                 flag_lj_3_en = 1;
  311.                         }
  312.                                                 
  313.                 }
  314.         }
  315. }
復(fù)制代碼


下面有原理圖,最好按著原理圖焊接。
PDF格式 溫度上下限 蜂鳴器報警.pdf (91.83 KB, 下載次數(shù): 52)

評分

參與人數(shù) 2黑幣 +108 收起 理由
wuli韜韜 + 8
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:397465 發(fā)表于 2018-9-13 15:18 來自手機 | 只看該作者
標志語法錯誤咋改你的uint temperature  和dq是錯誤的標志你說咋改啊
回復(fù)

使用道具 舉報

板凳
ID:397465 發(fā)表于 2018-9-13 15:21 來自手機 | 只看該作者
你有幾個標志錯誤的!你能改下不
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩中文在线 | avmans最新导航地址 | 91免费在线 | 成人黄色电影在线观看 | 欧美精品 在线观看 | 国产在线网址 | 极品粉嫩国产48尤物在线播放 | 久久福利网站 | 欧洲毛片 | 亚洲精品中文字幕中文字幕 | 久久亚洲国产精品 | 成人午夜看片 | 综合久久综合久久 | 亚洲国产激情 | 婷婷激情五月网 | 91精品国产综合久久久密闭 | 亚洲欧美aⅴ | 久久久久91 | 亚洲性视频网站 | 91看片官网| 91精品国产一区二区在线观看 | 国产亚洲成av人片在线观看桃 | 蜜桃一区二区三区 | 久草新视频 | h片在线看 | 99精品99久久久久久宅男 | 日日干天天操 | 亚洲+变态+欧美+另类+精品 | 国产精品特级毛片一区二区三区 | 国产91视频播放 | 日韩一区二区不卡 | 巨大荫蒂视频欧美另类大 | 中文字幕97| 性色网站| 久久久国产网站 | 国产在线网址 | 亚洲人久久 | 午夜一级大片 | 美女视频h | www.色五月.com | 国产一卡二卡三卡 |