欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-01 15:41:53
...

一、程序实战

(四)中断相关

基础概念:
1、中断发生,中断响应,中断返回的定义
2、中断可嵌套执行
3、中断有优先级,排序如下:
51单片机攻略—外部中断、定时器
三个原则,有点意思:
51单片机攻略—外部中断、定时器

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、可编程芯片定时:性能优越;
51单片机攻略—外部中断、定时器
4、流程:
(1)TMOD设置T0/T1工作方式:
51单片机攻略—外部中断、定时器
(2)工作方式选择,以此确定TMOD值:
51单片机攻略—外部中断、定时器
51单片机攻略—外部中断、定时器
51单片机攻略—外部中断、定时器

(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];
		}
	}
}

测试成功。