#include <reg51.h>
#define uchar unsigned char //宏定義?
#define uint unsigned int
void delay (uchar n );
sfr p0 = 0x80;
sfr p2 = 0xA0;
sfr p1 = 0x90;
sbit dula = P2^6; //段選,申明U1鎖存器的鎖存端,鎖存器使用的是74HC573?
sbit wela = P2^7; //位選,申明U2鎖存器的鎖存端,鎖存器使用的是74HC573?
sbit beep = p2^3;
sbit led1=p1^0;
uchar DisBuf[4];
uchar Minute,Second,Counter;
uint Count=0;
int num=0;
int flag=1;
int frq;
int i,j ;
uchar code SegCode[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數(shù)組,用于數(shù)碼管顯示數(shù)字的數(shù)字集,從0
uchar code BitCode[]=
{0xfe,0xfd,0xfb,0xf7};
void BufToSeg(void)
{
uchar i;
for(i=0;i<4;i++) {
if(i==2)
{
dula = 1;
P0 = SegCode[DisBuf[ i]];
dula = 0;
}
dula = 1; //打開U1鎖存器,用于控制顯示的數(shù)據(jù)?
P0 = SegCode[DisBuf[ i]]; //送入數(shù)據(jù)到鎖存器U1,送入段選信號,顯示什么數(shù)字?
dula = 0; //關(guān)閉U1鎖存器?
P0 = 0xff; //消影,因為P0口任然保持上次的數(shù)據(jù)?
wela = 1; //打開U2鎖存器,用于控制哪個數(shù)碼管亮?
P0 = BitCode[ i];
wela = 0; //關(guān)閉U1鎖存器?
delay(3); //延時五個毫秒?
}
}
void delay (uchar n )
{
uchar j;
while(n--)
{
for(j=0;j<113;j++);
}
}
void NumToBuf(void)
{
DisBuf[0]=Minute/10;
DisBuf[1]=Minute%10;
DisBuf[2]=Second/10;
DisBuf[3]=Second%10;
}
void main()
{
if(flag==1)
{
TMOD = 0x01; //設(shè)置定時器0在工作方式1?
TH0 = (65536-45872)/256; //裝初值,50ms申請一次中斷?
TL0 = (65536-45872)%256;
EA = 1; //開總中斷?
ET0 = 1; //開定時器0中斷?
TR0 = 1; //啟動定時器0?
}
while(1)
{
NumToBuf();
BufToSeg();
delay(1);
led1=1;
beep=1;
if(Minute==10)
{
TR0=0;
delay(30);
led1=~led1; 結(jié)果是燈和倒計時的前三位一起閃爍,希望大神可以指點,
我想只讓燈閃,或者就讓燈和倒計時的四位一起閃,小白求指點
delay(30);
beep=~beep;
}
}
}
void T0_time() interrupt 1 //1號中斷,定時器0的中斷號?
{
TH0 = (65536-45872)/256; //裝初值,50ms申請一次中斷?
TL0 = (65536-45872)%256;
Counter++; //申請一次中斷num加1一次?
if(Counter==1) //num加到20時,50*20=1000ms,說明一秒鐘到了?
{
Counter=0;
Second++;
if(Second==60)
{
Second=0;
Minute++;
num++;
}
}
}
|