本帖最后由 xichandoujigu 于 2018-1-5 14:25 编辑
外部3.2接了一个按键,测试外部中断用,如果不按按键,数码管显示到5s的时候蜂鸣器就响,能正常运行,在执行外部中断的时候赋值数码管为1秒,按道理执行按键后应该返回主程序继续按照1,2,3,4,5的顺序运行后蜂鸣器响,但实际是一按键蜂鸣器就立即响,为什么呢? #include <REG51.H>#define uchar unsigned char
#define uint unsigned int
uchar Count;
unsigned int fen_gao; //分十位
unsigned int fen_di; //分个位
unsigned int miao_gao; //秒十位
unsigned int miao_di; // 秒个位
unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P37=P3^3;
sbit P36=P3^4;
sbit P35=P3^5;
sbit P34=P3^7;
sbit beep=P3^0;
char zhongduan_cnt;
//10ms延时子程序(12MHZ)
void delay_ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
void init()
{
TMOD=0x01; //定时器初始化 选择timer0做16位定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开放中断
ET0=1; //开放timer0中断
TR0=1; //启动timer0
EX0=1;// 按键外部中断用
IT0=1; // 按键外部中断用
}
void display(unsigned int fen_gao,fen_di,miao_gao,miao_di)
{
P1 = 0X00;
P37=0;
P1=Tab[fen_gao];
delay_ms() ;
P37=1;
P1 = 0X00;
P36=0;
P1=Tab[fen_di];
delay_ms() ;
P36=1;
P1 = 0X00;
P35=0;
P1=Tab[miao_gao];
delay_ms() ;
P35=1;
P1 = 0X00;
P34=0;
P1=Tab[miao_di];
delay_ms() ;
P34=1;
}
void Delay_beep(char x)
{ char t; while(x--) for(t=0;t<120;t++); } //按周期t发音
void Play(char t)
{ char i; for(i=0;i<100;i++) { beep=~beep; Delay_beep(t); } beep=0; }
void timer0(void) interrupt 1 using 1
{
TH0 = (65536-50000)/256;
TL0 |= (65536-50000)%256;
zhongduan_cnt++;
}
void is_key(void) interrupt 0 using 1
{
miao_di=1;
miao_gao=0;
fen_di=0 ;
fen_gao==0 ; //执行完后beep立即开始响了!
}
/*********主程序********************/
void main()
{
beep=0;
miao_di=0;
miao_gao=0;
fen_di=0;
fen_gao=0;
zhongduan_cnt=0;
P35=0;
P37=0;
P34=0;
P36=0;
init();
while(1)
{
if(zhongduan_cnt>19) //如果到了1S
{
zhongduan_cnt=0; //清零
miao_di++; //秒数累加
}
if (miao_di>9)
{
miao_gao=miao_gao+1;
miao_di=0;
}
if (miao_gao>5)
{
fen_di=fen_di+1;
miao_gao=0;
}
if (fen_di>9)
{
fen_gao=fen_gao+1;
fen_di=0;
}
display(fen_gao,fen_di,miao_gao,miao_di);
if(miao_di==5) //5秒开始响
if(miao_gao==0)
if(fen_di==0)
if (fen_gao==0)
{
while(1)
{ Play(1); }
}
}
}
|