51单片机攻略—外部中断、定时器

一、程序实战

(四)中断相关

基础概念:
1、中断发生,中断响应,中断返回的定义
2、中断可嵌套执行
3、中断有优先级,排序如下:
在这里插入图片描述
三个原则,有点意思:
在这里插入图片描述

1、外部中断

主程序:数码管循环显示数字
中断子程序:点亮LED1并保持
通过P32口置低电平的方式触发外部中断,程序进入子程序点亮LED1,并保留了数码管的显示状态。

#include <reg52.h>
sbit S1 = P2^0;
sbit S2 = P2^1;
sbit S3 = P2^2;
sbit S4 = P2^3;
sbit led1 = P1^0;
#define uint unsigned int
#define uchar unsigned char
uchar i;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};
void delay(uint z){
    uint x,y;
    for (x = 200; x > 0; x--) {
        for(y = z; y > 0; y--);
    }
}
void exter0() interrupt 0{
	led1 = 0;
	delay(20000);
}
void main(){
    EA = 1;     //1、开总中断
    EX0 = 1;    //2、开外部中断0
	S1 = S2 = S3 = S4 = 0;
	while(1){
		for(i = 0; i < 16; i++){
            led1 = 1;
			P0 = table[i];
			delay(200);
		}
	}
}

测试成功。

2、定时器

定时器的中断在单片机内部进行,区别于外部触发中断
1、软件延时:例如一直在用的delay()函数;不占用硬件资源,但降低了CPU利用率;
2、时基电路定时:例如555电路,但硬件定时电路不可编程;
3、可编程芯片定时:性能优越;
在这里插入图片描述
4、流程:
(1)TMOD设置T0/T1工作方式:
在这里插入图片描述
(2)工作方式选择,以此确定TMOD值:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)得出不同模式下TMOD十六进制数;
(4)计算初值;
(5)开总中断、开定时器中断、启动定时器;
利用定时器控制数码管一秒变化一次(对于11.0592MHZ晶振而言的精确时间),程序如下:

#include <reg52.h>
sbit S1 = P2^0;
sbit S2 = P2^1;
sbit S3 = P2^2;
sbit S4 = P2^3;
#define uint unsigned int
#define uchar unsigned char
uchar i,clk_temp;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};
void exter0() interrupt 1{
    TH0 = (65536-46080)/256;
    TL0 = (65536-46080)%256;
    clk_temp ++;
}
void main(){
    i = 0;
    clk_temp = 0;
    TMOD = 0x01;    //设置定时器0为工作方式1,每个定时器有四种工作方式
    TH0 = (65536-46080)/256;    //高八位装大数
    TL0 = (65536-46080)%256;    //低八位装余数
    EA = 1;     //1、开总中断
    ET0 = 1;    //2、开定时器中断
    TR0 = 1;    //3、启动定时器
	S1 = S2 = S3 = S4 = 0;
	P0 =  0xc0;
	while(1){
		if(clk_temp == 20){
            clk_temp = 0;
            i ++;
			if(i == 16){
				i = 0;
			}
			P0 = table[i];
		}
	}
}

测试成功。

发布了11 篇原创文章 · 获赞 3 · 访问量 895

猜你喜欢

转载自blog.csdn.net/m0_46115596/article/details/104708611