【51单片机】【protues仿真】基于51单片机数字温度计数码管系统
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、数码管显示温度
2、按键设置对应上下限阈值
3、高于阈值或低于阈值声光警报
二、使用步骤
基于51单片机的数字温度计数码管显示系统设计,主要包含温度采集、数据处理和动态显示三大模块。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、温度传感器
4、蜂鸣器模块
5、LED灯模块
6、数码管显示模块
四、软件设计
# include <reg51.h>
#define uint unsigned int
#define uchar unsigned char //宏定义
#define Disdata P2 //段码输出口
#define discan P0 //扫描口
sbit p34=P0^0;
sbit p35=P0^1;
sbit p36=P0^2;
sbit dp=P2^7;
sbit p37=P0^3;
sbit DQ=P1^0; //定义DS18B20总线I/O
sbit set=P1^6; //定义选择报调整警温度上限和下限(1为上限,0为下限)
/****P1.4和P1.4为调整温度报警增加键和减少键******/
sbit SET=P3^2;
sbit add=P1^4;
sbit dec=P1^5;
sbit led_red=P1^2; //超过上限温度或低于下限温度,红灯亮·
sbit led_green=P1^3; //温度在正常范围内,绿灯亮
sbit speaker=P3^5; //定义响铃
int temp1;
signed char m; //温度值全局变量
bit sign=0; //外部中断状态标志
signed char shangxian=28; //上限报警温度,默认值为38
signed char xiaxian=25; //下限报警温度,默认值为5
uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延时子程序*****/
uchar code dis_7[12]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
/*共阳LED段码表 "0","1","2","3","4","5","7","8","9","不亮","-"*/
uchar code scan_con[4]={0xf1,0xF2,0xF4,0xF8}; //列扫描控制字
uchar data temp_data[2]={0x00,0x00}; //读出温度暂存
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据,其中一个作为运算暂存用
void Delay(uint i)
{
while( i-- );
}
/******************显示扫描函数**********************/
void scan()
{
char k;
for(k=0;k<4;k++) //循环扫描4个口,并显示
{
Disdata=dis_7[display[k]];
if(k==1){dp=0;}
discan=scan_con[k];
Delay(65);
discan=0xff;
}
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; Delay(8); //稍做延时
DQ=0; //单片机将DQ拉低
Delay(80); //精确延时,大于480us
DQ=1; //拉高总线
Delay(14);
x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay(20);
}
/***************18b20读一字节函数****************/
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(4);
}
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;
}
}
void Tmpchange(void) //发送温度转换命令
{
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转
}
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Tmpchange();
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*100+0.5; //放大10倍输出并四舍五入
return(t); } /*****显示开机初始化等待画面*****/
Disp_init() {
P2 = 0x80; //显示-
p34=1;p35=0;p36=0;p37=0;
Delay(200);
P2 = 0x80;
p34=0;p35=1;p36=0;p37=0;
Delay(200);
P2 = 0x80;
p34=0;p35=0;p36=1;p37=0;
Delay(200);
P2 = 0x80;
p34=0;p35=0;p36=0;p37=1;
Delay(200);
P2 = 0x80;
}
/*****主函数*****/
void main(void)
{
uint h;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
for(h=0;h<4;h++)
{
display[h]=8; //开机显示8888
}
ReadTemperature();
speaker=0;
for(h=0;h<500;h++)
{
scan(); //开机显示“8888”2s
}
while(1)
{
if(temp1==0)
{
work_temp();
beep(); //检测是否超过上限或低于下限
keyscan(); //按键检测
}
else
{
keyscan(); //按键检测
}
}
}
五、实验现象
演示视频: