|
/***************讀取DS18B20溫度,通共陰數碼管顯示**************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
code uchar seven_seg[] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x77,0x7C,0x39,0x5E,0x79,0x71};
uint timer;
uint temp;
sbit DQ = P1^0;
sbit LED = P0^1;
sbit KEY = P0^2;
sbit BIT1 = P0^7;
sbit BIT2 = P0^6;
sbit BIT3 = P0^5;
sbit BIT4 = P0^4;
void delay(uint x)
{
while(x--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delay(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay(20);
}
/******************************從18B20中讀一個字節****************************/
uchar Read_OneChar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat >>= 1;
DQ = 1; // 給脈沖信號
if(DQ)
dat |= 0x80;
delay(8);
}
return(dat);
}
/******************************向18B20中寫一個字節****************************/
void Write_OneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(10);
DQ = 1;
dat >>= 1;
}
delay(8);
}
/***********************************讀取溫度**********************************/
uint Read_Temperature(void)
{
float zs,xs; //zs=整數,xs=小數
uchar temp_L,temp_H; //溫度低8位,和高8位
uint t; //返回值
EA=0; //關中斷,以免意外
Init_DS18B20();
Write_OneChar(0xcc); // 跳過讀序號列號的操作
Write_OneChar(0xbe); // 讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
temp_L = Read_OneChar(); //讀取溫度值低位
temp_H = Read_OneChar(); //讀取溫度值高位
Init_DS18B20();
Write_OneChar(0xcc); //跳過讀序號列號的操作
Write_OneChar(0x44); //啟動溫度轉換
xs = 0x0f & temp_L; //低四位的后四位得到小數部分
xs = xs/10;
zs = ((temp_L&0xf0)>> 4)|((temp_H&0x0f)<< 4);//低位右移4位,高位左移4位,得到整數部分
t=(zs+xs)*10; //整數+小數等于數據,但又小數點,所以數據X10倍,變成整數
EA=1; //開中斷
return(t);
}
/********延時函數************/
void delay_time(uint time)
{uint a,b;
for(a=0;a<time;a++)
for(b=0;b<2;b++);
}
/********初始化中斷函數************/
void timer0_init(void) //初始化
{
TMOD = 0x01;
TH0 = 0xec;
TL0 = 0x78;
TR0 = 1;
EA = 1;
ET0 = 1;
}
/************************************************************************/
void timer0_isr(void) interrupt 1 //中斷
{
TH0 = (65535-1000)/256;
TL0 = (65535-1000)%256;
timer++;
}
/**********顯示函數************/
void display_num(uint num)
{
BIT1=1;
P2=seven_seg[num/100%10];
BIT2=0;
delay_time(10);
BIT2=1;
P2=seven_seg[num/10%10]+0X01;
BIT3=0;
delay_time(10);
BIT3=1;
P2=seven_seg[num%10];
BIT4=0;
delay_time(10);
BIT4=1;
}
/***********主函數*************/
void main(void)
{
KEY=1;
timer0_init();
while(1)
{
if(KEY==0){temp=0;LED=0;}
display_num(temp); // temp2
if(timer>1000)
{timer=0;temp=Read_Temperature();}
LED=1;
}
}
QQ截圖20190521201109.png (153.5 KB, 下載次數: 35)
下載附件
原理圖
2019-5-21 20:15 上傳
|
|