找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3|回复: 0
收起左侧

单片机串口通信与温湿度传感器Proteus仿真程序

[复制链接]
ID:511961 发表于 2026-11-6 19:38 | 显示全部楼层 |阅读模式
一、实验要求
1. 掌握51单片机串行口的结构和工作原理,理解串行口控制寄存器SCON、电源控制寄存器PCON各位含义。
2. 掌握串口波特率的计算方法,能够根据通信要求正确设置定时器初值。
3. 掌握DHT11温湿度传感器的单总线通信协议,能够通过单片机I/O口模拟读取温湿度数据。
4. 能够独立完成串口发送字符串、DHT11温湿度读取、串口输出温湿度数据基础实验。
5. 在基础练习实验之上,完成温湿度检测与串口上位机显示综合实验,理解传感器数据采集与串口通信结合的设计方法。
6. 实验结束后按照模板手写实验文档,程序截图、仿真截图整理作为附录。
二、实验原理
1. 51单片机串行口结构
AT89C51的串行口是一个全双工通信接口,有4种工作方式,通过RXD(P3.0)和TXD(P3.1)与外部通信。
SCON(串行口控制寄存器,地址98H):
  - SM0、SM1:串行口工作方式选择。方式0(移位寄存器)、方式1(8位UART,波特率可变)、方式2(9位UART,固定波特率)、方式3(9位UART,波特率可变)。
  -REN:允许接收位,置1允许串口接收数据。
  -TI:发送中断标志,发送完一帧数据后硬件置1,必须软件清0。
  -RI:接收中断标志,接收到一帧数据后硬件置1,必须软件清0。
PCON(电源控制寄存器,地址87H):SMOD位=1时波特率加倍。
2. 波特率计算
方式1和方式3的波特率由定时器T1的溢出率决定:
波特率 = (2^SMOD /32) × (定时器T1溢出率)
定时器T1通常工作在方式2(8位自动重装),溢出率= fosc / (12 × (256 - TH1))
常用9600波特率(12MHz晶振,SMOD=0):
  初值 =256-(12000000/(32×12×9600))≈256-3.255=253=0xFD
注意:12MHz晶振下9600波特率存在少量误差,实际应用中常用11.0592MHz晶振消除误差。
3. DHT11温湿度传感器原理
DHT11是一款含有已校准数字信号输出的温湿度复合传感器,采用单总线(Single Bus)通信协议。
  - 湿度测量范围:20%~90%RH,精度±5%RH
  - 温度测量范围:0~50℃,精度±2℃
  - 数据格式:40位数据 =8位湿度整数 + 8位湿度小数 + 8位温度整数 + 8位温度小数 + 8位校验和
通信流程:单片机发送起始信号(拉低总线至少18ms)→ DHT11响应(拉低80μs + 拉高80μs)→ 逐位传输40位数据(每位以50μs低电平开始,高电平26~28μs表示"0",70μs表示"1")。
三、练习实验内容及步骤
3.1  练习实验1—串口发送字符串
1.实验目的
掌握51单片机串口方式1的初始化配置,能够通过串口向计算机发送字符串,理解波特率设置的意义。
2.实验步骤
1)建立Proteus工程,放置Virtual Terminal串口调试组件,连接单片机RXD、TXD。
2)编写串口初始化函数和字符发送函数,主循环中每隔1秒发送一次"Hello 51 MCU!"。
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
注意:P3.1 (TXD) → 串口助手模块 RXD;P3.0 (RXD) → 串口助手模块 TXD
VirtualTerminal串口调试组件左侧栏虚拟仪器中可以找到。
3)若串口助手出现乱码情况则需设置以下内容:
(a)在 Proteus原理图中双击 AT89C52 芯片;
找到Clock Frequency属性,把默认的12MHz改成 11.0592MHz;
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
(b)双击串口助手:设置波特率 9600、数据位 8、停止位 1、无校验(9600, 8, N, 1)
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
4)创建Keil工程项目,编写代码:
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
程序说明:

   
代码 / 语句
   
   
作用
   
   
说明
   
  
SCON = 0x50
  
串口方式 1
0101 0000B:SM0SM1=01(方式 1,10 位帧),REN=1 允许接收
  
TMOD |= 0x20
  
T1 设方式 2
8 位自动重装,溢出率稳定,最适合做波特率发生器
  
TH1 = 256 - FOSC/12/32/BAUD
  
波特率初值
SMOD=0 时,方式 1 波特率  = FOSC/(12×32×(256?TH1))
  
SBUF = dat
  
启动发送
对发送缓冲器写入即触发移位发送
  
while (TI == 0)
  
等待发送完成
发送完一帧(10 位)后硬件自动置位 TI
  
TI = 0
  
清标志
必须软件清零,否则下次发送会被误判为 "已完成"
  
unsigned char code hello[]
  
字符串入代码区
51 单片机程序 / 数据存储空间分离,code 节省片内 RAM
波特率计算:
初值 = 256 ? 11059200 / (12 ×32 × 9600) = 256 ? 3 = 253 = 0xFD
5)仿真
Proteus仿真工程安装hex文件并做仿真演示。
回到proteus软件,双击89C51芯片,打开编辑文件框,在program file一栏,点击黄色文件按钮,找到keil工程文件,在该工程下找到Objects文件,选择该文件内的hex文件,最后点击确定,保存设置。
注意:若工程项目发生移动,则需重读此操作,再次修改HEX文件地址。
6)点击proteus界面左下角开始按钮,系统开始仿真。
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
3.2  练习实验2—DHT11温湿度读取
1.实验目的
理解DHT11单总线通信时序,能够用单片机I/O口模拟DHT11通信协议,正确读取温湿度数据。
2.实验步骤
1)P2.0连接DHT11的DATA引脚,DHT11的VCC接+5V,GND接地。
2)编写DHT11读取函数:发送起始信号→等待响应→读取40位数据→校验。
3)将读取到的温湿度值暂存到变量中,可通过LED或数码管临时显示验证。
4)在Proteus中运行仿真,观察DHT11输出的温湿度数据是否合理。
3.DH11温度度传感器
DHT11 是一款常用的数字式温湿度传感器模块,集成了温度测量与湿度测量功能,广泛应用于环境监测、智能家居、农业大棚、气象站等领域。该模块内部集成了温湿度传感器元件和一颗单片机,经过校准后可输出数字信号,用户可直接通过单片机读取数据,无需额外的模数转换电路。
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image016.gif
DHT11温湿度传感器模块通常为3Pin或4Pin排针接口,常见引脚定义如下:
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
DHT11单总线通信需要上拉电阻(R1),因为DHT11的DATA引脚是开漏输出,它本身并不会主动驱动高电平,而是靠上拉电阻将总线电平拉高,DHT11只在需要时将数据线拉低,形成低电平信号。
单片机作为主机,DHT11作为从机,通信过程包含“启动信号”“响应信号”和“数据传输”三个阶段,整个通信过程的时序要求较严格,通常需通过延时精确控制GPIO读取/写入时序。通讯总时序图如下:
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image020.gif
4.Proteus仿真工程
按照下图所示设计电路原理图:
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
注意:DHT11的data引脚需要上拉电阻(4.7KΩ)。
5.Keil程序代码
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg
6仿真
Keil编译后,若无报错,启动Proteus仿真,观察结果。
注意:若工程项目均未移动位置,Keil重新编写程序后,Proteus无需再指定HEX文件地址。
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg

3.3  练习实验3—串口接收控制LED
1.实验目的
掌握串口接收中断的配置和使用,能够通过串口接收上位机发来的命令控制硬件。
2.实验步骤
1)P2.0连接LED,保持串口电路不变。
2)配置串口接收中断:REN=1允许接收,ES=1使能串口中断,EA=1开总中断。
3)中断服务函数中判断收到的数据:收到'1'点亮LED,收到'0'熄灭LED,其他数据不处理。
4)编写按键控制LED亮灭程序,并编译通过无报错。
4.Proteus仿真工程
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg
5.Keil程序代码
程序代码思路:
串口接收中断(RI=1)→ 读取SBUF存入变量 → 回显
主循环:收到'1' → LED亮;收到 '0' → LED灭
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image042.jpg

   
代码 / 寄存器
   
   
作用
   
   
说明
   
  
SCON = 0x50
  
方式 1 + 允许接收
SM0SM1=01(10 位帧),REN=1 才能收
  
ES = 1; EA = 1
  
开串口中断、总中断
串口中断必须开两级才能响应
  
interrupt 4
  
串口中断服务函数
51 中断号:0 = 外部 0,1=T0,2 = 外部 1,3=T1,4 = 串口
  
if (RI)
  
接收完成判断
RI 由硬件置位,软件必须清零
  
recv_cmd = SBUF
  
读接收数据
读 SBUF 相当于取走数据
  
回显 SBUF=...; while(!TI); TI=0
  
发送数据
轮询等待发送完成再清标志

6仿真
Proteus仿真工程安装hex文件并做仿真演示,点击proteus界面左下角开始按钮,系统开始仿真。
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image044.jpg
图1:输入1:LED点亮
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image046.jpg
图2:输入0:LED熄灭


四、实验内容及要求
1.    实验名称:DHT11温湿度检测与串口实时显示系统
2.    实验预习要求
1)  预习51单片机串口通信原理,复习SCON、PCON寄存器配置,掌握波特率计算方法。
2)  预习DHT11单总线通信时序图,理解起始信号、响应信号、数据位的电平持续时间。
3)  预先规划硬件引脚分配:DHT11数据线引脚、串口TXD/RXD引脚。
4)  思考逻辑:温湿度采集周期(建议1秒读一次),串口输出格式(便于阅读的字符串格式)。
3.    实验内容:
1) 搭建DHT11温湿度传感器电路,单片机每隔1秒采集一次温湿度数据。
2)  通过串口将温湿度数据发送到上位机(Proteus中的虚拟终端或串口调试助手)。
3)  串口输出格式要求:每次发送一帧完整数据,格式为"Temp:XX.XC  Humi:XX.X RH\r\n"。
4)  当温度超过30℃或湿度低于30%时,通过串口发送报警提示字符串"WARNING:Temperature/Humidity out of range!"。
5)  同时用一个LED作为超限报警指示灯,超限时LED闪烁。
6)  温湿度数据使用数码管显示
4.    硬件电路设计说明
1)  保留AT89C51最小系统:12MHz晶振电路、上电复位电路。
2)   DHT11模块:DATA引脚接P1.0,VCC接+5V,GND接地,DATA与VCC之间接4.7k上拉电阻。
3)  串口电路:TXD(P3.1)接COMPIM的RXD,RXD(P3.0)接COMPIM的TXD,COMPIM波特率设为9600。
4)  报警LED:P2.1串联300Ω电阻接地。
5)  P0.0~P0.7 —数码管段选A~G/DP;P2.0~P2.7—位选(共阴)
6)  Proteus图纸中标注DHT11、COMPIM、LED等元件名称。
file:///C:/Users/ZHUANZ~1.DES/AppData/Local/Temp/msohtmlclip1/01/clip_image048.jpg
5.    软件编程思路提示
1)  定义全局变量temp_int、temp_dec、humi_int、humi_dec存储温湿度数据。
2)  编写uart_init()串口初始化函数,dht11_read()温湿度读取函数,uart_send_char()和uart_send_str()发送函数。
3)  main循环:每隔1秒调用dht11_read()读取数据,格式化组装字符串,通过串口发送。
4)  判断超限条件:温度>30或湿度<30时,置位报警标志,LED以500ms间隔闪烁。
5)  串口输出字符串时,需要将整数转为ASCII字符:数字n对应的字符为n+ '0'。
6.    实验要求
1)  按要求绘制Proteus工程,DHT11电路、串口电路连线规范,最小系统完整。
2)  按要求编写C语言程序,代码结构清晰,有必要注释;Keil编译无警告无错误。
3)  仿真测试:运行后虚拟终端每秒显示一行温湿度数据;修改DHT11的仿真值(Proteus中可调整),观察超限报警功能是否正常。
4)  记录仿真现象,截取Proteus仿真运行截图(含虚拟终端显示),截取Keil完整程序代码截图。
7.    思考题
为什么51单片机串口通信常用11.0592MHz晶振而不是12MHz晶振?请结合波特率误差计算说明。
8.    实验文档撰写要求
1)  实验文档采用配套实验文档模板。
2)  实验内容仅写指导手册中(四)综合实验内容部分,练习实验部分不做为实验文档内容。
3)  实验结果按截取仿真和程序截图,截图调整近似A4 纸大小,打印出来,作为附录放在文档最后页。

串行通信.zip

383.83 KB, 下载次数: 0, 下载积分: 黑币 -5

Proteus仿真和程序

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表