仿真图:
仿真图:
代码段:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit P10=P1^0;
uchar a=0;//T0中断次数
char c=0; //闪烁次数
uint b=0; //外部中断(S14问
uint z; //判断减一执行后是否开启加一按键
void delay(uint z);
void display();
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code wei[]={0x01,0x02};
uchar m[]={0,0};
void delay(uint z){ //延迟函数
uint j,k;
for(j=0;j<z;j++)
for(k=0;k<25;k++);
}
void display(){ //数码管显示函数
uchar i;
m[0]=TL1%10;
m[1]=TL1/10;
for(i=0;i<2;i++){
P2=wei[i];
P0=table[m[i]];
delay(10);
}
}
void tini(){ //定时/计数器初始化
TMOD=0x61; //T0方式1定时,T1方式计数 0110 0001
TL1=0x00;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=0; //T0停止计数
TR1=0; //T1停止计数
}
void exini(){ //外部中断初始化
EA=1; //CPU开中断
EX0=1; //允许INT0中断
EX1=1; //允许INT1中断
ET0=1; //允许T0中断
ET1=1; //允许T1中断
PX0=1;
IT0=1; //INT0中断下降沿触发
IT1=1; //INT1中断下降沿触发
}
void shanshuo(){ //闪烁程序
for(c=TL1;c>0;c--){
P10=1;
delay(500);
display();
P10=0;
delay(500);
display();
}
}
void main (void) {
exini();
tini();
while(1){
display();
}
}
void int3_0() interrupt 0{ //外部中断0服务程序
b=b+1; //中断次数加一
TR1=1; //启动计数器1
switch(b){
case 1:TR1=1;break;
case 2:TR1=0;b=0;TR0=1;break;
}
}
void int1_0() interrupt 2{ //外部中断1服务程序
if(TR1==1)
z=0;
else
z=1;
TR1=0;
if(TL1>0){
TL1=TL1-1; //计数值减一
}
else{
TL1=0;
TR1=0;
}
if(z==0)
TR1=1;
else if(z==1)
TR1=0;
}
void int1_3() interrupt 1{ //计时器T0中断服务程序
TH0=(65536-50000)/256; //定时50ms时间常数
TL0=(65536-50000)%256;
a=a+1; //中断次数加一
if(a==100){
a=0;
TR0=0; //停止计时
shanshuo();
P10=1; //LED熄灭
}
}
解析:
主要涉及外部中断0,外部中断1、定时器T0的中断操作,计数器在中断作为功能键时是一个不错的选择