|
一、实验要求 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 | | 0101 0000B:SM0SM1=01(方式 1,10 位帧),REN=1 允许接收 | | TMOD |= 0x20 | | | | TH1 = 256 - FOSC/12/32/BAUD | | SMOD=0 时,方式 1 波特率 = FOSC/(12×32×(256?TH1)) | | SBUF = dat | | | | while (TI == 0) | | | | 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 | | SM0SM1=01(10 位帧),REN=1 才能收 | | ES = 1; EA = 1 | | | | interrupt 4 | | 51 中断号:0 = 外部 0,1=T0,2 = 外部 1,3=T1,4 = 串口 | | if (RI) | | | | recv_cmd = 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 纸大小,打印出来,作为附录放在文档最后页。
|