知识点:使用STC-ISP工具中的【串口波特率计算器】可以快速生成要使用的串口代码:
例1:IAP15W4K61S4中的串口1向电脑串口助手发送16进制数据,按键key1按一下发送0x66,按键key2按一下发送0x33:
#include <stc15.h>
#include "delay.h"
void Uart1_Init(void) //115200bps@22.1184MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xD0; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //使能串口1中断
}
void uart1_send_byte(unsigned char byte){
SBUF = byte;
while(TI==0);
TI = 0; //清除串口1发送中断请求位
}
void main(){
Uart1_Init();
while(1){
//板载按键key1按一下
if(P32==0){
Delay_ms(20);
while(P32==0);
uart1_send_byte(0x66);
}
//板载按键key2按一下
if(P33==0){
Delay_ms(20);
while(P33==0);
uart1_send_byte(0x33);
}
}
}
例2:IAP15W4K61S4中的串口1向电脑串口助手发送16进制数据,按键key1按一下发送发送的数据增加0x01,按键key2按一下发送的数据减少0x01:
#include <stc15.h>
#include "delay.h"
void Uart1_Init(void) //115200bps@22.1184MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xD0; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //使能串口1中断
}
void uart1_send_byte(unsigned char byte){
SBUF = byte;
while(TI==0);
TI = 0; //清除串口1发送中断请求位
}
unsigned char send_data = 0;
void main(){
Uart1_Init();
while(1){
//板载按键key1按一下
if(P32==0){
Delay_ms(20);
while(P32==0);
send_data += 0x01;
uart1_send_byte(send_data);
}
//板载按键key2按一下
if(P33==0){
Delay_ms(20);
while(P33==0);
send_data -= 0x01;
uart1_send_byte(send_data);
}
}
}
在STC-ISP工具中的【串口波特率计算器】中也可以打开串口中断,生成对应代码使用:
例3:IAP15W4K61S4中的串口1接收来自电脑串口助手发送的16进制数据,如果接收到的是0,则点亮板载led灯,接收到的是1,就熄灭板载led灯:
#include <stc15.h>
#include "delay.h"
unsigned char send_data = 1;
//串口中断
void Uart1_Isr(void) interrupt 4
{
if (TI) //检测串口1发送中断
{
TI = 0; //清除串口1发送中断请求位
}
if (RI) //检测串口1接收中断
{
if(SBUF==0){
send_data=0;
}else if(SBUF==1){
send_data=1;
}
RI = 0; //清除串口1接收中断请求位
}
}
void Uart1_Init(void) //115200bps@22.1184MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xD0; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //使能串口1中断
}
//串口发送一个字节
void uart1_send_byte(unsigned char byte){
SBUF = byte;
while(TI==0);
TI = 0; //清除串口1发送中断请求位
}
void main(){
Uart1_Init();
while(1){
if(send_data==0){
P53=0;
}else{
P53=1;
}
}
}