剛學(xué)的單片機(jī),下面的程序是在學(xué)習(xí)中斷和定時(shí)器時(shí)寫(xiě)的,已調(diào)試通過(guò), 多功能電子鐘有如下功能: 1,可以用來(lái)做電子鐘 2,可以用做報(bào)警器(按P3.2時(shí),用做報(bào)警) 3,可以用做鬧鐘(按P1.6時(shí),用做鬧鐘) 4,可以顯示星期 程度當(dāng)中還有好多的不妥之處,還請(qǐng)高手門幫忙指正. 程序如下: (由于注解太多,所以沒(méi)有能寫(xiě)出來(lái),請(qǐng)見(jiàn)諒!!),制作成功后的圖片如附件. 內(nèi)容如下:
#include <AT89X51.H> #define uchar unsigned char #define uint unsigned int uchar code dispcode[]={0x81,0x9f,0xa4,0x8c,0x9a,0xc8,0xc0,0x9d,0x80,0x88}; uchar code DATA[]={0xfc,0x92,0x98,0xac,0x89,0x01,0x5c,0x80,0x88}; uchar dispbitcode[]={0xfe,0xfd,0xfb,0xf7}; uchar dispbuf[8]={0,0,0,0}; uchar dispbitcnt; uchar second,minite,hour,day; uchar clockhour,clockminite; uint tcnt; uchar mstcnt; uchar t; uint a; //上面的是定義各個(gè)變量和數(shù)碼管緩存 void yanshi(uint t) { for(;t>0;t--); }//延時(shí)子程序
void beep() { while(hour<clockhour){ for(a=0;a<1000;a++) {yanshi(5); P1_4=~P1_4;} for(a=0;a<1000;a++) {yanshi(5); P1_4=~P1_4;} for(a=0;a<5000;a++) {yanshi(6); P1_4=~P1_4;} if(P3_6==0){break;}} while(minite<clockminite){ for(a=0;a<1000;a++) {yanshi(5); P1_4=~P1_4;} for(a=0;a<1000;a++) {yanshi(5); P1_4=~P1_4;} for(a=0;a<5000;a++) {yanshi(6); P1_4=~P1_4;} if(P3_6==0){break;}}}//報(bào)警子程序(P1.4接的是BEEP,P3.6為O時(shí)跳出)
void baojing() { if(P1_7==0){ yanshi(500); if(P1_7==0){ while(1){ if(P1_7==1){ while(1){ beep(); if(P3_6==0) {break;}}} if(P3_6==0){break;}}}}}//報(bào)警執(zhí)行子程序(用P1.7做信號(hào)檢測(cè)腳,同樣當(dāng)P3.6為0時(shí)跳出)
void clock() { if(P3_3==0){yanshi(500); if(P3_3==0){clockminite++; if(clockminite==60) {clockminite=0;} dispbuf[3]=clockminite%10; dispbuf[2]=clockminite/10; while(P3_3==0);}} if(P3_6==0){yanshi(500); if(P3_6==0){clockhour++; if(clockhour==24){clockhour=0;} dispbuf[1]=clockhour%10; dispbuf[0]=clockhour/10; while(P3_6==0);}}}//設(shè)定鬧鐘子程序
void key() { if(P3_6==0){yanshi(500); if(P3_6==0){second++; if(second==60){second=0;} while(P3_6==0);}} if(P3_5==0){yanshi(1000); if(P3_5==0){minite++; if(minite==60){minite=0;} dispbuf[3]=minite%10; dispbuf[2]=minite/10; while(P3_5==0);}} if(P3_7==0){yanshi(500); if(P3_7==0){hour++; if(hour==24){hour=0;} dispbuf[1]=hour%10; dispbuf[0]=hour/10; while(P3_7==0);}} if(P3_4==0){yanshi(500); if(P3_4==0){day++; if(day==7){day=0; } P2=DATA[day]; while(P3_4==0);}} }//設(shè)定時(shí)間子程序
void laozhong() { if(hour==clockhour){ if(minite==clockminite){ for(a=0;a<1000;a++) {yanshi(5); P1_4=~P1_4;} for(a=0;a<1000;a++) {yanshi(5); P1_4=~P1_4;} for(a=0;a<5000;a++) {yanshi(6); P1_4=~P1_4;}}}}//鬧鐘子程序
void display() { dispbuf[3]=minite%10; dispbuf[2]=minite/10; dispbuf[1]=hour%10; dispbuf[0]=hour/10; P2=DATA[day]; }//顯示子程序
void displayclock() { dispbuf[7]=clockminite%10; dispbuf[6]=clockminite/10; dispbuf[5]=clockhour%10; dispbuf[4]=clockhour/10; }//鬧鐘顯示子程序
void time() { tcnt++; if(tcnt==4000){tcnt=0; second++; if(second==60){second=0; minite++; if(minite==60){minite=0; hour++; if(hour==24){hour=0; day++; if(day==7){day=0;}}}} display();}}//時(shí)間子程序
void t0(void) interrupt 1 using 0 { mstcnt++; if(mstcnt==4){mstcnt=0; P0=dispcode[dispbuf[dispbitcnt]]; P1=dispbitcode[dispbitcnt]; P2=DATA[day]; dispbitcnt++;} if(dispbitcnt==4){dispbitcnt=0;} time();displayclock();}//中斷
void main(void) { TMOD=0x02; TH0=0x06; TL0=0x06; TR0=1; ET0=1; EA=1; while(1) { key();clock(); if(P1_6==0) {while(1){laozhong(); if(P3_6==0){break;}}} if(P3_2==0){yanshi(10000); if(P3_2==0){while(1) {baojing(); if(P3_6==0) {break;} }}}}} //S1:?jiǎn)?dòng)報(bào)警器(P3.2) //S2: clock minite 加(P3.3) //S3: 星期加(P3.4) //S4:time minite 加(P3.5) //S5: clock hour 加/退出報(bào)警器(P3.6) //S6:time hour 加(P3.7) //P1-7為信號(hào)檢測(cè)腳
[此貼子已經(jīng)被作者于2009-6-9 9:40:09編輯過(guò)]
|