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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2519|回復: 8
收起左側

一個“基于ds18b20的電熱水器水溫控制器”的求助

[復制鏈接]
ID:528612 發表于 2022-6-19 12:15 | 顯示全部樓層 |閱讀模式
這個是單片機練習,大致需要實現的功能如下:
1.包括一個電源開關,一個設定按鍵,兩個控制設定溫度增減的按鍵
2.通過4位數碼管分別顯示設定溫度和實際溫度,量程為0到99度,開機后設定溫度值初始化為26度(這個地方我用了兩個2位數碼管分別顯示,設定溫度值通過藍色數碼管顯示)
3.用ds18b20對溫度進行轉換并通過數碼管顯示(通過紅色數碼管顯示)
4.單片機要根據設定溫度S和實測溫度P控制繼電器R的動作,精度為2度
(1)當P<=S-1時,繼電器接通加熱回路
(2)當P>S+1時,繼電器斷開加熱回路
(3)當P>S-1且P<=S+1時,繼電器保持原狀態不變

目前原理圖和程序都已經基本完成了,但是只實現了“通過ds18b20讀取溫度并通過數碼管顯示”,和“通過數碼管顯示設定溫度,并通過按鍵增減數值”這兩個模塊的功能,按下設定按鍵后,無論設定溫度和實測溫度值之間關系如何,P3.0口始終保持高電平,繼電器沒有任何動作,目前找不到問題出在什么地方。
此外還很好奇為什么開始仿真時,顯示實測溫度的數碼管會顯示85大約1秒鐘的時間,之后才恢復正常,如果可以解決的話又要如何解決呢?
希望各位大神能夠指導一下。

下面是原理圖:

原理圖,應該也存在需要修改的地方

原理圖,應該也存在需要修改的地方

下面是我自己在參考了一些文章后編寫的代碼,參考的部分主要是控制ds18b20初始化和讀寫數據
  1. /*預計實現功能:DS18B20讀取溫度通過P3.7口送入單片機,P3.2和P3.3通過外部中斷方式增大或減小設定溫度值*/
  2. /*P3.1口是設定按鍵,P3.0口通過光耦連接繼電器*/
  3. /*設定按鍵按下后,當DS18B20讀取到的溫度數值小于設定溫度減1時,繼電器會接通;*/
  4. /*當讀取到的溫度大于設定溫度加1時,繼電器斷開;*/
  5. /*當讀取到的溫度大于設定溫度-1且小于等于設定溫度+1時,繼電器不動作*/
  6. /*目前的問題是程序只能實現顯示當前溫度和設定溫度兩個功能*/
  7. /*而無論當前溫度和設定溫度數值大小關系如何,P3.0口始終保持高電平,無任何動作,目前找不到問題出在什么地方*/
  8. /*希望能夠得到解答和幫助*/
  9. #include<reg51.h>//頭文件

  10. /*測量部分溫度顯示相關變量定義*/
  11. sbit DQ=P3^7;//DE18B20總線
  12. sbit CurTempTP=P2^0;//當前溫度十位,Curent Temperature's Ten Place
  13. sbit CurTempOP=P2^1;//當前溫度個位,Curent Temperature's One Place
  14. char CurTemp;//量程限制為0到99攝氏度,故使用有符號字符型變量
  15. int CurTempTPNum;//當前溫度十位數字
  16. int CurTempOPNum;//當前溫度個位數字

  17. /*設定部分溫度顯示相關變量定義*/
  18. char SetTemp=26;//設定溫度,初始值為26
  19. sbit SetTempTP=P2^2;//設定溫度的十位,set temperature's one place
  20. sbit SetTempOP=P2^3;//設定溫度的個位,set temperature's ten place
  21. int SetTempTPNum;//設定溫度十位數字
  22. int SetTempOPNum;//設定溫度個位數字

  23. /*其他設定*/
  24. sbit SetButton=P3^1;//溫度設定按鍵
  25. sbit Heater=P3^0;//加熱線圈繼電器控制
  26. int a,b;

  27. unsigned char LED[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//定義0~9共陽極數碼管字符碼

  28. void DelayMs(const int ms)//毫秒延時子程序,正常
  29. {
  30.     int i;
  31.     for(i=0;i<ms;i++)//單次循環約1毫秒,根據輸入的ms值進行延時
  32.     {
  33.         int j;
  34.         for(j=0;j<120;j++);
  35.     }
  36. }

  37. void DelayUs(unsigned int k)//微秒延時子程序,正常
  38. {
  39.     while(k--);//每次數值減1延時約6微秒,設定值為需要延時的時間除以6
  40. }

  41. void DS18B20Init()//ds18b20初始化子程序,正常
  42. {        
  43.     unsigned char Flag=0;//DS18B20初始化標志位
  44.     DQ=1;//暫時拉高總線
  45.     DelayUs(5);//稍作延時
  46.     DQ=0;//主機(單片機)發送復位脈沖
  47.     DelayUs(80);//保持480微秒以上
  48.     DQ=1;//然后釋放總線
  49.     DelayUs(14);//若從機(DS18B20)初始化成功,會在15到60微秒后產生低電平信號,信號持續60到240微秒
  50.         Flag=DQ;//若DQFlag=0則初始化成功,DQFlag=1則初始化失敗
  51.         DelayUs(20);
  52. }

  53. unsigned char DS18B20ReadData()//ds18b20讀數據子程序,正常
  54. {
  55.     unsigned char k=0;
  56.     unsigned char dat=0;
  57.     for(k=8;k>0;k--)
  58.     {
  59.         DQ=0;//拉低總線
  60.         dat=dat>>1;//從最高位開始讀取數據,每讀取一位后向右移動一位
  61.         DQ=1;//釋放總線
  62.         if(DQ)
  63.             dat|=0x80;
  64.                 DelayUs(4);

  65.     }
  66.     return dat;
  67. }

  68. void DS18B20WriteData(unsigned char com)//ds18b20寫數據子程序,com為command,正常
  69. {
  70.     unsigned char l=0;
  71.     for(l=8;l>0;l--)
  72.     {
  73.         DQ=0;//拉低總線
  74.         DQ=com&0x01;//從最低位開始寫入指令數據,
  75.                 DelayUs(5);//延時
  76.         DQ=1;//釋放總線
  77.         com=com>>1;//寫入一位后,指令數據右移一位等待下一位寫入
  78.     }
  79. }

  80. unsigned char DS18B20GetTemp()//溫度獲取
  81. {
  82.     unsigned char TL=0;//溫度低8位
  83.     unsigned char TH=0;//溫度高8位
  84.         unsigned char Temp=0;
  85.     DS18B20Init();//溫度轉換部分,初始化
  86.     DS18B20WriteData(0xcc);//跳過讀rom
  87.     DS18B20WriteData(0x44);//轉換溫度
  88.         DS18B20Init();//溫度讀取部分
  89.     DS18B20WriteData(0xcc);
  90.     DS18B20WriteData(0xbe);//讀取溫度
  91.     TL=DS18B20ReadData();//讀低8位
  92.     TH=DS18B20ReadData();//讀高8位
  93.     Temp=TH<<4;//高8位左移4位后賦值
  94.         Temp=Temp|TL>>4;//低8位左移4位舍棄小數部分后按位或賦值
  95.     return Temp;//返回Temp
  96. }

  97. void ShowTemp()//測量溫度數值與設定溫度數值綜合顯示,兩種數值顯示區間均為0到99攝氏度,正常
  98. {
  99.         //顯示當前測量溫度,數碼管接P0口,數位由P2.0和P2.1口控制
  100.         if(CurTemp>=0&&CurTemp<=99)//當測量值處于0到99攝氏度區間
  101.     {
  102.             CurTempTPNum=CurTemp/10;//取測量值十位
  103.         CurTempOPNum=CurTemp%10;//取測量值個位
  104.             //顯示測量值十位,點亮1毫秒后熄滅
  105.                 CurTempTP=1;
  106.             P0=LED[CurTempTPNum];
  107.             DelayMs(10);
  108.             CurTempTP=0;
  109.             //顯示測量值個位,點亮1毫秒后熄滅
  110.                 CurTempOP=1;
  111.             P0=LED[CurTempOPNum];
  112.             DelayMs(10);
  113.             CurTempOP=0;
  114.         }
  115.         else if(CurTemp<0)//當測量值低于0攝氏度,則數碼管顯示0
  116.         {
  117.             CurTempTP=1;
  118.             P0=LED[0];
  119.             DelayMs(10);
  120.             CurTempTP=0;
  121.             CurTempOP=1;
  122.             P0=LED[0];
  123.             DelayMs(10);
  124.             CurTempOP=0;
  125.           }
  126.         else if(CurTemp>99)//當測量值高于99攝氏度,則數碼管顯示9
  127.         {
  128.             CurTempTP=1;
  129.             P0=LED[9];
  130.             DelayMs(10);
  131.             CurTempTP=0;
  132.             CurTempOP=1;
  133.             P0=LED[9];
  134.             DelayMs(10);
  135.             CurTempOP=0;
  136.           }
  137.         //顯示當前設定溫度,數碼管連接P1口,數位由P2.2和P2.3控制
  138.     SetTempTPNum=SetTemp/10;//取設定值十位
  139.     SetTempOPNum=SetTemp%10;//取設定值個位
  140.     //顯示設定值十位,點亮1毫秒后熄滅
  141.         SetTempOP=1;
  142.     P1=LED[SetTempOPNum];
  143.     DelayMs(10) ;
  144.     SetTempOP=0;
  145.     //顯示設定值個位,點亮1毫秒后熄滅
  146.         SetTempTP=1;
  147.     P1=LED[SetTempTPNum];
  148.     DelayMs(10);
  149.     SetTempTP=0;
  150. }

  151. void Add() interrupt 0//P3.2口接按鈕控制增加設定值,正常
  152. {
  153.     if(SetTemp<99)//防止數值溢出
  154.     {
  155.         SetTemp++;//設定值加1
  156.     }
  157. }

  158. void Sub() interrupt 2//P3.3口接按鈕控制減小設定值,正常
  159. {
  160.     if(SetTemp>0)//防止數值過小
  161.     {
  162.         SetTemp--;//設定值減1
  163.     }
  164. }

  165. void main()//主函數,有問題
  166. {
  167.     EA=1;//允許總中斷
  168.         EX0=1;//允許外部中斷0
  169.         EX1=1;//允許外部中斷1
  170.     IT0=1;//外部中斷0跳沿觸發
  171.     IT1=1;//外部中斷1跳沿觸發
  172.         Heater=0;
  173.     while(1)
  174.         {
  175.                 CurTemp=DS18B20GetTemp();//讀取DS18B20轉換的溫度
  176.                 ShowTemp();
  177.                 a=SetTemp-1;
  178.                 b=SetTemp+1;
  179.                 if(SetButton==0)//原本按下按鍵后應該會對當前溫度和設定溫度進行比較然后確定繼電器的動作,但是卻沒有任何反應,也不清楚是哪里出了問題
  180.                 {
  181.                     DelayMs(10);
  182.                     if(SetButton==0)
  183.                     {                       
  184.                             if(CurTemp>a&&CurTemp<=b)
  185.                             {
  186.                                 ;
  187.                             }
  188.                                 else if(CurTemp<=a)
  189.                             {
  190.                                 Heater=0;
  191.                             }
  192.                             else if(CurTemp>b)
  193.                             {
  194.                                     Heater=1;
  195.                             }
  196.                     }
  197.                 }                                                           
  198.         }
  199. }                    
復制代碼

基于DS18B20的水溫控制器,但是程序有點小問題.zip (98.88 KB, 下載次數: 162)
回復

使用道具 舉報

ID:213173 發表于 2022-6-19 20:15 | 顯示全部樓層
把這個示例略改一下就能滿足你的要求
DS18B20溫度上下限報警 仿真.rar (177.89 KB, 下載次數: 113)
回復

使用道具 舉報

ID:161164 發表于 2022-6-19 23:25 | 顯示全部樓層
電阻!你最少缺了一個電阻
2022-06-19_232402.png
回復

使用道具 舉報

ID:528612 發表于 2022-6-20 00:17 來自手機 | 顯示全部樓層
lkc8210 發表于 2022-6-19 23:25
電阻!你最少缺了一個電阻

啊…這個沒注意到,感謝指出
回復

使用道具 舉報

ID:1030903 發表于 2022-6-20 23:29 來自手機 | 顯示全部樓層
剛上電顯示85?1秒后才是正常讀數?是不是你初始設定的值是85呀
回復

使用道具 舉報

ID:528612 發表于 2022-6-23 08:38 | 顯示全部樓層
無恥之徒 發表于 2022-6-20 23:29
剛上電顯示85?1秒后才是正常讀數?是不是你初始設定的值是85呀

沒有,初始值是默認就是85
回復

使用道具 舉報

ID:1006814 發表于 2022-6-23 09:11 | 顯示全部樓層
主程序應該一直比較當前溫度和設置溫度,符合條件執行對應的程序。
回復

使用道具 舉報

ID:195496 發表于 2022-6-24 17:51 | 顯示全部樓層
上電后第一次讀出的就是85度,要多讀幾次才行
回復

使用道具 舉報

ID:528612 發表于 2022-7-15 11:41 | 顯示全部樓層
問題已經解決了,感謝各位
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品自拍视频 | 精品免费 | 国产精品一区在线观看 | 91视频亚洲 | 一区二区三区国产精品 | 在线免费观看欧美 | 97高清国语自产拍 | 日本欧美黄色片 | 久久精品影视 | 亚洲在线高清 | 国产一区二区在线免费 | 五月天激情电影 | 日韩一区在线播放 | 高清免费av| av网站在线看 | 亚洲成人免费视频 | 日本久久久久久久久 | 日韩成人在线一区 | 99久久精品国产一区二区三区 | 一本一道久久a久久精品综合蜜臀 | 97精品超碰一区二区三区 | 一区二区三区在线观看视频 | 国产精品99久久免费观看 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 欧美日韩在线观看一区 | 在线一区视频 | 久久99精品国产 | 亚洲国产成人av好男人在线观看 | 亚洲色在线视频 | av天天澡天天爽天天av | 91社区在线观看播放 | 天堂av影院| 久久51| 欧美亚洲国产精品 | 久久av网站 | 人人干人人干人人干 | 国产精品久久久久久亚洲调教 | 色久伊人 | 国产一区二区三区免费 | 欧美一区二区三区的 | 成人在线精品视频 |