51单片机资源.docx

上传人:b****3 文档编号:4111201 上传时间:2022-11-27 格式:DOCX 页数:18 大小:52.36KB
下载 相关 举报
51单片机资源.docx_第1页
第1页 / 共18页
51单片机资源.docx_第2页
第2页 / 共18页
51单片机资源.docx_第3页
第3页 / 共18页
51单片机资源.docx_第4页
第4页 / 共18页
51单片机资源.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

51单片机资源.docx

《51单片机资源.docx》由会员分享,可在线阅读,更多相关《51单片机资源.docx(18页珍藏版)》请在冰豆网上搜索。

51单片机资源.docx

51单片机资源

1.中断系统

一.中断概述

⒈什么叫中断?

CPU暂时中止其正在执行的程序,转去执行请求中断的那个外设或事件的服务程序,等处理完毕后再返回执行原来中止的程序,叫做中断。

⒉为什么要设置中断?

⑴提高CPU工作效率

⑵具有实时处理功能

⑶具有故障处理功能

⑷实现分时操作

二.中断源和中断控制寄存器

⒈中断源

中断源是指能发出中断请求,引起中断的装置或事件。

80C51单片机的中断源共有5个,其中2个为外部中断源,3个为内部中断源:

⑴INT0:

外部中断0,中断请求信号由P3.2输入。

⑵INT1:

外部中断1,中断请求信号由P3.3输入。

⑶T0:

定时/计数器0溢出中断,对外部脉冲计数由P3.4输入。

⑷T1:

定时/计数器1溢出中断,对外部脉冲计数由P3.5输入。

⑸串行中断:

包括串行接收中断RI和串行发送中断TI。

⒉中断控制寄存器

80C51单片机中涉及中断控制的有3个方面,4个特殊功能寄存器:

①中断请求:

定时和外中断控制寄存器TCON;串行控制寄存器SCON;

②中断允许控制寄存器IE;

③中断优先级控制寄存器IP。

⑴中断请求控制寄存器

INT0、INT1、T0、T1中断请求标志放在TCON中,串行中断请求标志放在SCON中。

TCON的结构、位名称、位地址和功能如下:

TCON

D7

D6

D5

D4

D3

D2

D1

D0

位名称

TF1

TF0

IE1

IT1

IE0

IT0

位地址

8FH

8EH

8DH

8CH

8BH

8AH

89H

88H

功能

T1中断标志

T0中断标志

INT1中断标志

INT1触发方式

INT0中断标志

INT0触发方式

TCON位功能:

①TF1——T1溢出中断请求标志,T1计数溢出后,TF1=1

②TF0——T0溢出中断请求标志

T0计数溢出后,TF0=1

③IE1——外中断中断请求标志

当P3.3引脚信号有效时,IE1=1

④IE0——外中断中断请求标志

当P3.2引脚信号有效时,IE0=1

⑤IT1——外中断触发方式控制位

IT1=1,边沿触发方式;

IT1=0,电平触发方式。

⑥IT0——外中断触发方式控制位

其意义和功能与IT1相似。

串行控制寄存器SCON

TCON

D7

D6

D5

D4

D3

D2

D1

D0

位名称

TI

RI

位地址

99H

98H

功能

串行发送中断标志

串行接收中断标志

①TI——串行口发送中断请求标志

②RI——串行口接收中断请求标志

⑵中断允许控制寄存器IE

80C51对中断源的开放或关闭由中断允许控制寄存器IE控制。

IE的结构、位名称和位地址如下:

IE

D7

D6

D5

D4

D3

D2

D1

D0

位名称

EA

ES

ET1

EX1

ET0

EX0

位地址

AFH

ACH

ABH

AAH

A9H

A8H

中断源

CPU中断允许控制位

串行口中断允许控制位

T1中断允许控制位

INT1中断允许控制位

T0中断允许控制位

INT0中断允许控制位

①EA——CPU中断允许控制位

EA=1,CPU开中;

EA=0,CPU关中,且屏蔽所有5个中断源。

②EX0——外中断INT0中断允许控制位

EX0=1,INT0开中;EX0=0,INT0关中。

③EX1——外中断INT1中断允许控制位

EX1=1,INT1开中;EX1=0,INT1关中。

④ET0——定时/计数器T0中断允许控制位

ET0=1,T0开中;ET0=0,T0关中。

⑤ET1——定时/计数器T1中断允许控制位

ET1=1,T1开中;ET1=0,T1关中。

⑥ES——串行口中断(包括串发、串收)允许控制位

ES=1,串行口开中;ES=0,串行口关中。

说明:

80C51对中断实行两级控制,总控制位是EA,每一中断源还有各自的控制位。

首先要EA=1,其次还要自身的控制位置“1”。

三.中断处理过程

中断处理过程大致可分为四步:

中断请求、中断响应、中断服务、中断返回

⒈中断请求

中断源发出中断请求信号,相应的中断请求标志位(在中断允许控制寄存器IE中)置“1”。

⒉中断响应

CPU查询(检测)到某中断标志为“1”,在满足中断响应条件下,响应中断。

⑴中断响应条件:

①该中断已经“开中”;

②CPU此时没有响应同级或更高级的中断;

③当前正处于所执行指令的最后一个机器周期;

④正在执行的指令不是RETI或者是访向IE、IP的指令,

否则必须再另外执行一条指令后才能响应。

⑵中断响应操作

CPU响应中断后,进行下列操作:

①保护断点地址;

②撤除该中断源的中断请求标志;

③关闭同级中断;

④将相应中断的入口地址送入PC;

80C51五个中断入口地址:

INT0:

0003H;

T0:

000BH;

INT1:

0013H

T1:

001BH;

串行口:

0023H

⒊执行中断服务程序

中断服务程序应包含以下几部分:

⑴保护现场

⑵执行中断服务程序主体,完成相应操作

⑶恢复现场

⒋中断返回

在中断服务程序最后,必须安排一条中断返回指令RETI,当CPU执行RETI指令后,自动完成下列操作:

⑴恢复断点地址。

⑵开放同级中断,以便允许同级中断源请求中断。

四.中断响应等待时间

若排除CPU正在响应同级或更高级的中断情况,中断响应等待时间为:

3~8个机器周期

五.中断请求的撤除

中断源发出中断请求,相应中断请求标志置“1”。

CPU响应中断后,必须清除中断请求“1”标志。

否则中断响应返回后,将再次进入该中断,引起死循环出错。

⑴对定时/计数器T0、T1中断,外中断边沿触发方式,CPU响应中断时就用硬件自动清除了相应的中断请求标志。

⑵对外中断电平触发方式,需要采取软硬结合的方法清除(CPU自动硬件清除,同时用户也要及时将外部中断引脚变成无效电平)。

⑶对串行口中断,用户应在串行中断服务程序中用软件清除TI或RI。

六.中断优先控制和中断嵌套

⒈中断优先控制

80C51中断优先控制首先根据中断优先级,此外还规定了同一中断优先级之间的中断优先权。

其从高到低的顺序为:

INT0、INT1、T0、T1、串行口。

中断优先级是可编程的,而中断优先权是固定的,不能设置,仅用于同级中断源同时请求中断时的优先次序。

80C51中断优先控制的基本原则:

①高优先级中断可以中断正在响应的低优先级中断,反之则不能。

②同优先级中断不能互相中断。

③同一中断优先级中,若有多个中断源同时请求中断,CPU将先响应优先权高的中断,后响应优先权低的中断。

⒉中断嵌套

当CPU正在执行某个中断服务程序时,如果发生更高一级的中断源请求中断,CPU可以“中断”正在执行的低优先级中断,转而响应更高一级的中断,这就是中断嵌套。

中断嵌套只能高优先级“中断”低优先级,低优先级不能“中断”高优先级,同一优先级也不能相互“中断”。

中断嵌套结构类似与调用子程序嵌套,不同的是:

①子程序嵌套是在程序中事先按排好的;中断嵌套是随机发生的。

②子程序嵌套无次序限制,中断嵌套只允许高优先级“中断”低优先级。

七.中断系统的应用

⒈中断初始化

⑴设置堆栈指针SP

⑵定义中断优先级

⑶定义外中断触发方式

⑷开放中断

⑸安排好等待中断或中断发生前主程序应完成的操作内容。

⒉中断服务主程序

中断服务子程序内容要求:

⑴在中断服务入口地址设置一条跳转指令,转移到中断服务程序的实际入口处。

⑵根据需要保护现场。

⑶中断源请求中断服务要求的操作。

⑷恢复现场。

与保护现场相对应,注意先进后出、后进先出操作原则。

⑸中断返回,最后一条指令必须是RETI。

⒊中断系统应用举例

****C51中提供的中断服务函数的定义如下:

返回值中断ISR函数名interruptnusing[m]

其中:

n-----对应中断源的编号

m----使用指定的寄存器组(0~3)

程序举例:

#defineucharunsignedchar//定义一下方便使用

#defineuintunsignedint

#defineulongunsignedlong

#include//包括一个52标准内核的头文件

sbitP10=P1^0;//头文件中没有定义的IO就要自己来定义了

//用外中断方式读按键K1,点亮或者熄灭一个LED

voidmain(void)//主程序

{

IT0=1;//外中断跳变产生中断

EX0=1;//打开外部中断0

EA=1;//打开总中断

P10=0;

while

(1);//主程序循环

}

//外中断0的ISR

voidint0_ISR()interrupt0

{

P10=~P10;//在中断里点亮或者熄灭LED

}

/*提示:

需要去抖操作,否则按键抖动会引起多种中断。

*/

二、80C51定时/计数器

定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、信号检测等。

此外,定时/计数器还可作为串行通信中波特率发生器。

一.定时/计数器概述

80C51单片机内部有两个定时/计数器T0和T1,其核心是计数器,基本功能是加1。

对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器。

计数器由二个8位计数器组成。

定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1计满后溢出。

调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。

定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚输入。

且外部脉冲的最高频率不能超过时钟频率的1/24。

二.定时/计数器的控制寄存器

⒈定时/计数器控制寄存器TCON

TCON

T1中断标志

T1运行标志

T0中断标志

T0运行标志

INT1中断标志

INT1触发方式

INT0中断标志

INT0触发方式

位名称

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

位地址

8FH

8EH

8DH

8CH

8BH

8AH

89H

88H

TCON低4位与外中断、有关,已在中断中叙述。

高4位与定时/计数器T0、T1有关。

⑴TF1:

定时/计数器T1溢出标志。

⑵TF0:

定时/计数器T0溢出标志。

⑶TR1:

定时/计数器T1运行控制位。

TR1=1,T1运行;TR1=0,T1停。

⑷TR0:

定时/计数器T0运行控制位。

TR0=1,T0运行;TR0=0,T0停。

TCON的字节地址为88H,每一位有位地址,均可位操作。

⒉定时/计数器工作方式控制寄存器TMOD

TMOD用于设定定时/计数器的工作方式

低4位用于控制T0,高4位用于控制T1。

高4位控制T1

低4位控制T0

门控位

计数/定时方式选择

工作方式选择

门控位

计数/定时方式选择

工作方式选择

G

C/T

M1

M0

G

C/T

M1

M0

⑴M1M0——工作方式选择位

M1M0

工作方式

功能

00

方式0

13位计数器

01

方式1

16位计数器

10

方式2

两个8位计数器,初值自动装入

11

方式3

两个8位计数器,仅适用T0

⑵C/T——计数/定时方式选择位

C/T=1,计数工作方式,对外部事件脉冲计数,用作计数器。

C/T=0,定时工作方式,对片内机周脉冲计数,用作定时器。

⑶GATE——门控位

GATE=0,运行只受TCON中运行控制位TR0/TR1的控制。

GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制。

只有当INT0/INT1=1且TR0/TR1=1,T0/T1才能运行。

TMOD字节地址89H,不能位操作,设置TMOD须用字节操作指令。

三.定时/计数器工作方式

⒈工作方式0

13位计数器,由TL低5位和TH8位组成,TL低5位计数满时不向TL第6位进位,而是向TH进位,13位计满溢出,TF置“1”。

最大计数值2^13=8192。

⒉工作方式1

16位计数器,由TL和TH组成,最大计数值为2^16=65536。

工作方式与方式0相似;

⒊工作方式2

可自动装载的8位计数器,仅用TL计数,最大计数值为2^8=256,计满溢出后,一方面进位TF,使溢出标志TF=1;另一方面,使原来装在TH中的初值装入TL。

优点:

定时初值可自动恢复;缺点:

计数范围小。

常作为串口波特率发生器。

适用于需要重复定时,而定时范围不大的应用场合。

⒋工作方式3

方式3仅适用于T0,T1无方式3。

T1停止计数,只是保持其值,T0分成两个独立的8位计数器TH0和TL0;,此方式较特别。

⑴T0方式3

在方式3情况下,T0被拆成二个独立的8位计数器TH0、TL0。

①TL0使用T0原有的控制寄存器资源:

TF0,TR0,GATE,C/T,INT0,组成一个8位的定时/计数器;

②TH0借用T1的中断溢出标志TF1,运行控制开关TR1,只能对片内机周脉冲计数,组成另一个8位定时器(不能用作计数器)。

⑵T0方式3情况下的T1

T1由于其TF1、TR1被T0的TH0占用,计数器溢出时,只能将输出信号送至串行口,即用作串行口波特率发生器。

四.定时/计数器的应用

⒈计算定时/计数初值

80C51定时/计数初值计算公式:

故有:

其中:

N与工作方式有关:

方式0时,N=13;

方式1时,N=16;

方式2、3时,N=8。

Fosc---主振频率(单片机晶振);

⒉定时/计数器应用步骤

⑴合理选择定时/计数器工作方式

⑵计算定时/计数器定时初值(按上述公式计算)

⑶编制应用程序

①定时/计数器的初始化

包括定义TMOD、写入定时初值、设置中断系统、启动定时/计数器运行等。

②正确编制定时/计数器中断服务程序

注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。

【例】试用T1方式2编制程序,在P1.0引脚输出周期为400S的脉冲方波,已知fosc=12MHZ。

解:

①计算定时初值

T1初值=2^8-200*10^(-6)*12*10^6/12=256–200=56=38H

TH1=38H;TL1=38H

②设置TMOD:

00100000B=20H

③编制程序如下:

(1)查询方式

#include//包括一个52标准内核的头文件

sbitP10=P1^0;

voidmain(void){

P10=0;

TMOD=0x20;//T1function2

TH1=0x38;

TL1=0x38;

TR1=1;//startT1

while

(1){

while(!

TF1);//查询等待TF1置位

TF1=0;

P10=~P10;

}

}

(2)中断方式

#include//包括一个52标准内核的头文件

sbitP10=P1^0;

voidmain(void){

P10=0;

TMOD=0x20;//T1function2

TH1=0x38;

TL1=0x38;

EA=1;//enableinterrupt

ET1=1;

TR1=1;//startT1

while

(1);

}

voidTimer1_ISR(void)interrupt1using3{

P10=~P10;

}

3、串行通信

内容简介见PPT

波特率计算:

方式1和方式3都是可变的:

其中:

N与工作方式有关:

方式0时,N=13;

方式1时,N=16;

方式2、3时,N=8。

常用波特率通常按规范取1200、2400、4800、9600、…,若采用晶振12MHz和6MHz,则计算得出的T1定时初值将不是一个整数,产生波特率误差而影响串行通信的同步性能。

解决的方法只有调整单片机的时钟频率fosc,通常采用11.0592MHz晶振。

程序举例:

(1)查询法:

点对点的双机通信:

要实现甲与乙两台单片机点对点的双机通信,线路只须将甲机的TXD与乙机的RXD相连,将甲机的RXD与乙机的TXD相连,地线与地线相连。

 

分析过程:

甲、乙两机都选择方式1:

8位异步通信方式,最高位用作奇偶校验,波特率为1200bps,甲机发送,乙机接收,因此甲机的串口控制字为40H,乙机的串口控制字为50H。

由于选择的是方式1,波特率由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。

则须对定时/计数器T1初始化。

设SMOD=0,甲、乙两机的振荡频率为12MHZ,由于波特率为1200。

定时/计数器T1选择为方式2,则初值为:

初值=256-fosc×2SMOD/(12×波特率×32)=256-12000000/(12×1200×32)≈230=E6H;根据要求定时/计数器T1的方式控制字为20H

发送程序:

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharidatatrdata[]={'8','9','S','5','1',0x0d,0x0a,0x00};

main()

{

uchari;

uintj;

TMOD=0x20;//定时器1定时方式2

TH1=0xe6;//12MHz1200波特率

TL1=0xe6;

SCON=0x40;//串口方式1,不允许接收REN=0;

PCON=0;//SMOD=0

TR1=1;//启动定时器

while

(1)

{

i=0;

while(trdata[i]!

=0x00)//00结束

{

SBUF=trdata[i];

while(TI==0);

TI=0;

i++;

}

for(j=0;j<50000;j++);//延时

}

}

接收方程序:

#include

#defineucharunsignedchar

ucharidatabuf[8];

main()

{

uchari;

SCON=0x50;//串口方式1,允许接收REN=1

PCON=0;//SMOD=0

TMOD=0x20;//定时器1定时方式2

TH1=0xe6;//12MHz1200波特率

TL1=0xe6;

TR1=1;//启动定时器

while

(1)//接收一祯

{for(i=0;i<9;i++)

{

while(RI==0)//当有数据时启动接收

RI=0;

buf[i]=SBUF;//读入数据

}

}

}

与PC机串行调试器通讯:

#include

//UART初始化:

模式1,8位,9600Bdsat11.059MHz

voidInitSerial()

{

SCON=0x50//uartinmode1(8bit),REN=1

TMOD=TMOD|0x20;//Timer1inmode2

TH1=0xFD;//9600Bdsat11.059MHz

TL1=0xFD;//9600Bdsat11.059MHz

TR1=1;//Timer1run

}

voidmain()

{

unsignedchartemp;

InitSerial();//串行口初始化

while

(1)

{while(!

RI);//PC机发送数据

RI=0;

temp=SBUF;//接收数据

SBUF=temp;//发送数据

while(!

TI);//MCU发送数据

TI=0;

}

}

(2)中断法

一般情况下,常采用查询法发送数据。

中断法接收程序。

下面就是一个中断法的程序:

#include

unsignedchari,full_flag;

unsignedcharbuff[20];//BUFF

//UART初始化:

模式1,8位,9600Bdsat11.059MHz

voidInitSerial()

{

SCON=0x50//uartinmode1(8bit),REN=1

TMOD=TMOD|0x20;//Timer1inmode2

TH1=0xFD;//9600Bdsat11.059MHz

TL1=0xFD;//9600Bdsat11.059MHz

TR1=1;//Timer1run

EA=1;//enableinterrupt

ES=1;

}

voidmain(void){

i=0;

full_flag=0;

while

(1){

if(full_flag){

ES=0;

}

Delay(1000);//延时1s

full_flag=0

ES=1;

}

}

voidUART_ISR(void)interrupt4{

if(RI){

RI=0;

}

buff[i]=SBUF;

i++;

if(i>20){

full_flag=1;

i=0;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1