用89C51写程序单片机与计算机之间串行异步通信,波特率9600bps。串口工作方式2,偶校验位。定时器1工作方式2,作为串口波特率发生器。3) S3为是否允许接收控制信号,当按S3奇数次为允许接收,当按S3偶数次为不允许接收。当允许接收打开时,再按下S2,串口助手收到aa1234,回送1234,开发板收到后在数码管上显示
时间: 2023-12-23 15:06:12 浏览: 82
基于C_环境的单片机_89C51_与PC的串行通信
好的,以下是89C51单片机实现串行异步通信的程序代码:
```
#include <reg51.h>
#define FREQ_OSC 11059200UL //定义晶振频率
#define BAUD_RATE 9600 //定义波特率
sbit S3 = P1^0; //定义S3引脚
sbit S2 = P1^1; //定义S2引脚
unsigned char data receive_data; //定义接收数据变量
void init_serial() //串口初始化函数
{
TMOD &= 0x0F; //清零T1模式位
TMOD |= 0x20; //T1工作方式2
TH1 = 256 - FREQ_OSC/(32*BAUD_RATE); //计算波特率重装值
TL1 = TH1;
PCON |= 0x80; //SMOD置1,波特率加倍
SCON = 0x50; //串口工作方式2,允许接收
ES = 1; //开启串口中断
EA = 1; //开启总中断
TR1 = 1; //启动定时器1
}
void init_timer() //定时器初始化函数
{
TMOD &= 0xF0; //清零T0模式位
TMOD |= 0x02; //T0工作方式2
TH0 = 0x3C; //计算定时器重装值
TL0 = 0xAF;
ET0 = 1; //开启定时器中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器0
}
void send_data(unsigned char dat) //发送数据函数
{
SBUF = dat; //将数据放入发送缓冲区
while(!TI); //等待发送完成
TI = 0; //清除发送完成标志
}
void main()
{
init_serial(); //初始化串口
init_timer(); //初始化定时器
while(1)
{
if(S3 == 0) //判断是否允许接收
{
if(S2 == 0) //判断是否收到数据
{
send_data('1'); //发送回送数据1
send_data('2'); //发送回送数据2
send_data('3'); //发送回送数据3
send_data('4'); //发送回送数据4
}
}
}
}
void serial_isr() interrupt 4 //串口中断函数
{
if(RI) //判断是否收到数据
{
receive_data = SBUF; //读取接收的数据
RI = 0; //清除接收标志
}
}
void timer_isr() interrupt 1 //定时器中断函数
{
TH0 = 0x3C; //重新赋值重装值
TL0 = 0xAF;
if(S3 == 1) //判断是否允许接收
{
P2 = receive_data; //将接收数据显示在数码管上
}
}
```
以上代码实现了串口工作方式2,波特率9600bps,偶校验位的设置,定时器1作为串口波特率发生器,S3控制是否允许接收控制信号,S2用于触发回送数据,回送数据为"1234",接收到数据后在数码管上显示。需要注意的是,在程序中使用了中断函数,需要开启总中断。
阅读全文