51单片机攻略—外部中断、定时器
程序员文章站
2022-04-01 15:41:53
...
一、程序实战
(四)中断相关
基础概念:
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];
}
}
}
测试成功。
上一篇: Spark运行第一个Scala程序WordCount
下一篇: 筛质数