找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)ds18b20仿真+詳細(xì)注釋的代碼

[復(fù)制鏈接]
ID:267001 發(fā)表于 2017-12-26 11:58 | 顯示全部樓層 |閱讀模式
基于51單片機(jī) 18b20仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png

單片機(jī)源程序如下(帶有詳細(xì)的注釋):
  1. #include<reg51.h>
  2. #include<lcd1602.h>
  3. #include<18b20.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. bit flag1s = 0;          //1s定時標(biāo)志
  7. unsigned char T0RH = 0;  //T0重載值的高字節(jié)
  8. unsigned char T0RL = 0;  //T0重載值的低字節(jié)

  9. void ConfigTimer0(unsigned int ms);
  10. unsigned char IntToString(unsigned char *str, int dat);
  11. extern bit Start18B20();
  12. extern bit Get18B20Temp(int *temp);
  13. extern void InitLcd1602();
  14. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

  15. void main()
  16. {
  17.     bit res;
  18.     int temp;        //讀取到的當(dāng)前溫度值
  19.     int intT, decT;  //溫度值的整數(shù)和小數(shù)部分
  20.     unsigned char len;
  21.     unsigned char str[12];

  22.     EA = 1;            //開總中斷
  23.     ConfigTimer0(10);  //T0定時10ms
  24.     Start18B20();      //啟動DS18B20
  25.     InitLcd1602();     //初始化液晶
  26.    
  27.     while (1)
  28.     {
  29.         if (flag1s)  //每秒更新一次溫度
  30.         {
  31.             flag1s = 0;
  32.             res = Get18B20Temp(&temp);  //讀取當(dāng)前溫度
  33.             if (res)                    //讀取成功時,刷新當(dāng)前溫度顯示
  34.             {
  35.                 intT = temp >> 4;             //分離出溫度值整數(shù)部分
  36.                 decT = temp & 0xF;            //分離出溫度值小數(shù)部分
  37.                 len = IntToString(str, intT); //整數(shù)部分轉(zhuǎn)換為字符串
  38.                 str[len++] = '.';             //添加小數(shù)點
  39.                 decT = (decT*10) / 16;        //二進(jìn)制的小數(shù)部分轉(zhuǎn)換為1位十進(jìn)制位
  40.                 str[len++] = decT + '0';      //十進(jìn)制小數(shù)位再轉(zhuǎn)換為ASCII字符
  41.                 while (len < 6)               //用空格補(bǔ)齊到6個字符長度
  42.                 {
  43.                     str[len++] = ' ';
  44.                 }
  45.                 str[len] = '\0';              //添加字符串結(jié)束符
  46.                 LcdShowStr(0, 0, str);        //顯示到液晶屏上
  47.             }
  48.             else                        //讀取失敗時,提示錯誤信息
  49.             {
  50.                 LcdShowStr(0, 0, "error!");
  51.             }
  52.             Start18B20();               //重新啟動下一次轉(zhuǎn)換
  53.         }
  54.     }
  55. }
  56. /* 整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長度 */
  57. unsigned char IntToString(unsigned char *str, int dat)
  58. {
  59.     signed char i = 0;
  60.     unsigned char len = 0;
  61.     unsigned char buf[6];
  62.    
  63.     if (dat < 0)  //如果為負(fù)數(shù),首先取絕對值,并在指針上添加負(fù)號
  64.     {
  65.         dat = -dat;
  66.         *str++ = '-';
  67.         len++;
  68.     }
  69.     do {          //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
  70.         buf[i++] = dat % 10;
  71.         dat /= 10;
  72.     } while (dat > 0);
  73.     len += i;     //i最后的值就是有效字符的個數(shù)
  74.     while (i-- > 0)   //將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
  75.     {
  76.         *str++ = buf[i] + '0';
  77.     }
  78.     *str = '\0';  //添加字符串結(jié)束符
  79.    
  80.     return len;   //返回字符串長度
  81. }
  82. /* 配置并啟動T0,ms-T0定時時間 */
  83. void ConfigTimer0(unsigned int ms)
  84. {
  85.     unsigned long tmp;  //臨時變量
  86.    
  87.     tmp = 11059200 / 12;      //定時器計數(shù)頻率
  88.     tmp = (tmp * ms) / 1000;  //計算所需的計數(shù)值
  89.     tmp = 65536 - tmp;        //計算定時器重載值
  90.     tmp = tmp + 2;            //補(bǔ)償中斷響應(yīng)延時造成的誤差
  91.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節(jié)
  92.     T0RL = (unsigned char)tmp;
  93.     TMOD &= 0xF0;   //清零T0的控制位
  94.     TMOD |= 0x01;   //配置T0為模式1
  95.     TH0 = T0RH;     //加載T0重載值
  96.     TL0 = T0RL;
  97.     ET0 = 1;        //使能T0中斷
  98.     TR0 = 1;        //啟動T0
  99. }
  100. ……………………

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

所有資料51hei提供下載:
16.18b20.zip (99.28 KB, 下載次數(shù): 133)





回復(fù)

使用道具 舉報

ID:301249 發(fā)表于 2018-9-6 00:15 | 顯示全部樓層
附件中沒有仿真
回復(fù)

使用道具 舉報

ID:389904 發(fā)表于 2018-9-9 17:22 | 顯示全部樓層
附件中沒有仿真
回復(fù)

使用道具 舉報

ID:146834 發(fā)表于 2018-11-28 21:44 | 顯示全部樓層
謝謝。
回復(fù)

使用道具 舉報

ID:259302 發(fā)表于 2018-12-22 12:04
有病毒

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表