中断系统
一.外部中断
外部中断源(2个)
INT0:由P3^2端口引入,低电平或下降沿引起
INT1:由P3^3端口引入,低电平或下降沿引起
这两个外部中断源标志和它们的触发方式控制位由特殊功能寄存器TCON的低4位控制
内部中断源(3个)
T0:定时器/计数器0中断,由T0回零溢出引起
T1:定时器/计数器1中断,由T1回零溢出引起
TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起
这三个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中
1.允许中断
2.配置中断方式
3.编写中断函数
void Int0() interrupt 2 //中断处理函数,加关键字interrupt和入口号
{
//中断处理语句;
}
中断级别由高到低
外部中断0 中断入口0
T0溢出中断 中断入口1
外部中断1 中断入口2
T1溢出中断 中断入口3
串行口中断 中断入口4
中断响应条件
- 此中断源的中断允许为1
- 总中断CPU中断打开(EA = 1)
- 中断源有中断请求
外部中断1初始化及中断处理函数
void InitInt1()
{
EA = 1;
EX1 = 1;
IT1 = 1;
}
void Int1() interrupt 2
{
//....
}
二.定时器/计数器
(定时由内部触发,计数由外部产生)
当工作在定时模式时,每经过一个机器周期内部的16位计数寄存器的值就会加1,当这个寄存器装满时溢出,最高单次定时时间为:65536*1.085 (机器周期)= 时间(us)。
当工作在计数器模式时,T0(P3^4引脚),T1(P3^5引脚)每来一个脉冲计数寄存器加1
使用步骤
- 启动定时/计数器(TCON)
- 设置定时/计数工作模式(TMOD)
- 查询是否溢出(读TCON内TF位)
定时器0初始化
void Timer0Init(void)//定时50ms
{
AUXR |= 0X80;//定时器时钟1T模式
TMOD &= 0XF0;//设置定时模式
TL0 = (65535-50000) / 256;//设置定时初值
TH0 = (65535-50000) / 256;//设置定时初值
TF0 = 0;//清除TF0标志位
TR0 = 1;//允许计数
ET0 = 1;//溢出中断允许
EA = 1;
}
三.串行通信
分为异步通信和同步通信
串口的使用:
- 设置AUXR定时器时钟频率及选择串口的波特率发生器
- 设置SCON串行口的控制器(选择工作模式)
- 设置PCON波特率是否倍数
- T2H T2L设置波特率大小
- ET1 = 0;禁止定时器1中断
- TR1 = 1;启动定时器1
- ES = 1;允许串口中断
AUXR寄存器
SCON寄存器
PCON寄存器
SMOD = 0:TH1参数 = 256-fosc/12/32/波特率
SMOD = 1:TH1参数 = 256-fosc/12/16/波特率
12M晶振或11.0592M晶振的情况下,要产生9600Bps的波特率,SMOD = 0时,参数为0XFD;SMOD = 1时,参数为0XFA。
void Uart_Init()
{
TMOD &= 0X0F;
TMOD |= 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
ET1 = 0;
SCON = 0X50;
AUXR = 0X00;
ES = 1;
EA = 1;
}
串行口中有两个缓冲寄存器SBUF,一个为发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,都是字节寻址,为99H。
串行发送时,CPU向SBUF写入数据,此时99H表示发送缓存SBUF。
串行接收时,CPU向SBUF读出数据,此时99H表示接收缓存SBUF。
数据发送,把数据放进SBUF后,内核会自动将数据发送出去,内容发送完成后,会将TI标志位置1
- 发送数据程序:SBUF = 数据/变量 eg:SBUF = 0XFF;
数据接收,内核从串口接收到一个完整的数据后,会将RI标志位置1,用户用SBUF直接读取即可
- 接收数据程序:变量 = SBUF eg:dat = SBUF;
数据接收代码
void ServerUart() interrupt 4
{
if(RI)//数据接收
{
RI = 0;
command = SBUF;
}
}
发送一个字节代码
void SendByte(uchar dat)//发送一个字节
{
SBUF = dat;
while(TI == 0);//内容发送完成后,会将TI标志位置1
TI = 0;//软件清零,取消此中断
}
发送一个字符串代码
void SendString(uchar *str)
{
while(*str != '\0')
{
sendbyte(*str++);
}
}