求救關於c51微控制器ds18b20溫度顯示的問題

時間 2021-09-10 12:09:58

1樓:

#include

#define uint8 unsigned int //8 bit

#define uint unsigned int //8 bit

#define uint16 unsigned long //16 bit

#define date _pb0//io 0 int 1

#define dateio _15_0//pbc0

#define dispdata _pb7//io 0 int 1

#define dispclk _pb6//io 0 int 1

uint8 const showtable[29]=;

uint8 const dotcodeh=;

uint tplsb,tpmsb; // 溫度值低位、高位位元組

uint16 tplmsb;

uint16 temp @0x50;

void delay1ms(uint16 j)}}

void disp(uint8 t,uint8 showdata) }

}void init()

void wait()

bit readbit()

uint readbyte()

return(b);

}void writebyte(uint b)

else // 寫0}}

void main()

else

}temp=tpmsb;

temp=temp<<8; //合成一個字

temp=temp|tplsb;

a3=temp&0x000f;

temp=temp>>4;

temp=temp&0x00ff;

a1=temp/10;

a2=temp%10;

if(a4==19) disp(1,showtable[a4]);

disp(1,showtable[a1]);

disp(1,showtable[a2]);

disp(1,showtable[dotcodeh[a3]]);

if(a4==16) disp(1,0);

m=60;

n=4;}}

、、、、、、、、、、、、、、、、、、、、、、、、、、、

給你參考而已,自己工作使用過的,子程式一定沒有問題

2樓:特客人

#include

#include

#include //要用到取絕對值函式abs()

//通過ds18b20測試當前環境溫度, 並通過數碼管顯示當前溫度值, 目前顯示範圍: -55~ +125度

sbit wela = p2^7; //數碼管位選

sbit dula = p2^6; //數碼管段選

sbit ds = p2^2;

int tempvalue;

//數碼管2-5位選

unsigned char code tablewe=;

//0-f數碼管的編碼(共陰極)

unsigned char code table=;

//0-9數碼管的編碼(共陰極), 帶小數點

unsigned char code tablewidthdot=;

//延時函式, 對於11.0592mhz時鐘, 例i=10,則大概延時10ms.

void delay(unsigned int i)

}//初始化ds18b20

//讓ds18b20一段相對長時間低電平, 然後一段相對非常短時間高電平, 即可啟動

void dsinit()

void dswait()

//向ds18b20讀取一位資料

//讀一位, 讓ds18b20一小週期低電平, 然後兩小週期高電平,

//之後ds18b20則會輸出持續一段時間的一位資料

bit readbit()

//讀取一位元組資料, 通過呼叫readbit()來實現

unsigned char readbyte()

return dat;

}//向ds18b20寫入一位元組資料

void writebyte(unsigned char dat)

else //寫"0", 將dq拉低60us~120us

ds = 0;

i = 8; while(i>0) i--; //拉低約64us, 符號要求

ds = 1;

i++; i++; //整個寫0時隙過程已經超過60us, 這裡就不用像寫1那樣, 再延時64us了}}

//向ds18b20傳送溫度轉換命令

void sendchangecmd()

//向ds18b20傳送讀取資料命令

void sendreadcmd()

//獲取當前溫度值

int gettmpvalue()

unsigned char const timecount = 3; //動態掃描的時間間隔

//顯示當前溫度值, 精確到小數點後一位

//若先位選再段選, 由於io口預設輸出高電平, 所以當先位選會使數碼管出現亂碼

void display(int v)

;unsigned int tmp = abs(v);

datas[0] = tmp / 10000;

datas[1] = tmp % 10000 / 1000;

datas[2] = tmp % 1000 / 100;

datas[3] = tmp % 100 / 10;

datas[4] = tmp % 10;

if(v < 0)

for(count = 0; count != 5; count++)

else

dula = 1; //開啟鎖存, 給它一個下降沿量

dula = 0;

//位選

p0 =tablewe[count]; //選擇第(count + 1) 個數碼管

wela = 1; //開啟鎖存, 給它一個下降沿量

wela = 0;

delay(timecount);}}

void main()

tempvalue = gettmpvalue();}}

關於51微控制器ds18b20溫度計的問題

3樓:匿名使用者

void disp_temperature() //顯示溫度else if(qian!=0)//千位不為0,顯示資料if((bai==0)&&(qian==0))//千,百都為0時else if((bai==0)&&(qian!=0))//千不為0,百為0

else if(bai!=0)//百不為0p0=~led_dian[shi]; //十位與小數點p2=0xdf;

delay(10);

p2=0xff;

p0=~led[ge]; //顯示個位.

p2=0x7f;

delay(10);

p2=0xff; //關閉顯示}但此程式確實有問題.比如他把十位跟小數點放同一位了.正常是個位後才到小數點.

51微控制器的ds18b20,51微控制器與DS18B20程式

匯流排拉低,就是由微控制器控制,使dq 0。由於一般dq是結在集電極開路輸出口上,實際上微控制器在dq上輸出的高電平是靠上拉電阻來實現電位變高的。可以理解為,微控制器 不使 dq 0。那麼此時dq 1即是高電平,實際上也就是微控制器放棄了dq的控制,這個高電平僅僅是因為上拉電阻提供的,dq的控制權就...

c51微控制器程式求助

sec cnt equ 30h sec 0x equ 31h org 0000h sjmp mian org 000bh sjmp int t0 mian mov sec cnt,20 mov sec 0x,00h mov tmod,01h mov th0,65536 50000 256mov tl...

c51微控制器中斷程式中的interrupt1,2,3是由什麼決定的

中斷是指由於某種事件的發生 硬體或者軟體的 計算機暫停執行當前的程式,轉而執行另一程式,以處理髮生的事件,處理完畢後又返回原程式繼續作業的過程。中斷是處理器一種工作狀態的描述。1 int0 外部中斷0,由p3.2埠引入,低電平或下降沿引起。預設優先順序最高。2 int1 外部中斷1,由p3.3埠引入...