📄 wenkong.c
字号:
#include <reg51.h> // 调用头文件
sbit BAI =P2^3; // 数码管是四位的(三位显示整数,一位显示小数),有四个电源使能端,BAI驱动百位 SHI驱动十位
sbit SHI =P2^2; // GE驱动个位
sbit GE =P2^1; //
sbit XIAO=P2^0; // XIAO驱动小数位
sbit dp=P0^5; // 小数点标致
sbit beng=P2^4; // 驱动鸣声器
sbit DQ =P2^5; //定义通信端口
static unsigned char HT,LT; //定义用于存放温度值的高位
unsigned char tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
//0, 1, 2 3 4 5 6 7 8 9
void delay(unsigned int i) //
{
while(i--);
}
void delayms(unsigned int i) //延时 1MS
{ unsigned char j=0;
for (;i>0;i--)
{ for (j=0;j<125;j++)
{;}
}
}
//DB18B20初始化函数
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);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1; // 逐位右移
DQ = 1; // 给脉冲信号
if(DQ) //DQ为1 时,表示收到高电平1
dat|=0x80; // 把收到的高电平置给DAT的最高位
delay(4);
}
return(dat); //
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01; //把要发送的高电平或者低电平给DQ 发送出去
delay(5);
DQ = 1;
dat>>=1; //逐位右移
}
delay(4);
}
//读取温度
void ReadTemperature()
{
unsigned char a=0;
unsigned char b=0;
Init_DS18B20(); //调用初始化函数
WriteOneChar(0xCC); // 跳过读序号列号的操作
//不需要验证序列号。
WriteOneChar(0x44); // 发送温度转换命令 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
LT=(a&0xF0)?5:0; //
HT=b<<4; //
HT+=(a&0xF0)>>4; //
}
void display_tempmain( ) //主程序温度显示函数
{
static char k;
if (HT>99) //
{ P0=tab[1];
BAI=0;
SHI=1;
GE =1;
XIAO=1;
delay(600);
}
if (HT<1) // 如果温度低于1度
{ P0=0x7f; //数码管百显示"-",表示零下温度
BAI =0; //驱动百位数码管,屏蔽其他位数码管
SHI=1;
GE=1;
XIAO=1;
delay(600);
}
P0=tab[LT]; //
BAI =1;
SHI=1;
GE =1;
XIAO=0; //
delay(600);
P0=tab[HT/10]; // 显示十位温度值,屏蔽其他位
BAI=1;
SHI=0;
GE=1;
XIAO=1;
delay(600);
if(k!=tab[HT%10]) //
{ if(beng)
{beng=0;
delayms(350); // 个位温度值发生变化,短鸣一声,告示
beng=1;
}
}
P0=tab[HT%10]; //显示各位温度值
k=tab [HT%10];
SHI=1; //一定要把各位放在最后面,因为要确保个位的后面的小数点被点亮
GE =0;
XIAO=1;
delay (600);
}
void main(void)
{
P2=0xff;
while(1) //主循环
{ dp=0; //点亮小数点
ReadTemperature(); //读取温度值
display_tempmain(); //对读到的温度值进行处理
if(HT>37|HT<20) // 判断温度范围
{beng=0;} // 如果温度高于37度或者低于20度,则报警告示
else
beng=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -