欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機(jī),18B20,1602溫度計(jì)+串口通信,實(shí)際溫度計(jì) 上位機(jī)程序VS2010 C++ MFC [打印本頁]

作者: ZMRGHY    時(shí)間: 2020-11-21 01:11
標(biāo)題: 51單片機(jī),18B20,1602溫度計(jì)+串口通信,實(shí)際溫度計(jì) 上位機(jī)程序VS2010 C++ MFC
制作出來的實(shí)物圖如下:




仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


上位機(jī):


安裝程序解壓到同一目錄下。再運(yùn)行setup安裝。。。。

溫度計(jì).exe
編寫環(huán)境Win10 x64.     VS2010 x86  C++ MFC
測(cè)試環(huán)境Win10 x64.   

在32位系統(tǒng)上,能不能正常使用還不清楚。
所以公布了源代碼文件,如果在32位系統(tǒng)上,不能正常使用。
請(qǐng)使用源代碼文件,在32位系統(tǒng)上重新生成一下應(yīng)用程序。。。

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include "math.h"

  3. bit flag1s = 0, _up = 0;          //1s定時(shí)標(biāo)志
  4. unsigned char T0RH = 0;  //T0重載值的高字節(jié)
  5. unsigned char T0RL = 0;  //T0重載值的低字節(jié)

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

  12. //串口初始化函數(shù)
  13. void InitUART()
  14. {
  15.                 //IP = 0x10;
  16.                 TMOD &= 0x0F;
  17.     TMOD |= 0x20;
  18.     SCON = 0x50;
  19.     TH1 = 0xF3;
  20.     TL1 = TH1;
  21.     PCON = 0x00;
  22.     EA = 1;
  23.     ES = 1;
  24.     TR1 = 1;
  25. }

  26. //串口發(fā)送1字節(jié)數(shù)據(jù)
  27. void SendOneByte(unsigned char c)
  28. {
  29.     SBUF = c;
  30.     while(!TI);
  31.     TI = 0;
  32. }
  33. void main()
  34. {
  35.     bit res;
  36.     int temp, former=0xffff;        //讀取到的當(dāng)前溫度值
  37.     int intT, decT;  //溫度值的整數(shù)和小數(shù)部分
  38.     unsigned char len;
  39.     unsigned char str[12];
  40.                
  41.                 IP = 0x10;
  42.                 InitUART();
  43.     // EA = 1;            //開總中斷
  44.     ConfigTimer0(10);  //T0定時(shí)10ms
  45.     Start18B20();      //啟動(dòng)DS18B20
  46.     InitLcd1602();     //初始化液晶
  47.    
  48.     while (1)
  49.     {
  50.         if (flag1s || _up)  //每秒更新一次溫度
  51.         {
  52.             flag1s = 0;
  53.             res = Get18B20Temp(&temp);  //讀取當(dāng)前溫度
  54.             if (res && ((abs(temp-former) >= 4)||_up))                 //讀取成功時(shí),刷新當(dāng)前溫度顯示
  55.             {
  56.                                                                 former = temp;                                                                //記錄新的溫度
  57.                                                                 _up = 0;
  58.                                                                 SendOneByte((unsigned char) (temp/256));
  59.                                                                 SendOneByte((unsigned char) (temp%256));
  60.                 intT = temp >> 4;             //分離出溫度值整數(shù)部分
  61.                 decT = temp & 0xF;            //分離出溫度值小數(shù)部分
  62.                 len = IntToString(str, intT); //整數(shù)部分轉(zhuǎn)換為字符串
  63.                 str[len++] = '.';             //添加小數(shù)點(diǎn)
  64.                 decT = (int)((decT*100) * 0.0625 + 0.5);        //二進(jìn)制的小數(shù)部分轉(zhuǎn)換為1位十進(jìn)制位
  65.                 str[len++] = decT/10 + '0';      //十進(jìn)制小數(shù)位再轉(zhuǎn)換為ASCII字符
  66.                                                                 str[len++] = decT%10 + '0';
  67.                                                                 str[len++] = 'C';
  68.                 while (len < 7)               //用空格補(bǔ)齊到6個(gè)字符長度
  69.                 {
  70.                     str[len++] = ' ';
  71.                 }
  72.                 str[len] = '\0';              //添加字符串結(jié)束符
  73.                 LcdShowStr(0, 0, str);        //顯示到液晶屏上
  74.             }
  75.             else                        //讀取失敗時(shí),提示錯(cuò)誤信息
  76.             {
  77.                                                                 if(!res)
  78.                                                                         LcdShowStr(0, 0, "error!");
  79.             }
  80.             Start18B20();               //重新啟動(dòng)下一次轉(zhuǎn)換
  81.         }
  82.     }
  83. }
  84. /* 整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長度 */
  85. unsigned char IntToString(unsigned char *str, int dat)
  86. {
  87.     signed char i = 0;
  88.     unsigned char len = 0;
  89.     unsigned char buf[6];
  90.    
  91.     if (dat < 0)  //如果為負(fù)數(shù),首先取絕對(duì)值,并在指針上添加負(fù)號(hào)
  92.     {
  93.         dat = -dat;
  94.         *str++ = '-';
  95.         len++;
  96.     }
  97.     do {          //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
  98.         buf[i++] = dat % 10;
  99.         dat /= 10;
  100.     } while (dat > 0);
  101.     len += i;     //i最后的值就是有效字符的個(gè)數(shù)
  102.     while (i-- > 0)   //將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
  103.     {
  104.         *str++ = buf[i] + '0';
  105.     }
  106.     *str = '\0';  //添加字符串結(jié)束符
  107.    
  108.     return len;   //返回字符串長度
  109. }
  110. /* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
  111. void ConfigTimer0(unsigned int ms)
  112. {
  113.     unsigned long tmp;  //臨時(shí)變量
  114.    
  115.     tmp = 12000000 / 12;      //定時(shí)器計(jì)數(shù)頻率
  116.     tmp = (tmp * ms) / 1000;  //計(jì)算所需的計(jì)數(shù)值
  117.     tmp = 65536 - tmp;        //計(jì)算定時(shí)器重載值
  118.     tmp = tmp + 15;           //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
  119.     T0RH = (unsigned char)(tmp>>8);  //定時(shí)器重載值拆分為高低字節(jié)
  120.     T0RL = (unsigned char)tmp;
  121.     TMOD &= 0xF0;   //清零T0的控制位
  122.     TMOD |= 0x01;   //配置T0為模式1
  123.     TH0 = T0RH;     //加載T0重載值
  124.     TL0 = T0RL;
  125.     ET0 = 1;        //使能T0中斷
  126.     TR0 = 1;        //啟動(dòng)T0
  127. }
  128. /* T0中斷服務(wù)函數(shù),完成1秒定時(shí) */
  129. void InterruptTimer0() interrupt 1
  130. {
  131.     static unsigned char tmr1s = 0;
  132.    
  133.     TH0 = T0RH;  //重新加載重載值
  134.     TL0 = T0RL;
  135.     tmr1s++;
  136.     if (tmr1s >= 100)  //定時(shí)1s
  137.     {
  138.         tmr1s = 0;
  139.                                 if(!flag1s)
  140.                                         flag1s = 1;
  141.     }
  142. }

  143. //串口中斷服務(wù)函數(shù),
  144. void UARTInterrupt(void) interrupt 4
  145. {
  146.                 char ch=0;
  147.     if(RI)
  148.     {
  149.         RI = 0;
  150.                                 ch = SBUF;
  151.                                 if((ch=='1') && !_up)
  152.                                         _up = 1;
  153.         //add your code here!
  154.     }/*
  155.     else
  156.         TI = 0;*/
  157. }
復(fù)制代碼

所有資料51hei提供下載:
溫度計(jì)。單片機(jī) 仿真.rar (106.64 KB, 下載次數(shù): 55)
溫度計(jì)。上位機(jī).rar (130.59 KB, 下載次數(shù): 46)
安裝程序.7z (13.13 MB, 下載次數(shù): 36)

作者: ZMRGHY    時(shí)間: 2020-11-21 01:19
忘了,還有一個(gè)工具,仿真需虛擬串口

vspd.zip

4.72 MB, 下載次數(shù): 15, 下載積分: 黑幣 -5


作者: 51hei團(tuán)團(tuán)    時(shí)間: 2020-11-21 01:52
好資料,51黑有你更精彩!!!
作者: ZMRGHY    時(shí)間: 2020-11-21 04:24
51hei團(tuán)團(tuán) 發(fā)表于 2020-11-21 01:52
好資料,51黑有你更精彩!!!

團(tuán)團(tuán),早上好
作者: zkele    時(shí)間: 2020-11-21 07:49
51黑有你更精彩!!!下載一份有空學(xué)習(xí)一下
作者: renzaijiangnan    時(shí)間: 2020-11-21 14:00
好東東
作者: ZMRGHY    時(shí)間: 2020-11-21 20:19
更正說明。。。。
設(shè)計(jì)開發(fā)時(shí),一直用的是開發(fā)板。

顯示的都是實(shí)時(shí)溫度。。。。采集不到負(fù)溫度。。。。
今天自己在仿真中發(fā)現(xiàn)。。。當(dāng)負(fù)溫度時(shí),1602和電腦上顯示不一樣,而且兩個(gè)都與DS18B20顯示不一樣。。。
查找原因,發(fā)現(xiàn)思路沒錯(cuò),細(xì)節(jié)決定成敗。。。

在C51中,
int i;
-32768<= i <= 32767

unsigned int  i;
0 <=  i   <=  65535

unsigned char LSB, MSB;

當(dāng)i為int變量時(shí)。

i = (int)MSB<<8;

i += LSB    與    i |= LSB  兩者的區(qū)別是什么。。。


當(dāng)i為int變量時(shí)。
MSB = i/256; LSB = i%256;      與     MSB = i>>8;    LSB =  i & 0xff    的區(qū)別是什么呀。。。。。

找到原因,才知道很簡單。。。。
1、修改了DS18B20.c中的讀溫度函數(shù)。。。。
2、修改了main.c中轉(zhuǎn)換字符串函數(shù)。。。。。
有一句話與大家共勉。。。。。。。。
編程入門很重要,養(yǎng)成良好的書寫習(xí)慣,才是編程的必修課。。。。

keil.rar

45.46 KB, 下載次數(shù): 19, 下載積分: 黑幣 -5


作者: ZMRGHY    時(shí)間: 2020-11-21 22:02






歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1