单片机 串口实验 实验五

ops/2024/11/17 18:58:05/

实验五 串口实验

一、实验目的  

1、掌握MCS-51单片机串口通信的原理。

2、掌握MCS-51单片机串口通信程序的设计方法及其过程。

3、掌握MCS-51单片机串口通信的电路应用。

二、实验任务

两片单片机分别接一个按键和两个数码管,通过串口通信,实现单片机1的按键控制单片机2的数码管进行数值累加。本实验要求单片机处理器的晶振频率为11.0592MHz,串口传输波特率为:4800bps。

三、实验原理

AT89C51/51、STC89C51/52标准MCS-51单片机MCU都有能进行异步传输的串行口(UART),且具有一对UART(RX和TX)。UART可以工作在全双工异步方式或半双工同步方式,并且支持多处理器通信。AT89C51/51、STC89C51/52单片机具有一个串口数据发送寄存器(SBUF)和一个串口数据接收寄存器(SBUF),并通过单片机内部定时器T1作为波特率发生器。在使用串口通信时只需要配置好串行口控制寄存器以及定时器T1就可以通过SBUF发送和接收数据。每发送完一帧数据之后处理器内部会自动把串口控制寄存器其中SCON的D1位TI(发送中断标志位)硬件置为1,如果需要传输下一帧数据就需要用户在控制程序中软件清零。每接收完一帧数据之后就处理器内部会自动把串口控制寄存其中SCON的D0位RI(接收中断标志位)硬件置为1,如果需要接收下一帧数据就需要用户在控制程序中软件清零。

AT89C51/51、STC89C51/52单片机具有4种串行口工作方式:方式0(一位寄存器方式),方式1(8位异步通信方式),方式2和方式3(9位异步通信方式)。本实验将选择方式1作为串行口通信方式。定时器T1 TOMD工作在方式2(8位自动重置定时/计数器),波特率计算公式为:

波特率 =(2SMOD/32)·(T1溢出率)

定时器T1的初始值为:

T1的初值=256 - fosc×2SMOD /(12×波特率×32)

本实验要求单片机处理器的晶振频率为11.0592MHz,串口传输波特率为:4800bps。因此,可以根据定时器T1的初始值计算公式计算其初始值。

电路原理图如图5-1所示。

图5-1串口通信实验电路图

注释:上面的原理是课程设计给的模板,不是我写的,仅供参考,如有相同就是参考的,参考书:单片机原理与接口技术实验指导书、单片机原理与接口技术

四、程序流程图

图5-2本次实验程序流程图

五、实验结果及分析总结

本次实验顺利实现了两个单片机使用串口通信,收获了MCS-51单片机串口通信的原理以及串口通信程序的设计方法过程和通信的电路应用。在实验的过程中出现了一个最基本也是最致命的实验错误,绘制的电路图是错误的。

即在完成代码的编写之后,下载至仿真电路,不可以实现串口通信,反复的检查了几次依旧检查不出是代码的问题,最后再一次的检查仿真电路图时,发现是将通信的串口连接错误(即将U1的P3.0接到了U2的P3.0),因此在更改串口的错误连接之后,再一次的进行仿真,才得到的实验结果是正确的。本次实验的代码如图5-4以及第六点程序附录所示。

图5-3本次实验绘制电路图

图5-4关键程序标注

六、程序附录

#include <reg51.h>
#define DUANMA P0 // 数码管段码引脚
#define WEI P2 // 数码管位选引脚
sbit KEY = P1^7; // 按键引脚unsigned char table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; // 数码管段码表
unsigned char secNum; 
unsigned char recDATA;void delayms(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--)for (j = 120; j > 0; j--);
}void INIT() {SCON = 0x50; //串行口工作于方式1 PCON &= 0x7f;TMOD = 0x20; //T1工作于方式2TL1 = 0xfa;TH1 = 0xfa; //波特率是4800EA = 1;ES = 1;TR1 = 1;
}void checkKey() {if (KEY == 0) { // 检测按键是否按下delayms(10); // 延时去抖动if (KEY == 0) { // 再次检测按键是否按下secNum++; // 按键加1SBUF = secNum; // 发送数据给单片机2while (KEY == 0); // 等待按键释放}}
}void main() {INIT();while (1) {    checkKey(); // 检测按键是否按下WEI = 0xfe;DUANMA = table[recDATA / 10 % 10];delayms(10);WEI = 0xfd;DUANMA = table[recDATA % 10];delayms(10);}
}void chuankou() interrupt 4 //接收
{if (RI == 1) {recDATA = SBUF; // 接收单片机1发送的数据RI = 0;}
}

学习过程中,参考资料网上的,如有侵权删。如有需要自行下载源文件,里面code文件是程序代码,还有一个仿真文件。


http://www.ppmy.cn/ops/134501.html

相关文章

【学习】HTTP

HTTP 超文本传输协议&#xff08;HTTP&#xff09;是一个用于传输超媒体文档&#xff08;例如 HTML&#xff09;的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的&#xff0c;但也可以用于其他目的。HTTP 遵循经典的客户端—服务端模型&#xff0c;客户端打开…

C/C++ 中有哪些类型转换方式? 分别有什么区别?

在C编写C/C代码的时候&#xff0c;我们经常会遇到发生类型转换的场景&#xff0c;比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同&#xff0c;都会发生类型转换&#xff1b;所以&#xff0c;在C语言中提供了两种类型转换 —— 隐…

CSM32RV20:RISC-V核的低功耗MCU芯片,常用在智能门锁上

CSM32RV20是一款基于RISC-V核的低功耗MCU芯片。 内置RISC-V RV32IMAC内核&#xff08;2.6CoreMark/MHz&#xff09;&#xff1b; 蕞高32MHz工作频率&#xff1b; 内置4kB的SRAM&#xff1b; 内置8B的ALWAYS寄存器&#xff0c;能在掉电模式2下保存数据&#xff1b; 内置40kB的嵌…

【Rust调用Windows API】获取正在运行的全部进程信息

前言 WIndows API官方文档 提供了C的调用示例&#xff0c;最近想尝试用Rust去实现&#xff0c;本系列博客记录一下实现过程。 依赖 Rust调用Windows API需要引入依赖winapi&#xff0c;在Cargo.toml中添加依赖 winapi "0.3.9"调用不同的API集就需要使用相应的功…

Python - 初识Python;Python解释器下载安装;Python IDE(一)

一、初识Python Python 是一种高级编程语言&#xff0c;Python是一种面向对象的解释型计算机程序设计语言&#xff0c;Python由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆&#xff08;&#xff09;Guido van Rossum吉多范罗苏姆&#xff08;&#xff09;于1989 年底发明…

羊城杯2020Easyphp

审题 看到url&#xff0c;可以想到伪协议读取 尝试过后可以发现&#xff0c;题目绕过了read后面的编码 我们可以尝试双重urlencode进行绕过 ?filephp://filter/read%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%…

react 中 memo 模块作用

memo是一个用于优化组件性能的高阶组件。 一、避免不必要的重新渲染 1. 浅比较机制原理 1.1 组件渲染触发条件 在 React 中&#xff0c;当组件的props或state发生变化时&#xff0c;组件会重新渲染。然而&#xff0c;在某些情况下&#xff0c;即使父组件重新渲染并传递给子…

STM32 ADC --- 任意单通道采样

STM32 ADC — 单通道采样 文章目录 STM32 ADC --- 单通道采样cubeMX配置代码修改&#xff1a;应用 使用cubeMX生成HAL工程 需求&#xff1a;有多个通道需要进行ADC采样&#xff0c;实现每次采样只采样一个通道&#xff0c;且可以随时采样不同通道的功能。 cubeMX配置 这里我们…