//18B20单线温度检测的应用样例程序
#include<REG52.H>
/*****************************************************************************/
sbit DQ=P1^7;//ds18b20 端口
sfr dataled=0x80;//显示数据端口
/**********************************************************************/
unsigned char temp;
unsigned char flag_get,count,num;
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表共阳
unsigned char str[3];
/***********************************************************************/
unsigned char ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/************************************************************************/
main()
{
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[2]=0xc6;//显示C符号
str[0]=tab[temp/10]; //十位温度
str[1]=tab[temp%10]; //个位温度
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature();
flag_get=0;
}
}
}
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//标志位有效
}
count++;
if(count==1)
{P2=0xf7;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=0xfb;
dataled=str[1];}
if(count==3)
{ P2=0xfd;
dataled=str[2];
count=0;}
}
/*************************************************************************************/
void delay(unsigned int i)//延时函数
{
while(i--);
}
/***************************************************************************************/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}
//读一个字节
unsigned char 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(5);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
long int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=4;
b+=(a&0xf0)>>4;
t=b;
return(t);
}
要能在数码管上显示出来哦……包括小数点。
怎么修改ds18b20的转换精度?最好有具体的C语言程序。
实际应用中精度不用设置,让其为最大12位,只需在程序中按需要的精度要求舍弃后面的位数即可。采用右移的办法舍弃,有个数码管显示的程序你可参考一下:uint16 temp;uint8 n=0; \/\/N=0符号为正 \/* if(tem>6348) \/\/温度值正负判断 { tem=65536-tem; \/\/负温度求补码 n=1; \/\/标志位置n=1...
...做个DS18B20的温测小系统,数码管老显示“00”,还闪烁,望帮小弟指点...
1.先不考虑检测值,单显示测试正常否。2.温度检测值应该是没检测到
DS18B20温度传感器测温程序 示数显示一直为001C,不知道哪出问题了,希...
(T_data[1]<<4)|(T_data[0]>>4)合并
有关温度报警器的程序,有关DS18B20的程序已写好,求助有关蜂鸣器报警和温...
单片机在处理标度转换时是通过把 DS18B20 的信号线送回的 16 位数据右移 4 位得到二进制的温度值。其小数部分通过查小数表的形式获取。程序流程图如下图 9: 开始将28H低4位与29H高4位组合成一个字节将合成的字节(整数部分)送29H单元将29H单元低4位送A给DPTR赋常数表格2首地址将查到的数值(即小数部分)...
...读取小数点后一位?我的数码管显示小数点后一位,一直是8..._百度...
a=ReadOneChar();b=ReadOneChar();t=b;t<<=8;t=t|a;a = t % 16; \/\/取出小数部分 t = t \/ 16; \/\/这是整数部分 return(t);a 中,已经是小数,可以根据你的需求,自行处理。
数码管显示DS18B20温度
稍稍改了一下程序,显示效果不错,数值随着温度调整,可以发生变化。……temp = TMPH;temp <<= 8;temp = temp | TMPL;tt = temp * 0.0625;a = tt * 10000;a = a + 1235; \/\/加上了四位小数 \/\/温度百位 P2 = 255; \/\/先消隐 P0 = table1[a \/ 1000000];P2 = 255 - 0x...
DS18B20测温C程序:数码管显示不随温度变化,且不正确,求高手解答,万分感 ...
在mian函数while(reset())的下一行加上DQ=1;(拉高电平)。
我现在写了DS18B20的c程序还有用定时器输出的PWM波程序,用数码管显示...
无论程序执行到何处都会被暂停,优先去执行中断服务程序。 DS18B20这种对时序有严格要求的单总线通讯,在发送和接收数据时被定时器中断扰乱了时序,所以无法通讯。要解决此问题建议你采用带硬件PWM的MCU,或者将18B20通讯代码放在中断服务程序内部,如果采用后一种方式,PWM计时时间请算上18B20通讯的时间。
单片机ds18b20测温程序,为啥数码管显示的温度是16进制,我照着别人的...
共阴极和共阳极的数码管字符编码不同的,好好检查检查你的段码数组。
DS18B20温度显示程序、用的是四位共阴极数码管。目前显示的是比如:27.00...
你把最后两个设置成定向的输出字符,,一直显示‘C,