- 0
- 0
- 约4.52千字
- 约 13页
- 2026-03-12 发布于江苏
- 举报
温度传感器设计
总体设计框图
本方案设计的系统由单片机系统、数字温度传感器、数码管显示模块组成,其总体架构如下图。
单片机
单
片
机
测温电路
显示电路驱动电路
显示电路
驱动电路
单片机系统
本设计采用STC89C52单片机作为控制器,完成所有功能的控制,包括:
DS18B20数字温度传感器的初始化和读取温度值
LED数码管显示驱动与控制
数字温度传感器模块
DS18B20性能
测温范围-55~+125℃,以0.5℃递增
可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃
温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字
DS18B20外形及引脚说明
DS18B20外形及引脚
GND:地
DQ:单线运用的数据输入/输出引脚
VD:可选的电源引脚
软件设计
主程序模块
主程序需要调用1个子程序为:
实时温度显示子程序:驱动数码管把实时温度值送出在LED数码管显示
读温度值模块
读温度值模块需要调用4个子程序,分别为:
DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作
DS18B20写字节子程序:对DS18B20发出命令
DS18B20读字节子程序:读取DS18B20存储器的数据
延时子程序:对DS18B20操作时的时序控制
软件程序
数码管显示温度程序:
//头文件:
#includereg51.h
#includeds18b20.h //引入DS18B20头文件
//变量定义:
unsignedcharly_dis[4];//定义显示缓冲区
codeunsignedchartable[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共阳数码管0-9
unsignedcharl_posit=0; //显示位置
//引脚定义:
sbitSMG_q=P1^0; //定义数码管阳级控制脚(千位)
sbitSMG_b=P1^1; //定义数码管阳级控制脚(百位)
sbitSMG_s=P1^2; //定义数码管阳级控制脚(十位)
sbitSMG_g=P1^3; //定义数码管阳级控制脚(个位)
//函数声明:
voiddisplay(void);//显示函数,显示缓冲区内容
voiddelay(void);
//主函数,C语言的入口函数:
voidmain()
{
unsignedinti=0;
floattt;
intltemp;
while(1){
if(i==0)
tmpchange(); //温度转换
if(i==100){
tt=tmp()*0.0625; //得到真实十进制温度值,因为DS18B20
//可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。
ltemp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
if(ltemp0){ //判断第一位显示整数还是负号
ly_dis[0]=0xbf;
ltemp=0-ltemp;
}
else
ly_dis[0]=ltemp/1000;//显示百位值
ltemp=ltemp%1000;
ly_dis[1]=ltemp/100; //显示温度十位值
ltemp=ltemp%100;
ly_dis[2]=ltemp/10; //显示温度个位值
ly_dis[3]=ltemp%10; //显示小数点后一位
}
i++;
if(i==3000)
i=0;
display(); //调用显示
delay();
}
}//显示函数,参数为显示内容
voiddisplay()
{
P0=0XFF; //
switch(l_posit){
case0: //选择千位数码管,关闭其它位
SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P0=table[ly_dis[0]]; //输出显示内容
break;
case1: //选择百位数码管,关闭其它位
SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P0=table[ly_dis[1]];
break;
case2: //选择十位数码管,关闭其它位
SMG_q=1;
原创力文档

文档评论(0)