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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機溫控儀的仿真圖 編程 PCB文件與電路原理圖 可用作練手

[復制鏈接]
跳轉到指定樓層
樓主
已經添加附件,大家各取所需.51單片機控制的溫控儀設計資料


溫控儀電路原理圖:


pcb工程文件:


溫控儀單片機源程序如下:
  1. #include<reg52.h>
  2. #include"eeprom.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit wei1 = P1^3;                     //數碼管位選
  6. sbit wei2 = P1^2;
  7. sbit wei3 = P1^1;
  8. sbit wei4 = P1^0;
  9. sbit DQ = P3^2;                 //溫度
  10. sbit k1=P3^7;                                //功能按鍵
  11. sbit k2=P3^6;                                  // 增加鍵
  12. sbit k3=P3^5;                                //減少鍵
  13. uchar TL,TH,TN,TD;     
  14. sbit beep=P1^6;
  15. uchar count,num,m,s1num=0;                                              //溫度值
  16. uchar htemp=33,ltemp=15;                                        //溫度上下線初始化
  17. float f_temp;
  18. int key_delay=0;
  19. const int key_count=200;
  20. bit yyp=1,halarm=0,lalarm=0;
  21. uchar code TAB[]={0xC0, 0xF9, 0xA4,  0xB0,   0x99,  0x92,   0x82,  0xF8, 0x80,  0x90,   0x88,   0x83, 0xC6,  0xA1, 0x86,  0x8E};
  22. uchar code TAB1[]={0xbf,0x89,0xc7,0xC6};         //三個依次是 - H L         后面兩個是溫度符號大寫的C
  23. /****毫秒級延時函數*****/
  24. void delay(uint x)
  25. {
  26.   uint i,j;
  27.   for(i=x;i>0;i--)
  28.      for(j=110;j>0;j--);
  29. }
  30. void delay1(uchar i)
  31. {
  32.     uchar j=100;
  33.         for(i;i>0;i--)
  34.           for(j;j>0;j--)
  35.             {;}
  36. }
  37. void di()
  38. {
  39.         beep=0;
  40.         delay(100);
  41.         beep=1;
  42. }
  43. /***********ds18b20延遲子函數(晶振12MHz )*******/
  44. ///////////////////////////////////////////////////
  45. void delay_18B20(unsigned int i)
  46. {
  47.         while(i--);
  48. }
  49. ///////////////////////////////////////////////////
  50. /**********ds18b20初始化函數**********************/
  51. ////////////////////////////////////////////////////
  52. void Init_DS18B20(void)
  53. {
  54.          unsigned char x=0;
  55.          DQ = 1;                                                          //DQ復位
  56.          delay_18B20(8);                                                  //稍做延時
  57.          DQ = 0;                                                          //單片機將DQ拉低
  58.          delay_18B20(80);                                                 //精確延時 大于 480us
  59.          DQ = 1;                                                          //拉高總線
  60.          delay_18B20(14);
  61.          x=DQ;                                                            //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  62.          delay_18B20(20);
  63. }
  64. ////////////////////////////////////////////
  65. /***********ds18b20讀一個字節**************/  
  66. ///////////////////////////////////////////
  67. unsigned char ReadOneChar(void)
  68. {
  69.         uchar i=0;
  70.         uchar dat = 0;
  71.         for (i=8;i>0;i--)
  72.          {
  73.                   DQ = 0;                                                         // 給脈沖信號
  74.                   dat>>=1;
  75.                   DQ = 1;                                                         // 給脈沖信號
  76.                   if(DQ)
  77.                   dat|=0x80;
  78.                   delay_18B20(4);
  79.          }
  80.         return(dat);
  81. }
  82. //////////////////////////////////////////////////
  83. /*************ds18b20寫一個字節****************/  
  84. //////////////////////////////////////////////////
  85. void WriteOneChar(uchar dat)
  86. {
  87.         unsigned char i=0;
  88.         for (i=8; i>0; i--)
  89.         {
  90.                   DQ = 0;
  91.                 DQ = dat&0x01;
  92.             delay_18B20(5);
  93.                 DQ = 1;
  94.             dat>>=1;
  95. }
  96. }

  97. /**************讀取ds18b20當前溫度************/
  98. //////////////////////////////////////////////
  99. void ReadTemp()
  100. {
  101.        
  102.         Init_DS18B20();
  103.         WriteOneChar(0xCC);            // 跳過讀序號列號的操作
  104.         WriteOneChar(0x44);         // 啟動溫度轉換

  105.         Init_DS18B20();
  106.         delay(1);
  107.         WriteOneChar(0xCC);         //跳過讀序號列號的操作
  108.         WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度

  109.         TL=ReadOneChar();    //先讀的是溫度值低位
  110.         TH=ReadOneChar();    //接著讀的是溫度值高位
  111.         TN=TH*16+TL/16;         //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
  112.                                         //這樣得出的是溫度的整數部分,小數部分被丟棄了
  113.                                           
  114.         TD=(TL%16)*10/16;       //計算溫度的小數部分,將余數乘以10再除以16取整,
  115.                                         //這樣得到的是溫度小數部分的第一位數字(保留1位小數)          
  116. }
  117. ////////////////////////////////////////////////
  118. void get_wendu(uchar m)
  119. {
  120.         uchar ws,wg;
  121.         ws=m/10;
  122.         wg=m%10;

  123.         wei1=0;                          //讀取溫度的十位和個位
  124.         P0=TAB[ws];
  125.         delay(2);
  126.         wei1=1;
  127.         P0=0xff;

  128.         wei2=0;
  129.         P0=TAB[wg]& 0x7f;
  130.         delay(2);
  131.         wei2=1;       
  132.         P0=0xff;
  133.        
  134. }
  135. void get_wendu2(uchar m)
  136. {
  137.         wei3=0;
  138.         P0=TAB[m];
  139.         delay(2);
  140.         wei3=1;       
  141.         P0=0xff;
  142.        
  143.         wei4=0;
  144.         P0=TAB1[3];
  145.         delay(2);
  146.         wei4=1;       
  147.         P0=0xff;
  148.        
  149.        
  150. }
  151. /////////調最高溫度調用的函數//////
  152. void hdisplay(uchar dat)                                       
  153. {       
  154.         uchar fs,fg;
  155.         wei1=0;                          //讀取最高溫度符號“H-”
  156.         P0=TAB1[1];
  157.         delay(5);
  158.         wei1=1;
  159.         P0=0xff;
  160.                                                        
  161.         wei2=0;
  162.         P0=TAB1[0];
  163.         delay(5);
  164.         wei2=1;       
  165.         P0=0xff;       
  166.                
  167.         fs=dat/10;
  168.         fg=dat%10;
  169.         wei3=0;
  170.         P0=TAB[fs];
  171.         delay(5);
  172.         wei3=1;
  173.         P0=0xff;

  174.         wei4=0;
  175.         P0=TAB[fg];
  176.         delay(5);
  177.         wei4=1;               
  178.         P0=0xff;
  179. }
  180. /////////調最低溫度調用的函數//////
  181. void ldisplay(uchar dat)                                       
  182. {       
  183.         uchar fs,fg;
  184.         wei1=0;                          //讀取最低溫度符號“L=”
  185.         P0=TAB1[2];
  186.         delay(2);
  187.         wei1=1;
  188.         P0=0xff;
  189.                                                        
  190.         wei2=0;
  191.         P0=TAB1[0];
  192.         delay(2);
  193.         wei2=1;       
  194.         P0=0xff;       
  195.                
  196.         fs=dat/10;
  197.         fg=dat%10;
  198.         wei3=0;
  199.         P0=TAB[fs];
  200.         delay(2);
  201.         wei3=1;
  202.         P0=0xff;

  203.         wei4=0;
  204.         P0=TAB[fg];
  205.         delay(2);
  206.         wei4=1;       
  207.         P0=0xff;       
  208. }
  209. /****按鍵掃描******/
  210. void keyscan()
  211. {
  212.         if(k1==0)
  213.         {
  214.                 delay(10);
  215.                 if(k1==0)
  216.                 {
  217.                         yyp=0;
  218.                         s1num++;
  219.                         while(!k1);        //等待按鍵釋放
  220.                         di();
  221.                         htemp=byte_read(0x2200);
  222.                         ltemp=byte_read(0x2000);
  223.                         switch(s1num)
  224.                         {
  225.                                 case 1:break;
  226.                                 case 2:break;
  227.                                 case 3:if(s1num==3)s1num=0;yyp=1;
  228.                                                 break;
  229.                         }

  230.                          
  231.                
  232.                 }
  233.         }
  234.         if(s1num!=0)
  235.         {
  236.                 if(k2==0)
  237.                 {
  238.                         delay(10);
  239.                         if(k2==0)
  240.                         {
  241.                                 do
  242.                                 {
  243.                                         delay1(10);
  244.                                 }
  245.                                 while((!k2)&(key_delay++<key_count));        ///等待按鍵釋放
  246.                                 di();
  247.                                 switch(s1num)
  248.                         {
  249.                                         case 1: htemp++;
  250.                                                         if(htemp==99)htemp=0;
  251.                                                         hdisplay(htemp);       
  252.                                                         SectorErase(0x2200);//擦除扇區
  253.                                                            byte_write(0x2200,htemp);//重新寫入數據
  254.                                                         break;
  255.                                         case 2: ltemp++;
  256.                                                         if(ltemp==99)ltemp=0;
  257.                                                         ldisplay(ltemp);
  258.                                                         SectorErase(0x2000);//擦除扇區
  259.                                                            byte_write(0x2000,ltemp);//重新寫入數據
  260.                                                     break;
  261.                                 }
  262.                         }
  263.                 }
  264.                 if(k3==0)
  265.                 {
  266.                         delay(10);
  267.                         if(k3==0)
  268.                         {
  269.                                 do
  270.                                 {
  271.                                         delay1(10);
  272.                                 }
  273.                                 while((!k3)&(key_delay++<key_count));                //等待按鍵釋放
  274.                                 di();
  275.                                 switch(s1num)
  276.                         {
  277.                                         case 1: htemp--;
  278.                                                         if(htemp==0)htemp=99;
  279.                                                         hdisplay(htemp);
  280.                                                         SectorErase(0x2200);//擦除扇區
  281.                                                            byte_write(0x2200,htemp);//重新寫入數據       
  282.                                                         break;
  283.                                         case 2: ltemp--;
  284.                                                         if(ltemp==0)ltemp=99;
  285.                                                         ldisplay(ltemp);
  286.                                                         SectorErase(0x2000);//擦除扇區
  287.                                                            byte_write(0x2000,ltemp);//重新寫入數據
  288.                                                     break;
  289.                                 }
  290.                         }
  291.                 }
  292.         }
  293. }
  294. ///////////////////////////////////////////////////////////
  295. void baojing()
  296. {
  297.                         if((TN>=htemp)||(TN<=ltemp))                //溫度高于設置最大溫度
  298.                         {
  299. ……………………

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

所有資料51hei提供下載:
溫控資料.zip (12.91 MB, 下載次數: 41)




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

使用道具 舉報

沙發
ID:87193 發表于 2018-1-30 14:22 | 只看該作者
具體功能的實現能否介紹詳細一點呢
回復

使用道具 舉報

板凳
ID:280260 發表于 2018-1-31 14:09 | 只看該作者
lemon0210 發表于 2018-1-30 14:22
具體功能的實現能否介紹詳細一點呢

溫度控制 可設置低高溫超過區間 蜂鳴器報警 自動檢測溫度
回復

使用道具 舉報

地板
ID:273691 發表于 2018-2-25 11:03 | 只看該作者
大神,為什么我下載的文件仿真的時候調溫度上限下限也會跟著變,調下限上限也跟著變,要怎么辦
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频免费在线 | 欧美综合一区二区 | 色综合久 | 久久国产传媒 | 久久精品久久久久久 | 久久久精品一区二区三区 | 粉嫩一区二区三区国产精品 | 亚洲成av人片在线观看 | www.婷婷亚洲基地 | 午夜精品一区二区三区在线视 | 免费观看成人鲁鲁鲁鲁鲁视频 | 91精品国产91久久久久久丝袜 | 国产成人免费视频 | 伊人狠狠干 | 黄色一级视频 | 久久99国产精一区二区三区 | 亚洲精品二区 | 丁香一区二区 | 欧美一区二区三区在线播放 | 一区二区三区在线播放 | 精品国产区 | 国产一区二区三区视频免费观看 | av永久免费 | 亚洲高清在线播放 | 天堂av在线影院 | 欧美午夜视频 | 精品国产一区二区三区久久久久久 | 国产一级特黄真人毛片 | 风间由美一区二区三区在线观看 | 欧美专区在线视频 | 亚洲国产小视频 | 欧美一级免费黄色片 | 日韩快播电影网 | 91.com视频 | 伊人网综合在线观看 | 日本免费一区二区三区四区 | 免费成人国产 | 国产免费看 | 天天狠狠 | 欧美中文字幕一区 | 精品国产乱码久久久 |