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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3982|回復(fù): 3
收起左側(cè)

基于STC89C51單片機(jī)的溫度測(cè)量?jī)x表程序

[復(fù)制鏈接]
ID:274459 發(fā)表于 2020-12-23 22:25 | 顯示全部樓層 |閱讀模式
使用模塊:STC89C51,DS18B20溫度傳感器模塊,LCD1602

仿真

仿真

實(shí)物圖片

實(shí)物圖片


單片機(jī)源程序如下:
  1. #include<reg51.h>                                                //包含reg52.h庫(kù)文件
  2. #include<math.h>                                                //包含絕對(duì)值函數(shù)
  3. #define uint unsigned int                                //宏定義uint
  4. #define uchar unsigned char                                //宏定義uchar
  5. sbit lcden=P2^7;                                                //液晶使能端
  6. sbit lcdrw=P2^6;
  7. sbit lcdrs=P2^5;                                                //液晶數(shù)據(jù)命令選擇端選擇寫(xiě)數(shù)據(jù)還是寫(xiě)命令
  8. sbit DQ = P3^4;                         //通過(guò)DQ口讀取溫度值

  9. uchar temp_value,num,fig,s1num,figh,figl,t;  //設(shè)置全局無(wú)符號(hào)字符型變量
  10. char h,l;                                                                //設(shè)置全局有符號(hào)字符型變量
  11. void delay(uint z);                                                //申明延時(shí)程序
  12. void init();                                                        //申明LCD初始化程序
  13. void write_com(uchar com);                                //申明寫(xiě)命令程序
  14. void write_data(uchar date);                        //申明寫(xiě)數(shù)據(jù)程序
  15. //void keyscan();                                                    //申明按鍵掃描程序
  16. void write_hl(uchar add,char date);            //申明設(shè)置的最高低溫度值在LCD上顯示程序
  17. void write_temp_value(uchar add,char date);        //申明溫度值在LCD上顯示程序
  18. void delay_18B20(unsigned int i);                //申明延時(shí)程序
  19. void Init_DS18B20(void);                                //申明DS18B20初始化程序
  20. unsigned char ReadOneChar(void);                //申明ds18b20讀一個(gè)字節(jié)
  21. void WriteOneChar(uchar dat);                        //申明ds18b20讀一個(gè)字節(jié)
  22. void ReadTemp(void);                                        //申明讀取ds18b20當(dāng)前溫度
  23. void comp();
  24. void main()
  25. {
  26.         init();                                                                //LCD初始化
  27.         Init_DS18B20();                                                //DS18B20初始化
  28.         while(1)                                                        //大循環(huán)
  29.         {
  30. //                if(s1==0||s1num>=1)
  31. //                {        keyscan();                                        //按鍵掃描
  32. //                }
  33. //        else{
  34.                 ReadTemp();                                        //讀取溫度值
  35.                         write_temp_value(0,temp_value);        //LCD顯示溫度值
  36.                 }
  37.                 comp();               
  38.         }
  39. //}

  40. void delay(uint z)                                                //延時(shí)程序
  41. {
  42.         uint x,y;
  43.         for(x=z;x>0;x--)
  44.         for(y=110;y>0;y--);
  45. }



  46. void init()                                                //LCD初始化程序
  47. {  
  48.         lcden=0;
  49.         lcdrw=0;
  50.         write_com(0x38);                         //設(shè)置16x2 顯示5x7 點(diǎn)陣,8 位數(shù)據(jù)接口
  51.         write_com(0x0c);                 //設(shè)置開(kāi)始顯示不顯示光標(biāo)
  52.         write_com(0x06);                         //寫(xiě)一個(gè)字符后地址指針加1
  53.         write_com(0x01);                         //顯示清零數(shù)據(jù)指針清零
  54.         write_com(0x80);                         //將數(shù)據(jù)指針第一行第一個(gè)字處,
  55.         
  56.         write_com(0x80+9);                         //定義當(dāng)前指針位置
  57.         write_data('H');                                 //寫(xiě)入
  58.         write_data(':');                                 //寫(xiě)入
  59.         write_data('+');                                 //寫(xiě)入
  60.         write_data('2');                                 //寫(xiě)入
  61.         write_data('0');                                 //寫(xiě)入
  62.         write_data(0xdf);                                 //寫(xiě)入°
  63.         write_data('C');                                 //寫(xiě)入C
  64.         write_com(0x80+9+0x40);                  //定義當(dāng)前指針位置
  65.         write_data('L');                                 //寫(xiě)入
  66.         write_data(':');                                 //寫(xiě)入
  67.         write_data('+');                                 //寫(xiě)入
  68.         write_data('1');                                 //寫(xiě)入
  69.         write_data('0');                                 //寫(xiě)入
  70.         write_data(0xdf);                                 //寫(xiě)入°
  71.         write_data('C');                                 //寫(xiě)入C
  72.         h=0x14;                  //h=+20
  73.         l=0+0x0a;                                                     //l=+10
  74. //        D1=1;
  75. //        D2=1;
  76.         figh=0;                                                         //給正確初始值,便于上電比較
  77.         figl=1;                                                         //給正確初始值,便于上電比較
  78. }
  79. void write_com(uchar com)                //寫(xiě)命令程序
  80. {        lcdrs=0;                                         //設(shè)置為寫(xiě)入命令
  81.         P0=com;                                         //將命令賦給P0 口
  82.         delay(5);                                         //延時(shí)
  83.         lcden=1;                                         //打開(kāi)LCD使能,輸入一個(gè)高脈沖
  84.         delay(5);                                        //延時(shí)
  85.         lcden=0;                                         //置低完成高脈沖
  86. }
  87. void write_data(uchar date)                //寫(xiě)數(shù)據(jù)程序
  88. {        lcdrs=1;                                         //設(shè)置為寫(xiě)入數(shù)據(jù)
  89.         P0=date;                                         //將數(shù)據(jù)賦給P0 口
  90.         delay(5);                                         //延時(shí)
  91.         lcden=1;                                         //打開(kāi)LCD使能,輸入一個(gè)高脈沖
  92.         delay(5);                                         //延時(shí)
  93.         lcden=0;                                         //置低完成高脈沖
  94. }

  95. void write_temp_value(uchar add,char date)         //讀取的溫度值在LCD上顯示程序
  96. {        uchar bai,shi,ge;
  97.         bai=date/100;
  98.         shi=date%100/10;                                 
  99.         ge=date%10;                                                 //分離出百,十,個(gè)位數(shù)
  100.         if((bai|shi)==0)                                 //如果百十都等于0
  101.         shi=0x70;                                                 //十賦值0x70,以便十位寫(xiě)入空字符,write_data(0x30+shi),參考1602字符圖形碼
  102.         if(bai==0)
  103.         bai=0x70;
  104.         write_com(0x80+add);                     //設(shè)置當(dāng)前光標(biāo)位置,準(zhǔn)備寫(xiě)數(shù)據(jù)
  105.         
  106.         if(fig==0&&shi!=0x70)                         //如果溫度為負(fù)且十位不等于0(如果十位等于0,shi=0x70)
  107.         { write_data('-');                                 //在百位寫(xiě)入負(fù)號(hào)
  108.           write_data(0x30+shi);                        //寫(xiě)入十位數(shù)據(jù)
  109.         }
  110.         if(fig==0&&shi==0x70)                         //如果溫度為負(fù)且百十位都等于0
  111.         { write_data(0x30+0x70);                 //在百位寫(xiě)入一個(gè)空字符
  112.           write_data('-');                                 //在十位寫(xiě)入負(fù)號(hào)
  113.         }
  114.         if(fig==1)write_data(0x30+bai);  //溫度正,寫(xiě)入百位數(shù)據(jù)
  115.         if(fig==1)write_data(0x30+shi);         //溫度正,寫(xiě)入十位數(shù)據(jù)
  116.         write_data(0x30+ge);                         //寫(xiě)入個(gè)位數(shù)據(jù)
  117.         write_data(0xdf);                                 //寫(xiě)入°
  118.         write_data('C');                                 //寫(xiě)入C
  119.         
  120. }
  121. void write_hl(uchar add,char date)         //設(shè)置的高低溫度值在LCD上顯示程序
  122. {        uchar bai,shi,ge;
  123.         bai=date/100;
  124.         shi=date%100/10;                                 
  125.         ge=date%10;                                                 //分離出百,十,個(gè)位數(shù)
  126.         write_com(0x80+add);                     //設(shè)置當(dāng)前光標(biāo)位置,準(zhǔn)備寫(xiě)數(shù)據(jù)
  127.         
  128.         if(t==1&&shi!=0)                             //如果溫度為負(fù)且十位不等于0(如果十位等于0,shi=0x70)            負(fù)數(shù):百位第1種情況,寫(xiě)-
  129.                 { write_data('-');}                         //在百位寫(xiě)入負(fù)號(hào)
  130.         if(t==1&&shi==0)                             //如果溫度為負(fù)且百十位都等于0                                                    負(fù)數(shù):百位第2種情況,寫(xiě)空
  131.                 { write_data(0x30+0x70);         //在百位寫(xiě)入一個(gè)空字符
  132.                     write_data('-');                         //在十位寫(xiě)入負(fù)號(hào)                                                                            負(fù)數(shù):十位第1種情況,寫(xiě)-
  133.                 }
  134.         if(t==1&&shi!=0)                             //如果溫度為負(fù)且十不等于0                                                                負(fù)數(shù):十位第2種情況,寫(xiě)數(shù)                                                
  135.             {write_data(0x30+shi);}                 //在十位寫(xiě)入數(shù)據(jù)
  136.         if(t==0&&bai==0&&shi!=0)                 //否則溫度為正,如果bai=0且shi!=0                                                  正數(shù):百位第1種情況,寫(xiě)+
  137.                 {write_data('+');}                         //在百位寫(xiě)入+
  138.         if(t==0&&bai==0&&shi==0)                 //否則溫度為正,如果bai=0且shi=0                                                           正數(shù):百位第2種情況,寫(xiě)空
  139.                 {write_data(0x30+0x70);}         //在百位寫(xiě)入一個(gè)空字符
  140.         if(t==0&&bai!=0)        
  141.                 {write_data(0x30+bai);}      //否則百位為正不等于0,寫(xiě)入百位數(shù)                                                           正數(shù):百位第3種情況,寫(xiě)數(shù)
  142.         if(t==0&&bai==0&&shi==0&&ge!=0)         //如果百十等于0,個(gè)不等于0                                                                           正數(shù):十位第1種情況,寫(xiě)+
  143.                 {write_data('+');}                         //在十位寫(xiě)入+
  144.         if(t==0&&bai==0&&shi==0&&ge==0)         //如果百十個(gè)都等于0
  145.             {write_data(' ');}                     //在十位寫(xiě)入空字符                                                                                           正數(shù):十位第2種情況,寫(xiě)空
  146.         if(t==0&&shi!=0)        
  147.                 {write_data(0x30+shi);}             //在十位寫(xiě)入數(shù)                                                                                                   正數(shù):十位第3種情況,寫(xiě)數(shù)                    
  148.         write_data(0x30+ge);                         //寫(xiě)入個(gè)位數(shù)據(jù)
  149. }

  150. /***********ds18b20子程序*************************/

  151. /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/

  152. void delay_18B20(unsigned int i)
  153. {
  154.         while(i--);
  155. }

  156. /**********ds18b20初始化函數(shù)**********************/

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

  169. /***********ds18b20讀一個(gè)字節(jié)**************/  

  170. unsigned char ReadOneChar(void)
  171. {
  172.         uchar i=0;
  173.         uchar dat = 0;
  174.         for (i=8;i>0;i--)
  175.          {
  176.                   DQ = 0; // 給脈沖信號(hào)
  177.                   dat>>=1;
  178.                   DQ = 1; // 給脈沖信號(hào)
  179.                   if(DQ)
  180.                   dat|=0x80;
  181.                   delay_18B20(4);
  182.          }
  183.          return(dat);
  184. }

  185. /*************ds18b20寫(xiě)一個(gè)字節(jié)****************/  

  186. void WriteOneChar(uchar dat)
  187. {
  188.          unsigned char i=0;
  189.          for (i=8; i>0; i--)
  190.          {
  191.                   DQ = 0;
  192.                  DQ = dat&0x01;
  193.             delay_18B20(5);
  194.                  DQ = 1;
  195.             dat>>=1;
  196. }
  197. }

  198. /**************讀取ds18b20當(dāng)前溫度************/

  199. void ReadTemp(void)
  200. {
  201.         unsigned char a=0;
  202.         unsigned char b=0;
  203.         unsigned char t=0;

  204.         Init_DS18B20();
  205.         WriteOneChar(0xCC);            // 跳過(guò)讀序號(hào)列號(hào)的操作
  206.         WriteOneChar(0x44);         // 啟動(dòng)溫度轉(zhuǎn)換

  207.         delay_18B20(100);       // this message is very important

  208.         Init_DS18B20();
  209.         WriteOneChar(0xCC);         //跳過(guò)讀序號(hào)列號(hào)的操作
  210.         WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度

  211.         delay_18B20(100);

  212.         a=ReadOneChar();            //讀取溫度值低位
  213.         b=ReadOneChar();                   //讀取溫度值高位
  214. //        a=0xff;                                        //測(cè)試無(wú)法讀取-16度的問(wèn)題
  215. //        b=0xfe;
  216.         temp_value=b<<4;                  //temp_value=b左移動(dòng)4位  ,                         轉(zhuǎn)換成10進(jìn)制
  217.         temp_value+=(a&0xf0)>>4;  //temp_value=temp_value+((a&0xf0)>>4) 轉(zhuǎn)換成10進(jìn)制
  218.         fig=0x01;                                  //設(shè)置fig=1溫度正
  219.         if(temp_value>0x7f)                  //如果temp_value大于0x7f,即為負(fù)數(shù)區(qū),參考DS18B20datasheet
  220.         {fig=0;                                          //設(shè)置fig=0溫度負(fù),以便判斷顯示
  221.          a=~a+1;                                  //將讀取的溫度轉(zhuǎn)換成10進(jìn)制數(shù)
  222.          b=~b;
  223.          temp_value=b<<4;                  //temp_value=b左移動(dòng)4位  ,                         轉(zhuǎn)換成10進(jìn)制
  224.          temp_value+=(a&0xf0)>>4; //temp_value=temp_value+((a&0xf0)>>4) 轉(zhuǎn)換成10進(jìn)制
  225.         }            
  226. }

  227.                      
復(fù)制代碼

所有代碼51hei下載(由于怕有人照搬此例,所以仿真工程不分享出來(lái),要學(xué)習(xí)的可以自己按圖畫(huà)):
程序1.7z (26.53 KB, 下載次數(shù): 44)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:892311 發(fā)表于 2021-3-15 20:20 | 顯示全部樓層
挺有用的
回復(fù)

使用道具 舉報(bào)

ID:851135 發(fā)表于 2021-6-23 18:08 來(lái)自手機(jī) | 顯示全部樓層
看來(lái)只有自己慢慢的畫(huà)仿真圖了
回復(fù)

使用道具 舉報(bào)

ID:718725 發(fā)表于 2021-6-23 22:22 來(lái)自手機(jī) | 顯示全部樓層
這個(gè)好,有想法
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久草欧美视频 | 欧美亚洲一级 | 最新中文字幕一区 | 欧美高清hd | 成人欧美一区二区三区在线播放 | 成人免费视频网站在线观看 | 日日淫| 日韩欧美中文字幕在线视频 | 国产在线麻豆精品入口 | 成人免费视频 | 免费观看一级特黄欧美大片 | 久久手机在线视频 | 午夜免费电影 | 国产一区二区在线免费播放 | 久久久久九九九女人毛片 | 国产在线视频三区 | 欧美激情在线播放 | 99re视频在线| 久久久久久国产 | 亚洲视频中文字幕 | 色婷婷av一区二区三区软件 | 日日日操 | 国产精品久久久久影院色老大 | 国产激情精品一区二区三区 | 久久久一二三 | 久久精品欧美视频 | 农村真人裸体丰满少妇毛片 | 成人激情视频免费观看 | 久草中文在线观看 | 色香蕉在线 | 亚洲欧美在线一区 | 国产片一区二区三区 | 羞羞视频免费在线观看 | 日韩三区在线 | a黄视频| 久久久久亚洲视频 | 亚洲成色777777在线观看影院 | 亚洲欧美在线一区 | 97伦理| 国产一区二区三区视频免费观看 | 日日天天|