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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

低于或超過某一個溫度報警且控制繼電器吸停

[復制鏈接]
跳轉到指定樓層
樓主
該系統是溫度控制系統。當溫度超過上限值時,高溫LED燈閃爍,蜂鳴器響,繼電器吸合。當溫度低于下限值時,低溫LED燈閃爍,蜂鳴器響,時繼電器松開,
對溫度有報警有控制。程序注悉非常詳細
所有資料打包下載:
LCD1602顯示DS18B20時鐘超時報警.zip (59.62 KB, 下載次數: 219)

源碼預覽:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define LCD1602_DATAPINS P0
  5. sbit LCD1602_E=P2^7;
  6. sbit LCD1602_RW=P2^5;
  7. sbit LCD1602_RS=P2^6;
  8. sbit DSPORT=P3^7; //DS18B20的數據IO口
  9. sbit LED_H=P1^3;  //超溫指示燈
  10. sbit LED_L=P1^4;  //超溫指示燈
  11. sbit Relay=P1^6;  //溫度控制繼電器
  12. sbit CLK=P1^5;    //溫度越限蜂鳴器報警
  13. sbit Key1=P1^0;   //按鍵1,備用,本程序未涉及按鍵
  14. sbit Key2=P1^1;   //按鍵2,備用,本程序未涉及按鍵
  15. sbit Key3=P1^2;   //按鍵3,備用,本程序未涉及按鍵
  16. void Delay1ms(uint x)  //當晶振=24MHz、x=1,延時1ms
  17. {
  18.         uint y,z;
  19.         for(y=x; y>0; y--)
  20.   for(z=247; z>0; z--);
  21. }
  22. void Delay1us(uint i)  //當晶振=24MHz、i=1,,延時10us
  23. {
  24.   while(i--);
  25. }
  26. /***********************************初始化**********************************/
  27. uchar Ds18b20Init()
  28. {
  29.         uchar i;
  30.         DSPORT = 0;                 //將總線拉低480us~960us
  31.   Delay1us(150); //精確延時=501us,低于777us不能輸出溫度
  32.         DSPORT = 1;                 //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
  33.         i = 0;
  34.         while(DSPORT)         //等待DS18B20拉低總線
  35.         {
  36.                 i++;
  37.                 if(i>50)      //等待>5MS
  38.                 {
  39.                         return 0; //程序能運行到這里,說明DSPORT=1,總線沒被拉低,初始化失敗,返回while(DSPORT)記下判斷
  40.                 }
  41.                 Delay1ms(1);       
  42.         }
  43.         return 1;     //在while(DSPORT)循環中,總線沒被拉低,一旦DSPORT=0,總線被拉低,初始化成功,向調用處返回1
  44. }
  45. /**********************************讀取一個字節********************************/
  46. uchar Ds18b20ReadByte()
  47. {
  48.         uchar byte, bi;
  49.         uint i, j;       
  50.         for(j=8; j>0; j--)
  51.         {
  52.                 DSPORT = 0;    //先將總線拉低1us   
  53.                 Delay1us(1);   //延時
  54.                 DSPORT = 1;    //然后釋放總線
  55.                 Delay1us(1);   //延時   
  56.                 bi = DSPORT;         //讀取數據,從最低位開始讀取
  57.                 /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
  58.                 byte = (byte >> 1) | (bi << 7);                                                  
  59.                 i = 4;                //讀取完之后等待48us再接著讀取下一個數
  60.                 while(i--);
  61.         }                               
  62.         return byte;
  63. }
  64. /*****************************向18B20寫入一個字節******************************/
  65. void Ds18b20WriteByte(uchar dat)
  66. {
  67.         uint i, j;
  68.         for(j=0; j<8; j++)
  69.         {
  70.                 DSPORT = 0;                        //每寫入一位數據之前先把總線拉低1us
  71.                 i++;
  72.                 DSPORT = dat & 0x01; //然后寫入一個數據,從最低位開始
  73.                 i=6;
  74.                 while(i--); //延時68us,持續時間最少60us
  75.                 DSPORT = 1;        //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
  76.                 dat >>= 1;
  77.         }
  78. }
  79. /*********************************讓18b20開始轉換溫度***************************/
  80. void  Ds18b20ChangTemp()
  81. {
  82.         Ds18b20Init();
  83.         Delay1ms(1);
  84.         Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
  85.         Ds18b20WriteByte(0x44);          //溫度轉換命令  
  86. }
  87. /**********************************發送讀取溫度命令******************************/
  88. void  Ds18b20ReadTempCom()
  89. {       
  90.         Ds18b20Init();
  91.         Delay1ms(1);
  92.         Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
  93.         Ds18b20WriteByte(0xbe);         //發送讀取溫度命令
  94. }
  95. /************************************讀取溫度*********************************/
  96. int Ds18b20ReadTemp()
  97. {
  98.         int temp = 0;
  99.         uchar tmh, tml;
  100.         Ds18b20ChangTemp();                                 //先寫入轉換命令
  101.         Ds18b20ReadTempCom();                        //然后等待轉換完后發送讀取溫度命令
  102.         tml = Ds18b20ReadByte();        //讀取溫度值共16位,先讀低字節
  103.         tmh = Ds18b20ReadByte();        //再讀高字節
  104.         temp = tmh;
  105.         temp <<= 8;
  106.         temp |= tml;
  107.         return temp;
  108. }
  109. /***********************向LCD寫入一個字節的命令***************************/
  110. void LcdWriteCom(uchar com)          //寫入命令
  111. {
  112.         LCD1602_E = 0;     //使能
  113.         LCD1602_RS = 0;           //選擇發送命令
  114.         LCD1602_RW = 0;           //選擇寫入       
  115.         LCD1602_DATAPINS = com;  //放入命令
  116.         Delay1ms(1);                         //等待數據穩定
  117.         LCD1602_E = 1;                 //寫入時序
  118.         Delay1ms(5);                   //保持時間
  119.         LCD1602_E = 0;
  120. }
  121. /*************************向LCD寫入一個字節的數據*****************************/                             
  122. void LcdWriteData(uchar dat)                        //寫入數據
  123. {
  124.         LCD1602_E = 0;        //使能清零
  125.         LCD1602_RS = 1;        //選擇輸入數據
  126.         LCD1602_RW = 0;        //選擇寫入
  127.         LCD1602_DATAPINS = dat; //寫入數據
  128.         Delay1ms(1);
  129.         LCD1602_E = 1;  //寫入時序
  130.         Delay1ms(5);    //保持時間
  131.         LCD1602_E = 0;
  132. }
  133. /*********************************初始化LCD屏**********************************/                  
  134. void LcdInit()                                                  //LCD初始化子程序
  135. {
  136.         LcdWriteCom(0x38);  //開顯示
  137.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  138.         LcdWriteCom(0x06);  //寫一個指針加1
  139.         LcdWriteCom(0x01);  //清屏
  140.         LcdWriteCom(0x80);  //設置數據指針起點
  141. }
  142. void LcdDisplay(int temp)            //lcd顯示
  143.   {   
  144.     uchar datas[]={0,0,0,0,0}; //定義數組
  145.     float tp;  
  146.     if(temp< 0)                                    //當溫度值為負數
  147.     {
  148.       LcdWriteCom(0x80);  //寫地址 80表示初始地址
  149.       LcdWriteData('-');  //顯示負
  150.       temp=temp-1;        //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  151.       temp=~temp;
  152.       tp=temp;
  153.       temp=tp*0.0625*100+0.5;        //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  154.                               //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  155.                               //算由0.5,還是在小數點后面。
  156.     }
  157.     else
  158.     {                       
  159.       LcdWriteCom(0x80);                  //寫地址0x80表示初始地址
  160.       LcdWriteData('+');                   //顯示正溫度
  161.       tp=temp;                //因為數據處理有小數點所以將溫度賦給一個浮點型變量
  162.                               //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  163.       temp=tp*0.0625*100+0.5;        //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  164.                               //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  165.                               //算加上0.5,還是在小數點后面。
  166.       CLK=1;                  //防止蜂鳴器響
  167.       LED_H=1;                //防止高溫LED燈閃亮
  168.       LED_L=1;                //防止低溫LED燈閃亮
  169.       Relay=1;                //防止加溫繼電器吸合
  170.       if(temp/100-0.5>25)     //判斷溫度是否高于設定溫度
  171.       {
  172.         CLK=~CLK;             //超溫蜂鳴器響,也可以其它有源報警聲
  173.         LED_H=~LED_H;         //高溫LED燈閃亮
  174.         LED_L=1;              //防止低溫指示燈點燃
  175.         Relay=1;              //高溫加熱繼電器關閉
  176.         Delay1us(20);         //延時100us
  177.       }
  178.       if(temp/100-0.5<20)     //判斷溫度是否低于設定溫度
  179.       {
  180.         CLK=~CLK;             //超溫蜂鳴器響,也可以其它有源報警聲
  181.         LED_L=~LED_L;         //低溫LED燈閃亮
  182.         LED_H=1;              //防止高溫指示燈點燃
  183.         Relay=0;              //低溫加熱繼電器吸合
  184.         Delay1us(20);         //延時100us
  185.       }
  186.     }
  187.     datas[0] = temp / 10000;         //計算百位值
  188.     datas[1] = temp % 10000 / 1000;  //計算十位值
  189.     datas[2] = temp % 1000 / 100;    //計算個位值
  190.     datas[3] = temp % 100 / 10;      //計算小數點后第一位值
  191.     datas[4] = temp % 10;            //計算小數點后第二位值
  192.     LcdWriteCom(0x82);                      //寫百位初始地址
  193.     LcdWriteData('0'+datas[0]); //顯示百位        
  194.     LcdWriteCom(0x83);                      //寫十位初始地址
  195.     LcdWriteData('0'+datas[1]); //顯示十位
  196.     LcdWriteCom(0x84);                      //寫個位初始地址
  197.     LcdWriteData('0'+datas[2]); //顯示個位
  198.     LcdWriteCom(0x85);                      //寫‘.’初始地址
  199.     LcdWriteData('.');                       //顯示 ‘.’
  200.     LcdWriteCom(0x86);                      //寫小數點后第一位初始地址
  201.     LcdWriteData('0'+datas[3]); //顯示小數點后第一位數  
  202.     LcdWriteCom(0x87);                      //寫小數點后第二位初始地址
  203.     LcdWriteData('0'+datas[4]); //顯示小數點后第二位數   
  204.   }
  205. /************************************主函數*******************************************/
  206. void main()
  207. {
  208.         LcdInit();                            //初始化LCD1602
  209.         LcdWriteCom(0x88);        //寫'C'地址
  210.         LcdWriteData('C');  //顯示'C'
  211.         while(1)
  212.         {
  213.                 LcdDisplay(Ds18b20ReadTemp());
  214.         }
  215. }
復制代碼


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2016-12-3 23:35 | 只看該作者
51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:108991 發表于 2016-12-14 16:31 | 只看該作者
感激不盡
回復

使用道具 舉報

地板
ID:1035250 發表于 2022-6-21 10:49 來自觸屏版 | 只看該作者
可以調溫度上下限嗎
回復

使用道具 舉報

5#
ID:1035250 發表于 2022-6-21 15:19 來自觸屏版 | 只看該作者
誰能根據樓主的資料畫一個Proteus仿真圖學習一下嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日做夜夜爽毛片麻豆 | 自拍偷拍精品 | 97超在线视频| 最新国产精品精品视频 | 亚洲精品在线免费播放 | 国产精品1区 | 成人伊人网 | h视频在线观看免费 | 亚洲精品播放 | 精品av| 亚洲欧美少妇 | 久久com| 密色视频| 成人黄色电影在线观看 | 国产久| 欧美第一页 | 久草网址 | 在线观看中文字幕 | 玖玖视频 | 欧美一区二区激情三区 | 欧美色专区| 婷婷色国产偷v国产偷v小说 | 亚洲精品视频在线看 | 日韩欧美一区二区三区免费观看 | 欧美精品一区二区在线观看 | 欧美aⅴ在线观看 | 欧美日韩a| 新超碰97 | 在线只有精品 | 欧美日韩免费一区二区三区 | 日韩欧美在线一区 | 欧美区日韩区 | 粉嫩一区二区三区性色av | 天天干夜夜操 | 久久久久黑人 | 国产精品久久久久久久午夜 | 国产精品海角社区在线观看 | 黄免费观看 | 国产精品国产成人国产三级 | 欧美一区二区三区四区视频 | 国精日本亚洲欧州国产中文久久 |