STC89S51单片机 DS18B20温度显示到数码管上
1.根据时序图 来写程序
1. 初始化时序图
初始化的作用 是侦测DS18B20是否能正常工作 就是是否存在DS18B20 如果初始化成功 DS18B20会将DQ置0
所以代码如下
bit DS18B20_Reset()
{
bit flag;//是否侦测到DS18B20的标志位
DS18B20_DQ=0;//先将DQ置0
Delay480us();//延时480us
DS18B20_DQ=1;//释放 等待DS18B20拉低 但是要超过60u 如果小于60 就不准确
Delay80us();//就定延时80us
flag=DS18B20_DQ;//然后给到flag
Delay400us();//把时序走完
return flag;
}
2. 写入时序图
void DS18B20_WriteData(unsigned char dat)
{
unsigned char j;
for(j=0;j<8;j++)
{
DS18B20_DQ=0;//可以看到 要延时>1us
Delay4us();//就延时4us
DS18B20_DQ=dat&0x01;//取数据的最低位
Delay60us();//延时60us 60到120均可 不管是写0还是写1
DS18B20_DQ=1;// 释放总线
dat=dat>>1;//右移一位 把最低位移走 移动8次 就传完了
Delay25us();//时序走完
}
}
3.读时序图
unsigned char DS18B20_ReadData()
{
unsigned char j,rdata;
for(j=0;j<8;j++)
{
DS18B20_DQ=0;//不管怎样 做之前 都要先拉低DQ
Delay4us();//延时4us 大于1us即可
DS18B20_DQ=1;//释放总线
rdata>>=1;//
Delay6us();
if(DS18B20_DQ==1)//如果读到是1
{
rdata=rdata|0x80;//先放到最高位 然后右移
}
Delay60us();//延时60us
DS18B20_DQ=1;//释放总线
}
return rdata;//返回数据
}
2.main 主函数
void main()
{
while(1)
{
unsigned int i=0;
unsigned int tempH,tempL;//温度高位和低位
DS18B20_Reset();
DS18B20_WriteData(0xCC);//跳过RAM检测
DS18B20_WriteData(0x44);//启动温度转换
DS18B20_Reset();
DS18B20_WriteData(0xCC);//跳过RAM检测
DS18B20_WriteData(0xBE);//读暂存器命令
tempL=DS18B20_ReadData();//读温度低位
tempH=DS18B20_ReadData();//读温度高位
tempH=(tempH<<8)|tempL;
if((t&0xF800)==0xF800)//如果温度是负值
{
t=~t+1;
}
temp=tempH*0.0625*100;//×0.0625就是温度
dis_code[0]=change(temp/1000);//温度十位
dis_code[1]=change(temp/100%10)|0x80;//温度个位
dis_code[2]=change(temp/10%10);//温度小数点后一位
dis_code[3]=change(temp%10);//温度小数点后二位
//显示到动态数码管上面
for(i=0;i<4;i++)
{
//HC138译码器 位码
switch(i)
{
case 0:HC138_A=0;HC138_B=0;HC138_C=0;break;
case 1:HC138_A=1;HC138_B=0;HC138_C=0;break;
case 2:HC138_A=0;HC138_B=1;HC138_C=0;break;
case 3:HC138_A=1;HC138_B=1;HC138_C=0;break;
default: break;
}
P2=dis_code[i];
Delay1ms();
P2=0;
}
}
}
unsigned int change(unsigned int t)
{
switch(t)
{
//每个数字对应的数码管共阴极的16进制
case 0:return 0x3f;break;
case 1:return 0x06;break;
case 2:return 0x5b;break;
case 3:return 0x4f;break;
case 4:return 0x66;break;
case 5:return 0x6d;break;
case 6:return 0x7d;break;
case 7:return 0x07;break;
case 8:return 0x7f;break;
case 9:return 0x6f;break;
default: return 0; break;
}
}
另外 代码中用到了许多延时函数 尽量用烧入代码的软件里面 有更加准确的延时函数 如stc-isp
注意 找到自己单片机对应的指令集 和系统频率
3. 展示视频
VID_20230411_170205