由于時間關系,沒法研究你的程序,不過我有一個現成的,你可以對照一下,找找原因。
/*
使用定時器中斷進行的倒計時程序。
*/
#include <STC89C5xRC.H>//單片機所有資源說明文件
#include <intrins.h>//循環移位函數所在的頭文件
#define SMG P0//數碼管接口
sbit K1=P3^4;//獨立按鍵接口
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
sbit DUAN=P2^6;//數碼管顯示段碼的鎖存
sbit WEI=P2^7;//選擇數碼管位的鎖存
sbit FMQ=P2^3;//蜂鳴器
unsigned char ZF[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,
0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char Wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char PLAY[8]={0,0,0,0,0,0,0,0};
unsigned char n=0,TT=0;
void Delay1ms() //@11.0592MHz,用于數碼管動態顯示時間間隔
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay10ms() //@11.0592MHz,用于按鍵消抖時間
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
void Delay100ms() //@11.0592MHz,用于蜂鳴器響的時間
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0Init(void) //50毫秒@11.0592MHz,定時器設置
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0x4C; //設置定時初值
EA = 1; //總中斷開啟
ET0 = 1; //定時器0中斷開啟
TF0 = 0; //清除TF0標志
TR0 = 0; //定時器0不計時
}
void XS(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
SMG=Wei;
WEI=1;
WEI=0;
SMG=PLAY;
DUAN=1;
DUAN=0;
Delay1ms();
SMG=0x00;
DUAN=1;
DUAN=0;
}
}
void DISPLAY(void)
{
PLAY[5]=ZF[n/100];
PLAY[6]=ZF[(n%100)/10];
PLAY[7]=ZF[(n%10)/1];
}
void main(void)
{
unsigned char m;
bit KS=0;
Timer0Init();
while(1)
{
if (K1==0)
{
Delay10ms();
if (K1==0)
{
n=n+1;
}
for(m=0;((m<50)&&(K1==0));m++)
{
Delay10ms();
}
}
if (K2==0)
{
Delay10ms();
if (K2==0)
{
n=n-1;
}
for(m=0;((m<50)&&(K2==0));m++)
{
Delay10ms();
}
}
if (K3==0)
{
Delay10ms();
if (K3==0)
{
n=0;
}
for(m=0;((m<50)&&(K3==0));m++)
{
Delay10ms();
}
}
if (K4==0)
{
Delay10ms();
if (K4==0)
{
if (n!=0)
{
TR0=1;
}
}
for(m=0;((m<50)&&(K4==0));m++)
{
Delay10ms();
}
}
DISPLAY();
XS();
}
}
void Time0 (void) interrupt 1//定時器0中斷服務函數
{
unsigned char m;
TL0 = 0x00;
TH0 = 0x4C;
TT++;
if (TT==20)
{
n--;
if (n==0)
{
for (m=0;m<100;m++)
{
DISPLAY();
XS();
}
TR0=0;
FMQ=0;
Delay100ms();
FMQ=1;
}
TT=0;
}
}
程序對應的電路:
1.jpg (55.8 KB, 下載次數: 27)
下載附件
2018-10-31 08:11 上傳
1.jpg (8.34 KB, 下載次數: 33)
下載附件
2018-10-31 08:12 上傳
1.jpg (11.06 KB, 下載次數: 35)
下載附件
2018-10-31 08:13 上傳
|