采用单片机穿行口方式1实现双机通信的发送和接收结果显示,单片机1的按键P1^0控制单片机2的单只发光二极管的亮灭,单片机2的按键P1^0控制单片机1的单只发光二级管的亮灭,二极管都接在P2^0口,晶振12MHZ,波特率9600bps,写出Keil5代码
时间: 2023-08-31 13:39:08 浏览: 102
### 回答1:
以下是基于STC89C52单片机的Keil5代码:
单片机1代码:
```c
#include <reg52.h>
sbit LED = P2^0;
void InitUART()
{
TMOD = 0x20; // 定时器1工作在模式2,8位自动重装载
TH1 = 0xFD; // 波特率9600,晶振12MHz
TL1 = TH1;
SCON = 0x50; // 8位数据,无校验位,1位停止位,允许接收
TR1 = 1; // 打开定时器1
ES = 1; // 使能串口中断
EA = 1; // 全部中断使能
}
void UART_ISR() interrupt 4
{
if (RI == 1) // 接收到数据
{
RI = 0; // 清除接收中断标志
LED = SBUF; // 将接收到的数据显示到LED上
}
}
void main()
{
InitUART(); // 初始化串口
while (1);
}
```
单片机2代码:
```c
#include <reg52.h>
sbit LED = P2^0;
void InitUART()
{
TMOD = 0x20; // 定时器1工作在模式2,8位自动重装载
TH1 = 0xFD; // 波特率9600,晶振12MHz
TL1 = TH1;
SCON = 0x50; // 8位数据,无校验位,1位停止位,允许接收
TR1 = 1; // 打开定时器1
ES = 1; // 使能串口中断
EA = 1; // 全部中断使能
}
void UART_ISR() interrupt 4
{
if (RI == 1) // 接收到数据
{
RI = 0; // 清除接收中断标志
LED = SBUF; // 将接收到的数据显示到LED上
}
}
void main()
{
InitUART(); // 初始化串口
while (1);
}
```
以上代码中,主要包括了串口初始化、串口中断处理函数、以及主函数。在串口中断处理函数中,我们通过判断RI标志位是否为1来判断是否接收到了数据。如果接收到数据,则清除RI标志位,并将数据显示在LED上。主函数中,我们只需要初始化串口,并通过while(1)让程序保持运行状态。
### 回答2:
以下是使用Keil5编写的实现双机通信的发送和接收结果显示的代码:
```
#include <reg52.h>
#define FREQ_OSC 12000000UL
#define BAUD_RATE 9600
// 定义串口通信参数
#define T1_RELOAD 256 - (FREQ_OSC / (32 * 12 * BAUD_RATE))
#define T2_RELOAD 65536 - (FREQ_OSC / (32 * BAUD_RATE))
// 定义全局变量
unsigned char receiveData = 0; // 接收数据
unsigned char sendData = 0; // 发送数据
// 延时函数
void delay(unsigned int time){
unsigned int i, j;
for(i=0; i<time; i++){
for(j=0; j<120; j++);
}
}
// UART串口初始化
void UART_Init(){
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = T1_RELOAD;
TL1 = T1_RELOAD;
TH2 = T2_RELOAD / 256;
TL2 = T2_RELOAD % 256;
TR1 = 1;
TR2 = 1;
REN = 1;
ES = 1;
EA = 1;
}
// 发送数据
void UART_SendByte(unsigned char sendData){
TI = 0;
SBUF = sendData;
while(!TI);
TI = 0;
}
// 接收数据
void UART_ReceiveByte() interrupt 4 {
if(RI){
receiveData = SBUF;
RI = 0;
}
}
void main(){
P1 = 0xFF; // 设置P1为输入
P2 = 0x00; // 设置P2为输出
UART_Init();
while(1){
if(P1 & 0x01){ // 如果P1^0为高电平
P2 &= 0xFE; // P2^0输出低电平,熄灭发光二极管
} else {
P2 |= 0x01; // P2^0输出高电平,点亮发光二极管
}
if(P1 & 0x01){ // 如果P1^0为高电平
sendData = '0';
} else {
sendData = '1';
}
UART_SendByte(sendData); // 发送数据
delay(500); // 延时500ms,使状态保持一段时间
if(receiveData == '0'){ // 如果接收到的数据为'0'
P2 |= 0x01; // P2^0输出高电平,点亮发光二极管
} else {
P2 &= 0xFE; // P2^0输出低电平,熄灭发光二极管
}
}
}
```
这段代码使用了单片机的UART串口通信模块实现双机通信。其中,P1^0按键控制单片机2的发光二极管的亮灭,P2^0口连接发光二极管;P1^0按键控制单片机1的发光二极管的亮灭,P2^0口连接发光二极管。晶振频率为12MHz,波特率设置为9600bps。当P1^0按键为高电平时,发光二极管熄灭;当P1^0按键为低电平时,发光二极管点亮。发送数据使用UART_SendByte函数发送数据,并通过延时函数保持状态一段时间。接收到的数据通过UART_ReceiveByte函数存储在receiveData变量中,根据接收到的数据控制发光二极管的亮灭状态。
阅读全文