|
主程序如下。目前數(shù)碼管顯示的數(shù)據(jù)是06666,這個(gè)是不正常的。這個(gè)程序是我仿照普中的DS18B20實(shí)驗(yàn)來做的,預(yù)期是用DS18B20測溫,數(shù)碼管顯示數(shù)據(jù),保留一位小數(shù)。
目前顯示不正常,我首先是檢查DS18B20初始化是否有問題,所以我加了一個(gè)指示燈,發(fā)現(xiàn)初始化是沒有問題的。
所以說現(xiàn)在讓我疑惑的有兩點(diǎn),第一點(diǎn)就是T_value = DS18B20_Read_T()*10;//保留一位小數(shù),
我覺得問題是出現(xiàn)在這里,因?yàn)檫@里
/*
if(T_value < 0)
{
T_value = - T_value;
temp_buf[0] = 0x40; //-
}
else
{
temp_buf[0] = 0x00; //不顯示
}
*/
我無論加不加注釋,數(shù)碼管要點(diǎn)亮的首位總是顯示0。我不知道為什么會這樣。
第二點(diǎn)是這一句temp_buf[3] = duan_table[T_value%1000%100/10]; //個(gè)位+小數(shù)點(diǎn),加個(gè)小數(shù)點(diǎn)的話應(yīng)該寫成temp_buf[3] = duan_table[T_value%1000%100/10] | 0x80;(用的是共陰極數(shù)碼管),但是這樣寫的話,這一位完全不亮。
我非常疑惑,懇請諸位大神指點(diǎn)迷津。
#include <REGX51.H>
#include "Delay.h"
#include <intrins.h>
#include "Smg.h"
#include "DS18B20.H"
#include "LED.h"
extern duan_table[];
void main(void)
{
uchar i = 0;
int T_value;
uchar temp_buf[5];
uint DS18B20_OK = 0;
DS18B20_OK = DS18B20_Init();//DS18B20初始化
if(DS18B20_OK)
LED_OFF();
else
LED_ON();
while(1)
{
i++;
if(i%50 == 0) //每隔一段時(shí)間讀取溫度值,間隔時(shí)間要大于溫度傳感器轉(zhuǎn)換時(shí)間
T_value = DS18B20_Read_T()*10;//保留一位小數(shù)
/*
if(T_value < 0)
{
T_value = - T_value;
temp_buf[0] = 0x40; //-
}
else
{
temp_buf[0] = 0x00; //不顯示
}
*/
temp_buf[1] = duan_table[T_value/1000];
temp_buf[2] = duan_table[T_value%1000/100];
temp_buf[3] = duan_table[T_value%1000%100/10]; //個(gè)位+小數(shù)點(diǎn)
temp_buf[4] = duan_table[T_value%1000%100%10];
smg_display(temp_buf, 4);
}
}
|
|