一、案例要求:
有8个LED小灯,默认状态下小灯全亮,编写程序通过单一外部中断0控制LED灯,每按一次按键,中断服务程序内容为低4位led和高4位led交替闪烁3次,中间间隔1s;松开按键后,恢复常亮状态。注:本小题只用一个按键,定时器用T1工作方式1。
二、案例分析:
本案例需用到定时器精准定时1s,要求为T1工作方式1,假定晶振频率为12MHZ,则方式1的最大定时时间为65536us,可以定时50000us,即50ms,循环20次即是1000ms=1s,就可以满足题目的时间要求;其次要用到外部中断0,由于51单片机外部中断0的信号是从P3.2进入,所以按键应该接到P3.2口,按下一次按键,便进入到中断服务程序,执行高四位和低四位LED交替闪烁的程序,执行完中断服务程序后,恢复到原始状态(全亮)。
三、案例代码:
#include<reg51.h>
//定时器1工作方式1,定时1s函数
void time1s()
{
unsigned int i;
for(i=0;i<20;i++) //每次定时50ms,循环20次便是1s
{
TH1=(65536-50000)/256; //定时器初值高8位
TL1=(65536-50000)%256; //定时器初值低8位
TR1=1; //开启T1
while(!TF1); //查询T1是否溢出
TF1=0; //T1溢出后将标志位TF1清零
}
}
void main()
{
TMOD=0x10; //设置工作方式为T1工作方式1
EX0=1; //外部中断0允许
EA=1; //总中断允许
IT0=0; //外部中断0为下降沿触发方式
while(1) //默认状态(未中断时),所有灯常亮
{
P1=0;
}
}
void int0() interrupt 0 //外部中断0中断服务函数
{
unsigned char m,n;
n=P1; //保护现场,将常亮的状态暂存n
for(m=0;m<3;m++) //执行中断的功能,高四位低四位灯交替闪烁,中间间隔1s
{
P1=0x0f;
time1s();
P1=0xf0;
time1s();
}
P1=n; //恢复现场,将上述暂存的状态还给P1,继续执行中断前的效果
}