51单片机学习——中断

发布者:诗意世界最新更新时间:2022-04-11 来源: eefocus关键字:51单片机  中断  中断标志 手机看文章 扫描二维码
随时随地手机看文章

1、中断源及其中断标志

外部中断0:中断号为0;中断标志为IE0;中断服务程序入口为0003H;

定时器0:中断号为1;中断标志为TF0;中断服务程序入口为000BH;

外部中断1:中断号为2;中断标志为IE1;中断服务程序入口为0013H;

定时器1:中断号为3;中断标志为TF1;中断服务程序入口为001BH;

串行口:中断号为4;中断标志为R1或T1;中断服务程序入口为0023H;


2、中断允许控制

CPU对中断系统所有中断及其某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。IE的状态可通过程序由软件设定。某位设定为1,相应的中断源中断允许;某位设定为0,相应的中断源中断屏蔽。CPU复位时,IE各位清0,禁止所有中断。IE各位定义如下:


EX0:外部中断0中断允许位;

ETO:定时器0中断允许位;

EX1:外部中断1中断允许位;

ET1:定时器1中断允许位;

ES:串行口中断允许位;

EA:CPU中断允许位(总开关);

3、中断函数在数码管动态显示中的运用

在用延时函数或定时器进行数码管动态显示时,数码管的显示即便消影后任然可能会闪烁,而利用中断函数,可以解决这个问题。下面做个让数码管从0000~9999依次显示的程序。


程序:


#include

 

sbit ADDR0=P1^0;  

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

 

unsigned char code ledseg[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned char ledbuf[4]=

{0xff,0xff,0xff,0xff};

 

unsigned char flag = 0;

unsigned int n = 0;

unsigned char i = 0;

 

void main()

{

unsigned int sec = 0;

 

ADDR3=1;

ENLED=0;

TMOD = 0x01;  //对定时器0及其中断进行初始化

TH0 = 0xfc;

TL0 = 0x67;

TR0 = 1;

EA = 1;

ET0 = 1;

while(1)

{

if(flag == 1)

{

flag = 0;

sec++;                          

ledbuf[0] = ledseg[sec%10];     //对数码管的显示进行初始化   

ledbuf[1] = ledseg[sec/10%10];

ledbuf[2] = ledseg[sec/100%10];

ledbuf[3] = ledseg[sec/1000%10];

}

}

}

 

void InterruptTime0() interrupt 1 //中断源为定时器0,当TF=1时进入,响应后TF自动清0

{

TH0=0xfc;

TL0=0x67;

n++;

if(n>=1000)

{

n=0;

flag = 1;

}

P0=0xff;

switch(i)    //数码管的显示

{

case 0:ADDR0=0;ADDR1=0;ADDR2=0;i++;P0=ledbuf[0];break;

case 1:ADDR0=1;ADDR1=0;ADDR2=0;i++;P0=ledbuf[1];break;

case 2:ADDR0=0;ADDR1=1;ADDR2=0;i++;P0=ledbuf[2];break;

case 3:ADDR0=1;ADDR1=1;ADDR2=0;i=0;P0=ledbuf[3];break;

default:break;

}

}


在这里,利用中断函数使数码管每1ms显示一次数值,当flag=1时,时间达到1s,再改变数码管的数值。这样一来,显示数值这一步骤是在改变数值之前做的,所以数码管的显示会更加的清晰。


关键字:51单片机  中断  中断标志 引用地址:51单片机学习——中断

上一篇:51单片机——数码管动态显示
下一篇:51的单片机学习——定时器

推荐阅读最新更新时间:2024-11-17 10:17

51单片机定时器的应用以及计数初值的计算
#include reg51.h #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; uchar t_count=0; int main(void) { TMOD=0x00; TH0=(8192-5000)/32; TL0=(8192-5000)%32; IE=0x82; TR0=1; while(1); } void LED_FLASH() interrupt 1 { TH0=(8192-5000)/32; TL0=(8192-5000)%32; if(++t_count==100) { LED=~
[单片机]
80C51中断说明
中断响应过程 中断检测 在每一个条指令结束后,系统自动检测中断请求信号.有过有中断请求且中断允许位为真,则响应中断. 保护现场 响应中断后,系统将当前PC指针压入堆栈,但是PSW和A中内容不会保存.如果需要保护则需要手动入栈.保护现场前需要关闭终端,防止有更高优先级中断发生而破坏现场 中断服务 中断函数 清除中断标志位 恢复现场 弹出堆栈内保护数据.在恢复时也要关闭中断. 中断返回 弹出PC指针,继续进行原程序 中断源 中断控制寄存器 TCON 中断请求控制 以IT0为例说明中断触发方式: IT0=0 低电平触发,低电平有效 IT0=1 下降沿触发 SCON 串行口控制器 IE 中断允许控制
[单片机]
80C51<font color='red'>中断</font>说明
一种基于C8051单片机的SPWM波形实现方案
1 引言   正弦脉宽调制(SPWM)技术已在交流调速、直流输电、变频电源等领域得到广泛应用,为了提高整个系统的控制效果,高性能SPWM脉冲形成技术一直是人们不断探索的问题。采用模拟电路和数字电路等硬件电路来产生SPWM波形是一种切实可行的方法,但是这种实现方法控制电路复杂、抗干扰能力差、实时调节较困难。近年来,人们提出了由单片机、DSP等微控制器来实现SPWM波形的数字控制方法 ,由于微控制器内部集成了很多控制电路,比如定时器、PWM电路、可编程计数器阵列等,所以使得这种实现SPWM的方法具有控制电路简单、运行速度快、控制精度高、抗干扰能力强等优点。本文介绍了一种利用C8051单片机实现输出频率可变SPWM波形的方法,并将由C
[单片机]
一种基于C80<font color='red'>51单片机</font>的SPWM波形实现方案
S3C2440外部中断响应寄存器设置方法
如果不按照如下设置,中断将无法执行或者无法使下一个中断进入。 /*中断挂起设置,此过程加入到主函数中启动时加载*/ void Eint_wait() { rSRCPND=rSRCPND; //中断挂起寄存器清除 rINTPND=rINTPND; //中断源挂起寄存器清除 rEINTPEND|=0x1 13; //外部中断挂起寄存器,Eint挂起等待中断 rSRCPND=BIT_EINT8_23; //中断源挂起寄存器相应位置1等待中断 rINTPND=BIT_EINT8_23; //中断挂起寄存器相应位置1等待中断 } /*中断挂起设置结束*/ /*以下为响应中断时的处理过程,为pISR指针中的函数*/
[单片机]
89C51单片机16位数据传送指令的执行过程
16位数据传送指令(1条) 这是89C51单片机唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入数据指针DPTR中去。其中高8位送入DPH,低8位送入DPL。 MOV DPTR,#data16;#dataH→(DPH),#dataL→(DPL)16位常数的高8位送到DPH,低8位送到DPL 例如:MOV DPTR,#2345 则执行完程序后,DPL中的值为23,DPL中的值为45。
[单片机]
89C<font color='red'>51单片机</font>16位数据传送指令的执行过程
按键控制51单片机上面硬件的功能
按键一二三对应51单片机上不同的功能 例如跑马灯,蜂鸣器,呼吸灯,中断之类的 #define FSCLK 11059200 //晶振频率为 11.0592MHz #include STC12C5A60S2.h #include key_scan.h #include intrins.h #define LED_PORT P0 sbit BEEP=P1^4; unsigned int n = 0; unsigned int t = 0; unsigned char xx = 127; unsigned char p; unsigned char m; #define uchar unsig
[单片机]
51单片机做一个LED显示的电子钟
#include reg52.h #define uchar unsigned char #define uint unsigned int uchar code table ="ME-400-A clock"; uchar code table1 ="    --:--:--    "; uchar code table2 ="ALL:00:00:-- "; uchar code table3 ="    "; uchar clk_time ;  //秒,分,时寄存器初始值 sbit T_RST=P2^2;//ds1302-5 sbit T_IO=P2^3;//ds1302-6 sbit T_CLK=P2^4;//ds1302-
[电源管理]
STM32F7使用SPI发送完成和接收中断
虽然在平常的使用中,spi使用轮询等待发送完成或者接收完成就行了。 但是在对时间有严格要求的设计中,假设我们需要发送完成后立马做xx事情,此时如果有低优先级的信号需要处理,我们的轮询方式就得不到及时的响应; 或者说比如需要定时从spi设备中采集数据,定时器中断来了我们就要马上调用接收函数,接收完成马上进行其他计算,同样此时应该保证数据的优先级。 此时就需要用到发送完成和接收中断了。 前面我们已经实现了SPI轮询的发送和接收,在前面的基础上进行修改。 接缓冲区满中断 新增发送和接收的回调函数,并在初始化的时候配置,使能SPI接收中断: SPI_HandleTypeDef SPI3_Handler; //SPI2句柄
[单片机]
STM32F7使用SPI发送完成和接收<font color='red'>中断</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved