【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_712={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_con4={0xf1,0xF2,0xF4,0xF8}; //列扫描控制字

uchar data temp_data2={0x00,0x00}; //读出温度暂存

uchar data display5={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_7display\[k];

if(k==1){dp=0;}

discan=scan_conk;

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++)

{

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

}

}

}

五、实验现象

演示视频:

相关推荐
star learning white3 小时前
STM32入门学习5
stm32·嵌入式硬件·学习
新晨单片机设计4 小时前
S006A-基于STM32单片机温湿度检测系统【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
逐步前行6 小时前
ESP32-S3-分区表(Partition Table)
单片机
星河单片机6 小时前
STM32驱动HS‑S37A水位传感器+OLED完整实验讲解
stm32·单片机·嵌入式硬件
代码不接地7 小时前
【EDA】0.公共部分&元件库设计
嵌入式硬件
糖糖单片机设计7 小时前
STM32水稻苗大棚环境监测系统
stm32·单片机·嵌入式硬件
star learning white9 小时前
STM32入门学习3
stm32·单片机·学习
jianqiang.xue9 小时前
审查技能库(上):内存安全四件套
stm32·单片机·物联网·架构·esp32
XiHongShi20169 小时前
cpuz分享,建议保存
单片机·学习
恒锐丰科技林技术员9 小时前
EG2226 全桥驱动芯片:高压电机逆变驱动的高性价比方案
经验分享·嵌入式硬件·硬件工程