DS18B20測(cè)溫顯示程序
#include
sbit TSOR=P2^0;
#define Busy 0x80;
#define uchar unsigned char
#define uint unsigned int
#define reset() {WDT=0x1e;WDT=0xe1;}
sfr WDT=0xa6;
bit ON_OFF;
bit outflag;
sbit en =P1^7;/*DTLED-6顯示芯片使能端*/
sbit dout=P1^6;/*DTLED-6顯示芯片數(shù)據(jù)讀入端*/
sbit clk=P1^3;/*DTLED-6顯示芯片/時(shí)鐘芯片DS1302時(shí)鐘輸入端*/
//============================================
uchar dispbuf[9];/*顯示值存放陣列*/
uchar temp1,temp2;
uchar cnt;
char set,T;
//===========================================
void gettempTS(void);
void initTS(void);
uchar readBTS(void);
void writeBTS(uchar byte);
void resetTS(void);
bit readTS(void);
void write1TS(void);
void write0TS(void);
void delay15us(void);
void delay60us(void);
//*************延時(shí)K×1ms,12.000MHz***********
void delay(uint k)
{
uint i,j; //定義i,j為無(wú)符號(hào)整形變量
for(i=0;i
for(j=0;j<60;j++)
{;}
reset()}
}
//*******************************************
void delay15us(void)
{
uint i; //定義i為無(wú)符號(hào)整形變量
for(i=0;i<4;i++);
}
//***************************************
void delay60us(void)
{
uint i; //定義i為無(wú)符號(hào)整形變量
for(i=0;i<15;i++);
}
//**********************************************
void write0TS(void)
{
TSOR=1;TSOR=0;
delay15us();delay15us();delay15us();delay15us();
TSOR=1;
_nop_();_nop_();
}
//**************************************************
void write1TS(void)
{
TSOR=1;TSOR=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
delay15us();delay15us();delay15us();
}
//********************************************
bit readTS(void)
{
bit b;
TSOR=1;
TSOR=0;
_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
b=TSOR;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
return b;
}
//***************************************************
void resetTS(void)
{uchar i;
TSOR=1;TSOR=0;
for(i=0;i<8;i++)delay60us();
TSOR=1;
while(TSOR);
for(i=0;i<8;i++)delay60us();
}
//***********************************************
void writeBTS(uchar byte)
{uchar i;
for(i=0;i<8;i++)
{
if(byte&0x01)
write1TS();
else
write0TS();
byte=byte>>1;
}
}
//**********************************************
uchar readBTS(void)
{uchar i,j;
bit b;
j=0;
for(i=0;i<8;i++)
{
b=readTS();
if(b) j+=1;
j=_cror_(j,1);
}
return j;
}
//*****************************************8
void initTS(void)
{
resetTS();
writeBTS(0xcc);
writeBTS(0x4e);
writeBTS(0x64);
writeBTS(0x8a);
writeBTS(0x1f);
}
//******************************************
void gettempTS(void)
{
resetTS();
writeBTS(0xcc);
writeBTS(0x44);
delay(200);
resetTS();
writeBTS(0xcc);
writeBTS(0xbe);
temp2=readBTS();
temp1=readBTS();
readBTS();readBTS();readBTS();readBTS();
readBTS();readBTS();readBTS();
temp1=temp1<<4;
temp1+=(temp2&0xf0)>>4;
temp2=(temp2&0x0f)?5:0;
}
//********************************************
void delayus (uint value)/*延時(shí)副程式*/
{
while (value!=0) value--;/*10US延時(shí)*/
}
/*********************************************************************/
//串行發(fā)送DTLED-6顯示
//dispbuf0-dispbuf1-dispbuf2-dispbuf3-dispbuf4-dispbuf5-dispbuf6-dispbuf7-dispbuf8
// 小數(shù)點(diǎn) - 數(shù)碼管1- 數(shù)碼管2- 數(shù)碼管3- 數(shù)碼管4- 數(shù)碼管5- 數(shù)碼管6-ID識(shí)別碼-BZ識(shí)別碼
//00000xxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx
//小數(shù)點(diǎn)=1~6,其它為不顯示
//數(shù)碼管1-6=0~15,
//ID識(shí)別碼=0~15
//BZ識(shí)別碼=BZ.3為蜂鳴輸出控制位,0=關(guān)閉,1=打開(kāi)
// BZ0~2為蜂鳴頻率輸出設(shè)定為,000=不分頻, 最高頻率輸出=4800Hz;
// 001=一次分頻,頻率輸出=4800/ 2 =2400Hz;
// 010=二次分頻,頻率輸出=4800/ 4 =1200Hz;
// 011=三次分頻,頻率輸出=4800/ 8 =600Hz;
// 100=四次分頻,頻率輸出=4800/ 16=300Hz;
// 101=五次分頻,頻率輸出=4800/ 32=150Hz;
// 110=六次分頻,頻率輸出=4800/ 64=75Hz;
// 111=七次分頻,頻率輸出=4800/128=38Hz;
//======================================================================
void tsled(void)/*串行發(fā)送DTLED-6顯示副程式*/
{ char ts0,i,j;
clk=0;
en=0;
delayus(10);
for(j=0;j<9;j++)
{ts0=dispbuf[j];
for(i=0;i<4;i++)/*發(fā)小數(shù)點(diǎn)碼8,4,2,1*/
{
clk=1;
ts0=ts0<<1;
if(AC==1)
dout=1;
else dout=0;
clk=0;
_nop_();
delayus(3);
}
}
en=1;
}/*返回主程式*/
void main(void)
{
uchar T=28;
initTS();
reset()
dispbuf[7]=0x01;/*ID號(hào)碼*/
dispbuf[8]=0x00;/*蜂鳴器關(guān)閉*/
while(1)
{
gettempTS();
dispbuf[0]=2; //關(guān)閉小數(shù)點(diǎn)位顯示//數(shù)據(jù)顯示
dispbuf[1]=(temp2/10+0x30);
dispbuf[2]=((temp1-2)%10+0x30);
dispbuf[3]=((temp1-2)/10+0x30);
dispbuf[4]=0;
dispbuf[5]=(T%10+0x30);
dispbuf[6]=(T/10+0x30);
tsled();
delayus(50000);
}
}
評(píng)論