这一节我们讲一下蓝桥杯单片机比赛中断中的最后一个模块——串口。中断的其他模块在我的个人主页(4条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主有兴趣的可以去学习。

通信的方式

串行通信:一条总线,一次只能传输1bit。只需要一根线节省成本,但是传输速率慢。

并行通信:多条总线,支持多位同时传输。需要多根线浪费资源,但是传输速率快。

串行通信还包括:单工、半双工、全双工方式

单工:只能发送或者只能接受。

半双工:既能发送又能接受,但不能同时进行。

全双工:能同时发送并且接受。

我们使用的串口是串行全双工通信方式。下面我们来讲一下串口相关的寄存器,如果不想了解串口的这些繁琐的寄存器,想快速入手使用串口那么请看最下面的串口的使用步骤。

串口相关的寄存器

如下图,我们是用的单片机是STC15F2K60S2系列的,所以说此单片机只有两个串口——串口1和串口2,通常情况下我们只会使用串口1.

使用串口时,我们主要使用的寄存器如下图,我们只要大致了解它的功能,不需要死记硬背,况且考试的时候也是可以查手册的。主要的有T2H/T2L、AUXR、SCON、SBUF、IE、IP等寄存器

T2H/T2L寄存器:这里我使用的定时器2来产生波特率,所以我们需要使用T2H/T2L寄存器,这里我们为什么使用定时器2而不使用定时器1、定时器0呢?主要的还是定时器2只有一种工作方式并且功能少,而定时器0/1有4种工作方式,这里用定时器2生成波特率避免浪费资源。因为定时器只能实现一种功能,当我们使用它产生波特率时就不能使用作为其他功能了,所以这里我们采用定时器2产生波特率,避免资源浪费。这里不强求使用定时器2,看自己心情!

AUXR寄存器

SCON寄存器

SM0、SM1:控制串口的工作方式,共有4种工作方式,如下图,在这里我们主要使用的是方式1——8位UART波特率可变。这里的波特率计算规则我们这里不需要明白。

SM2:允许/禁止多机位控制

REN:接收端使能位,REN=1,允许接收;REN=0,禁止接收。

TI:发送中断请求标志位,当TI=1时表示发送完成,此时必须软件清0(手动清0)才能继续下一次的发送。

RI:接收中断请求标志位,与TI位类似,当RI=1时表示接收完成,此时必须软件清0(手动清0)才能继续下一次的发送。

这几位是我们使用最多的几位,一般的SCON=0x50;

IE寄存器

一般的,在我们使用串口中断时,需要使能EA和ES分别置1,表示打开串口中断,这样就可以在串口中断中处理程序。

PCON寄存器

SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波特率加倍;SMOD=0,则各工作方式的波特率加倍。复位时SMOD=0。

串口的使用步骤

1.使用烧写软件STC-ISP软件生成初始化好的串口代码,如下图

生成如下的代码:波特率为9600、8位数据、定时器2的频率为1MHz。我们发现这只是初始化串口1和定时器2,并没有中断的相关代码,所以如果你想使用中断也需要加上 EA=1; ES=1;

void UartInit(void)      //9600bps@12.000MHz
{SCON = 0x50;      //8位数据,可变波特率AUXR |= 0x01;      //串口1选择定时器2为波特率发生器AUXR &= 0xFB;        //定时器2时钟为Fosc/12,即12TT2L = 0xE6;       //设定定时初值T2H = 0xFF;        //设定定时初值AUXR |= 0x10;      //启动定时器2
}

 2.写串口发送数据函数,发送字节、发送字符串函数。

void Send_Byte(unsigned char dat)    /* 发送一个字节(8bit) */
{SBUF=dat;            /* 将要发送的数据放在数据缓冲寄存器里 */while(TI==0);        /* 等待发送完成(等待TI=1) */TI=0;                /* 手动清0,便于下次发送 */
}
void Send_String(unsigned char *dat)    /* 发送字符串函数 */
{ while(*dat != '0')            /* 判断每个字符是否为‘0’,为‘0’说明字符串发送完毕 */{Send_Byte(*dat++);        /* 调用发送字节函数,发送每一个字符 */}
}

3.如果使用中断的话还要编写串口中断服务函数,如下为我编写的串口中断服务函数

void Uart1Service(void)  interrupt 4
{if(RI==1)                /* 判断是否接受数据(判断上位机(电脑)是否向单片机发送数据) */{RI=0;                /* 手动清0 */rdat=SBUF;if(rdat==0x01)Send_String("I LOVE YOU");elseSend_Byte(rdat+1);}
}

代码实现:

题目:单片机向上位机(电脑)发送16进制0x11、0x22,通过上位机向单片机发送数据,如是0x01那么上位机接收到 “I LOVE YOU ” ,否则上位机收到+1后的数据。这里我们的接收和发送模式选择时注意,是HEX模式还是文本模式。

#include "stc15f2k60s2.h"
#include "intrins.h"/* 选择通道并且输入数据 */
void slect_138_573(unsigned char channel, unsigned char dat)
{P0 = 0x00;P0 = dat;                                      /* 这里用P0而不用其他端口是因为我们操作LED、数码管、继电器、蜂鸣器都是对P0进行操作 */switch(channel)                            /* 选择通道 */{case 4:                                      /* 使Y4输出低电平0,也就是操作LED */P2 = (P2 & 0x1f) | 0x80;/* (P2 & 0x1f)就是将前3位清0,再操作前3位。将0x80转为2进制1000 0000,这里只看前3位100就是Y4 */break;case 5:                                        /* 使Y5输出低电平0,也就是操作继电器和蜂鸣器 */P2 = (P2 & 0x1f) | 0xa0;break;case 6:                                       /* 使Y6输出低电平0,也就是操作8个数码管 */P2 = (P2 & 0x1f) | 0xc0;break;case 7:                                     /* 使Y7输出低电平0,也就是操作8个数码管中的1个数码管显示值 */P2 = (P2 & 0x1f) | 0xe0;break;case 0:                                       /* 关闭所有通道 */P2 = (P2 & 0x1f) | 0x00;break;}P2 = (P2 & 0x1f) | 0x00;       /* 使用后,关闭所有通道 */}void UartInit(void)     //9600bps@12.000MHz
{SCON = 0x50;      //8位数据,可变波特率AUXR |= 0x01;      //串口1选择定时器2为波特率发生器AUXR &= 0xFB;        //定时器2时钟为Fosc/12,即12TT2L = 0xE6;       //设定定时初值T2H = 0xFF;        //设定定时初值AUXR |= 0x10;      //启动定时器2EA=1;ES=1;
}void Send_Byte(unsigned char dat)
{SBUF=dat;while(TI==0);TI=0;
}void Send_String(unsigned char *dat)
{while(*dat != '0'){Send_Byte(*dat++);}
}unsigned char rdat;
void Uart1Service(void)  interrupt 4
{if(RI==1){RI=0;rdat=SBUF;if(rdat==0x01)Send_String("I LOVE YOU");elseSend_Byte(rdat+1);}
}void System_init(void)
{slect_138_573(4,0xff);slect_138_573(5,0x00);UartInit();
}void main(void)
{System_init();Send_Byte(0x11);Send_Byte(0x22);while(1){}
}

以上为本节的全部内容,如有错误请各位大佬指正,或有遗漏请指出。

蓝桥杯单片机比赛学习:7、中断系统之串口中断的基本原理相关推荐

  1. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...

  2. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理

    中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...

  3. 蓝桥杯单片机比赛学习:11、频率测量的基本原理

    在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能.频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现. 频率测量的基本原理 产生脉冲的主要元件是555定时器.555定 ...

  4. 蓝桥杯单片机比赛学习:8、PWM的基本原理之呼吸灯

    经过7节的学习,我们已经掌握了基本的硬件的使用规则,从本节开始我们开始学习一些模块的使用PWM.PCF8591.AT24C02.DS18B20.DS1302.555频率测量.光敏电阻测量.超声波测距等 ...

  5. 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块--PCF8591.我主页有其他模块的使用方法和基本原理(2条消息) Do My Best ...

  6. 蓝桥杯单片机比赛学习:1、led点亮原理

    此教程是鄙人蓝桥杯单片机的学习过程总结,可能会有错误,请指出批评.蓝桥杯单片机学习最重要的是将整个单片机模块化,比如,我们可以将它分为LED.蜂鸣器.继电器.数码管.按键.AD/DA.555定时器.光 ...

  7. 蓝桥杯单片机比赛学习:3、独立按键与矩阵按键的基本原理

    独立按键 首先我们看一下按键的原理图,如图1,当J5中的2,3接在一起的时候,红线标注就是一个完整的电路图,此时只有s4.s5.s6.s7按键可以使用,也就是独立按键.例如:当我们按下s4时,电路导通 ...

  8. 蓝桥杯单片机国赛客观题_蓝桥杯单片机比赛历年试题获取

    蓝桥杯单片机比赛历年试题获取!!! 准备蓝桥杯蓝桥杯比赛除了对板子各个模块的熟悉外,还有一件事,那就是把它们综合起来运用.当你单独使用板子上的某一个模块时,可能不会有什么问题,甚至对已经反复练习过后的 ...

  9. 第四届蓝桥杯单片机省赛 自动灌溉系统

    第四届蓝桥杯单片机省赛 自动灌溉系统 新手.所用驱动为大赛提供驱动 #include<stc15f2k60s2.h> #include "intrins.h"#defi ...

最新文章

  1. 【c语言】蓝桥杯算法提高 温度转换
  2. kali-linux 完美解决sublime输入 中文
  3. 【TypeScript】使用 const 关键字声明只读变量
  4. 商业模式新生代_业务分析基础 - 商业模式新生代01篇
  5. C# MVC中过滤器的简单使用
  6. PHP三维数组变一维
  7. python培训班靠谱吗-Python培训机构就业靠不靠谱?
  8. C++的学习(十一)继承
  9. linux源代码阅读笔记 高速缓冲区管理
  10. C语言在当代人工智能背景下的作用,人工智能对于当代社会的意义
  11. Appcan将支持在线编译提交App Store
  12. Ansible Jinjia2 模板
  13. 《孤尽班T31-04-工程结构规约》
  14. CentOS7下安装H2o的经历(How did I install the h2o in centos7?)
  15. excel学习-文本函数(left+right+len)
  16. 计算机操作上机考试题目,计算机系统操作工上机操作考试题.pdf
  17. WPF --三维空间(一)(简介)
  18. Tycho build 3: 创建一个全局构建项目
  19. ubuntu 18.04 安装 搜狗拼音输入法只有中文标点,没有文字
  20. Day 02- Vue3 技术_分析工程结构

热门文章

  1. 【真的?】用 ChatGPT 写一篇 Python 翻译库博客,可以打 9 分
  2. 程序员练级攻略:程序员修养
  3. Part5 第一个MapGIS云GIS软件程序
  4. HTML5系列代码:绘制一个圆形和矩形叠加的图形
  5. jquery动画顺序执行_jQuery动画入门--顺序执行
  6. 在电脑壁纸上HTML时钟壁纸,在电脑的桌面上怎么添加可爱的小钟表?
  7. EasyNVR摄像机网页无插件直播方案H5前端构建之:bootstrap弹窗功能的实现方案与代码
  8. 栈和队列的综合应用-钓鱼
  9. 从HTTP请求中获取客户IP地址
  10. Python基础知识点(入门基础知识点)