基于51单片机的串口控制系统仿真设计:温湿度传感器数据实时显示在LCD上,远程控制继电器和LED开关
继电器控制比较讲究,P1口的低五位分别控制五个设备,每个口都加了9012三极管做电流放大。比如发送"2"后收到"Device2:ON"这样的反馈,配合串口助手的自动发送功能,能玩出远程控制流水灯的效果。DHT11的数据读取是个技术活,这货的时序要求严得很。PS:通过串口助手发送命令12345,分别控制5个设备的开和关。PS:通过串口助手发送命令12345,分别控制5个设备的开和关。发送“1”控制继
基于51单片机的串口控制系统仿真设计 实现功能: 1、 将温湿度传感器(DHT11)采集到的数据实时显示在lcd上,并通过虚拟串口显示 2、可通过虚拟串口远程控制继电器和LED的开关 PS:通过串口助手发送命令12345,分别控制5个设备的开和关。 发送“1”控制继电器1打开,再次发送“1”,控制继电器1关闭 包含仿真+源码+串口工具 仿真软件:Proteus8.9 编程软件:Keil5 编程语言:C语言
这个基于51单片机的串口控制系统有点意思,咱们直接上干货。系统核心是STC89C52芯片,配合DHT11搞环境监测,还能通过串口远程控制设备。Proteus仿真里看着LCD1602实时刷新温湿度数据,虚拟终端里字符命令发得飞起,继电器咔嗒咔嗒响得贼带劲。
先看硬件连线:DHT11接P2.0,LCD1602数据口挂P0,控制线RS、RW、EN分别接P2.5-P2.7。继电器控制比较讲究,P1口的低五位分别控制五个设备,每个口都加了9012三极管做电流放大。虚拟串口直接用MAX232搭了个电平转换电路,毕竟仿真环境下得和电脑通信。
DHT11的数据读取是个技术活,这货的时序要求严得很。代码里得精确控制40us级的延时,起手先给个18ms的低电平启动信号:
void DHT11_start() {
DATA = 0;
delay_18ms();
DATA = 1;
delay_us(30);
while(DATA); // 等待DHT11拉低
while(!DATA); // 等待高电平
}
这段骚操作完成主机拉低总线再释放,DHT11收到信号后会回个响应脉冲。注意这里用while循环等待而不是定时器,实测在仿真实时性足够用。数据读取时每个bit都以50us低电平开头,高电平持续时间决定0或1。
LCD显示部分用了4位数据模式节省IO口,刷新频率设成每秒两次。有意思的是在显示函数里偷偷加了串口发送:
void update_display() {
lcd_write_string("Temp:");
lcd_write_byte(temp_value);
// 顺手把数据扔给串口
printf("T:%d H:%d\r\n", temp_value, humi_value);
}
这手操作实现了本地显示和串口输出的双同步。注意printf重定向到串口需要改写putchar函数,具体操作是往SBUF寄存器怼数据。

基于51单片机的串口控制系统仿真设计 实现功能: 1、 将温湿度传感器(DHT11)采集到的数据实时显示在lcd上,并通过虚拟串口显示 2、可通过虚拟串口远程控制继电器和LED的开关 PS:通过串口助手发送命令12345,分别控制5个设备的开和关。 发送“1”控制继电器1打开,再次发送“1”,控制继电器1关闭 包含仿真+源码+串口工具 仿真软件:Proteus8.9 编程软件:Keil5 编程语言:C语言
串口控制才是重头戏。中断服务程序里搞了个环形缓冲区,收到命令直接存数组:
bit flag = 0;
unsigned char cmd_buf[10];
void UART_ISR() interrupt 4 {
if(RI) {
RI = 0;
cmd_buf[flag++] = SBUF;
if(flag > 9) flag = 0; // 环形缓冲防溢出
}
}
命令解析部分玩的是状态机套路。收到ASCII字符'1'-'5'后,直接操作P1口对应引脚:
void execute_cmd(unsigned char cmd) {
if(cmd >= '1' && cmd <= '5') {
unsigned char pin = cmd - '1';
P1 ^= (1 << pin); // 异或操作实现状态翻转
}
}
这个异或操作骚得很,每次收到相同命令就能实现开关切换。比如第一次收到'1'时P1.0从1变0(假设初始高电平),继电器吸合;再发'1'又变回1,继电器断开。Proteus里继电器的咔嗒声配合LED明灭,操控反馈直接拉满。
调试时踩过几个坑:DHT11的响应时间必须给够,不然数据会乱码;串口波特率9600时定时器1必须用8位自动重装模式;继电器控制端记得加续流二极管,仿真里虽然不明显,但实物必炸。
源码里有个dev_state数组记录设备状态,每次操作后还会通过串口回传状态信息。比如发送"2"后收到"Device2:ON"这样的反馈,配合串口助手的自动发送功能,能玩出远程控制流水灯的效果。
最后说下Proteus仿真的骚操作:在虚拟终端属性里勾选"回显输入",调试时能看到自己发的命令。DHT11元件要右键设置温湿度参数,仿真时直接拖动滑块就能模拟环境变化,比实物调试方便得多。

更多推荐



所有评论(0)