资源简介
基于AT89S52单片机的数字温度计基于AT89S52单片机的数字温度计基于AT89S52单片机的数字温度计
代码片段和文件信息
//ds18b20做的温度计(共阴四位数码管)
#include
#define uchar unsigned char
sbit DQ=0xB0; //已修改为p3的0号端口
uchar data temp_data[2]={0x000x00}; // 用来存放从18B20读得的高8位和低8位数据
uchar data display[5]={0x000x000x000x000x00};
unsigned char code ditab[16]={0x000x010x010x020x030x030x04
0x040x050x060x060x070x080x080x090x09}; //共阴数码管
uchar code table[11] ={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f0x00};
// 0123456789百位或当最高位十位为0时不显示
uchar code table1[10]= {0xcf0x860xdb0xcf0xe60xed0xfd0x870xff0xef};
// 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.各位带有小数点的显示
void delay_18b20(unsigned int i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18b20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18b20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18b20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18b20(20);
}
ReadOneChar(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 ;
delay_18b20(4) ;
}
return (dat) ;
}
WriteOneChar(unsigned char dat)
{
unsigned char i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
delay_18b20(5) ;
DQ = 1 ;
dat>>=1 ;
}
}
Read_Temperature(void)
{
Init_DS18B20() ;
WriteOneChar(0xCC) ; // 跳过读序号列号的操作
WriteOneChar(0x44) ; // 启动温度转换
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
WriteOneChar(0xBE) ; //读取温度寄存器
temp_data[0] = ReadOneChar() ; //温度低8位
temp_data[1] = ReadOneChar() ;
评论
共有 条评论