?? zpfinaln.c
字號(hào):
/******************************************************************************/
/**
/** 功能描述:通過(guò)AT89S/C52,11.0592MHz,DS18B20和6位數(shù)碼管,采集溫度并在數(shù)碼管上實(shí)時(shí)顯示。
/** 并有相應(yīng)的不同顏色的led和蜂鳴器指示。
/** 創(chuàng) 建 人:chiusir@yahoo.cn 日期:2008-04-06 */
/** 修 改 人: 日期:2008-04-18 */
/** 其他說(shuō)明:
/******************************************************************************/
#include<regx51.h>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
sbit SIO = P2^0;
sbit redled =P3^0;
sbit greenled =P3^1;
sbit blueled =P3^2;
sbit BZ =P3^3;
//0,1,2,3,4,5,6,7,8,9,-
U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
/*******************************************************************************
*** 函 數(shù) 名: void DLY_us(U8 x)
*** 功能描述: 微秒級(jí)延時(shí);
*** 全局變量: NO !
*** 輸 入: x !
*** 輸 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函數(shù)說(shuō)明:
*** //1-5,2-7,3-9 ,5--16.5us,10-30.4,22-52,25-58,35-78,61-125,125-250,250--500us
/******************************************************************************/
void DLY_us(U8 x) //x取值1~255;
{
while(--x);
}
/*******************************************************************************
*** 函 數(shù) 名: void DLY_ms(U16 x)
*** 功能描述: 毫秒級(jí)延時(shí);
*** 全局變量: NO !
*** 輸 入: U16 x !
*** 輸 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函數(shù)說(shuō)明:
/******************************************************************************/
void DLY_ms(U8 x) //x取值1~255;
{
U8 i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/*******************************************************************************
*** 函 數(shù) 名: void Init1820()
*** 功能描述:
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函數(shù)說(shuō)明:
/******************************************************************************/
void Init1820()
{
SIO = 1;
_nop_();
SIO = 0; //拉低數(shù)據(jù)線,準(zhǔn)備Reset OneWire Bus;
DLY_us(125); //延時(shí)500us,Reset One-Wire Bus.
DLY_us(125);
SIO = 1; //提升數(shù)據(jù)線;
DLY_us(15); //延時(shí)35us;
while(SIO) //等待Slave 器件Ack 信號(hào);
{
_nop_();
}
DLY_us(60); //延時(shí)125us;
SIO = 1; //提升數(shù)據(jù)線,準(zhǔn)備數(shù)據(jù)傳輸;
}
/*******************************************************************************
*** 函 數(shù) 名: static void DS18B20_WR(U8 cmd)
*** 功能描述: 寫(xiě)一個(gè)字節(jié);
*** 全局變量: NO !
*** 輸 入: cmd:8bit;
*** 輸 出: NO !
*** 函數(shù)說(shuō)明: cmd主要有Rom操作指令和E2Ram操作指令兩種;
/******************************************************************************/
void WR1820(U8 cmd)
{
U8 i;
for(i=0;i<8;i++)
{
if(cmd & 0x01) //低位在前;
{
SIO = 0; //結(jié)束Recovery time;
_nop_();
_nop_();
_nop_();
SIO = 1;
} //發(fā)送數(shù)據(jù);
else
SIO = 0; //結(jié)束Rec time;
_nop_();
_nop_();
_nop_();
//SIO = 0; } //發(fā)送數(shù)據(jù);
DLY_us(30); //等待Slave Device采樣;
SIO = 1; //Recovery;
_nop_(); //Recovery Time Start;
cmd >>= 1;
}
}
/*******************************************************************************
*** 函 數(shù) 名: U8 RD1820(void)
*** 功能描述: 讀取一個(gè)字節(jié);
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: 8bit data;*
*** 函數(shù)說(shuō)明: 讀之前必須首先寫(xiě)1;
/******************************************************************************/
U8 RD1820(void)
{
U8 i;
U8 tmp=0;
SIO = 1;
_nop_(); //準(zhǔn)備讀;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先發(fā);
SIO = 0; //Read init;
_nop_(); //1us;
SIO = 1; //必須寫(xiě)1,否則讀出來(lái)的將是不預(yù)期的數(shù)據(jù);
DLY_us(2); //延時(shí)7us;
_nop_();
if(SIO) //在12us處讀取數(shù)據(jù);
tmp |= 0x80;
DLY_us(30); //延時(shí)55us;
SIO = 1;
_nop_(); //恢復(fù)One Wire Bus;
}
return tmp;
}
/*******************************************************************************
*** 函 數(shù) 名: U16 RD_T();
*** 功能描述: 讀取溫度;
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: 16bit data;
*** 函數(shù)說(shuō)明: 讀之前必須首先寫(xiě)1;
/******************************************************************************/
U16 RD_T()
{
U16 tp;
U8 tmbuf[2];
Init1820();
WR1820(0xcc);
//delay_ms(2);
WR1820(0x44);
// _nop_();
// SIO=1;
// delay_ms(250); //多個(gè)1820時(shí)要延時(shí),單個(gè)就不用,數(shù)據(jù)手冊(cè)里看
// delay_ms(250);
// delay_ms(250);
Init1820();
WR1820(0xcc);
WR1820(0xbe);
tmbuf[0]=RD1820();
tmbuf[1]=RD1820();
Init1820();
tp=tmbuf[1]*256+tmbuf[0];
return(tp);
}
/*******************************************************************************
*** 函 數(shù) 名: void Show_8LED(U16 dig)
*** 功能描述: 把數(shù)字轉(zhuǎn)化為5位LED顯示
*** 全局變量: NO !
*** 輸 入: 從DB18B20讀取的16位原始數(shù)據(jù):低11位數(shù)據(jù)位,高5位為符號(hào)位!
//0,1,2,3,4,5,6,7,8,9,-
U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
P0.0--4依次為符號(hào)位,百位,十位,個(gè)位,十分為,百分位
P1接8段數(shù)碼管
*** 輸 出: NO !
*** 函數(shù)說(shuō)明:
/******************************************************************************/
void Show_8LED(int tmv)
{
U8 ge,shi,bai,shifen,baifen,neg=0;
if(tmv<0)
{
tmv=-tmv;
neg=1;
}
bai=tmv/10000;
shi=(tmv%10000)/1000;
ge =(tmv%1000)/100;
shifen=(tmv%100)/10;
baifen=tmv%10;
for(tmv=0;tmv<80;tmv++)
{
if(neg)
{
P0=0x01; //符號(hào)位
P1=LED_IMG[10];
DLY_ms(3); //this is the smallest interval
}
P0=0x02;
P1=LED_IMG[bai]|0X80;
DLY_ms(3);
P0=0x04;
P1=LED_IMG[shi]|0X80;
DLY_ms(3);
P0=0x08;
P1=LED_IMG[ge]&0x7f; //dot always.
DLY_ms(3);
P0=0x10;
P1=LED_IMG[shifen]|0X80;
DLY_ms(3);
P0=0x20;
P1=LED_IMG[baifen]|0X80;
DLY_ms(3);
P1=0xff;
}
}
/*******************************************************************************
*** 函 數(shù) 名: void Beep(U16 cnt)
*** 功能描述: 蜂鳴器鳴響
*** 全局變量: NO !
*** 輸 入: CNT-時(shí)間長(zhǎng)短 !
*** 輸 出: NO !
*** 函數(shù)說(shuō)明:
/******************************************************************************/
void Beep(U16 cnt)
{
while(cnt--)
{
BZ=1;
DLY_us(200); //
BZ=0;
DLY_us(50);
}
}
/*******************************************************************************
**** main()
*******************************************************************************/
void main(void)
{
U16 y;
float x;
U8 neg_flag=0,i;
P0=0xff;
P1=0x00;
P3=0xff;
DLY_ms(250);
P3=0x00; //cancel noise
for(i=0;i<6;i++) //1.5s
{
DLY_ms(250);
}
Show_8LED(-12345);
DLY_ms(250);
DLY_ms(250);
Show_8LED(-6789);
DLY_ms(250);
DLY_ms(250);
while(1)
{
y=RD_T();
if(y<2001)
{
neg_flag=0;
y&=0x07ff;
}
else
{
neg_flag=1;
y=~y+1;
}
x=y*6.25;
if(neg_flag)
x=-x;
Show_8LED((int)x);
P3|=0x07;
if(y<480) //30--480
greenled=0;
else if(y<615) //40--615
blueled=0;
else if(y<2001){ //60--960,
redled=0;
Beep(1000);
}
else
greenled=0;
for(i=0;i<8;i++) //2s
{
DLY_ms(250);
}
}
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -