STC89C52的中断

中断分为四个步骤:中断请求->中断响应->中断处理->中断返回

数据输入输出传送方式
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;
  }
}
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值