中断分为四个步骤:中断请求->中断响应->中断处理->中断返回
数据输入输出传送方式:
1.无条件传送 (led)
2.查询传送方式(温度传感器,ADC采样转换)
3.中断传送方式(IRQ)
4.直接储存器存取方式(DMA)
5个中断源
外部中断源(2个)
INT0-由P3.2端口引入,低电平或下降沿引起。
INT1-由P3.3端口引入,低电平或下降沿引起。
这两个外部中断源标识和它们的触发方式控制位由特殊功能寄存器TCON的低4位控制。
内部中断源(3个)
T0-定时器/计数器0中断,由T0回零溢出引起。
T1-定时器/计数器0中断,由T1回零溢出引起。
TI/RI-串口IO中断,串行端口完成一帧字符发送或接收后引起。
这3个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中。
1.允许中断
中断允许寄存器IE和XICON(特殊功能寄存器sfr)
EA可位寻址
2.配置中断方式
3.编写中断处理函数
中断优先级:外部中断0(入口号0)>T0溢出中断(入口号1)>外部中断1(入口号2)>T1溢出中断(入口号3)>串行口中断(入口号4)
void int1() interrupt 2 关键字interrupt 和入口号
{
}
#include <reg52.h>
sbit key=P3^3;
sbit led=P1^0;
void main()
{
IT1=0;
EX1=1;
EA=1;
while(1)
{}
}
void int1() interrupt 2
{
led=~led;
}
定时器相关
两个16位定时器/计数器:定时器0(T0为P3.4)和定时器1(T1为P3.5)
这里说的16位是指定时/计数器内部分别有16位的计数寄存器。
当工作在定时模式时,每经过一个机器周期内部的16位计数寄存器的值就会加1,当这个寄存器装满溢出时,我们可以计算出工作在定时模式时的最高单次定时时间为65535*1.085us=时间(单位us)
当工作在计数器模式时,T0(P3.4引脚),T1(P3.5引脚)每来一个脉冲计数寄存器加1。
使用步骤
启动定时器/计数器(通过TCON控制器)
设置定时器/计数器工作模式(通过TMOD控制器)
查询定时器/计数器是否溢出(读TCON内TF位)
TMOD 地址:89H 复位值:00H 不可位寻址
#include <reg52.h>
sbit time0=P3^4;
sbit led=P1^0;
int i=0;
void main()
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=(65535-46082)/256;
TL0=(65535-46082)%256;
while(1)
{
// if(TF0==1)
// {
// TF0=0;
// TH0=(65535-46082)/256;
// TL0=(65535-46082)%256;
// i++;
// if(i==20)
// {
// i=0;
// led=~led;
// }
// }
}
}
void timer0() interrupt 1
{
TH0=0x4b;
TL0=0xfd;
i++;
if(i==20)
{
i=0;
led=~led;
}
}
串口中断
串行通信又可分为异步通信和同步通信
异步通信指发送和接收设备使用各自的时钟 ,以字符(构成的帧)为单位进行传输的,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传输的,即字符之间不一定有位间隔的整数倍的关系,但同一字符内的各位之间的距离均为位间隔的整数倍
起始位 +数据 +终止位
同步时钟根据时钟发数据
串行通信中常见的错误校验
奇偶检验
代码和校验
循环冗余校验
传输速率
比特率是每秒传输二进制代码的位数,单位是位/秒(bps)
如9600bps,每个字节8位( 不带起始位和终止位的),9600/8=1200个字节,波特率位9600时,每秒钟传输1200字节
串行接口的结构
串行口工作之前需要对相关寄存器进行配置,设定其工作模式
1.设置T1的工作方式(编程TMOD的寄存器);
2.计算T1的初始值,装载TH1,TL1;
3.启动T1(编程TCON中的TR1位);
4.确定串行口控制(编程SCON寄存器);
5.如需串行口在中断方式工作时,要进行中断设置编程IE寄存器。
与串口通信相关的寄存器
(附图)
IE寄存器:EA ES
SCON寄存器:
其中SM0和SM1决定了不同的工作方式。
波特率计算方式
#include <reg52.h>
sbit led=P1^0;
int num=0;
void main()
{
EA=1; //串口初始化
ES=1;
SM0=0;SM1=1; //串口工作方式1,8位uart波特率可变
REN=1; //串口允许接收
//设置定时器产生的波特率
TR1=1;
TMOD=0x20; //
TH1=0xfd;
TL1=0xfd;
while(1)
{
}
}
void uart() interrupt 4
{
if(RI)
{
num=SBUF;
SBUF=num;
led=~led;
RI=0;
}
}