解决串口与按键引脚冲突——蓝桥杯单片机学习日记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;
}

在采用以上方法后,无论按键扫描采用定时器轮询扫描还是软件延时消抖扫描,串口发送与接收都不在受按键的影响。

蓝桥杯单片机学习日记1-LED 蜂鸣器 继电器 数码管的简单驱动

蓝桥杯单片机学习日记2-独立按键的短按,长按的使用

蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

物联沃分享整理
物联沃-IOTWORD物联网 » 解决串口与按键引脚冲突——蓝桥杯单片机学习日记4:串口接收与发送

发表评论