基于单片机的PID控制PWM温度加热控制系统设计
1. 系统总体设计概述
点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081521
1.1 课题背景与设计意义
随着医疗服务水平的不断提升,医院对病房管理系统的智能化、自动化要求越来越高。传统的人工巡视方式不仅效率低,而且无法在第一时间响应患者的紧急需求。因此,设计一套结构简单、成本低廉、响应迅速、运行稳定的病房呼叫系统具有重要的现实意义。
本系统以AT89S51单片机为核心控制器,构建一个基于51单片机的12路病房呼叫系统。系统可实现12个病床独立呼叫,护士站实时显示具体病床号,并通过指示灯与蜂鸣器进行声光报警提示。系统结构清晰,扩展性良好,适用于中小型病房管理场景。
2. 系统功能设计
2.1 系统主要功能
本系统主要实现以下功能:
-
采用AT89S51单片机作为核心控制单元;
-
使用3×4矩阵键盘构成12个独立呼叫按键;
-
每个按键对应一个具体病床编号;
-
当病人按下呼叫键时:
- 显示屏实时显示对应病床号;
- 对应指示灯点亮;
- 蜂鸣器持续鸣叫报警;
-
护士按下“清除键”后:
- 当前呼叫状态清除;
- 指示灯熄灭;
- 蜂鸣器停止;
- 显示屏清空;
-
系统响应时间短,具备按键消抖功能,确保运行稳定可靠。
2.2 系统整体结构
系统整体结构包括以下几个部分:
- 单片机最小系统模块
- 矩阵键盘输入模块
- 显示模块
- 指示灯显示模块
- 蜂鸣器报警模块
- 电源电路模块
系统采用模块化设计,硬件结构清晰,程序结构分层实现,便于调试与扩展。
3. 系统电路设计
3.1 单片机最小系统模块设计
3.1.1 AT89S51单片机简介
AT89S51是ATMEL公司生产的一款低功耗、高性能CMOS 8位单片机,兼容MCS-51指令系统,内部资源包括:
- 4KB Flash程序存储器
- 128B数据存储器
- 32个可编程I/O口
- 2个16位定时器
- 串行通信接口
其结构简单,稳定性高,适用于嵌入式控制系统。
3.1.2 时钟电路设计
单片机工作必须依赖外部晶振电路。系统采用12MHz晶振:
- 晶振两端连接到XTAL1和XTAL2;
- 两侧分别接30pF电容至地;
- 提供稳定的时钟频率。
12MHz晶振是51单片机常用频率,便于软件延时计算。
3.1.3 复位电路设计
复位电路采用RC上电复位方式:
- R:10kΩ电阻
- C:10μF电容
- 上电瞬间产生高电平脉冲
- 确保系统可靠复位
复位电路连接至RST引脚。
3.2 矩阵键盘输入模块设计
3.2.1 3×4矩阵键盘结构
矩阵键盘由:
- 3行
- 4列
共12个按键,连接方式如下:
- 行线连接P1.0~P1.2
- 列线连接P1.4~P1.7
通过行列扫描方式判断按键位置。
3.2.2 键盘扫描原理
扫描步骤:
- 将行线设为低电平;
- 逐列读取状态;
- 若某列为低电平,说明对应按键按下;
- 计算行列编号得到床位编号。
为防止按键抖动,程序中加入延时消抖处理。
3.3 显示模块设计
本系统采用数码管显示病床号。
3.3.1 显示原理
- 使用两位数码管;
- 显示范围:01~12;
- 采用动态扫描方式显示。
3.3.2 动态扫描方式
步骤:
- 送入段码;
- 打开对应位选;
- 延时;
- 切换下一位;
动态扫描可以节省I/O口资源。
3.4 指示灯模块设计
12个LED分别对应12个病床。
- 连接至P2口;
- 当某床呼叫时,对应LED点亮;
- 清除后熄灭。
LED串联限流电阻(约220Ω),防止电流过大损坏器件。
3.5 蜂鸣器报警模块设计
蜂鸣器采用有源蜂鸣器。
工作原理:
- 单片机输出高电平;
- 三极管导通;
- 蜂鸣器发声。
加入限流电阻与NPN三极管驱动,提高驱动能力。
3.6 电源电路设计
系统使用+5V直流供电。
主要包括:
- 变压器降压;
- 整流桥整流;
- 滤波电容平滑;
- 7805稳压芯片输出稳定5V。
保证系统稳定运行。
4. 程序设计
4.1 程序总体结构
程序采用模块化设计,包括:
- 主程序
- 键盘扫描模块
- 显示模块
- LED控制模块
- 蜂鸣器控制模块
- 清除功能模块
主程序循环扫描按键,实现实时响应。
4.2 主程序设计
主程序流程:
-
初始化系统;
-
循环扫描键盘;
-
判断是否有按键;
-
若有:
- 显示病床号;
- 点亮LED;
- 启动蜂鸣器;
-
检测清除键;
-
清除当前状态。
主程序代码
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^7;
sbit CLEAR_KEY = P3^6;
uchar bed_number = 0;
void Delay_ms(uint ms);
uchar KeyScan();
void Display(uchar num);
void LED_Show(uchar num);
void Clear_All();
void main()
{
while(1)
{
bed_number = KeyScan();
if(bed_number != 0)
{
Display(bed_number);
LED_Show(bed_number);
BEEP = 1;
}
if(CLEAR_KEY == 0)
{
Delay_ms(10);
if(CLEAR_KEY == 0)
{
Clear_All();
}
}
}
}
4.3 键盘扫描模块设计
uchar KeyScan()
{
uchar row, col;
P1 = 0xF0;
for(row = 0; row < 3; row++)
{
P1 = ~(0x01 << row);
col = P1 & 0xF0;
if(col != 0xF0)
{
Delay_ms(10);
col = P1 & 0xF0;
if(col != 0xF0)
{
if(col == 0xE0) return row*4 + 1;
if(col == 0xD0) return row*4 + 2;
if(col == 0xB0) return row*4 + 3;
if(col == 0x70) return row*4 + 4;
}
}
}
return 0;
}
4.4 显示模块设计
uchar code seg_code[] = {0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
void Display(uchar num)
{
uchar shi, ge;
shi = num / 10;
ge = num % 10;
P0 = seg_code[shi];
P2 = 0x01;
Delay_ms(5);
P0 = seg_code[ge];
P2 = 0x02;
Delay_ms(5);
}
4.5 LED显示模块设计
void LED_Show(uchar num)
{
P2 = ~(0x01 << (num-1));
}
4.6 清除模块设计
void Clear_All()
{
P2 = 0xFF;
P0 = 0x00;
BEEP = 0;
}
4.7 延时函数
void Delay_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<120;j++);
}
5. 系统性能分析
5.1 响应速度分析
系统采用循环扫描方式,键盘扫描时间小于20ms,能够实现快速响应,满足病房呼叫系统实时性要求。
5.2 抗干扰能力
- RC复位电路增强稳定性
- 软件消抖避免误触发
- 稳压电源保障供电稳定
5.3 系统扩展性
系统可扩展:
- 增加呼叫数量
- 增加无线传输模块
- 加入语音播报功能
- 接入上位机管理系统
6. 总结
本设计基于AT89S51单片机构建了一套完整的12路病房呼叫系统。系统采用3×4矩阵键盘实现12个病床呼叫输入,通过数码管实时显示床位号,配合LED与蜂鸣器实现声光报警提示。系统结构清晰,程序逻辑严谨,响应迅速,运行稳定,具备较高的实用价值。
通过本系统设计,不仅巩固了对51单片机硬件结构与I/O控制原理的理解,还掌握了矩阵键盘扫描、动态显示、模块化程序设计等关键技术,为后续嵌入式系统开发奠定了良好基础。
更多推荐



所有评论(0)