《基于51單片機的電子鐘C語言程序[4頁]》由會員分享,可在線閱讀,更多相關《基于51單片機的電子鐘C語言程序[4頁](5頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
基于51單片機的電子鐘C語言程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*七段共陰管顯示定義*/
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
??????????????????????? 0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/*定義并初始化變量*/
uc
2、har seconde=0;
uchar minite=0;
uchar hour=12;
uchar mstcnt=0;
sbit P1_0=P1^0;???????????????? // second 調(diào)整定義
sbit P1_1=P1^1;???????????????? //minite調(diào)整定義
sbit P1_2=P1^2;???????????????? //hour調(diào)整定義
/*函數(shù)聲明*/
void delay(uchar k );????? //延時子程序
void time_pro( );??? //時間處理子程序
void display( );??
3、???? //顯示子程序
void keyscan( );??????????????? //鍵盤掃描子程序
/*****************************/
/*延時子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
?? {
??? for(j=0;j<125;j++)
???? {;}
?? }
}????
/**************************/
/*時間處理子程序*/
/*****************
4、*********/
void time_pro( void)
{
??????? if(seconde==60)??????????????????? //秒鐘設為60進制
????????? { seconde=0;
??????????? minite++;
?????????? if( minite==60)????????????? //分鐘設為60進制
????????????? { minite=0;
??????????????? hour++;
????????????? if(hour==24)????????????? //時鐘設為24進制
????
5、???????????? {hour=0; }
????????????? }
????????? }
???
}
/*****************************/
/* 顯示子程序*/
/*****************************/
void display(void)???
{?????
??????? P2=0xfe;
??????? P0=dispcode[hour/10];???????????????? //顯示小時的十位
??????? delay(4);
??????? P2=0xfd;
??????? P0=(d
6、ispcode[(hour%10)])|0X80;??????? //顯示小時的個位
??????? delay(4);
??????? P2=0xfb;
??????? P0=dispcode[minite/10];?????????????? //顯示分的十位
??????? delay(4);
??????? P2=0xf7;
??????? P0=(dispcode[minite%10])|0X80;??????? //顯示分的個位
??????? delay(4);
??????? P2=0xef;
??????? P0=dispcode[seconde/10];?
7、??????????? //顯示秒的十位
??????? delay(4);
??????? P2=0xdf;
??????? P0=dispcode[seconde%10];???????????? //顯示秒的個位
??????? delay(4);?????
}
/*******************************/
/*鍵盤掃描子程序*/
/*******************************/
void keyscan (void)
{
??? if(P1_0==0)???????????????????? //按鍵1秒的調(diào)整
???
8、??? {
?????????? delay(30);
?????????????? if(P1_0==0)
?????????????????? {
?????????????????????? seconde++;
????????????????????? if(seconde==60)
??????????????????????? {seconde=0; }
?????????????????? }
?????? }
??? if(P1_1==0)??????????????????? //按鍵2分的調(diào)整
?????? {
??????????? delay
9、(30);
?????????????? if(P1_1==0)
???????????????? {
??????????????????? minite++;
??????????????????? if(minite==60)
????????????????????? {minite=0;}
?????? }
???? }
??? if(P1_2==0)?????????????????? //按鍵3小時的調(diào)整
?????? {
??????????? delay(30);
?????????????? if(P1_2==0)
????????????????
10、?? {
?????????????????????? hour++;
??????????????????? if(hour==24)
????????????????????? {hour=0; }
???????????????? }
?????? }
}
void timer0(void) interrupt 1 using 0???? //定時器0方式1,50ms中斷一次
??? {
???? TH0=0x3c;
TMOD = 0x11;
??????? mstcnt++;
??????? if(mstcnt==20)
??????? {
????????
11、??? seconde++;
??????????? mstcnt=0;??? //注意點。對計數(shù)單元的清零十分的重要,本次調(diào)試中就是
??????? }?????????????? //因為忽略了這一點,給我早成了很大的被動。
??????
}
/**************************/
/*主函數(shù)*/
/**************************/
void main(void)
{?????? P1=0xff;??????????????? //初始化p1口,全設為1?????
TMOD = 0x11; //time0為定時器,方式1
TH0=0x3c;???????????? //預置計數(shù)初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
??? while (1)
{??
???????? keyscan( );??? //按鍵掃描
???????? time_pro( ); //時間處理
?? display( ); //顯示時間??????????
}
}