2025年甲机通过传串口控制乙机的LED显示状态

甲机通过传串口控制乙机的LED显示状态一 目标 单片机甲机 P1 端口外接 8 位拨码开关 乙机 P0 外接 8 只 LED 要求使用单片机串行口通信 在查询状态下使单片机乙机的 8 只 LED 能够显示甲机 8 位拨码开关的状态 二 布线 三 实现 1 首先我们先来编写发送机的代码 利用 T1 定时器的工作方式 2 八位自动重装载模式 进行波特率的设置 常用的波特率有

大家好,我是讯享网,很高兴认识大家。

一、目标

单片机甲机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!

小讯
上一篇 2025-02-19 11:42
下一篇 2025-02-22 14:21

相关推荐

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