51单片机资源Word格式文档下载.docx
《51单片机资源Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机资源Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
位地址
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
TI
RI
99H
98H
串行发送中断标志
串行接收中断标志
①TI——串行口发送中断请求标志
②RI——串行口接收中断请求标志
⑵中断允许控制寄存器IE
80C51对中断源的开放或关闭由中断允许控制寄存器IE控制。
IE的结构、位名称和位地址如下:
IE
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<
reg52.h>
//包括一个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
T1运行标志
T0运行标志
TR1
TR0
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
⑴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)查询方式
sbitP10=P1^0;
voidmain(void){
TMOD=0x20;
//T1function2
TH1=0x38;
TL1=0x38;
TR1=1;
//startT1
while
(1){
while(!
TF1);
//查询等待TF1置位
TF1=0;
P10=~P10;
(2)中断方式
//enableinterrupt
ET1=1;
voidTimer1_ISR(void)interrupt1using3{
3、串行通信
内容简介见PPT
波特率计算:
方式1和方式3都是可变的:
常用波特率通常按规范取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
发送程序:
#defineucharunsignedchar
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++);
//延时
接收方程序:
ucharidatabuf[8];
SCON=0x50;
//串口方式1,允许接收REN=1
TMOD=0x20;
while
(1)//接收一祯
{for(i=0;
i<
9;
i++)
{
while(RI==0)//当有数据时启动接收
RI=0;
buf[i]=SBUF;
//读入数据
与PC机串行调试器通讯:
#include<
reg51.h>
//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)中断法
一般情况下,常采用查询法发送数据。
中断法接收程序。
下面就是一个中断法的程序:
unsignedchari,full_flag;
unsignedcharbuff[20];
//BUFF
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){
buff[i]=SBUF;
if(i>
20){
full_flag=1;