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

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

QQ登錄

只需一步,快速開始

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

51單片機(jī)溫度測(cè)量(數(shù)碼管)控制器電路圖PCB與源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我做的51單片機(jī)溫度探測(cè)控制器
用了一個(gè)多星期
附件包括原理圖和程序
基本原理是  用DS18B20溫度傳感器檢測(cè)溫度 然后經(jīng)過51控制制冷制熱設(shè)備開關(guān)
并且實(shí)時(shí)顯示溫度

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機(jī)源程序如下:
  1. #include<reg52.h>     //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  2. #include<math.h>
  3. #include<INTRINS.H>

  4. #define uchar unsigned char
  5. #define uint   unsigned int

  6. /******************************************************************/
  7. /*                    定義端口                                    */
  8. /******************************************************************/
  9. sbit buzzer=P1^0;//蜂鳴器端口
  10. sbit led1=P1^1;  //led指示燈,當(dāng)前溫度高于設(shè)置的最高溫度時(shí)點(diǎn)亮
  11. sbit led2=P1^2;  //led指示燈,當(dāng)前溫度低于設(shè)置的最低溫度時(shí)點(diǎn)亮
  12. sbit DQ=P1^4;         //ds18b20 端口

  13. sbit key1=P3^4;  //按鍵
  14. sbit key2=P3^5;
  15. sbit key3=P3^6;
  16. sbit key4=P3^7;

  17. /******************************************************************/
  18. /*                    全局變量                                    */
  19. /******************************************************************/
  20. uint temp;//當(dāng)前溫度值
  21. uchar TempH=0,TempL=0;
  22. int temp_max,temp_min;//設(shè)定溫度的最大值和最小值
  23. uchar flag_get,count,num;
  24. uchar tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段碼
  25. uchar  str[4];//四位數(shù)碼管顯示字符
  26. uchar display_mod;//數(shù)碼管顯示模式
  27. /******************************************************************/
  28. /*                   函數(shù)聲明                                     */
  29. /******************************************************************/
  30. unsigned int ReadTemperature(void);//讀取溫度函數(shù)
  31. void Init_DS18B20(void);//18b20初始化函數(shù)
  32. unsigned char ReadOneChar(void);//18B20讀一個(gè)字節(jié)
  33. void WriteOneChar(unsigned char dat);//18B20寫一個(gè)字節(jié)
  34. void delay(unsigned int i);//短延時(shí)
  35. void delay_ms(uint z);//長(zhǎng)延時(shí)
  36. void alarm();//報(bào)警
  37. void keyscan();//鍵盤掃描
  38. /******************************************************************/
  39. /*                    主函數(shù)                                      */
  40. /******************************************************************/
  41. main()
  42. {
  43.         display_mod=0;//顯示當(dāng)前溫度
  44.         temp_min=10;//設(shè)置最低溫  
  45.         temp_max=40;//設(shè)置最高溫
  46.         TMOD|=0x01;//定時(shí)器設(shè)置
  47.         TH0=0xef;  //定時(shí)器初值
  48.         TL0=0xf0;
  49.         IE=0x82;//EA=1,ET0=1
  50.         TR0=1;  //開定時(shí)器
  51.         P2=0xff;  
  52.         count=0;
  53.         while(1)
  54.         {
  55.                   keyscan();//獨(dú)立按鍵掃描
  56.                        
  57.                 if(flag_get==1)
  58.                 {
  59.                         flag_get=0;// 獲取溫度標(biāo)志清零
  60.                         temp=ReadTemperature();//讀溫度值
  61.                 }                       

  62.                 if(display_mod==0)
  63.                 {
  64.                         if(temp&0x8000)
  65.                      {
  66.                              str[0]=0xbf;//負(fù)號(hào)標(biāo)志
  67.                              temp=~temp; //取反加1
  68.                                  temp +=1;
  69.                          }
  70.                         else
  71.                         {
  72.                                 str[0]=0xff;
  73.                         }
  74.                         TempH=temp>>4;
  75.                           TempL=temp&0x0F;
  76.                           TempL=TempL*6/10;//小數(shù)近似處理
  77.                        
  78.                         str[1]=tab[(TempH%100)/10]; //十位溫度
  79.                            str[2]=tab[(TempH%100)%10]&0x7f; //個(gè)位溫度,帶小數(shù)點(diǎn)
  80.                            str[3]=tab[TempL];                       
  81.                 }
  82.                 else if(display_mod==1)//顯示最低溫
  83.                 {
  84.                         str[0]=0xc7;//顯示L
  85.                         str[1]=tab[temp_min/100]; //溫度百位
  86.                            str[2]=tab[(temp_min%100)/10]; //溫度十位
  87.                            str[3]=tab[temp_min%10];//溫度個(gè)位
  88.                 }
  89.                 else if(display_mod==2)//顯示最高溫
  90.                 {
  91.                         str[0]=0x89;//顯示H
  92.                         str[1]=tab[temp_max/100]; //溫度百位
  93.                            str[2]=tab[(temp_max%100)/10]; //溫度十位
  94.                            str[3]=tab[temp_max%10];//溫度個(gè)位       
  95.                 }
  96.                 alarm();
  97.           }
  98. }


  99. /******************************************************************/
  100. /*                  定時(shí)器中斷                                    */
  101. /******************************************************************/
  102. void tim(void) interrupt 1 using 1//中斷,用于數(shù)碼管掃描和溫度檢測(cè)間隔
  103. {
  104.         TH0=0xea;//定時(shí)器重裝值
  105.         TL0=0xf0;
  106.         num++;
  107.         if (num==100)
  108.     {
  109.                 num=0;
  110.                   flag_get=1;//獲取溫度標(biāo)志位有效
  111.         }
  112.         count++;
  113.         if(count==1)
  114.            {
  115.                 P2=0Xfe;
  116.             P0=str[0];
  117.         }//數(shù)碼管掃描
  118.         if(count==2)
  119.    {
  120.                 if(str[1]==tab[0])
  121.                         str[1]=0xff;//顯示為空
  122.                    P2=0Xfd;
  123.             P0=str[1];
  124.         }
  125.         if(count==3)
  126.    {
  127.                 P2=0Xfb;
  128.              P0=str[2];
  129.    }
  130.         if(count==4)
  131.    {
  132.                 P2=0Xf7;
  133.              P0=str[3];
  134.                 count=0;
  135.    }
  136. }
  137. /******************************************************************/
  138. /*                    長(zhǎng)延時(shí)函數(shù)                                  */
  139. /******************************************************************/
  140. void delay_ms(uint z) //長(zhǎng)延時(shí)函數(shù)
  141. {
  142.         uint x,y;
  143.         for(x=z;x>0;x--)
  144.                 for(y=110;y>0;y--);
  145. }
  146. /******************************************************************/
  147. /*                    短延時(shí)函數(shù)                                  */
  148. /******************************************************************/
  149. void delay(unsigned int i)//短延時(shí)函數(shù)
  150. {
  151.         while(i--);
  152. }

  153. /******************************************************************/
  154. /*                    初始化                                      */
  155. /******************************************************************/
  156. void Init_DS18B20(void)
  157. {
  158.         unsigned char x=0;
  159.         DQ = 1;    //DQ復(fù)位
  160.         delay(8);  //稍做延時(shí)
  161.         DQ = 0;    //單片機(jī)將DQ拉低
  162.         delay(80); //精確延時(shí) 大于 480us
  163.         DQ = 1;    //拉高總線
  164.         delay(10);
  165.         x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  166.         delay(5);
  167. }

  168. /******************************************************************/
  169. /*                    讀一個(gè)字節(jié)                                  */
  170. /******************************************************************/
  171. unsigned char ReadOneChar(void)
  172. {
  173.         unsigned char i=0;
  174.         unsigned char dat = 0;
  175.         for (i=8;i>0;i--)
  176.         {
  177.                   DQ = 0; // 給脈沖信號(hào)
  178.                   dat>>=1;
  179.                   DQ = 1; // 給脈沖信號(hào)
  180.                   if(DQ)
  181.                            dat|=0x80;
  182.                   delay(5);
  183.         }
  184.         return(dat);
  185. }

  186. /******************************************************************/
  187. /*                 寫一個(gè)字節(jié)                                     */
  188. /******************************************************************/
  189. void WriteOneChar(unsigned char dat)
  190. {
  191.         unsigned char i=0;
  192.         for (i=8; i>0; i--)
  193.         {
  194.           DQ = 0;
  195.           DQ = dat&0x01;
  196.           delay(5);
  197.           DQ = 1;
  198.           dat>>=1;
  199.         }
  200.         delay(5);
  201. }

  202. /******************************************************************/
  203. /*                   讀取溫度                                     */
  204. /******************************************************************/
  205. unsigned int ReadTemperature(void)
  206. {       
  207.         unsigned char a=0;
  208.         unsigned int b=0;
  209.         unsigned int t=0;
  210.         Init_DS18B20();
  211.         WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
  212.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  213.         delay(200);
  214.         Init_DS18B20();
  215.         WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
  216.         WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  217.         a=ReadOneChar();   //低位
  218.         b=ReadOneChar();   //高位
  219.         b<<=8;
  220.         t=a+b;
  221.         return(t);
  222. }

  223. /******************************************************************/
  224. /*              獨(dú)立鍵盤掃描函數(shù)并顯示設(shè)定的溫度                  */
  225. /******************************************************************/
  226. void keyscan()  
  227. {       
  228.         static uchar keynum;//用于切換界面時(shí)按鍵計(jì)數(shù)
  229.         P3=0xff;//拉高P3口,以讀取P3口的值
  230.         if(key4==0)//設(shè)置鍵
  231.         {
  232.                 delay_ms(5);//延時(shí)消抖
  233.                 if(key4==0)
  234.                 {
  235.                         keynum++;
  236.                         keynum%=2;//在0、1間變化
  237.                         if(keynum==1)
  238.                         {
  239.                                 display_mod=1;
  240.                         }
  241.                         else
  242.                         {
  243.                                 display_mod=2;
  244.                         }
  245.                 }
  246.                 while(!key4);//松手檢測(cè)
  247.         }
  248.         if(key3==0)//確定鍵
  249.         {
  250.                 delay_ms(5);
  251.                 if(key3==0)
  252.                 {
  253.                         keynum=0;
  254.                         display_mod=0;
  255.                 }
  256.                 while(!key3);
  257.         }
  258.         if(key2==0)//加鍵
  259.         {
  260.                 delay_ms(5);//延時(shí)消抖
  261.                 if(key2==0)
  262.                 {
  263.                         if(display_mod==2)
  264.                         {
  265.                                 temp_max++;
  266.                                 if(temp_max>=99)
  267.                                         temp_max=99;
  268.                         }
  269.                         if(display_mod==1)
  270.                         {
  271.                                 temp_min++;
  272.                                 if(temp_min>=temp_max)
  273.                                         temp_min=temp_max;
  274.                         }
  275.                        
  276.                 }
  277.                 while(!key2);//松手檢測(cè)
  278.         }
  279.         if(key1==0)//減鍵
  280.         {
  281.                 delay_ms(5);
  282.                 if(key1==0)
  283.                 {
  284.                         if(display_mod==2)
  285.                         {
  286.                                 temp_max--;
  287.                                 if(temp_max<=temp_min)
  288.                                         temp_max=temp_min;
  289.                         }
  290.                         if(display_mod==1)
  291.                         {
  292.                                 temp_min--;
  293.                                 if(temp_min<=0)
  294. ……………………

  295. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
程序.rar (38.52 KB, 下載次數(shù): 121)
DXP格式.rar (431.81 KB, 下載次數(shù): 140)




評(píng)分

參與人數(shù) 1黑幣 +4 收起 理由
關(guān)外秀才 + 4 贊一個(gè)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:404454 發(fā)表于 2019-7-4 23:46 | 只看該作者
謝謝分享。
回復(fù)

使用道具 舉報(bào)

板凳
ID:585189 發(fā)表于 2019-7-16 16:04 | 只看該作者
大佬厲害啊,要是說無線測(cè)量該去了解下什么新的知識(shí)呢
回復(fù)

使用道具 舉報(bào)

地板
ID:610984 發(fā)表于 2019-9-29 19:52 | 只看該作者
謝謝大咖!
回復(fù)

使用道具 舉報(bào)

5#
ID:667671 發(fā)表于 2019-12-18 19:17 | 只看該作者
優(yōu)秀。是急需的文件。贊一個(gè)
回復(fù)

使用道具 舉報(bào)

6#
ID:1065553 發(fā)表于 2023-3-8 14:26 來自手機(jī) | 只看該作者
有proteus文件嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人精品国产 | 香蕉一区二区 | 北条麻妃99精品青青久久主播 | 国产精品国产三级国产aⅴ中文 | 久久精品视频网站 | 一级片免费网站 | 欧美一区二区在线 | 嫩草网 | 国产高清在线 | 久久精品国产99国产 | 人人爱干 | 日韩一区不卡 | 99久久99久久精品国产片果冰 | 国产欧美日韩久久久 | 中文字幕在线二区 | 国产一级黄色网 | 日本一区二区三区免费观看 | 91国内精精品久久久久久婷婷 | 在线一区观看 | 欧美一区二区三区精品免费 | 午夜影院在线观看免费 | 国产综合精品一区二区三区 | 午夜小电影 | 国产美女在线精品免费 | 午夜精品福利视频 | 亚洲综合色视频在线观看 | 国产免费一区二区三区 | 天天看天天干 | 国产精品亚洲成在人线 | 亚洲欧洲成人av每日更新 | 一级毛片在线看 | 精品久久久久久久久久久久久久 | 日韩在线一区二区三区 | 色欧美片视频在线观看 | 瑟瑟激情| 中国美女一级黄色片 | 成人亚洲性情网站www在线观看 | 一区二区三区视频在线免费观看 | 国产成人午夜高潮毛片 | 精品在线视频播放 | 天堂网avav |