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

}

}

}

五、实验现象

演示视频:

相关推荐
小刘爱玩单片机43 分钟前
【stm32协议外设篇】- PAJ7620手势识别传感器
c语言·stm32·单片机·嵌入式硬件
Jerry丶Li2 小时前
二十七、通信接口
c语言·stm32·单片机·嵌入式硬件
沸速存储3 小时前
DDR5引领变革:内存条行业的技术迭代与市场重构
嵌入式硬件·电脑
飞睿科技3 小时前
【IoT开发选型】乐鑫ESP32-C6核心优势解析:为何它在无线连接中表现如此全面?
嵌入式硬件·物联网
heisd_14 小时前
STM32时钟系统对于STM32F1系列(详解)
stm32·单片机·嵌入式硬件
应用市场4 小时前
STM32 ADC底层原理与寄存器配置详解
stm32·单片机·嵌入式硬件
d111111111d4 小时前
STM32外设学习--DMA直接存储器读取--学习笔记。
笔记·stm32·单片机·嵌入式硬件·学习
一支闲人5 小时前
OLED代码演示-使用缓存区
stm32·单片机·嵌入式硬件·oled模块
点灯小铭5 小时前
基于单片机的噪声波形检测与分贝测量仪设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业
奋斗的牛马7 小时前
硬件基础知识-电容(一)
单片机·嵌入式硬件·学习·fpga开发·信息与通信