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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單只18B20測溫程序(1602寫字符串方式)

[復制鏈接]
跳轉到指定樓層
樓主
ID:110653 發表于 2016-3-29 01:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

DS18B20是一種很常用的數字溫度傳感器,溫度檢測范圍是-55~+125度,手冊 說明在-10~+85度范圍內檢測誤差為±0.5度,作者在自己的產品中隨機抽樣驗證 了幾只傳感器,在-25度誤差0.1度,+25度與+50度誤差小于0.1度,可見這種傳感 器實際精度是很高的,傳感器引腳如圖19-1所示,工作電壓范圍是3.0~5.5V,通 常使用+5V,電源接反或接錯一般是不會損壞傳感器的,對于單只DS18B20的使用,我們按圖19-2連接即可。







電路和介紹詳見:http://www.zg4o1577.cn/bbs/dpj-47286-1.html(在這貼附件中可下載完整的源碼壓縮包)
主程序如下(部分預覽):
  1. /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
  4.   作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
  5.   仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         驗證信息:STC15單片機
  8.   郵箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  10. //單只DS18B20的溫度檢測,測溫范圍-55 —— +125度,1602液晶顯示。
  11. #include "STC15W4K.H"
  12. #include "DS18b20.h"
  13. #include "myfun.h"
  14. #include "LCD1602.h"
  15. bit flag;                      // flag=0表示正溫,flag=1表示負溫。
  16. unsigned char str[10];                   // 最長字符10字節,比如:-123.4567/0
  17. unsigned char Long_Str(long dat,unsigned char *str) // 長整型數轉換為字符串,返回值為轉換后的字符串長度
  18. {
  19.         signed char i=0;
  20.         unsigned char len = 0;
  21.         unsigned char buf[11];           // 長整數最大值4294967295,轉ASCII碼后占用10+1=11字節
  22.         if (dat < 0)               // 如果為負數,首先取絕對值,并添加負號
  23.         {
  24.                 dat = -dat;
  25.                 *str++ = '-';
  26.                 len++;
  27.         }
  28.         do
  29.         {                               // 低位在前高位在后順序排列
  30.                 buf[i++] = dat % 10+0x30;        // C語言中數組下標固定從0開始
  31.                 dat /= 10;
  32.         } while (dat > 0);
  33.     len += i;                 // i最后的值就是有效字符的個數
  34.     while (i-- > 0)           // 高位在前低位在后順序排列
  35.     {
  36.         *str++ = buf[i] ;
  37.     }     
  38.         *str = 0;                 // 添加字符串結束符方便使用KEIL自帶的字符串處理函數處理
  39.         return len;               // 返回字符串長度
  40. }

  41.         
  42. //****************溫度數據處理函數************************/
  43. void gettemp()                           //讀取溫度值
  44. {                     
  45.          unsigned int temp0,temp1,temp;      // 存放小數、整數、符號,10000倍小數值
  46.          unsigned char temH,temL;                  // 存放原始高字節與低字節
  47.          unsigned char len;                                          // 溫度整數部分字符串長度
  48.          temp=DS18B20_ReadTemperature();         // 從18B20中讀取2字節原始溫度值
  49.          flag=0;
  50.          if ((temp&0xf800)!=0)                   // 如果是負溫,將補碼取反加1變為原碼
  51.          {
  52.                  temp=~temp        +1;
  53.                  flag=1;
  54.          }        
  55.          temH=temp/256;                                   // 高字節(5位符號+3位數據)
  56.          temL=temp%256;                                   // 低字節(4位整數+4位小數)
  57.          
  58.          temp0=temL&0x0F;              // 4 位小數
  59.      temp1=(temH<<4)|(temL>>4);    // 8 位整數(最高一位符號0不用管)
  60.          
  61.          len=Long_Str(temp1,str);
  62.          str[len++]='.';                           // 添加小數點,覆蓋原有字符串結束符0
  63.          temp=temp0*625;               // 將結果中的小數乘以分辨溫度0.0625
  64.                                                             // 擴大10000倍進行輸出,不用浮點,同樣可以保留4位小數精度
  65.          str[len++]= temp/1000+48;                   // 小數點后1位ASCII碼
  66.          str[len++]=(temp%1000)/100+48;    // 小數點后2位ASCII碼
  67.          str[len++]=(temp%100)/10+48;           // 小數點后3位ASCII碼
  68.          str[len++]= temp%10+48;                   // 小數點后4位ASCII碼
  69.          str[len]= 0;                                           // 添加字符串結束符
  70. }
  71. void port_mode()            // 端口模式
  72. {
  73.         P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
  74.         P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
  75. }
  76. void main()
  77. {
  78.         unsigned char xPos,yPos;
  79.         unsigned char *s="Now temp is:";
  80.         port_mode();                      // 所有IO口設為準雙向弱上拉方式。
  81.         xPos=0;                              // xPos表示水平右移字符數(0-15)
  82.         yPos=0;                              // yPos表示垂直下移字符數(0-1)
  83.         delay100ms();                 // 等待LCD1602上電時內部復位
  84.         LCD1602_Init();
  85.         WriteString(xPos,yPos,s);          // X坐標、Y坐標、字符串,屏幕左上角為坐標原點        
  86.         DS18B20_SetResolution(3);     // 設置DS18B20的分辨率為12位(默認值,新器件可以不作任何設置)
  87.         while(1)
  88.         {
  89.                 gettemp();
  90.                 WriteString(0,1,str);
  91.                 SetCur(NoCur);                  //  有顯示無光標
  92.         }
  93. }
復制代碼

lcd1602.h文件

  1. #include "LCD1602.H"
  2. /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
  3. ★★★★★★★★★★★★★★★★★★★★★★★★
  4. 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
  5.   作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
  6.   仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
  7.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  8.         驗證信息:STC15單片機
  9.   郵箱:xgliyouquan@126.com
  10.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  11. void delay2_uS ()  // 22.1184MHz
  12. {
  13.     unsigned char t=9;
  14.         while(--t);
  15. }

  16. //        正常讀寫操作之前檢測LCD控制器狀態
  17. //  讀狀態時序:RS=0,RW=1,E=1,判斷忙完畢后釋放總線
  18. void WaitIdle()
  19. {
  20.         unsigned char tmp;
  21.         RS=0;                          // 命令
  22.         RW=1;                          // 讀取
  23.         DPORT=0xff;                  // 為接收數據作準備
  24.         _nop_();          // 短暫延時
  25.         E=1;                   // 使能LCD1602
  26.         delay2_uS();                  // LCD1602在E為高電平區間輸出數據到端口
  27.         for(;;)
  28.         {
  29.                 tmp=DPORT;           // 將數據端口上的值賦給tmp
  30.                 tmp&=0x80;           // 最高位為1時表示液晶模塊正忙,不能對其進行操作
  31.                 if(        tmp==0)           // 其余6位表示內部當前顯示地址,無實際用途。
  32.                         break;
  33.         }
  34.         E=0;                           // 釋放總線
  35. }
  36.         
  37. // 向LCD1602液晶寫入一字節數據,dat-待寫入數據值
  38. // 寫數據時序:RS=1,RW=0,D7——D0 = 數據,E=正脈沖,液晶在脈沖下降沿采樣數據。
  39. void LcdWriteDat(unsigned char dat)
  40. {
  41.     WaitIdle();                        // 等待LCD1602空閑
  42.         RS=1;                                // 數據
  43.         RW=0;                                // 寫
  44.         DPORT=dat;                        // 將待寫數據送到數據端口
  45.         _nop_();            // 短暫延時
  46.         E=1;                                // 使能LCD1602
  47.         delay2_uS();                        // LCD1602在E為高電平區間讀取數據端口上的值
  48.         E=0;                            // 關閉LCD1602使能,釋放總線           
  49. }

  50. // 向LCD1602液晶寫入一字節命令,cmd-待寫入命令值
  51. // 寫命令時序:RS=0,RW=0,D7——D0 = 數據,E=正脈沖,液晶在脈沖下降沿采樣數據。
  52. void LcdWriteCmd(unsigned char cmd)
  53. {
  54.     WaitIdle();                        // 等待LCD1602空閑
  55.         RS=0;                                // 命令
  56.         RW=0;                                // 寫
  57.         DPORT=cmd;                        // 將命令碼輸出在數據端口上
  58.         _nop_();            // 短暫延時
  59.         E=1;                                // 使能LCD1602
  60.         delay2_uS();                        // LCD1602在E為高電平區間讀取數據端口上的值
  61.         E=0;                                 // 關閉LCD1602使能,釋放總線
  62. }

  63. // 清屏命令:清除顯示內容,將1602內部RAM全部填入空白的ASCII碼20H
  64. //                         光標歸位,將光標撤回到屏幕左上角的坐標原點
  65. //           將1602內部顯示地址設為0  
  66. void ClrLcd()              
  67. {        
  68.         LcdWriteCmd(0x01);
  69. }

  70. // 內部函數用于設置顯示字符起始坐標
  71. void LcdPos(unsigned char xPos,unsigned char yPos)         
  72. {
  73.         unsigned char tmp;
  74.         xPos&=0x0f;                      // x位置范圍是0~15
  75.         yPos&=0x01;                      // y位置范圍是0~1
  76.         if(yPos==0)                         // 顯示第一行
  77.                 tmp=xPos;                  // 第一行字符地址從 0x00 開始
  78.         else
  79.                 tmp=xPos+0x40;          // 第二行字符地址從 0x40 開始
  80.         tmp|=0x80;                          // 設置 RAM 地址
  81.         LcdWriteCmd(tmp);
  82. }

  83. void SetCur(unsigned char Para)            // 設置光標
  84. {
  85.         switch(Para)
  86.         {        
  87.                 case 0:
  88.                 {        
  89.                         LcdWriteCmd(0x08);        break;              // 關顯示
  90.                 }
  91.                 case 1:
  92.                 {        
  93.                         LcdWriteCmd(0x0c);        break;             // 開顯示但無光標
  94.                 }
  95.                 case 2:
  96.                 {
  97.                         LcdWriteCmd(0x0e);        break;             // 開顯示有光標但不閃爍
  98.                 }
  99.                 case 3:
  100.                 {
  101.                         LcdWriteCmd(0x0f);        break;             // 開顯示有光標且閃爍
  102.                 }
  103.                 default:
  104.                         break;
  105.         }
  106. }

  107. //在指定的行與列顯示指定的字符,xpos:行,ypos:列,c:待顯示字符
  108. void WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat)
  109. {
  110.         LcdPos(xPos,yPos);
  111.         LcdWriteDat(Dat);
  112. }

  113. // 在液晶上顯示字符串,xpos:行坐標,ypos:列坐標,str-字符串指針
  114. void WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s)
  115. {        
  116.         unsigned char i=0;
  117.         LcdPos(xPos,yPos);                  // 起始坐標
  118.         while(s[i])
  119.         {
  120.                 LcdWriteDat(s[i]);
  121.                 i++;
  122.                 if (i>=16)  break;          // 超出16個字符外的數據丟棄
  123.         }
  124. }

  125. // LCD 1602初始化
  126. void LCD1602_Init()            
  127. {
  128.         LcdWriteCmd(0x38);             // 顯示模式設置,設置16×2顯示,5×7點陣,8位數據接口
  129.         LcdWriteCmd(0x08);             // 顯示關閉,不顯示光標、光標不閃爍
  130.         LcdWriteCmd(0x01);             // 顯示清屏
  131.         LcdWriteCmd(0x06);             // 顯示光標移動位置
  132.         LcdWriteCmd(0x0c);             // 顯示開及光標設置
  133. }
復制代碼



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本天堂一区 | 成人在线电影在线观看 | 真人女人一级毛片免费播放 | 在线成人一区 | 国产欧美一区二区久久性色99 | www.久| 91久久精品一区二区二区 | 免费毛片在线 | 免费激情网站 | 一区二区在线不卡 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 九九在线视频 | 自拍视频网站 | 黄网站在线观看 | 国产在线观看一区二区 | 国产精品视频一二三区 | 亚洲一在线 | 日韩淫片免费看 | 国精品一区 | 国产一区二区自拍 | 国产精品久久久久久av公交车 | 亚洲成人精品视频 | 亚洲成a人片 | 国产成人精品网站 | 国产精品久久久久久久久久三级 | 国产精品欧美一区二区 | 成人在线黄色 | 天天夜夜操 | 美女二区 | 中文字幕精品一区二区三区精品 | 日韩一区二区久久 | 精品久久久999 | 亚洲一区免费视频 | 狠狠的干狠狠的操 | 视频二区在线观看 | 欧产日产国产精品99 | 精品视频一区二区 | 成人亚洲| 青草青草久热精品视频在线观看 | 一区观看 | 久久久av一区 |