单片机C语言程序 用DS18B20与数码管设计温度报警器
发布网友
发布时间:2022-05-09 15:58
我来回答
共1个回答
热心网友
时间:2023-05-30 18:36
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^3; //DS18B20数据口
uchar code table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint a) //延时
{
while(a--); //为了精准控制
}
void reset() //复位
{
DQ=0;
delay(50);
DQ=1;
delay(50);
}
void write_bit(uchar a) //写一位
{
DQ=0;
if(a) DQ=1;
delay(5);
DQ=1;
}
uchar read_bit() //读一位
{
DQ=0;
DQ=1;
delay(0); //需要非常准确控制时间 5US左右
return DQ;
}
void write_byte(char k) //写一个字节
{
uchar i,b;
for(i=0;i<8;i++)
{
b=k;
b=b>>i; //位操作 用于除2计算
write_bit(b&0x01);
delay(5);
}
}
uchar read_byte() //读一个字节
{
uchar i,m=1,s=0;
for(i=0;i<8;i++)
{
if(read_bit()) s+=m<<i; //位操作 用于乘2计算
delay(5);
}
return s;
}
void display_smg(uint temp) //驱动数码管
{
uint i;
for(i=7;i>=0;i--)
{
P2=i; //位选
P0=table[temp%10]; //段选
temp/=10;
delay(500);
if(temp==0) break; //消零
}
}
main()
{
uchar temp_h,temp_l;
uint temp;
P0=0x00;
P2=0x00;
while(1)
{
reset(); //复位
write_byte(0xcc); //跳过搜索
write_byte(0x44); //温度转换
reset(); //复位
write_byte(0xcc); //跳过搜索
write_byte(0xbe); //要求读出数据
temp_l=read_byte(); //读出低八位
temp_h=read_byte(); //读出高八位
reset(); //终止读数
temp=temp_h*16+temp_l/16;//转换低位和高位之和
display_smg(temp); //驱动数码管
}
}