|
5黑幣
大佬們幫我看一下這個(gè)DS18B20溫度顯示在LCD屏上負(fù)數(shù)部分顯示的溫度與實(shí)際溫度誤差太大,這是哪了除了問題,應(yīng)該怎么修改呢,正數(shù)部分顯示正常,主程序部分的程序void main()
{
bit res;
int temp; //讀取到的當(dāng)前溫度值
int intT, decT; //溫度值的整數(shù)和小數(shù)部分
unsigned char len;
unsigned char str[12];
EA = 1; //開總中斷
ConfigTimer0(10); //T0 定時(shí) 10ms
Start18B20(); //啟動 DS18B20
InitLcd1602(); //初始化液晶
LcdStar();
while (1)
{
if (flag1s) //每秒更新一次溫度
{
flag1s = 0;
res = Get18B20Temp(&temp); //讀取當(dāng)前溫度
if (res) //讀取成功時(shí),刷新當(dāng)前溫度顯示
{
intT = temp >> 4; //分離出溫度值整數(shù)部分
decT = temp & 0xF; //分離出溫度值小數(shù)部分
len = IntToString(str, intT); //整數(shù)部分轉(zhuǎn)換為字符串
str[len++] = '.'; //添加小數(shù)點(diǎn)
decT = (decT*10) / 16; //二進(jìn)制的小數(shù)部分轉(zhuǎn)換為 1 位十進(jìn)制位
str[len++] = decT + '0'; //十進(jìn)制小數(shù)位再轉(zhuǎn)換為 ASCII 字符
while (len < 6) //用空格補(bǔ)齊到 6 個(gè)字符長度
{
str[len++] = ' ';
}
str[len] = '\0'; //添加字符串結(jié)束符
LcdShowStr(9, 1, str); //顯示到液晶屏上
LcdShowStr(14, 1, "C");//添加C溫度
}
else //讀取失敗時(shí),提示錯(cuò)誤信息
{
LcdShowStr(0, 0, "error!");
}
Start18B20(); //重新啟動下一次轉(zhuǎn)換
}
}
}
/* 整型數(shù)轉(zhuǎn)換為字符串, str-字符串指針, dat-待轉(zhuǎn)換數(shù),返回值-字符串長度 */
unsigned char IntToString(unsigned char *str, int dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[6];
if (dat < 0) //如果為負(fù)數(shù),首先取絕對值,并在指針上添加負(fù)號
{
dat = -dat;
*str++ = '-';
len++;
}
do { //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
buf[i++] = dat % 10;
dat /= 10;
} while (dat > 0);
len += i; //i 最后的值就是有效字符的個(gè)數(shù)
while (i-- > 0) //將數(shù)組值轉(zhuǎn)換為 ASCII 碼反向拷貝到接收指針上
{
*str++ = buf[ i] + '0';
}
*str = '\0'; //添加字符串結(jié)束符
return len; //返回字符串長度
}
/* 配置并啟動 T0, ms-T0 定時(shí)時(shí)間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時(shí)變量
tmp = 11059200 / 12; //定時(shí)器計(jì)數(shù)頻率
tmp = (tmp * ms) / 1000; //計(jì)算所需的計(jì)數(shù)值
tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
tmp = tmp + 12; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 為模式 1
TH0 = T0RH; //加載 T0 重載值
TL0 = T0RL;
ET0 = 1; //使能 T0 中斷
TR0 = 1; //啟動 T0
}
/* T0 中斷服務(wù)函數(shù),完成 1 秒定時(shí) */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr1s = 0;
TH0 = T0RH; //重新加載重載值
TL0 = T0RL;
tmr1s++;
if (tmr1s >= 100) //定時(shí) 1s
{
tmr1s = 0;
flag1s = 1;
}
}
圖片1.png (9.62 KB, 下載次數(shù): 74)
下載附件
2021-5-26 09:50 上傳
|
|