波特率
串口中断
中断号为4
UART通信
UART通信的初始化
初始化TF1
- TMOD 配置前四位为0010
- TH1 = 0xfd
- TL1 = 0xfd
- TR1 = 1
初始化SCON寄存器
SCON = 0x50
初始化AUXR寄存器
AUXR 最后一位配置为0
初始化IE寄存器
- ES = 1
- EA = 1
UART数据发送与接收
注:
1.通过RI TI 来判断数据是否发送或接收完成
SCON寄存器配置
代码实现
/*
usrt串口通信 电脑向CPU发送数据
*/
#include <STC15F2K60S2.H>
void UartInit();
void UartSend(unsigned char byte);
void main()
{
UartInit();
UartSend(0xa5);
UartSend(0x5a);
while(1){
}
}
/**
*@brief 串口中断函数,用于发送用户输入的数据
*@param 无
*@retval 无
*/
unsigned char urdat;
void ServiceUart() interrupt 4
{
if(RI == 1){
urdat = SBUF;
UartSend(urdat);
RI = 0;
}
}
/**
*@brief uart串口向单片机发送数据
*@param byte [0, 255]
*@retval 无
*/
void UartSend(unsigned char byte){
SBUF = byte;
while(TI == 0); // 等待其发送完成
TI = 0;
}
/**
*@brief Uart串口通信初始化
*@param 无
*@retval 无
*/
void UartInit(){
// TF1配置
TMOD = (TMOD & 0x0f) | 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
// SCON和AUXR配置
SCON = 0x50;
AUXR &= 0xfe;
// IE配置
ES = 1;
EA = 1;
}
/*
串口通信实现LED灯控制及输入输出字符串
*/
#include <STC15F2K60S2.H>
void UartInit(void);
void UartSendByt(unsigned char byte);
void UartSendStr(unsigned char *str);
void main()
{
UartInit();
UartSendStr("Welcome to Norman's system!\r\n");
while(1){
}
}
unsigned char udat;
void ServiceUart() interrupt 4
{
if(RI == 1){
udat = SBUF;
P2 = (P2 & 0x1f) | 0x80;
P0 = udat;
P2 = 0xff;
UartSendStr("System is running!\r\n");
// \r 回车符,将光标移到最左端
RI = 0;
}
}
void UartSendByt(unsigned char byte){
SBUF = byte;
while(TI == 0);
TI = 0;
}
void UartSendStr(unsigned char *str){
while(*str != '\0'){
UartSendByt(*str);
str ++;
}
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE0; //设定定时初值
TH1 = 0xFE; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1;
ES = 1;
}