c51数码管显示温度
时间: 2025-03-03 12:30:21 浏览: 18
使用C51单片机驱动数码管显示温度传感器数据
系统概述
为了实现一个能够实时监测并显示环境温度的系统,可以选择使用C51单片机作为核心控制器,并配备合适的温度传感器和显示器组件。在此案例中,选用的是DS18B20数字温度传感器以及静态数码管用于数据显示[^1]。
主要组成部分说明
温度传感模块:采用DS18B20传感器负责收集周围空气中的实际温湿度情况;该器件具备较高的测量精度(可达±0.5°C),并且可以直接输出数字化后的结果给MCU处理。
**微控制器单元(MCU)**:这里指的就是STC系列或其他兼容型号的8位AT89S52/51型单片计算机芯片,它承担着接收来自前端感知元件的信息、执行必要的算法运算并将最终得到的数据映射成适合视觉呈现的形式等功能角色。
显示终端设备:由多个七段LED构成的一组或多组共阳极或阴极连接方式组成的多位数显装置——即所谓的“数码管”,用来直观反映当前所处位置下的具体数值变化趋势。
关键技术要点解析
初始化设置
在程序启动初期阶段,应当先完成对于各个外设资源的基础配置工作,比如初始化I/O端口状态、定义全局变量存储空间大小等操作:
#include <reg52.h>
// 定义公共使用的参数
unsigned char code smgduan[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 数字对应7段码表
bit flag;
float temperature;
void delay(unsigned int z) {
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init(void){
TMOD = 0X01; // 设置定时器模式
TH0=(65536-5000)/256; // 初值计算
TL0=(65536-5000)%256;
}
获取温度读数
借助于专门编写的子例程从指定地址获取最新的温度采样点记录下来供后续分析调用:
sbit DQ=P3^7;
void start_convert(){
uchar i;
DQ=0;
delay(5); // 延迟大于等于750ns
DQ=1;
while(DQ==0); // 等待低电平结束
while(DQ==1); // 等待存在脉冲到来
}
uchar read_bit(){
uchar bit_value;
DQ=0;
DQ=1;
nops();
nops();
bit_value=DQ;
while(!DQ);
return(bit_value);
}
char ds18b20_read_temp(){
uchar temp_l,temp_h,i,j,t;
float tem;
start_convert();
DQ=0;
for(i=0;i<8;i++){
DQ=1;
DQ=0;
t=read_bit();
if(t==1)
j|=0x01<<i;
}
DQ=1;
temp_l=j;
for(i=0;i<8;i++){
DQ=1;
DQ=0;
t=read_bit();
if(t==1)
j|=0x01<<i;
}
DQ=1;
temp_h=j;
tem=((temp_h&0x0F)<<8)+temp_l;
tem*=0.0625;
if(temp_h & 0xf0)
tem=-tem;
return (int)(tem*10);
}
更新显示屏内容
每当有新的有效数据到达时,则需及时刷新屏幕上的图像以保持界面同步更新的效果:
void display(int num){
P0=smgduan[num%10];
P2=0xfe;
delay(5);
P0=smgduan[(num/10)%10];
P2=0xfd;
delay(5);
P0=smgduan[(num/100)%10];
P2=0xfb;
delay(5);
P0=smgduan[num/1000];
P2=0xf7;
delay(5);
}
void main(){
EA=1;
ET0=1;
TR0=1;
init();
while(1){
temperature = ds18b20_read_temp()/10.0f;
display((int)temperature);
}
}
相关推荐

















