|
利用動態(tài)掃描和定時器0在數(shù)碼管上顯示出從543210開始以1%秒的速度往下遞減直至543111并保持顯示此數(shù),與此同時利用定時器0以500MS速度進(jìn)行流水燈從上至下移動,同時蜂鳴器發(fā)聲,當(dāng)數(shù)碼管上數(shù)減到停止時,實驗板上流水燈全部閃爍4次,數(shù)碼管全熄滅。單片機(jī)進(jìn)入休眠狀態(tài)。
我寫的單片機(jī)程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit ledla=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit laba=P2^3;
uint num,n,e;
uchar b,i,c,d;
display();
delay(uchar);
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1; //開中斷
num=999; //項目 只有后三位變化。我就給999;
b=7; //用來給八個流水燈循環(huán)用
laba=0; //蜂鳴器開
d=0; //自己寫的數(shù)碼開始保持543111標(biāo)志位
while(1)
{
display();//數(shù)碼管顯示
P1=~(1<<b);//流水燈顯示
if(i==8)
{
i=0;
b=7;
}
if(d==1)//數(shù)碼管保持在543111后d=1,進(jìn)入以后操作
{
for(c=0;c<3;c++)
{
P1=0x00;
for(e=0;e<65535;e++);
P1=0xff;
for(e=0;e<65535;e++);//流水燈全亮并亮滅三次
}
laba=1; //關(guān)蜂鳴器
P1=0xff; //關(guān)流水燈
P0=0xff;
wela=1;
wela=0;
P0=0xff;
dula=1;
dula=0; //關(guān)數(shù)碼管
PCON=0x02; //進(jìn)入休眠
}
}
}
delay(uchar x) //延時
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
void t0() interrupt 1
{
n++;
if(num>111) //num數(shù)碼管的后三位
{
num--;
d=0;
}
if(num==111)
{
d=1;
}
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(n==50)
{
i++;
b--;
n=0;
}
}
display()
{
P0=0xff;
wela=1;
wela=0;
P0=table[6];
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[5];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[4];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[num/100];
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[num%100/10];
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[num%100%10];
dula=1;
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(5);
}
以上是單片機(jī)代碼
下面是問題:
惟一的出錯的在于。沒辦法保持543111;運行到最后數(shù)碼管前五個不亮,第六個保持亮1到結(jié)束!
if(d==1)下面這些內(nèi)容不要。確實可以保持在543111;有了if(d==1)下面這些就會最后一個管亮1.
請各位大神指教。十分感謝。
|
|