?? temperature.c
字號:
#include<reg52.h>
#include<intrins.h>
void delay(unsigned int t);
unsigned char DisBuff[4];
unsigned char COM;
sbit COM4=P2^7; //定義通信端口
sbit COM3=P2^4;
sbit COM2=P2^5;
sbit COM1=P2^6;
sbit DQ=P3^7;
#define a 0x04 // AAAA
#define b 0x01 // F B
#define c 0x10 // F B
#define d 0x40 // GGGG
#define e 0x80 // E C
#define f 0x02 // E C
#define g 0x08 // DDDD H
#define h 0x20
unsigned char code LED_table[]={
a+b+c+d+e+f, //"0"
b+c, //"1"
a+b+d+e+g, //"2"
a+b+c+d+g, //"3"
b+c+f+g, //"4"
a+c+d+f+g, //"5"
a+c+d+e+f+g, //"6"
a+b+c, //"7"
a+b+c+d+e+f+g, //"8"
a+b+c+d+f+g, //"9"
b+c+e+f+g, //"H"
a+f+e+g, //"C"
d+e+f, //"L"
g, //"-"
0x00 //black
};
#undef a
#undef b
#undef c
#undef d
#undef e
#undef f
#undef g
#define SP 14
/********************************************************/
/* 初始化系統(tǒng) */
/********************************************************/
void Sys_Init()
{
TMOD=0x01;
TH0=(65536-1000)/256; //1ms
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*********************************************************/
/* 初始化DS18B20 */
/*********************************************************/
void Init_DS18B20(void) //初始化函數(shù)
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay(8); //稍做延時
DQ = 0; //pull DQ line low
delay(80); //leave it low for 480~960us
DQ = 1; //allow line to return high
delay(14); //wait for presence 15~60us
x=DQ; //稍做延時后 如果x=0則初始化成功
delay(20); // x=1則初始化失敗
}
/*********************************************************/
/* 讀一個字節(jié) */
/*********************************************************/
unsigned char Read_byte(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80; // 取數(shù)據(jù)最高位
delay(4);
}
return(dat);
}
/*********************************************************/
/* 寫一個字節(jié) */
/*********************************************************/
void Write_byte(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01; //取數(shù)據(jù)最低位
delay(5);
DQ = 1;
dat>>=1;
}
delay(4);
}
/*********************************************************/
/* 讀取溫度 */
/*********************************************************/
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
Write_byte(0xCC); // 跳過讀序號列號的動作 因?yàn)橹挥幸粋€器件
Write_byte(0x44); // 啟動溫度轉(zhuǎn)換
Init_DS18B20();
Write_byte(0xCC); //跳過讀序號列號的動作
Write_byte(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=Read_byte(); //讀取溫度值低位
b=Read_byte(); //讀取溫度值高位
//a=a>>4; //低位右移4位,舍棄小數(shù)部分
//b=b<<4; //高位左移4位,舍棄符號位
//t=b|a;
//return(t);
return((b*256+a)*10/16); // b*256+a 把兩個8位溫度變成16位
} // *10 擴(kuò)大10倍從而保留小數(shù)位
// /16 把18b20的輸出換算成實(shí)際溫度,
// 顯示時的小數(shù)點(diǎn)視情況而定
/*********************************************************/
/* 溫度顯示函數(shù) */
/*********************************************************/
void DisplayNumber(unsigned int Num)
{
unsigned char i;
EA=0;
for(i=0;i<4;i++)
{
DisBuff[i]=Num%10;
Num/=10;
}
/* if(DisBuff[3]==0)
{
DisBuff[3]=0xff;
if(DisBuff[2]==0)
{
DisBuff[2]=0xff;
if(DisBuff[1]==0)
DisBuff[1]=0xff;
}
} */
for(i=3;i>=0;i--) //消隱無效"0"
{
if(DisBuff[i]==0) DisBuff[i]=SP;
else break;
}
delay(100);
EA=1;
}
/*********************************************************/
/* 數(shù)碼管掃描選通 */
/*********************************************************/
void Display_Scan() interrupt 1 //中斷1觸發(fā)時,就會指向該函數(shù)執(zhí)行
{ //并且保留現(xiàn)場,該函數(shù)完成后,回到入口,
TR0=0; //從原現(xiàn)場繼續(xù)執(zhí)行,等待下次中斷發(fā)生
TH0=(65536-1000)/256; //1ms
TL0=(65536-1000)%256;
TR0=1;
if(COM>3) COM=0;
COM1=1;COM2=1;COM3=1;COM4=1;
switch(COM)
{
case 0: P0=LED_table[DisBuff[0]]; COM1=0; break;
case 1: P0=LED_table[DisBuff[1]]|0x20; COM2=0; break; //在數(shù)碼管第二位上點(diǎn)亮小數(shù)點(diǎn)
case 2: P0=LED_table[DisBuff[2]]; COM3=0; break;
case 3: P0=LED_table[DisBuff[3]]; COM4=0; break;
}
COM++;
}
/*********************************************************/
/* 延時子程序 */
/*********************************************************/
void delay(unsigned int i)
{
while(i--);
}
/*********************************************************/
/* 主函數(shù) */
/*********************************************************/
void main(void)
{
unsigned int temp;
Sys_Init();
while(1) //死循環(huán)
{
temp=ReadTemperature();
DisplayNumber(temp);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -