班級:通訊一甲 學號:B09622027 學生:李忠憲 指導老師:王志湖 老師 使用C語言設計製作一時鐘 班級:通訊一甲 學號:B09622027 學生:李忠憲 指導老師:王志湖 老師
簡介 中華大學通訊工程學系 一年級程式設計(二) 期末技能競賽 題目: 使用C語言設計製作一時鐘。 作品繳交日期:即日至2008/6/9止。 成績計算: 第1項:時鐘最基本功能須具備下列功能: 共40分 a. 顯示時、分、秒功能。 b. 具有時、分校正之功能。 c. 以電腦顯示或用自製單晶片電腦硬體電路都可以。惟用自製單晶片電腦硬體電路者另外加10分。
第2項:專題論文+投影片(PPT檔)+影音檔+網頁:60% a 第2項:專題論文+投影片(PPT檔)+影音檔+網頁:60% a. 專題論文格式按一般會議論文兩列格式中文撰寫,圖、表格必須清楚,使用之參考資料也必須詳列。15% b. 投影片(PPT檔)必須將您所設計製作的動機、原理、特色、貢獻與結論,摘錄成Power Point檔。15% c. 影音檔:使用Camtasia將以上投影片、作品製作過程及作品操作使用錄製成影音檔(AVI格式)。15% d. 網頁:將以上所有製作成網頁安置在本系學生園地供人瀏覽外,另燒錄成CD片(容量盡可能在500M以下)繳交 15%
所做的功能簡介 顯示時、分、秒功能 具有時、分校正之功能 含有AM/PM功能
設計原理 sec10 sec 1 2 3 4 5 1 2 3 4 5 6 7 8 9
流程圖(主程式的部分) main TMOD=0x02 IE=0x82 TL0=56 TH0=56 While(1) no TR0=1 P0_0==1 yes TR0=0 ; set ( ) bcd2seg ( )
流程圖(計數副程式的部分) clock_count ( ) no n[2]==9 n[2]++ no yes hs==0 return
流程圖(AM.PM副程式的部分) apt ( ) no n[5]==1 && n[4]==2 return yes no n[6]==10
流程圖(校正分副程式的部分) set ( ) no P0_2==1 return yes delay(50) no P0_2==0 n[3]==5 && n[2]==9 no yes n[2]++ n[2]=0 n[3]++ yes n[3]=0 n[2]=0 return return
流程圖(校正時副程式的部分) set ( ) no P0_1==1 return yes delay(50) no P0_1==0 n[5]==1 && n[4]==2 no n[4]++ yes n[4]=0 n[5]++ yes n[5]=0 n[4]=0 return return
程式 #include <reg51.h> //由reg51.h函數庫中讀取 sfr P4 =0xD8; //防燒程式 sbit P4_3 =P4^3; //防燒程式 unsigned char bcdseg[13]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8d,0x80,0x8c,0x88,0x98,0xfe}; //宣告七段陣列 unsigned char n[7]={0,0,0,0,0,0,10}; //宣告陣列 int hs=2304; //宣告變數hs int s=2; //宣告變數s int i,scan; //宣告變數i和scan int clock_count(void) ; //宣告clock副程式 int bcd2seg(void); //宣告七段顯示器副程式 int set(void); //宣告校正副程式 int delay(int); //宣告延遲副程式 int apt(void); //宣告辨別AM.PM副程式
sbit P0_0 =P0^0; //宣告使用P0的第0支腳位 int main(void){ //主程式 void (*isp) (void) = 0xf800; //防燒程式 if(P4_3==0) (*isp) (); //防燒程式 TMOD=0x02; //為計時計數模式 IP=0; //中斷計時計數 IE=0X82; //允許計時計數中斷 TL0=56; //除200 TH0=56; //除200 while(1){ //如果程式為真則開始執行 clock_count(); //clock副程式 apt(); //辨別AM.PM副程式 if(P0_0==1){ //撥到1開始校正 TR0=0; //中斷計數 set(); //校正副程式 }
else TR0=1; //其他則開始計數 bcd2seg(); //七段顯示器副程式 } int clock_count(void){ //計數副程式 if (hs==0){ //如果hs=0則進入迴圈 s--; if(s==0){ s=2; if(n[0]==9){ //秒的個位數為9時 n[0]=0; //回到0 if(n[1]==5){ //秒的十位數為5時 n[1]=0; //回到0 if(n[2]==9){ //分的個位數為9時 n[2]=0; //回到0 if(n[3]==5){ //分的十位數為5時 n[3]=0; //回到0
if(n[5]==1 && n[4]==2){ //若n[5]為1和n[4]為2 } else if (n[4]==9){ //其他則判別是否為9 n[4]=0; //回到0 n[5]++; //n[5]+1 else n[4]++ ; //其他則n[4]+1 else n[3]++ ; //其他則n[3]+1 else n[2]++ ; //其他則n[2]+1 else n[1]++ ; //其他則n[1]+1 else n[0]++ ; //其他則n[0]+1 hs=2304; else hs=hs-1; //hs-1
int apt(void){ //判別AM.PM副程式 if (n[5]==1 && n[4]==2){ //若n[5]為1和n[4]為2 if(n[6]==10){ //若n[6]為11 n[6]=11; } else n[6]=10; //其他則n[6]為10 int set(void){ //分的校正副程式 if(P0_2==1){ //若撥到1進入迴圈 delay(50); if(P0_2==0){ //若撥到0進入迴圈 if(n[3]==5 && n[2]==9){ //若n[3]為5和n[2]為9 n[3]=0; //回到0 n[2]=0; //回到0
else if(n[2]==9){ //其他則判別為9 n[3]++; //n[3]+1 } else n[2]++; //其他則n[2]+1 if(P0_1==1){ //時的校正 delay(50); if(P0_1==0){ //若撥到0進入迴圈 if(n[5]==1 && n[4]==2){ //若n[5]為1和n[4]為2 n[5]=0; //回到0 n[4]=0; //回到0 else if(n[4]==9){ //其他則判別為9 n[4]=0; //回到0 n[5]++; //n[5]+1 else n[4]++; //其他則n[4]+1
int bcd2seg(void){ //宣告七段顯示器的副程式 scan=0x01; for(i=0;i<7;i++){ P1=0xff; P2=bcdseg[n[i]]; P1=~scan; scan<<=1; } int delay(int x){ //宣告delay副程式 while(x>0) x--; return 0;
成果
參考資料 老師上課所敎的原理 上課的筆記 同學討論