NO9 蓝桥杯单片机实践之串口通信的使用

本文详细描述了STM8S15F2K60S2单片机中串口通信的初始化、定时器1配置以及中断处理过程,包括波特率设置、SCON寄存器配置和中断服务函数中接收和发送操作。作者还分享了实践中遇到的问题和代码实例。
摘要由CSDN通过智能技术生成

1 回顾

串口通信的代码编写结构还是与中断一样,不同的是:

初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器(定时器1用于产生波特率),但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。

void  函数名()

{

包含两部分寄存器:定时器1+串口通信

定时器1: TMOD (选择模式),TH1和TL1(初始计时寄存器),TR1(TCON寄存器里的启动计时按钮)!!注意,由于这里定时器只产生波特率,故不必打开ET1中断分开关,后面的中断服务函数毕竟也是中断号为串口通信而不是定时器。

串口通信:SCON(总的来说功能是模式选择),AUXR(辅助寄存器),中断开关(分开关+总开关)

}

void  函数名() interrupt  中断号

{

就是写时间到后执行什么。注意中断号要写串口通信的,而不是定时器的,因为定时器作用只是产生波特率而不是产生中断。

}

2 实践

2.1 任务

2.2 思路

题目中涉及到串口通信。那么串口通信的结构就要先写下来:

void  函数名()

{

}

void  函数名() interrupt  中断号

{

}

先考虑初始函数怎么写:

用定时器1产生波特率9600: (那么就要写与定时器1有关的寄存器)

TMOD,TR1,TL1,TH1 ,中断(但不使用)

(1)波特率9600查表得到当时钟为11.059MHZ,定时器1用方式2工作即8位重装,写入0xfd,即TL1,TH1= 0xfd

(2)刚才说到要用8位重装模式

查手册之TMOD= 0x20

(3)要让定时器允许定时则TR1 = 1。

初始函数中还涉及串口通信:

与串口通信有关的寄存器: SCON, PCON,AUXR, SBUF,中断

SCON:(上一篇文章查表,或直接查手册)常用的工作模式是8位UART波特率可变,即SM0,SM1为01,那么TB8和RB8和SM2为0(方式1时不使用),TI和RI初始也应该为0,REN=1,要允许接收。

即:01010000

因此,SCON=0x50.

PCON:在定时器1串口1情况写,只考虑SMOD那位,由波特率常用表,我们选了那一行的SMOD显示为0,故SMOD=0,故PCON=0x00。

AUXR: AUXR= 0x00(上一篇文章有解释)

中断:总开关EA=1,分开关ES=1

SBUF是存放数据的所以不是写在初始函数中

接下看看看中断程序函数怎么写:

(1)首先是中断号,因为中断用的是串口通信而不是定时器1,故中断号应是对应串口通信的中断号为4。

(2)任务是要我们接收信息。那么就要用到接收判断位RI,首先判断RI,当RI=1表示接收完成数据,然后再把接收到的数据存下来。(我们前一篇说过,发送的数据会暂时存到SBUF),那么现在我们要接收,就要定义一个变量把SBUF的数据存起来,即data= SBUF,然后再把RI清零。(由于这里只考虑接收,故在中断中只是写接收就行了)

虽然在中断中不用判断发送,但是还是要写一个发送函数来传给单片机,然后接收出来让我们看看是否嗯那个完成接收工作。

注意:还有因为任务是产生9600的波特率,因此串口收发助手的波特率记得调到9600!!

2.3 完整代码

这里我发现很奇怪,要把发送内容的函数放到main函数的循环里面才能让串口助手收到数据,放在main的循环外面是不行的,这样就导致其一直在发送,串口助手就一直在循环接收数据,小蜜蜂老师教程里却不会这样,为啥呢?求助大佬!!

(以下是在蓝桥杯单片机中可以使用的代码)

#include "stc15f2k60s2.h"


void selectHC138(unsigned int n)
{
  switch(n)
  {
    case 0:
      P2 = (P2 & 0x1f) | 0x00;  break;
   	case 1: 
			P2 = (P2 & 0x1f) | 0x20;  break; 
		case 2:
			P2 = (P2 & 0x1f) | 0x40;  break; 
		case 3: 
			P2 = (P2 & 0x1f) | 0x60;  break; 
		case 4:
			P2 = (P2 & 0x1f) | 0x80;  break; 
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;  break; 
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;  break; 
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;  break;
  }
}

//=============================send and recieve===============
void Init_Timer1()
{
  TH1 = 0xfd;
  TL1 = 0xfd;
  TMOD = 0x20;
  TR1 = 1;
  
  SCON = 0x50;
//  PCON = 0x00;
  AUXR = 0x00;
  ES = 1;
  EA = 1;
}

unsigned char urdat;

void chuankou() interrupt 4
{
//  if(TI == 1)
//  {
//    urdat = SBUF;
//    TI = 0;
//  }
  if (RI == 1)
  {
    //SBUF = urdat;
    urdat = SBUF;
    RI = 0;
  }
}  
//=====================================================
void send(unsigned char dat)
{
  SBUF = dat;
  while(TI == 0);
  TI = 0;
}

void close()
{
  selectHC138(5);
  P0 = 0x00;
  selectHC138(4);
  P0 = 0xff;
}

void main()
{
  close();
  Init_Timer1();
  while(1)
  {
     send(0x5a);
     send(0xa5);   
  }

  
}

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值