proteus仿真c51单片机(四)双机串口通信(电路设计及代码)

实验要求

1.通过甲机的按键给乙机发送控制字符,同时也可以实现乙机给甲机发送控制字符

2.用PROTEUS软件根据所给电路画出电路图,用KEIL软件调试程序和编译,最后在PROTEUS软件中实现仿真。

3.甲乙两个单片机通过串口进行通信,甲机用一按键向乙机发送控制命令,乙机根据收到的控制命令字符完成各种功能。

实验步骤

1、打开PROTEUS软件选取元件,连线绘制电路图。  

2、打开KEIL软件编制程序进行调试、编译。

3、将编译的HEX代码装入PROTEUS软件绘制的电路图的单片机中。

4、仿真运行观察实验现象,若与要求的实验现象不同,检查程序和电路图找出错误。

5、将编译好的HEX文件用单片机编程器下载进单片机,并在实验板电路上运行观察实验现象。

连接电路 

连接电路时注意甲机与乙机的RXD(数据接收引脚),TXD(数据发送引脚)相连 

主要程序演示(以甲机发送,乙机接收程序为例) 

 

约定通信双方的波特率为9600b/s,按键通过外部中断0实现,在外部中断0服务程序中编写串口发送数据程序。

向串口发送字符子程序 

 

发送不同的控制字符,编制一串口发送字符子程序,在发送控制字符时候调用。

乙机程序(接收端)

乙机需要设置串口方式寄存器,需要允许接收,设置定时器方式和约定波特率的定时器初值,接收放到串口中断进行,需要开相应的中断允许位,在中断服务程序中用switch case语句,按照SBUF接收到的控制字符执行相应的控制led的操作。

实验结果演示

发送A

 

 收到A仅LED1亮

发送B

收到B仅LED2亮

发送C

收到C两个都亮

发送D

收到D都灭 

C51单片机串口通信需要使用两个串口口,一个作为发送端,一个作为接收端。以下是一个简单的例子,其中P1.0口为发送端,P1.1口为接收端。 发送端程序: ```c #include <reg52.h> void UART_SendByte(unsigned char dat); void main() { TMOD = 0x20; // 设置计数器1为模式2 TH1 = 0xfd; // 波特率9600,时钟频率12MHz TL1 = 0xfd; TR1 = 1; // 启动计数器1 SCON = 0x50; // 串口工作在模式1,允许接收和发送 P1 = 0xff; // 初始化P1口为高电平 while(1) { UART_SendByte(0x55); // 发送0x55 } } void UART_SendByte(unsigned char dat) { SBUF = dat; // 将要发送的数据放入发送缓冲区 while(!TI); // 等待发送完成 TI = 0; // 发送完成标志位清零 } ``` 接收端程序: ```c #include <reg52.h> void UART_ReceiveByte(unsigned char *dat); void main() { TMOD = 0x20; // 设置计数器1为模式2 TH1 = 0xfd; // 波特率9600,时钟频率12MHz TL1 = 0xfd; TR1 = 1; // 启动计数器1 SCON = 0x50; // 串口工作在模式1,允许接收和发送 P1 = 0xff; // 初始化P1口为高电平 while(1) { unsigned char dat; UART_ReceiveByte(&dat); // 接收数据 P1 = dat; // 将接收到的数据输出到P1口 } } void UART_ReceiveByte(unsigned char *dat) { while(!RI); // 等待接收完成 *dat = SBUF; // 将接收到的数据放入dat指向的内存空 RI = 0; // 接收完成标志位清零 } ``` 需要注意的是,两个单片机的波特率、数据位数、停止位数、校验位等参数必须一致。同时,两个单片机的接收和发送引脚也需要正确连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值