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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機恒溫控制程序與Proteus仿真電路圖 18b20采集繼電器電機執行 代碼注釋很詳細

  [復制鏈接]
跳轉到指定樓層
樓主
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


制作出來的恒溫控制電路實物圖如下:

電路原理圖,我加了7805就不需要雙電源了,PCB版沒有
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


元件清單:
0.1uF(104)瓷片電容    1    C3
10K 碳膜電阻    4    R2, R9, R10,R5
12.00MHz 晶體振蕩器    1    CRY1
1N4007 二極管    2    D1, D2
0.47uF(1uF) 電解電容    1    CE1
100uF(220uF) 電解電容    1    CE2
22pF 瓷片電容    2    C1, C2
4.7K 碳膜電阻    1    R3
1K 碳膜電阻    4    R4, R6, R7, R8
5K 電位器     1    RP1
5V DC蜂鳴器    1    BZ1
S8550三極管    1    Q1
6x6輕觸按鍵    4    S1,S2,S3,S4
DS18B20 溫度傳感器    1    J1
SRD-05VDC 繼電器    2    RELAY1, RELAY2
LCD1602 液晶屏    1    LCD1
IDC-3P 2.54mm 單排排針    1    J1
IDC-16P 2.54mm 單排排針    1    LCD1
S9014 三極管    2    Q2, Q3
STC89C52 單片機    1    IC1
XH-2P 2.54mm插座    1    J2
KF25-6P-7.62mm 接線座    1    J6
紅色LED    2    LD2,LD3, LD4
綠色LED    1    LD1
萬能板(洞洞板)    1   
錫線    1份   
連線    1份   

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit DQ=P2^3;//ds18b20與單片機連接口

  6. sbit RS=P2^5;//液晶控制線接口
  7. sbit RW=P2^6;
  8. sbit EN=P2^7;



  9. uchar data disdata[5];
  10. uint tvalue,CurrentT=0;//溫度值
  11. uchar tflag;//溫度正負標志

  12.                
  13. #define LCD_BUS P0

  14. sbit SetKey = P2^2;//設置按鍵
  15. sbit UpKey  = P2^1; //加按鍵
  16. sbit DnKey  = P2^0;//減按鍵
  17. sbit BEEP   = P2^4;//蜂鳴器

  18. sbit Heat  = P1^0;//加熱繼電器控制
  19. sbit Cool   = P1^1;//降溫繼電器控制


  20. unsigned char AlarmTempLow=10,AlarmTempTop=40,Set=0;







  21. void delayms(uint ms)                 //延時xx毫秒
  22. {
  23.          uchar i;
  24.         while(ms--)
  25.         {
  26.                  for(i=0;i<120;i++);
  27.         }
  28. }



  29. void command(uint com)         //LCD寫指令
  30. {
  31.    RS=0;                                  //RS為0
  32.    LCD_BUS=com;          //裝載指令
  33.    delayms(5);                 //延時5ms
  34.    EN=1;                                 //LCD使能
  35.    delayms(5);                //延時5ms
  36.    EN=0;                                //LCD不使能
  37. }

  38. void write_dat(uchar dat)          //LCD寫數據
  39. {
  40.    RS=1;                                        //RS為1
  41.    LCD_BUS=dat;                //裝載數據
  42.    delayms(5);                         //延時5ms
  43.    EN=1;                                         //LCD使能
  44.    delayms(5);                         //延時5ms
  45.    EN=0;                                         //LCD不使能
  46. }

  47. void writestring(uchar x,uchar y,uchar *s) //LCD 寫字符串
  48. {     
  49.         if (y == 0)  command(0x80 + x);     //表示第一行
  50.          else         command(0xC0 + x);      //表示第二行
  51.       
  52.          while (*s)                         //判斷是否字符串的結尾
  53.          {     
  54.      write_dat( *s);    //顯示當前字符
  55.                  s ++;                             //字符串地址加1
  56.          }
  57. }

  58. void writeChar(uchar x,uchar y,uchar s) //LCD 寫字符串
  59. {     
  60.         if (y == 0)  command(0x80 + x);     //表示第一行
  61.          else         command(0xC0 + x);      //表示第二行
  62.       
  63.          {     
  64.      write_dat( s);    //顯示當前字符
  65.          }
  66. }


  67. void LCD_Initial()                //LCD初始化
  68. {

  69.    EN=0;                                  //LCD不使能
  70.    RW=0;                                  //RW為0
  71.    command(0x38);                //發送初始化指令
  72.    command(0x0c);                //發送初始化指令
  73.    command(0x06);          //發送初始化指令
  74.    command(0x01);          //發送初始化指令
  75.    command(0x80+0x02);        //發送LCD初始位置
  76. }


  77. /*************************DS1820程序****************************/
  78. void delay_18B20(unsigned int i)//延時1微秒
  79. {
  80.    while(i--);
  81. }

  82. void ds1820rst(void)/*ds1820復位*/
  83. {
  84.         unsigned char x=0;
  85.         DQ = 1;          //DQ復位
  86.         delay_18B20(4); //延時
  87.         DQ = 0;          //DQ拉低
  88.         delay_18B20(100); //精確延時大于480us
  89.         DQ = 1;          //拉高
  90.         delay_18B20(40);
  91. }

  92. uchar ds1820rd(void)/*讀數據*/
  93. {
  94.         unsigned char i=0;
  95.         unsigned char dat = 0;
  96.         for (i=8;i>0;i--)
  97.         {   
  98.                 DQ = 0; //給脈沖信號
  99.                 dat>>=1;
  100.                 DQ = 1; //給脈沖信號
  101.                 if(DQ)
  102.                 dat|=0x80;
  103.                 delay_18B20(10);
  104.         }
  105.    return(dat);
  106. }

  107. void ds1820wr(uchar wdata)/*寫數據*/
  108. {
  109.         unsigned char i=0;
  110.    for (i=8; i>0; i--)  //寫一個字節數據到DS18B20
  111.    {
  112.                 DQ = 0;
  113.                 DQ = wdata&0x01;  //寫一位數據
  114.                 delay_18B20(10);  //延時
  115.                 DQ = 1;     //拉高數據線
  116.                 wdata>>=1;//準備下一位
  117.    }
  118. }

  119. unsigned int Read_Temperature(void)/*讀取溫度值并轉換*/
  120. {
  121.         uchar a,b;
  122.         ds1820rst();   
  123.         ds1820wr(0xcc);//*跳過讀序列號*/
  124.         ds1820wr(0x44);//*啟動溫度轉換*/
  125.         ds1820rst();   
  126.         ds1820wr(0xcc);//*跳過讀序列號*/
  127.         ds1820wr(0xbe);//*讀取溫度*/
  128.         a=ds1820rd();  //讀取低位數據
  129.         b=ds1820rd();  //讀取高位數據
  130.         tvalue=b;   
  131.         tvalue<<=8;
  132.         tvalue=tvalue|a;//取得16位數據
  133.    if(tvalue<0x0fff)   tflag=0;  //判斷是否正溫度
  134.    else   {tvalue=~tvalue+1;tflag=1;} //負溫度,數據取反,溫度標志位為1
  135.         tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
  136.         CurrentT=tvalue;//保存當前溫度
  137.         return(tvalue);//返回溫度值
  138. }

  139. void Display_Temperature()                //顯示溫度
  140. {
  141.         uchar flagdat;
  142.    disdata[0]=tvalue/1000+0x30;//百位數
  143.    disdata[1]=tvalue%1000/100+0x30;//十位數
  144.    disdata[2]=tvalue%100/10+0x30;//個位數
  145.    disdata[3]=tvalue%10+0x30;//小數位
  146.    
  147.    if(tflag==0)   flagdat=0x20;//正溫度不顯示符號
  148.    else   flagdat=0x2d;//負溫度顯示負號:-
  149.         if(tflag==1)
  150.         {
  151.                 writeChar(10,0,flagdat);//顯示符號位
  152.                 writeChar(11,0,disdata[0]);//顯示百位
  153.                 writeChar(12,0,disdata[1]);//顯示十位
  154.                 writeChar(13,0,disdata[2]);//顯示個位
  155.                 writeChar(14,0,0X2E);//顯示小數點
  156.                 writeChar(15,0,disdata[3]);//顯示小數位
  157.         }
  158.         else
  159.         {
  160.                 writeChar(10,0,disdata[0]);//顯示百位
  161.                 writeChar(11,0,disdata[1]);//顯示十位
  162.                 writeChar(12,0,disdata[2]);//顯示個位
  163.                 writeChar(13,0,0X2e);//顯示小數點
  164.                 writeChar(14,0,disdata[3]);//顯示小數位
  165.                 writeChar(15,0,' ');//顯示小數位
  166.         }
  167. }

  168. void SetFun(void) //進入設置參數子函數
  169. {
  170.         unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
  171.         if(SetKey==0)  //設置按鍵
  172.         {
  173.                 delayms(20);   //延時防抖
  174.                 if(SetKey==0)  //設置按鍵
  175.                 {
  176.                         if(Set<2)        Set++;   //設置按鍵次數累計
  177.                         else Set=0;
  178.                 }
  179.                 switch(Set) //根據設置按鍵次數,指向對應設置位置
  180.                 {
  181.                         case 0:  writestring(0,1," ");writestring(8,1," ");break;//清除設置符號
  182.                         case 1:        writestring(0,1,">");writestring(8,1," ");break;//指向設置下限
  183.                         case 2:        writestring(0,1," ");writestring(8,1,">");break;//指向設置上限
  184.                 }
  185.                 while(SetKey==0);//等待按鍵松開
  186.         }
  187.         
  188.         if((UpKey==0)&&(Set!=0))//加按鍵按下
  189.         {
  190.                 delayms(20);//延時防抖
  191.                 if(UpKey==0)//加按鍵按下
  192.                 {
  193.                         switch(Set)//根據設置按鍵次數,設置上下限
  194.                         {
  195.                                 case 1:        if(AlarmTempLow<99) AlarmTempLow++;else AlarmTempLow=99; break;//設置下限
  196.                                 case 2:        if(AlarmTempTop<99) AlarmTempTop++;else AlarmTempTop=99; break;//設置上限
  197.                         }
  198.                         i1 = AlarmTempLow/100;          //獲得下限溫度值的百位
  199.                    i2 = AlarmTempLow%100/10;         //獲得下限溫度值的十位
  200.                         i3 = AlarmTempLow%10;                 //獲得下限溫度值的個位
  201.                         
  202.                         i4 = AlarmTempTop/100;          //獲得上限溫度值的百位
  203.                    i5 = AlarmTempTop%100/10;         //獲得上限溫度值的十位
  204.                         i6 = AlarmTempTop%10;                 //獲得上限溫度值的個位
  205.                         writestring(5,1,"   ");    //清除之前的內容
  206.                         writestring(13,1,"     ");//清除之前的內容
  207.                         if(i1!=0)        writeChar(5,1,i1+'0');//在第二行第5位 ,顯示下限溫度值的百位
  208.                         if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');//在第二行第5位 ,顯示下限溫度值的十位
  209.                         if(i1!=0) writeChar(6,1,i2+'0');//在第二行第6位 ,顯示下限溫度值的十位
  210.                         if((i1==0)&&(i2==0))        writeChar(5,1,i3+'0');//在第二行第5位 ,顯示下限溫度值的個位
  211.                         else if((i1==0)&&(i2!=0))        writeChar(6,1,i3+'0');//在第二行第6位 ,顯示下限溫度值的個位
  212.                         if((i1!=0))         writeChar(7,1,i3+'0');//在第二行第7位 ,顯示下限溫度值的個位
  213.                         
  214.                         if(i4!=0)        writeChar(13,1,i4+'0');//在第二行第13位 ,顯示上限溫度值的百位
  215.                         if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');//在第二行第13位 ,顯示上限溫度值的十位
  216.                         if(i4!=0) writeChar(14,1,i5+'0');//在第二行第14位 ,顯示上限溫度值的十位
  217.                         if((i4==0)&&(i5==0))        writeChar(13,1,i6+'0');//在第二行第13位 ,顯示上限溫度值的個位
  218.                         else if((i4==0)&&(i5!=0))        writeChar(14,1,i6+'0');//在第二行第14位 ,顯示上限溫度值的個位
  219.                         if((i4!=0)) writeChar(15,1,i6+'0');//在第二行第15位 ,顯示上限溫度值的個位
  220.                         while(UpKey==0);//等待按鍵松開
  221.                 }
  222.         }
  223.         
  224.         if((DnKey==0)&&(Set!=0))//減按鍵
  225.         {
  226.                 delayms(20);
  227.                 if(DnKey==0)//減按鍵
  228.                 {
  229.                         switch(Set)//根據設置按鍵次數,設置上下限
  230.                         {
  231.                                 case 1:        if(AlarmTempLow>0) AlarmTempLow--;else AlarmTempLow=0; break;//設置下限
  232.                                 case 2:        if(AlarmTempTop>0) AlarmTempTop--;else AlarmTempTop=0; break;//設置上限
  233.                         }
  234.                         i1 = AlarmTempLow/100;          //獲得下限溫度值的百位
  235.                    i2 = AlarmTempLow%100/10;         //獲得下限溫度值的十位
  236.                         i3 = AlarmTempLow%10;                 //獲得下限溫度值的個位
  237.                         
  238.                         i4 = AlarmTempTop/100;          //獲得上限溫度值的百位
  239.                    i5 = AlarmTempTop%100/10;         //獲得上限溫度值的十位
  240.                         i6 = AlarmTempTop%10;                 //獲得上限溫度值的個位
  241.                         writestring(5,1,"   ");    //清除之前的內容
  242.                         writestring(13,1,"     ");//清除之前的內容
  243.                         if(i1!=0)        writeChar(5,1,i1+'0');//在第二行第5位 ,顯示下限溫度值的百位
  244.                         if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');//在第二行第5位 ,顯示下限溫度值的十位
  245.                         if(i1!=0) writeChar(6,1,i2+'0');//在第二行第6位 ,顯示下限溫度值的十位
  246.                         if((i1==0)&&(i2==0))        writeChar(5,1,i3+'0');//在第二行第5位 ,顯示下限溫度值的個位
  247.                         else if((i1==0)&&(i2!=0))        writeChar(6,1,i3+'0');//在第二行第6位 ,顯示下限溫度值的個位
  248.                         if((i1!=0))         writeChar(7,1,i3+'0');//在第二行第7位 ,顯示下限溫度值的個位
  249.                         
  250.                         if(i4!=0)        writeChar(13,1,i4+'0');//在第二行第13位 ,顯示上限溫度值的百位
  251.                         if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');//在第二行第13位 ,顯示上限溫度值的十位
  252.                         if(i4!=0) writeChar(14,1,i5+'0');//在第二行第14位 ,顯示上限溫度值的十位
  253.                         if((i4==0)&&(i5==0))        writeChar(13,1,i6+'0');//在第二行第13位 ,顯示上限溫度值的個位
  254.                         else if((i4==0)&&(i5!=0))        writeChar(14,1,i6+'0');//在第二行第14位 ,顯示上限溫度值的個位
  255.                         if((i4!=0)) writeChar(15,1,i6+'0');//在第二行第15位 ,顯示上限溫度值的個位
  256.                         
  257.                         while(DnKey==0);
  258.                 }
  259.         }
  260. }



  261. void Alarm(void)//報警子函數
  262. {
  263.         if((CurrentT>=(AlarmTempTop*10))||(CurrentT<=(AlarmTempLow*10))||(tflag==1)) //超出設定范圍
  264.                 {
  265.                         BEEP=0;//啟動報警
  266.                 }
  267.                 else //在設定范圍內
  268.                 {
  269.                         BEEP=1;//取消報警
  270.                 }
  271. }
  272. ……………………

  273. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


全部資料51hei下載地址(dsn文件 仿真是用Proteus7.5畫的):
恒溫控制.7z (3.38 MB, 下載次數: 217)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:424598 發表于 2021-7-16 17:10 來自手機 | 只看該作者
樓主發貼專業,收藏,有空改成帶屏蔽測溫的。感謝分享
回復

使用道具 舉報

板凳
ID:983990 發表于 2021-11-27 09:44 | 只看該作者
樓主我這顯示DS18b20的數據錯誤是咋回事
回復

使用道具 舉報

地板
ID:440028 發表于 2022-1-6 08:58 | 只看該作者
數據資料比較詳細,這5分應該是值
回復

使用道具 舉報

5#
ID:795562 發表于 2022-1-27 22:27 | 只看該作者
這個很有指導意義
回復

使用道具 舉報

6#
ID:336378 發表于 2022-3-16 08:13 | 只看該作者
不是pid控制的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合色综合色综合 | 久99久视频 | 精品日韩在线 | 男女视频免费 | 国产精品久久久久久久久久 | 色一情一乱一伦一区二区三区 | 国产一区二区三区亚洲 | 激情91| 一区二区三区四区国产 | 欧美日韩综合视频 | 欧美精品一区三区 | 天天操天天干天天爽 | 欧美成人免费在线视频 | 精品婷婷 | 成人黄色电影免费 | 欧美特级黄色 | 一级片在线免费看 | 国产精品一区久久久 | 久夜精品 | 九色 在线 | 亚洲精品久久久久久国产精华液 | 欧美高清性xxxxhdvideosex | 黑人巨大精品欧美一区二区免费 | 国内精品久久影院 | 欧美一区二区在线看 | 欧美一级视频在线观看 | 欧美在线观看一区 | 成人影 | 91精品国产91久久久久青草 | 在线亚州| 一区二区视频在线 | 黑色丝袜三级在线播放 | 一区二区三区精品 | 国产精品一区二区av | 久久里面有精品 | 羞羞视频网页 | 国产黄色在线观看 | av激情在线 | 欧美一区二区免费在线 | 国产特级毛片aaaaaa | 一级黄在线观看 |