} } display();
void timer1(void) interrupt 3 using 1 { TH1=0x3c; /* 100ms定時常數 */ TL1=0xb0; count++; /* 中斷次數加1*/ if(count!=5) /* 判到10次(1s)否,不到直接返回 */ return; ss=!ss; /* ss閃爍標志求反 */ count=0; } void settime(void) { uchar i; while(S1); /* 等待S1鍵開始設置 */ for(i=0;i<4;i++) delay20ms(); /* 延時去抖動 */ while(S1); setflag=0; ss=0; hh=1; /* 設置當前位標志 */
TR1=1; /* 啟動定時器T1 */ ET1=1; /* 允許T1溢出中斷 */ void settime(void) { uchar i; while(S1); /* 等待S1鍵開始設置 */ for(i=0;i<4;i++) delay20ms(); /* 延時去抖動 */ while(S1); setflag=0; ss=0; hh=1; /* 設置當前位標志 */
TR1=1; /* 啟動定時器T1 */ ET1=1; /* 允許T1溢出中斷 */ break; case 0x04: buf[2]=0x0b; break; case 0x08: buf[3]=0x0b; break; } } /****************************************************/ display(); if(S1) goto sett_1; for(i=0;i<4;i++) delay20ms(); /* 延時去抖動 */ if(S1) goto sett_1; if(ml) { TR1=0; /* 關閉定時器T1 */ ET1=0; /* 禁止T1溢出中斷 */ buf[0]=hourh; buf[1]=hourl; buf[2]=minuh; buf[3]=minul; return; /* 如果當前編輯的份低位,則按S1鍵結束設定 */ } setflag<<=1; /* 當前位右移(標志左移1位) */ continue; sett_1: if(S2) continue; for(i=0;i<4;i++) delay20ms(); /* 延時去抖動 */
if(S2) continue; if(!hh) goto sett_2; { hourh++; /* 時高位加1處理 */ if(hourh!=2) continue; hourh=0; /* 時高位只能是0,1 */ continue; } sett_2: if(!hl) goto sett_3; { hourl++;/* 時低位加1處理,高位為0,可以是0~9,否則,只能0~2 */
if(hourh) goto sett_20; if(hourl==10) goto sett_21; continue; sett_21: hourl=0; continue; sett_20: if(hourl==3) goto sett_22; continue; sett_22: hourl=0; continue; }
sett_3: if(!mh) goto sett_4; { minuh++; /* 分高位加1處理,只能是0~5 */ if(minuh==6) goto sett_30; continue; sett_30: minuh=0; continue; } sett_4: minul++; /* 分低位加1處理,只能是0~9 */ if(minul==10) goto sett_40; continue; sett_40: minul=0; continue;
}
} #include "REG51.H" #define uchar unsigned char #define PSEG 0x30 /* P.的段碼 */
/* 0~9和P,暗的的段碼(共陽數碼管) */ uchar code seg[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x30,0xff}; /***************************************************************** ;74LS164的3 4 5 6 10 11 12 13 對應數碼管的A,B,C,D,E,F,G,DP DB 0C0h,0F9H,0A4H,0B0H,99H ; DB 92H,82H,0F8H,80H,90H *****************************************************************/
/* 輸入輸出定義 */ sbit DISPCON =P3^2; /* 顯示控制 */ sbit S1 =P1^3; /* 設置鍵 */ sbit S2 =P1^2; /* 數字+1鍵 */ sbit L1 =P1^7; /* L1,L2構成秒指示":" */ sbit L2 =P1^6;
/* 全局變量定義 */ uchar buf[4]; /* 顯示緩沖區 */ uchar hourh; /* BCD時鐘各位 */ uchar hourl;
uchar minuh; uchar minul; uchar second; /* 秒變量 */
uchar count; /* 溢出中斷計數器 */ uchar bdata setflag; /* 設置用標志字節 */ uchar bdata uflag; /* 通用標志字節 */
/* 位變量定義 */ /* 以下4個位變量在setflag中,便于移位處理 */
sbit hh =setflag^0; /* 當前設置位標志 */ sbit hl =setflag^1; sbit mh =setflag^2; sbit ml =setflag^3;
/* 以下位變量在uflag */ sbit fresh =uflag^0; /* 顯示刷新標志 */ sbit ss =uflag^1; /* 位閃爍標志 */ sbit sec =uflag^2; /* 秒指示標志 */ sbit warning =uflag^3; /* 定時標志 */
/*-----------------------------------------------------------------*/ sbit tfix =uflag^4; /* 開始修正標志 */ #define N 60 /* 誤差值,單位:1/10秒,默認為0,即不修正 */ /*-----------------------------------------------------------------*/
/* 函數說明 */ void sys_init(void); void t0_init(void); void uart_init(void); void display(void); void delay20ms(void) ; void settime(void);
void t1_init(void);
/***************************************************************** ;時鐘主函數:main() ;定時器T0工作于中斷方式 ;一旦走時開始,無法進行設置。如要重新設置,則必須復位 ;24小時制 ;如果某74LS164的1,2腳與其他74LS164的1,2腳錯連了,則會出現同顯示的狀態 ; ;帶編輯設定位閃爍功能和走時誤差自動糾正功能.與此相關的函數是: ; settime(),位閃爍標志ss ; timer1(),在settime()中啟動,每1s將標志ss求反,達到閃爍目的 ;******************************************************************* ;******************************************************************/ void main(void) { sys_init(); t0_init(); t1_init(); uart_init(); buf[0]=0x0a; buf[1]=0x0b; buf[2]=0x0b; buf[3]=0x0b; display(); settime(); display(); TR0=1; ET0=1; while(1) { if(fresh) { buf[0]=hourh; buf[1]=hourl; buf[2]=minuh; buf[3]=minul; display(); if(sec) { sec=0; L1=!L1; L2=!L2; delay20ms(); } } else { if(sec) { sec=0; L1=!L1; L2=!L2; delay20ms(); } } } } /***************************************************************** ;****************************************************************/ void display(void) { uchar out; DISPCON=1; out=seg[buf[0]]; SBUF=out; while(!TI); TI=0;
首頁 上一頁 1 2 3 下一頁 尾頁 2/3/3
本站部分文章來自網絡,如發現侵犯了您的權益,請聯系指出,本站及時確認刪除 E-mail:349991040@qq.com
論文格式網(www.donglienglish.cn--論文格式網拼音首字母組合)提供其他論文畢業論文格式,論文格式范文,畢業論文范文