问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

单片机ts18b20测温程序 请大神注释程序 最好每一句都注释明白(小白一只...

发布网友 发布时间:2024-03-22 10:40

我来回答

2个回答

热心网友 时间:2024-03-27 16:16

/****lcd1602显示温度(使用温度传感器18b20)*****/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*********液晶屏相关参数**************/
#define data_port P1 //液晶屏指令、数据通信接口
sbit rs=P2^0; //液晶屏寄存器选择接口(rs=0时选择指令寄存器,rs=1时选择数据寄存器)
sbit rw=P2^1; //液晶屏读写选择接口(rw=0时选择写入,rw=1时选择读出)
sbit en=P2^2; //液晶屏使能接口(en=0时通信接口中断,en=1时通信接口接通)
uchar code line1_str[]={" Temperature "};//液晶屏第一行要显示的字符串
uchar code num_tab[]={"0123456789"};
/*********温度传感器18b20相关参数**********/
sbit DQ=P3^5; //温度传感器18b20的数据接口
/**********子函数声明部分************/
void T1_int(); //定时器T1初始化子函数声明
void in_command(uchar com); //向液晶屏输入命令子函数声明
void in_data(uchar dat); //向液晶屏输入数据子函数声明
void lcd_disp_string(uchar str[]); //液晶屏显示一串字符子函数声明
void lcd_int(); //液晶屏初始化子函数声明
void disp_temperature(uint temp);//lcd1602显示温度子函数声明
bit ds18b20_ret(); //温度传感器18b20复位子函数声明
void ds18b20_wr_com(uchar com); //向温度传感器18b20写入命令子函数声明
void rd_ram_command(); //发送命令子函数(读取18b20的RAM)
uint ds18b20_rd_data(); //读出温度传感器18b20寄存器的相关数据(主要是温度值)子函数声明
void temperature_convert(); //18b20温度转换子函数声明
void delayms(uint ms); //毫秒延时子函数声明
void delay_n10_us(uchar n); //微秒延时子函数声明
/************************************/
void main()
{
T1_int(); //定时器T1初始化
DQ=1; //释放温度传感器18b20的数据接口
temperature_convert(); //第一次调用18b20温度转换子函数消除85°C问题
lcd_int(); //液晶屏初始化(放在18b20温度转换子函数后边用来延时,跳过85°C)
while(1)
{
temperature_convert(); //调用18b20温度转换子函数
rd_ram_command(); //发送命令子函数(读取18b20的RAM)
disp_temperature(ds18b20_rd_data());//调用lcd1602显示温度子函数
}
}
/**********定时器T1初始化*************/
void T1_int()
{
TMOD=0x10; //0001 0000 T1工作在定时方式1
TH1=0; //T1设定初值
TL1=0;
TR1=0; //暂时关闭T1
}
/**********18b20温度转换子函数*************/
void temperature_convert()
{
while(ds18b20_ret()==0);//温度传感器18b20复位
ds18b20_wr_com(0xcc); //向温度传感器18b20写入"跳跃ROM命令"
ds18b20_wr_com(0x44); //向温度传感器18b20写入"温度转换命令"
delay_n10_us(50); //500us延时,等待转换完成
}
/**********发送命令子函数(读取18b20的RAM)***********/
void rd_ram_command()
{
while(ds18b20_ret()==0);
ds18b20_wr_com(0xcc); //向温度传感器18b20写入"跳跃ROM命令"
ds18b20_wr_com(0xbe); //向温度传感器18b20写入"读RAM命令"
}
/******读出18b20寄存器的相关数据(主要是温度值)子函数******/
uint ds18b20_rd_data()
{
uchar i;
uint temp_val;
for(i=0;i<16;i++)
{
temp_val>>=1;
DQ=0;
_nop_();
DQ=1;
_nop_();
_nop_();
if(DQ==1)
{
temp_val|=0x8000;
}
delay_n10_us(7); //70us延时,确保读出
}
return(temp_val);
}
/******向温度传感器18b20写入命令子函数声明****/
void ds18b20_wr_com(uchar com)
{
uchar i;
for(i=0;i<8;i++)
{
if((com&0x01)==0)
{
DQ=0;
delay_n10_us(7); //70us延时,确保写入0
DQ=1;
_nop_();
}
else
{
DQ=0;
_nop_();
DQ=1;
delay_n10_us(7); //70us延时,确保写入1
}
com>>=1;
}
}
/**********温度传感器18b20复位子函数**********/
bit ds18b20_ret()
{
uint temp; //暂存脉冲时间
DQ=0; //启动复位脉冲
delay_n10_us(50); //500us延时(大于480us)
DQ=1; //停止复位脉冲
TR1=1; //启动T1
while(DQ==1 && TH1*256+TL1<=60);//等待18b20回应,等待时间不超过60us
if(DQ==0) //18b20回应
{
temp=TH1*256+TL1;
while(TH1*256+TL1-temp<40); //等待60us再次检测回应脉冲是否存在
if(DQ==0) //18b20正常回应
{
while(TH1*256+TL1<=480);//等待正常复位完成
TR1=0; //关闭T1
TH1=0; //计时归零
TL1=0;
return(1); //18b20有正常回应返回1
}
else
{
TR1=0; //关闭T1
TH1=0; //计时归零
TL1=0;
return(0); //18b20有正常回应返回0
}
}
else
{
TR1=0; //关闭T1
TH1=0; //计时归零
TL1=0;
return(0); //18b20没有回应返回0
}
}
/*********lcd1602显示温度子函数声明********/
void disp_temperature(uint temp)
{
uchar temp_h,temp_l,flag=0; //温度整数部分,小数部分(二进制)和最高位是否为'0'标志
uint temp_decimal=0; //存储温度值的小数部分(十进制)
in_command(0xc2); //设定第二行字符串起始显示位置
if(temp>=0x8000)
{
in_data('-'); //显示'-'号
temp=~temp;
temp+=1;
}
else
{
in_data(' '); //'+'号不显示
}
temp_h=temp/16;
temp_l=temp%16;
if(temp_h/100!=0)
{
flag=1;
in_data(num_tab[temp_h/100]); //显示温度值的百位
}
else
{
in_data(' '); //百位为'0'则百位不显示
}
temp_h%=100;
if(temp_h/10!=0 || flag==1)
{
flag=1;
in_data(num_tab[temp_h/10]); //显示温度值的十位
}
else
{
in_data(' '); //百位,十位都为'0'则十位不显示
}
temp_h%=10;
in_data(num_tab[temp_h]); //显示温度值的个位
in_data('.'); //显示小数点
if(temp_l/8==1)
{temp_decimal+=5000;}
temp_l=temp_l%8;
if(temp_l/4==1)
{temp_decimal+=2500;}
temp_l=temp_l%4;
if(temp_l/2==1)
{temp_decimal+=1250;}
temp_l=temp_l%2;
if(temp_l==1)
{temp_decimal+=625;}
in_data(num_tab[temp_decimal/1000]);//显示温度值的十分位
in_data(' ');
in_data(223); //显示温度单位标志'摄氏度'
in_data('C');
}
/**********液晶屏初始化子函数**********/
void lcd_int()
{
/***************LCD初始设置*****************/
delayms(15); //延时15MS,等待LCD初始化
in_command(0x01); //清显示屏
in_command(0x38); //8位通信,2行显示,5*7点阵
in_command(0x0c); //开显示,关光标,关闪烁
in_command(0x06); //字符不动,光标右移动,地址加一
/************1602显示上电后电机默认的状态信息**************/
in_command(0x80); //设定第一行字符串起始显示位置
lcd_disp_string(line1_str); //显示数据(字符)
}
/**********液晶屏显示一串字符**********/
void lcd_disp_string(uchar str[])
{
uchar i=0;
while(str[i]!='\0')
{
in_data(str[i]); //显示数据(字符)
i++;
delayms(50); //延时
}
}
/********向液晶屏输入命令子函数************/
void in_command(uchar com)
{
delayms(2);
en=0;//关闭通信,为设置参数做准备
rs=0;//选择指令寄存器
rw=0;//写入液晶
_nop_();
data_port=com;
en=1;//开始通信
_nop_();
en=0;//关闭通信,为设置参数做准备
}
/********向液晶屏输入数据子函数************/
void in_data(uchar dat)
{
delayms(2);
en=0;//关闭通信,为设置参数做准备
rs=1;//选择数据寄存器
rw=0;//写入液晶
_nop_();
data_port=dat;
_nop_();
en=1;//开始通信
_nop_();
en=0;//关闭通信,为设置参数做准备
}
/********微秒延时子函数************/
void delay_n10_us(uchar n)
{
while(n--)
{
_nop_();
_nop_();
}
}
/********毫秒延时子函数************/
void delayms(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<124;i++);
}
}

热心网友 时间:2024-03-27 16:17

你不上图,不能给你具体解释
单片机ts18b20测温程序 请大神注释程序 最好每一句都注释明白(小白一只...

T1_int(); //定时器T1初始化 DQ=1;//释放温度传感器18b20的数据接口 temperature_convert();//第一次调用18b20温度转换子函数消除85°C问题 lcd_int();//液晶屏初始化(放在18b20温度转换子函数后边用来延时,跳过85°C)while(1){ temperature_convert();//调用18b20温度转换子函数 rd_ram_comm...

18B20测温时读取到的温度数据怎么转换!

a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 ;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度 ;显示范围00到99度,显示精度为1度 ;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位 ;将28H中的低4...

单片机18b20的资料

(4)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。 测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
格力空调上面有个wifi是什么意思? 多媒体中控软件 水房的截水阀门漏水 大门掌握着家宅与外界的通道,大门风水磁场影响着全家人的工作运和事业... 苹果电池健康度降到百分之九十九会快速掉电吗? 海南特产:海南粉 教育办学培训许可证如何办理需要什么条件 开培训机构需要办办学许可证吗? 成片的西洋参怎么服用?谢谢 家居装饰16款温暖风格家居灯饰 单片机的c语言编程 求注释 谢谢 想要与你分手的人,大多会对你说哪些话,你可不要装糊涂? 魔学是什么意思? 一个女人结婚了,嫁人了,和没嫁一样,天天待自己娘家代表什么? 广州尾货3元5服装批发市场在哪里 新桑塔纳1.6排量从成都沿318国道去拉萨能行吗? 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 六十四的六次方根怎么算? 6√65的近似值(6上标)是多少 怎样求解根号65开6次方的近似值 两块磁铁之间用铜板隔断还能相吸吗 东莞中考和佛山中考区别 磁铁与铜板感应能产生多高的温度呢 旋转的磁铁靠近铜板,铜板会发热吗? 阅读下面短文,在文中空白处填入最适当的词语,使文章完整。(每空限填... ...安全的空中旅行①现在,长途旅行乘坐飞机是最节省时间的方式,但总有... 求一篇有意义的文章,要有意义,上语文课时用 我们班上要开一个关于道德的主题班会,开场白要一个谜底是道德的谜语的... 一个能绑定几个快手号 两个不同的实名认证是自己可以注册两个快手吗? 多年以后才明白打一个数 微信聊天记录迁移后聊天记录会被删掉么? 厨房下水道堵了怎么办怎样自己疏通下水道 厨房水槽下面漏水,这种情况需要拆橱柜么?一般维修管道的能修么?_百... 厨柜里的下水管堵了,想把下面的石板拆开,是用粘胶粘的那种,怎么拆?有... 高德领的介绍 梦见男友变异的预兆 ps图片海报的尺寸一般多大的? 手机号1 24 手机号24小时内绑定了两个被限制 请问什么时候才能重 ... ...号在最近24小时内绑定过三个,已达到限制,...24小时后可以再次... 狗狗喂馋了怎么办?(松狮) 钱隆首府怎么样,钱隆首府优缺点 湘潭钱隆首府带装修吗? 专科与本科异地恋会有结果吗 14cmX13Cm口杯装水多少? 有一首歌里面有 你说我们天作之合 然后怎么了 请问是什么歌名 ...号在最近24小时内绑定过三个,已达到限制,...24小时后可以再次... 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... ...钢,圆钢……的米重如何算?还有如何按吨位价钱算一跟的价钱?_百度知 ... 豆粉渣加工膳食纤维粉达标吗
  • 焦点

最新推荐

猜你喜欢

热门推荐