找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)溫度傳感器程序怎么加個(gè)蜂鳴器報(bào)警功能?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:413899 發(fā)表于 2018-11-30 21:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
50黑幣
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無符號(hào)字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號(hào)整型 宏定義        變量范圍0~65535

  4. //數(shù)碼管段選定義      0    1    2    3           4           5        6         7          8           9        
  5. uchar code smg_du[]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05};         //斷碼        
  6. //數(shù)碼管位選定義
  7. sbit smg_we1 = P2^0;            //數(shù)碼管位選定義
  8. sbit smg_we2 = P2^2;
  9. sbit smg_we3 = P2^4;
  10. sbit smg_we4 = P2^6;

  11. uchar dis_smg[4] = {0};        
  12. sbit dq   = P3^3;        //18b20 IO口的定義

  13. int temperature ;  //

  14. /***********************1ms延時(shí)函數(shù)*****************************/
  15. void delay_1ms(uint q)
  16. {
  17.         uint i,j;
  18.         for(i=0;i<q;i++)
  19.                 for(j=0;j<120;j++);
  20. }

  21. /***********************小延時(shí)函數(shù)*****************************/
  22. void delay_uint(uint q)
  23. {
  24.         while(q--);
  25. }

  26. /***********************數(shù)碼位選函數(shù)*****************************/
  27. void smg_we_switch(uchar i)
  28. {
  29.         switch(i)
  30.         {
  31.                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  32.                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  33.                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  34.                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  35.         }        
  36. }


  37. /***********************數(shù)碼顯示函數(shù)*****************************/
  38. void display()
  39. {
  40.         static uchar i;   
  41.         i++;
  42.         if(i >= 4)
  43.                 i = 0;        
  44.         P0 = 0xff;                         //消隱
  45.         smg_we_switch(i);                 //位選
  46.         P0 = dis_smg[i];                 //段選               

  47. }

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

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

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

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

  99.         init_18b20();                   //初始化18b20        
  100.         EA = 0;
  101.         write_18b20(0xcc);           //跳過64位ROM
  102.         write_18b20(0xbe);           //發(fā)出讀取暫存器命令
  103.                
  104.         low = read_18b20();        //讀溫度低字節(jié)
  105.         value = read_18b20();  //讀溫度高字節(jié)
  106.         EA = 1;

  107.         value <<= 8;                   //把溫度的高位左移8位
  108.         value |= low;                   //把讀出的溫度低位放到value的低八位中

  109.          value *= 0.625;               //轉(zhuǎn)換到溫度值 小數(shù)
  110.         return value;                   //返回讀出的溫度
  111. }

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

  120. /****************主函數(shù)***************/
  121. void main()
  122. {
  123.         P0 = P1 = P2 = P3 = 0xff;
  124.         time_init();                    //初始化定時(shí)器
  125.         temperature = read_temp();                //先讀出溫度的值        
  126.         delay_1ms(750);                                
  127.         temperature = read_temp();                         //先讀出溫度的值
  128.         dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示
  129.         dis_smg[1] = smg_du[temperature / 10 % 10] & 0xfb; //取溫度的個(gè)位顯示
  130.         dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示
  131.         while(1)
  132.         {               
  133.                 temperature = read_temp();        //先讀出溫度的值               
  134.                 if(flag_wd_z_f == 1)   //負(fù)溫度
  135.                 {
  136.                         smg_i = 4;
  137.                         dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示
  138.                         dis_smg[1] = smg_du[temperature / 10 % 10] & 0xfb; //取溫度的個(gè)位顯示
  139.                         dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示
  140.                         dis_smg[3] = 0xef;
  141.                 }else
  142.                 {        
  143.                         if(temperature >= 1000)
  144.                         {
  145.                                 smg_i = 4;
  146.                                 dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示
  147.                                 dis_smg[1] = smg_du[temperature / 10 % 10] & 0xfb; //取溫度的個(gè)位顯示
  148.                                 dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示
  149.                                 dis_smg[3] = smg_du[temperature / 1000 % 10] ;           //取溫度的十位顯示
  150.                         }else
  151.                         {
  152.                                 smg_i = 3;
  153.                                 dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示
  154.                                 dis_smg[1] = smg_du[temperature / 10 % 10] & 0xfb; //取溫度的個(gè)位顯示
  155.                                 dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示
  156.                         }
  157.                 }
  158.                 delay_1ms(300);        
  159.         }
  160. }

  161. /*************定時(shí)器0中斷服務(wù)程序***************/
  162. void time0_int() interrupt 1
  163. {        
  164.         TH0 = 0xf8;
  165.         TL0 = 0x30;     //2ms
  166.         display();                //數(shù)碼管顯示函數(shù)
  167. }

復(fù)制代碼

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

使用道具 舉報(bào)

沙發(fā)
ID:246251 發(fā)表于 2018-12-1 10:02 | 只看該作者
寫一個(gè)蜂鳴器驅(qū)動(dòng)的函數(shù),然后你不是最后的死循環(huán)里有temperature = read_temp();這個(gè)嗎?在這里加個(gè)判斷,設(shè)定一個(gè)閾值,超過這個(gè)閾值就驅(qū)動(dòng)蜂鳴器報(bào)警

評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表