解决串口与按键引脚冲突——蓝桥杯单片机学习日记4:串口接收与发送
此片文章用于记录蓝桥杯单片机的学习
串口的发送与接收较为简单,主要是字节和字符串的发送与接收。
直接上程序:
//串口初始化
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE8; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1; //启动串口中断
}
//用于发送一个字节
void Sent_byte(unsigned char byte)
{
SBUF = byte;
while (TI == 0);
TI = 0;
}
//用于发送一个字符串
void Sent_string(unsigned char *string)
{
while (*string != '\0') {
Sent_byte(*string++);
}
}
//中断接收字符,根据选择接收字符还是字符串
unsigned char RX;
void Usart_interrupt() interrupt 4 //用与接收字符
{
if (RI) {
RI = 0;
RX = SBUF;
}
}
//中断接收字符串,根据选择接收字符还是字符串
unsigned char i;
unsigned char string[20];
void Usart_interrupt() interrupt 4 //用与接收字符串
{
if (RI) {
RI = 0;
string[i] = SBUF;
if (string[i] == '\n') //回车为接收结束标志
{
i = 0;
} else {
i++;
}
}
}
单片机串口与按键冲突问题:
值得注意的是,蓝桥杯单片机所使用的串口引脚为P30与P31,而无论矩阵键盘还是单独按键都会使用到这两个引脚,特别是在按键功能和串口功能一起使用的情况下,会造成串口发送紊乱,数据不对的情况。
针对上述情况,提出一下解决方案:
1.在进入按键扫描程序前,关闭定时器1(2)(取决与哪个定时器作为波特率发生器)
2.扫描结束后,重新打开定时器1(2),并一定要使P3口复位。
以前面的独立键盘扫描为例(矩阵键盘也适用):
u8 Key_scan() //扫描按键按下的情况,采用定时器轮询
{
u8 Key_temp, Key_value;
TR1 = 0; //关闭定时器1
Key_temp = P3 & 0x0f;
switch (Key_temp) {
case 0x0e: Key_value = 7; break; //s7
case 0x0d: Key_value = 6; break; //s6
case 0x0b: Key_value = 5; break; //s5
case 0x07: Key_value = 4; break; //s5
default: Key_value = 0; break;
}
TR1 = 1; //打开定时器1
P3=0xff; //复位P3口
return Key_value;
}
在采用以上方法后,无论按键扫描采用定时器轮询扫描还是软件延时消抖扫描,串口发送与接收都不在受按键的影响。