【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(); //按键检测

}

}

}

五、实验现象

演示视频:

相关推荐
future14126 小时前
MCU硬件学习
单片机·嵌入式硬件·学习
GilgameshJSS6 小时前
STM32H743-ARM例程24-USB_MSC
c语言·arm开发·stm32·单片机·嵌入式硬件
小莞尔7 小时前
【51单片机】【protues仿真】基于51单片机电压测量多量程系统
c语言·单片机·嵌入式硬件·物联网·51单片机
showmethetime7 小时前
STM32实现LED舞台灯具控制
stm32·单片机·嵌入式硬件
沐欣工作室_lvyiyi7 小时前
基于单片机的智能电力参数测量 (论文+源码)
单片机·嵌入式硬件·毕业设计·电力参数测量
python百炼成钢7 小时前
3.Linux 网络相关
linux·运维·网络·stm32·单片机
mc235611 小时前
STM32F103C8T6--深入GPIO
stm32·单片机·嵌入式硬件
兆龙电子单片机设计11 小时前
【STM32项目开源】STM32单片机智能家居控制系统
stm32·单片机·物联网·开源·毕业设计·智能家居
A9better12 小时前
嵌入式开发学习日志41——stm32之SPI总线基本结构
stm32·单片机·嵌入式硬件·学习