目录
中断系统简介:
中断的优先级和嵌套:
8个中断请求源及其优先级:
中断的分别介绍:
1、外部中断0:INT0
2、外部中断1
3、T0和 T1:定时计数器的功能
4、串口中断(串口为什么使用定时器后面讲)
中断寄存器
(1)中断允许控制(IE)
(2)中断请求标志(TCON)
(3)中断号
外部中断
定时器中断
1、基础介绍
CPU 时序的有关知识
定时器定时功能的原理:
定时器计数功能的原理:
2、结构介绍
(1)工作方式寄存器TMOD
(2)控制寄存器TCON
3、配置定时器
串口通信
1、分类方式:
2、分别介绍
(1)串行通信和并行通信
(2)异步通信和同步通信:
(3)单工通信,半双工通信,全双工通信
3、通信速率(比特率)
4、串口通信简介
(1)简介
(2)逻辑电平之间的转换:
(3)连接方式
(4)通信协议
5、串口内部结构(不重要)
6、串口相关寄存器
(1)串口控制寄存器SCON
(2)电源控制寄存器 PCON
7、串口工作方式1
8、串口使用方法
(1)波特率初值的计算方法
(2)串口的初始化
为什么串口也使用定时器?
9、程序
中断系统简介:
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。
中断的优先级和嵌套:
在主程序中,中断1和中断2同时出现,这时候要考虑中断的优先级。
如果在一个中断中出现了另一个中断,且第二个中断优先级比前一个中断高,这时会嵌套执行第二个中断。
8个中断请求源及其优先级:
外部中断0:INT0 √ 外部中断1:INT1 √
外部中断2:INT2 外部中断3:INT3
定时器0 √ 定时器1 √ 定时器2
串口 √
打对号的是基本上单片机都具有的
优先级从上到下依次递减。RX和TX代表着串口。
中断的分别介绍:
1、外部中断0:INT0
P3.2管脚,通过控制TCON的IT0来确定下降沿或低电平触发;若IE0置1,就说明来了一个中断。EX0和EA都为1即可使用中断。
IP是自己控制中断的优先级,一般为默认即可。
2、外部中断1
P3.3管脚,通过控制TCON的IT1来确定下降沿或低电平触发;若IE0置1,就说明来了一个中断。EX1和EA都为1即可使用中断。
IP是自己控制中断的优先级,一般为默认即可。
3、T0和 T1:定时计数器的功能
T0 P3.4管脚 T1 P3.5管脚
若是16位计数器,那么计数到65535时,就会溢出,TF0就会自动置1,发出中断请求。
4、串口中断(串口为什么使用定时器后面讲)
RX P3.0 发送 TX P3.1 接受
如果RI和TI中有一个大于等于1(或门),就会发出中断请求。
中断寄存器
(1)中断允许控制(IE)
使用串口中断:ES位置1即可;同样,若使用定时器0或1,ET0和ET1置1即可。
(2)中断请求标志(TCON)
外部中断0和1通过 IT0和IT1两位来确定下降沿或低电平触发条件,置1是下降沿触发,置0是低电平触发。通常使用前者。
TR0和TR1是我们对定时器初始值的设定。
IE0和IE1是外部中断0和1的中断请求标志位,检测到下降沿或者低电平触发后,单片机内部自动完成置1。
TF0和TF1是定时器0和1的溢出中断请求标志,溢出后会自动置1。
(3)中断号
(4)中断响应条件
1、中断源有中断请求;
2、中断源的中断允许位(IE)为 1;
3、CPU 开中断(即 EA=1)。
外部中断
外部中断0是P3.2管脚的附加功能,通过控制TCON的低4位的IT0来确定下降沿或低电平触发;当系统检测到以上条件符合时,自动将IE0置1,就说明来了一个中断;EX0和EA都为1即可使用中断;IP是自己控制中断的优先级,一般为默认即可。外部中断1同理。
如果我们不使用外部中断,可以只通过判断IE0是否置1来确定是否有中断源产生。
开启外部中断0:
根据原理图,由于单片机所有管脚都有一个上拉电阻(始终为高电平),在按下按键K3的时候,P32管脚就会置0,这时如果我们设置下降沿触发的话,就会产生中断源。因此可以通过按键的按下来模拟外部中断触发。按键K4同理。
程序:使用独立按键 K3 控制 LED 亮灭,注意是通过外部中断来实现的,而不是简简单单的按键程序。
先配置外部中断0的初始化函数,目的是打开外部中断0;然后配置中断的主体函数。
#include <reg52.h>#define uchar unsigned char#define uint unsigned int/******************对4个独立按键的管脚进行定义*********************/sbit KEY1=P3^1;sbit KEY2=P3^0;sbit KEY3=P3^2;sbit KEY4=P3^3;/******************对LED灯进行定义*********************/sbit LED1=P2^0;sbit LED2=P2^1;void Delayms(uint ms);//1毫秒延时void int0_init();//外部中断0的初始化函数void main(){int0_init();//外部中断0的初始化函数while(1){Keyscan();}}void int0_init()//外部中断0的初始化函数 打开外部中断0{IT0=1;//下降沿触发EX0=1;//打开中断允许位EA=1;//打开总中断}void int0_work() interrupt 0//中断程序主体{Delayms(5);if(KEY3==0){LED1=!LED1;}while(!KEY3);}void Delayms(uint ms)//1毫秒延时{uint i,j;for(i=ms;i>0;i--)for(j=114;j>0;j--);}
定时器中断
1、基础介绍
CPU 时序的有关知识
外接晶振为 12MHz 时,51 单片机相关周期的具体值为
(1)振荡周期(时钟周期) 振荡周期=1/12us;
(2)状态周期 状态周期=1/6us;
(3)机器周期 机器周期=1us;
(4)指令周期 指令周期=1~4us;
定时器的两种功能:既可以实现定时,也可以实现计数。
定时器与CPU是独立的,不耽误CPU的工作。
依据定时器内部的时钟或者外部的脉冲信号来实现定时或计数功能。
定时器定时功能的原理:
每经过一个机器周期(1us),内部的16位计数寄存器的值就会加1,直到这个寄存器装满时溢出。当加到溢出后发出一个溢出中断,即硬件使TCON的高4位中TFO或TF1置1,我们程序可以捕获到这个中断,就可以知道此时经历了(65535+1)us。
定时器计数功能的原理:
T0(P3.4引脚的附加功能),T1(P3.5引脚的附加功能)
通过TMOD来设置定时器的这两种工作模式;每来一个脉冲计数器加1(共有16位计数器),当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TFO或TF1置1,向CPU发出中断请求(定时/计数器中断允许时).
2、结构介绍
(1)工作方式寄存器TMOD
定时器1配置高4位(前4位),低4位置0;
定时器0配置低4位(后4位),高4位置0;
GATE通常置0
C/T:定时或计数功能的选择,置0是定时模式,置1是计数模式
M1,M0是工作方式的设置
10模式通常应用于串口通信生成波特率,01模式用于定时器
(2)控制寄存器TCON
寄存器溢出使TFO或TF1置1,如果不使用中断,我们可以通过这一位来判断是否溢出。
3、配置定时器
①对 TMOD 赋值,以确定 T0 和 T1 的工作方式
②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1
③如果使用中断,则对 EA 赋值,开放定时器中断
④使 TR0 或 TR1 置1,启动定时/计数器定时或计数
例如:定时器0定时1毫秒
(1)TMOD的配置
高4位置0,低4位:00(定时功能)01 TMOD |= 0X01;
使用或运算:不干扰定时器1的使用,对高4位无影响。
(2)TH0和TH1的配置:
1毫秒除以1微秒(机器周期),看看需要计数几次;需要计数1000次;65536-1000=64536;将64536转换成16进制(FC18),高8位写入TH0,高8位写入TL0;TH0=0XFC, TL0=0X18。
定时器计算软件:定时选择方式1
(3)打开开关
ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器0
程序:通过定时器 0 中断控制 D1 指示灯间隔 1 秒闪烁。
#include <reg52.h>#define uchar unsigned char#define uint unsigned int/******************对LED灯进行定义*********************/sbit LED1=P2^0;sbit LED2=P2^1;void Delayms(uint ms);//1毫秒延时void timer0_init();//12MHZvoid main(){timer0_init();//12MHZwhile(1){}}void timer0() interrupt 1{staticuint i=0;TH0=0XFC;//给定时器赋初值,定时1msTL0=0X18;i++;if(i==1000)//1秒{i=0;LED1=!LED1;}}void timer0_init()//12MHZ 1毫秒{TMOD|=0X01;//选择为定时器0模式,工作方式1TH0=0XFC;//给定时器赋初值,定时1msTL0=0X18;ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器}void Delayms(uint ms)//1毫秒延时{uint i,j;for(i=ms;i>0;i--)for(j=114;j>0;j--);}
注意:与15系列单片机不同的是,在写中断主体函数的时候,由于定时器0和1不能自动重载初始值,所以我们要把定时器的初始值重新输入一遍。
而且,进入次数的计数变量i要定义为静态变量static,因为当我们的i不满足等于1000的时候就会退出中断,然后再次进入中断时又置为了0。所以我们设置静态变量i,在出中断函数之后还会保持上一次i的值。
串口通信
1、分类方式:
通信方式分类:串行通信和并行通信
通信数据同步方式:异步通信和同步通信
数据传输方向:单工通信,半双工通信,全双工通信
2、分别介绍
(1)串行通信和并行通信
串行通信:
通过一条数据线,将数据一位一位的依次传输。
并行通信
通常是将数据字节的各位用多条数据线同时进行传送,通常是 8 位、16 位、32 位等数据一起传输。
(2)异步通信和同步通信:
异步通信(多用)
是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。(这边是11.0592 MHZ,对面也应当差不多是)
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。如下图所示:
同步通信(少用)
要建立发送方时钟(甲)对接收方(乙)时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步 可以通过两种方法实现。如下图所示:
(3)单工通信,半双工通信,全双工通信
单工是指数据传输仅能沿一个方向,不能实现反向传输。
半双工是指数据传输可以沿两个方向,但需要分时进行。S485
全双工是指数据可以同时进行双向传输。S232
3、通信速率(比特率)
每秒钟传输二进制代码的位数,单位是:位/秒(bps)。
在后面会遇到一个“波特率”的概念,它表示每秒钟传输了多少个码元。而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。如常见的通信传输中,用0V表示数字0,5V表示数字1,那么一个码元可以表示两种状态0和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有0V、2V、4V以及6V分别表示二进制数00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。由于很多常见的通信中一个码元都是表示两种状态,所以我们常常直接以波特率来表示比特率。
4、串口通信简介
(1)简介
是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。
我们学习的是RS-232C接口。RS-232C接口规定使用 25 针连接器,简称DB25,还有一种 9 针的非标准连接器接口,简称DB9,我们通常使用DB9。
排针序号括号里的就是DB9的序号。在串口通信中,通常我们只使用2、3、5三个管脚,即TXD、RXD、SGND,其他管脚功能不明白也没关系。
(2)逻辑电平之间的转换:
RS-232C对逻辑电平也做了规定:(与单片机0是0V,1是5V不一样)
在 TXD 和 RXD 数据线上:
1.逻辑 1 为-3~-15V 的电压
2.逻辑 0 为 3~15V 的电压
在 RTS、CTS、DSR、DTR 和 DCD 等控制线上:
1.信号有效(ON 状态) 为 3~15V 的电压
2.信号无效(OFF 状态) 为-3~-15V 的电压
因此为了RS-232C和单片机之间的电平逻辑转换,我们需要一个芯片:MAX232,由此实现通信。
(3)连接方式
注意:串口数据收发线要交叉连接。计算机的TXD(发送)要对应单片机的RXD(接受),计算机的RXD要对应单片机的TXD,并且共GND,如下图:
(4)通信协议
RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式
“96”表示的是通信波特率为 9600。串口通信中通常使用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率。波特率常用值还有 4800、115200
“N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)
“8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。当然数据位数还可以为5、6、7位长度。
“1”表示的是1位停止位,串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示,而数据包的停 止信号可由 0.5、1、1.5 或2个逻辑1的数据位表示,只要双方约定一致即可。
5、串口内部结构(不重要)
上图中右边的TXD和RXD为单片机IO口,TXD对应的是P3.1管脚,RXD对应的是 P3.0管脚。波特率依靠TH1和TL1,SBUF是数据发送和接收的寄存器(读取串口数据就是读取SBUF的值)。
6、串口相关寄存器
(1)串口控制寄存器SCON
前两位确定串口通信的工作方式,我们通常使用方式1.(01)
SM2:多机工作方式控制位:一个主设备可连接多个串口设备,通过控制SM2来控制使用哪一个串口设备。多用于方式2和3。
当SM2=1 时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。
当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0和方式1未用到。(0)
REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置 REN=0,则禁止接收。 (1)
TB8:在方式2或方式3中,是发送数据的第9位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1未用到。(0)
RB8:在方式2或方式3中,是接收到数据的第9位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。在方式0和方式1未用到。(0)
TI:发送中断标志位。在方式 0 时,当串行发送第 8 位数据结束时,或在其 它方式,串行发送停止位的开始时,由内部硬件使 TI 置 1,向 CPU 发中断申请。 在中断服务程序中,必须用软件将其清 0,取消此中断申请。 (0)
RI:接收中断标志位。在方式 0 时,当串行接收第 8 位数据结束时,或在其 它方式,串行接收停止位的中间时,由内部硬件使 RI 置 1,向 CPU 发中断申请。 也必须在中断服务程序中,用软件将其清 0,取消此中断申请。(0)
所以,配置完毕:SCON=0X50
(2)电源控制寄存器 PCON
SMOD:波特率倍增位。在串口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
7、串口工作方式1
位采样脉冲:波特率.
8、串口使用方法
(1)波特率初值的计算方法
方式 0 的波特率 = fosc/12
方式 2 的波特率 =(2SMOD/64)· fosc
方式 1 的波特率 =(2SMOD/32)·(T1 溢出率)
方式 3 的波特率 =(2SMOD/32)·(T1 溢出率)
其中 T1 溢出率 = fosc /{12×[256 -(TH1)]}
方式0和方式2的波特率是固定的,方式1和3的波特率是可更改的。 Fosc:板载外部晶振的时钟频率。
波特率初值计算软件:SMOD的值是我们通过软件设定PCON时确定的。我们设定的什么,在计算软件中就选择什么。晶振频率选择11.0592MHZ.
(2)串口的初始化
①确定 T1(定时器1) 的工作方式(TMOD 寄存器);
②确定串口工作方式(SCON 寄存器);
③计算 T1 的初值(设定波特率),装载 TH1、TL1;
④启动 T1(TCON 中的 TR1 位);
⑤如果使用中断,需开启串口中断控制位(IE 寄存器)。
为什么串口也使用定时器?
1.定时器来确定发送和发送执行每一位的时间,一般是9600b/s,这样通讯时间确定了,别的接口也按照这个时间9600b/s量段,来接收数据,这样才不会错,如果不一致,那就会错。
2.用定时器可以设置任意波特率,也可以不用定时器,但波特率是死的,不灵活。
3.设置初值,是为了设置各种波特率的,一般我们根据公式,来确定一个波特率,反算出定时器初值的。得到这个值,赋到定时器寄存器里,开始计时,到达数值溢出,定时器就中断了,从初值到溢出的这段时间就是我们要的波特率函数时间。这样也就确定了每一位的发送和接收时间单位值。
9、程序
功能:当串口助手发送数据给单片机,单片机原封不动转发给串口助手显示。(一发一收)
不需要再定义TXD和RXD的管脚。
void uart_init(uchar baud)//串口通信初始化函数{TMOD|=0X20;//设置定时器1的工作方式:定时模式,8位自动重装定时器SCON=0X50;//设置串口通信的工作方式1PCON=0X80;//波特率加倍,提高通信速率TH1=baud;TL1=baud;ES=1;//打开接收中断EA=1;//打开总中断TR1=1;//打开计数器}void uart() interrupt 4//串口的中断号是4 数据的接受和发送{uchar dat=0;RI=0;dat=SBUF;//串口调试助手把数据传送给单片机上的SBUF,把SBUF接受的串口数据传送给datSBUF=dat;//单片机把数据传送给SBUF,准备发送到串口调试助手while(!TI);//TI=1是发送完成,如果未发送完成,一直发送数据,如果发送完成,退出while循环TI=0;}
将程序下载到单片机上之后;打开串口调试助手软件;波特率选择9600;在串口设置里面确定没有校验位,数据是8位;在右下角输入你要发给单片机的数据;点击打开串口;点击发送;就可以在主页面上收到你发给单片机的数据。
波特率计算软件和串口调试助手软件:
链接:/s/1McE3zbOClZD-uD3x2BpceQ?pwd=zqpi
提取码:zqpi