一、目标
单片机甲机P1端口外接8位拨码开关;乙机P0外接8只LED。要求使用单片机串行口通信,在查询状态下使单片机乙机的8只LED能够显示甲机8位拨码开关的状态。
二、布线
三、实现
1、首先我们先来编写发送机的代码。利用T1定时器的工作方式2(八位自动重装载模式)进行波特率的设置。常用的波特率有:1200、4800、9600、19200。我们选择采用9600的波特率对应的定时器初始值为0xFD。设置SCON串行口控制寄存器,令其工作在方式1(可变波特率,10位UART)。这里是发送机所以不需要接收功能,将REN设置为禁止接收状态。

#include<reg52.h> #include <intrins.h> #define uchar unsigned char//宏定义 #define uint unsigned int //宏定义 void sending(uint p1) {
SBUF=p1;//将p1送进缓冲区 while(!TI);//TI=0表示正在发送 TI=0; } void init() {
TMOD=0x20;//T1,工作方式2,8位自动重装载 SCON=0x40;//工作方式1,禁止接收 TH1=0xFD; TL1=0xFD;//9600 TR1=1; PCON=0x00;//波特率不加倍 } int main() {
init(); while(1) {
sending(P1); } return 0; }
讯享网
2、接下来我们来设置接收机的代码。这时我们需要接收甲机发送过来的数据,所以REN接收允许位应该置1,即允许接收。同样的采用串行口的工作方式1,所以串行口控制寄存器SCON应该设置为0x50;波特率的设置应该与发送机保持一致,否则接收机将无法正常接收到甲机发送的完整数据。
讯享网#include<reg51.h> //#include<intrins.h> #define uint unsigned int; #define uchar unsigned char; int p0=0x00; int receive() {
if(RI)//RI=1时表示接收完毕 {
RI=0; p0=SBUF;//接收完毕后将缓冲区接受的数据储存到p0 } return p0; } void init() {
TMOD=0x20;//T1,方式2,自动重装载 SCON=0x50;//方式1,允许接受 TH1=0XFD; TL1=0XFD;//9600 TR1=1; PCON=0X00;//波特率不加倍 } int main() {
init(); while(1) {
P0=receive();//将存储下来的数据显示出来即可 } return 0; }
四、结语
在完成单片机串口通信相关的功能时,一定要注意发送机和接收机的串口通信波特率设置是否一致,在下可是在这上面吃过亏的,有一次做实验时排查了好久都找不出问题所在,结果是因为波特率设置时粗心导致的两片机器波特率不一致造成的。
好啦 !以上就是这次分享的全部内容了,希望大家可以亲动脑筋,举一反三!
祝各位学习愉快哟!(^_^)y!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/72867.html