通常用:SMOD = 0,0xfd
利用51单片机的串行接口与上位机建立传输信道进行数据的收发。采用8位UART模式,即模式1,波特率为9600BPS。数据发送采用查询方式,数据接收采用中断方式。
系统上电初始化之后,单片机向上位机发送两个字节:0x5a和0xa5,然后等待接收上位机的数据,每接收到一个字节后,在该字节的基础上加1然后返回给上位机 。
中断号:
0 外部中断0:INT0
1 定时/计数器0:TF0
2 外部中断1:INT1
3 定时/计数器1:TF1
4 串口中断:R1/T1
代码:(发送不了数据?额。。。注意串口助手波特率9600)
#include "reg52.h"
sfr AUXR = 0x8e;//辅助寄存器
unsigned char urdat;
void InitUart()//串口初始化函数(串口中断)51芯片
{
//设置波特率
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;//查阅芯片手册:STC12C5A60S2
TR1 = 1;//启动定时器
//定义串口工作方式
SCON = 0x50;
AUXR = 0x00;
ES = 1;//打开串口中断
EA = 1;//打开总中断
}
void SendByte(unsigned char dat)//查询发送函数
{
SBUF = dat;//将数据放进SBUF缓冲器
while(TI == 0);//等待发送数据完成(未完成TI=0,0==0为真1,卡在此处死循环等待)
TI = 0;//发送完成后,人工清零
}
void ServiceUart() interrupt 4 //接收的时候需要 串口中断服务函数
{
if (RI == 1)//是否接收到一个完整的数据(串行接口接收完成中断标志位)
{
RI = 0;//接收完成后,需人工清零
urdat = SBUF;//把接收到的数据读出来
SendByte(urdat + 1);
}
// if (TI == 1)//是否发送完成(串行接口发送完成中断标志位)
// {
//
// }
}
void main()
{
InitUart();
SendByte(0x5a);//发送数据
SendByte(0xa5);
while(1)
{
}
}