當前位置:編程學習大全網 - 編程語言 - 急求基於8051單片機的多功能數字鐘的程序

急求基於8051單片機的多功能數字鐘的程序

#include <AT89X51.H>

unsigned char second=0,minute=0,hour=0,max=23; //second秒,minute分,hour時,max時制

//主函

main()

{

unsigned char code table[]={0xdd,0x84,0xe9,0xec,0xb4,0x7c,0x7d,0xc4,0xfd,0xfc};

unsigned int i;

void good();

TMOD=0X11; //T0工作於定時模式1用於計時,T1工作於定時模式1用於掃描按鍵

IE=0X8a; //開放T0、T1中斷

IP=0X80; //T1優先級高於T0,有按鍵停止計時

TH0=0X3c; //設置T0初值,定時5MS

TL0=0Xb0;

TH1=0x3c; //定時250ms掃描按鍵;

TL1=0xb0;

TR1=1; //啟動

good();

while(1) //掃描輪流顯示

{

i=minute/10; //顯示分十位

P0_5=0;

P0_4=1;

P0_6=1;

P0_7=1;

P2=table[i];

for(i=0;i<500;i++);

i=minute%10; //顯示分個位

P0_5=1;

P0_4=0;

P0_6=1;

P0_7=1;

P2=table[i];

for(i=0;i<500;i++);

i=hour%10; //顯示時個位

P0_5=1;

P0_4=1;

P0_6=0;

P0_7=1;

P2=table[i];

for(i=0;i<500;i++);

i=hour/10; //顯示時十位

P0_5=1;

P0_4=1;

P0_6=1;

if(i!=0)P0_7=0;

P2=table[i];

for(i=0;i<500;i++);

}

}

//計時中斷程序

void abc() interrupt 1 //t0(計時)中斷子程序

{

static char a=0;

TH0=0X3c; //重賦初值

TL0=0Xb0;

a++;

if (a==20) //當a=20時壹秒到了

{a=0;

P1_7=~P1_7; //二級管取反閃爍

second++; //秒增1

if(minute==0)

{if(second<2*hour)P1_4=~P1_4;

else P1_4=1; }

if(second==60){second=0;minute++;} //秒計到60,秒清0,分增壹

if(minute==60){minute=0;hour++;} //分計到60,分清0,時增壹

if(hour==max+1){hour=0;} //時計到最大值,清0

}

}

//按鍵中斷處理程序

void key() interrupt 3

{ char key=9;

// int i;

static char b=0;

TR1=0; //停止計時

TH1=0x3c; //重賦初值

TL1=0xb0;

b++; //250ms計數

if(b==5){ //判斷按鍵是哪壹個

if(P1_0==0)key=0;

if(P1_1==0)key=1;

if(P1_2==0||P3_2==0)key=2;

if(P1_3==0)key=3;

b=0;

}

switch (key)

{

case 0: //按下調時鍵調整時數

{TR0=0;

hour++;

if (hour==max+1)hour=0;

break;}

case 2: //按下調分鍵調整分數

{TR0=0;

minute++;

if (minute==60)minute=0;

break;}

case 1: {TR0=1;break;}//按下重啟鍵重新計時

case 3: Musicu(); //按下通訊鍵,功能待定

}

TR1=1; //重啟T1

}

void good()

{ int i,j=0,k;

unsigned char a[]={0x00,0x00,0x00,0x84,0x00,0x19,0x2d,0x0d,0x79,0x00,0xbc,0x2d,0x9d} ;//放置0~9

while(TR0==0&&minute==0&&hour==0)

{ if(k==60 ) { k=0;j++;if(j==13) j=0;}

//顯示g

P0_5=1;

P0_4=1;

P0_6=1;

if(a[j%13]==0x00) P0_7=1;

else P0_7=0;

P2=a[j%13];

for(i=0;i<500;i++);

//顯示分十位

if(a[(j+1)%13]==0x00) P0_6=1;

else P0_6=0;

P0_4=1;

P0_5=1;

P0_7=1;

P2=a[(j+1)%13];

for(i=0;i<500;i++);

//顯示時O位

P0_4=1;

P0_6=1;

if(a[(j+2)%13]==0x00) P0_5=1;

else P0_5=0;

P0_7=1;

P2=a[(j+2)%13];

for(i=0;i<500;i++);

//顯示分0位

P0_5=1;

if(a[(j+3)%13]==0x00) P0_4=1;

else P0_4=0;

P0_6=1;

P0_7=1;

P2=a[(j+3)%13];

for(i=0;i<500;i++);

k++;

} }

這條程序寫進去要註意幾點.

因為數碼管的接法不同.給數組a[]的0~9的代碼也要改.要不然妳寫進去後,顯示都是亂碼

  • 上一篇:開個美術相關的興趣班需要什麽手續
  • 下一篇:如何設置ae屏蔽
  • copyright 2024編程學習大全網