【51单片机学习过程记录】14 中断之串口中断的应用1(查询方式)_phangbob的博客-程序员秘密

技术标签: 51单片机学习过程记录  

声明:【51单片机学习过程记录】全是我自己学习、实践所记录的过程,我只是菜鸟,所有论点和观点仅代表我个人,不能确定是这个技术的真理。我的目的是学习和有可能成为可以向别人分享的经验,因此有错误我会虚心接受,并认真改正。

串口中断的使用

a  51单片机串口通信的方式有两种,第一种是  查询方式 , 第二种是  中断方式。

从上一篇记录点击打开链接 中的SCON 寄存器中可以看到,TI和RI的作用,以及使用的两种方法。

查询方式,简单来说,就是利用软件(代码)去判断、查询TI和RI标志位的状态,然后依据其状态去操作。

中断方式,就是中断发生后,操作在中断中进行。  这是我大概了解及说明,可能看代码会体会得更深。

b  两种方式的大概过程

查询方式:

接收数据时     先查询RI ---然后接收数据

发送数据时     先发送数据 --- 然后查询TI


中断方式:

接收数据时 等待中断---然后在中断中接收数据

发送数据时 发送数据---等待中断---然后在中断中发送数据


应用代码:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar ch;


void serialportinit()
{
// EA=1;//全开
// ES=1;//串口中断开查询方式需要把中断关闭

TMOD=0x20;//定时计数器1,8位自动装载计数器,作用是产生波特率
SCON=0x70;//串口使用工作模式1,8位UART,波特率可变
PCON|=0x00;//计算波特率中的smod位在PCON寄存器中
TH1=0xfd;//设置串口波特率为9600bps;

        TL1=0xfd;
TR1=1;//定时计数器1开启
}


void main()
{
serialportinit(); //串口初始化
while(1)
{
if(RI)
{
RI=0;
ch=SBUF;  
SBUF=ch;
while(!TI);
TI=0;
}
}
}


//void serialptint() interrupt 4
//{
// ES=0;
// if(RI)
// {
// RI=0;
// ch=SBUF;
// SBUF=ch;
// while(!TI);
// TI=0;
// }
// ES=1;
//}


小结:

首先说下,隔这么久没有记录是有原因的,网上找许多的串口相关代码,以及教程里说到的都很好理解,但是实践中还是会出现大大小小的问题,其中有些问题还真的不简单,需要好好分析,会整理好在下一篇记录。


讲回上面的例子,很简单(再次提醒,例子都是按照正确的思路、讲解来的,串口还是涉及其他问题),顾名思义,查询方式,就是判断RI 接收标志位是否置一,置一则表示接收到数据,然后把数据存放在ch,然后再将ch中的数据发回给串口助手。


查询方式通信中需要注意的是,当你使用查询方式时,必须要关闭中断,即EA=0;ES=0; 定时计数器1开启的功能是用来提供波特率。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/phangbob/article/details/52917623

智能推荐

Swift基础学习笔记(关于类)_骑着狼吃烤羊的博客-程序员秘密

Swift基础学习笔记(关于类)构造函数在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重载,所有的构造函数都是 init新建Person类,定义了必选属性 class Person: NSObject { //此处定义了必选属性 var name: String var no: Int override init() {

关于Android23以上权限管理神器!RxPermission的简单介绍_秋名山小尼玛的博客-程序员秘密

RxPermissions的简单使用介绍,使用中碰到的问题的解决方案。

Java------手写简单的排序算法(冒泡,选择,插入)_手写一个最简单的排序_王雪亮1024的博客-程序员秘密

package com.wxl.array;public class Sort { private static void show(int[] a) { int i; for(i=0;i&lt;a.length;i++) System.out.print(a[i]+"\t"); } public static void bubbleSort(int[] a) {...

TCP 基本认识_学习使我可乐的博客-程序员秘密

TCP 基本认识 TCP 连接建立 TCP 连接断开 Socket 编程 PS:本次文章不涉及 TCP 流量控制、拥塞控制、可靠性传输等方面知识,这些留在下篇哈!正文01 TCP 基本认识瞧瞧 TCP 头格式我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。TCP 头格式序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发...

vscode运行vue,终端输入 npm run serve一直报错_橘子奶盖”的博客-程序员秘密

vscode运行vue,终端输入 npm run serve一直报错,These dependencies were not found:* @/views/index/index in ./src/router/index.js

随便推点

freemarker中boolean变量的读取_weixin_34034261的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

ROS、OpenAI和Gazebo机器人与人工智能仿真与实践教研杂记(三)深度学习_zhangrelay的博客-程序员秘密

机器人在环境中如何自主行驶呢?不同的机器人需要配置不同参数,差速或者其他动力学模型,如何获得更好的环境参数?关于ROS、OpenAI和Gazebo已经测试过环境包括:Ubuntu 16.04 + ROS 1 Kinetic + OpenAI + Gazebo 7 Ubuntu 18.04 + ROS 1 Melodic + OpenAI +Gazebo 9了解OpenAI是什么?...

查看电脑ip地址的命令Linux,怎么用ipconfig命令查看自己电脑的IP地址_鹿醚的博客-程序员秘密

优质回答 回答者:xiexiaocun用ipconfig命令查看IP地址的具体方法:打开电脑的“运行面板”,使用快捷键快捷键:win+R;然后输入“cmd",点击“确定”按钮;进入命令提示符窗口,输入命令:ipconfig /all,然后按空格键,再按回车键,就查看到电脑的ip;------------------------------------------------------------...

QGIS 3.14|地震数据动画效果实战(二)动画设置篇_qgis temporal_QGIS课堂的博客-程序员秘密

01设置图层Temporal属性在QGIS 3.14中,图层的属性对话框首次加入了 Temporal标签页,提供图层的时间设置。右键点击【图层】面板中的“quake2020”图层,弹出菜单中选择【属性…】,打开图层属性对话框。勾选【Temporal】复选框,表示该图层接受 Temporal Controller控制。点击【Configuration】下拉框,可以看到有多种形式时间设置: Fix Time Range:固定时...

Python九九乘法表(range函数)_用range函数打印九九乘法表_qnhnt的博客-程序员秘密

range()函数是Python中的内置函数,在需要执行特定次数操作时使用它,表示循环的意思。 range()可以用于以列表的形式生成数字序列。允许在给定范围内生成一系列数字。 range(start, stop, step):start表示从返回序列的起始编号,默认从0开始;stop表示生成最多但不包括此数字的数字;step指的是序列中每个数字之间的差异,默认值为1。 a = range(1, 20 ,3)for i in a: print(i) # ==&gt;1 # 4.

普通程序员如何逆袭,达到财富自由?_CSDN 程序人生的博客-程序员秘密

作者 |纯洁的微笑来源 |纯洁的微笑(ID:keeppuresmile)这个问题值得我们思考。如何逆袭?这两天闲逛知乎,发现了一个有趣的问题:大部分人的回答大概率无非这两种模式:1、去...

推荐文章

热门文章

相关标签