工程設計結題報告
數字時鐘課程設計報告
組 號: 6
作 者:
指導老師:
日期:2017年7月29日
一 功能要求
制作一個電子時鐘,該時鐘能夠正確顯示分秒,且分秒都能顯示兩位數。同時具有跑表功能。
二 方案論證
按系統功能要求,決定控制系統采用AT89C52單片機。系統除能確保實現要求的功能外,還可以方便地進行其它的擴展。電子時鐘系統設計方案框圖如下所示
0.png (7.23 KB, 下載次數: 68)
下載附件
2016-1-30 20:11 上傳
三 系統硬件電力的設計
單片機的P1口,P3.0-P3.3端口作為4為LED數碼管顯示控制。P3.5端口按狃可用作時鐘顯示和調節轉換/秒表顯示轉換,P3.6端口按鈕可用作:時間調節/秒表工作轉換。
四 系統程序的設計
2.4.1 主函數
系統上電后,程序先將P2口置0,然后調用顯示子函數和A/D轉換測量子函數并進入循環。系統默認為循環顯示8個通道的電壓值,每個通道的數據顯示時間在1S左右,電壓測量的周期為8ms。主函數執行的流程圖如圖2.3所示。
2.4.2顯示子函數
顯示功能采用動態掃描發實現4位數碼管的數值顯示。測量所得的A/D轉換數據放在8個定義的ad_data[8]內存單元中,測量所得的A/D數據在顯示時需要經過轉換變成十進制BCD碼。列掃描采用掃字代碼,每位LED顯示器顯示時間為1ms,每路電壓數據顯示時間約為1s。
1.png (132.6 KB, 下載次數: 61)
下載附件
2016-1-30 20:11 上傳
圖2.2 數字電表電路原理圖
五 調試及性能分析
2.5.1 調試與測試
采用Kei C51 ver 7.09版的C編譯器進行C程序編譯及調試,同時進行硬件電路板的設計制作,燒好程序后進行軟件聯調
1 程序調試
程序編寫好燒入芯片,裝在電路板上基本能記時。但是由于數碼管(共陽)的亮度不夠硬件又加上了三極管,結果顯示就亂了。將程序掃描數組的數據取反后,芯片就能夠正常工作,時鐘的調試和顯示都正常了。可是當用秒表的時候又發現了新的問題,當手動停止秒表跑動的時候數碼管的顯示就不清楚,數碼管里一些不應該亮的發光二極管也出現不同程度的發光,使得顯示的數據不正常。為了解決這個問題就修改了跑表的子函數,在這個子函數的末加上了延時(delay1ms(1))以及賦值(P3=0xff)。最后數碼管顯示都正常了。
通過這次實驗,我們對單片機以原理的了解以及利用C語言來編程序都有了很大的進步。單片機的原理和程序的編輯,是設計的關鍵部分,我們應該盡最大的努力去學好他們,這對我們以后的學習也是非常有用的。
2硬件調試
在這次實驗中,由于我們用的上次是實驗板,所以在硬件上并沒有做過多的改動。但我們上次實驗中有些部分的原理不是很理解,所以做的作品不是很理想。其中數碼管不是很亮是最大的問題,所以我們在這次的實驗中做了改進:我們加入了9015的三極管。結果數碼管的顯示果然好了很多,基本達到所需要求。
六 源程序:
#include<AT89X52.h>
unsigned char codetable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char codepower[4]={0xfe,0xfd,0xfb,0xf7};
unsigned char time[4]={1,0,0,0};//時間數組
unsigned char dingshi[4]={0,0,0,0};//定時數組
unsigned char paomiao[4]={0,0,0,0};//跑秒數組
unsigned char temp[4];//跑秒臨時數組
unsigned char count=0;//計數變量
unsigned char k,n,t;
//延時函數
delay1ms(unsigned char t)
{
unsignedchar i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
//定時用的設定分鐘函數
void alarm1()
{ while(1)
{ for(k=2;k<4;k++)//掃描顯示
{ P1=table[dingshi[k]];
P3=power[k];
delay1ms(1);
}
if(P3_6==0) dingshi[2]++;
while(P3_6==0) ;
if(dingshi[2]==10){dingshi[3]++;dingshi[2]=0;}
if(dingshi[3]==6){dingshi[2]=0;dingshi[3]=0;}
if(P3_5==0) break;//響應按鍵
}
}
//定時用的設定秒鐘函數
void alarm2()
{ while(1)
{ for(k=0;k<2;k++)
{ P1=table[dingshi[k]];
P3=power[k];
delay1ms(1);
}
if(P3_6==0) dingshi[0]++;
while(P3_6==0);
if(dingshi[0]==10){dingshi[1]++;dingshi[0]=0;}
if(dingshi[1]==6){dingshi[0]=0;dingshi[1]=0;}
if(P3_5==0) break;
}
}
//設定分鐘函數
void minute()
{ for(;;)
{ for(k=2;k<4;k++)
{ P1=table[time[k]];
P3=power[k];
delay1ms(1);
}
if(P3_6==0) time[2]++;
while(P3_6==0) ;
if(time[2]==10) {time[3]++;time[2]=0;}
if(time[3]==6) {time[2]=0;time[3]=0;}
if(P3_5==0) break;
}
}
//設定秒鐘函數
void second()
{ for(;;)
{ for(k=0;k<2;k++)
{ P1=table[time[k]];
P3=power[k];
delay1ms(1);
}
if(P3_6==0) time[0]++;
while(P3_6==0);
if(time[0]==10) {time[1]++;time[0]=0;}
if(time[1]==6) time[1]=0;
if(P3_5==0) break;
}
}
//
void timer() interrupt 1//定時器中斷程序
{ paomiao[0]++;count++;
if(paomiao[0]==10){paomiao[1]++;paomiao[0]=0;}
if(paomiao[1]==10){paomiao[2]++;paomiao[1]=0;}
if(paomiao[2]==10){paomiao[3]++;paomiao[2]=0;}
if(paomiao[3]==6)
for(k=0;k<4;k++)
paomiao[k]=0;
if(count==100)
{ time[0]++;count=0;
if(time[0]==10){time[1]++;time[0]=0;}
if(time[1]==6){time[2]++;time[1]=0;}
if(time[2]==10){time[3]++;time[2]=0;}
if(time[3]==6){time[0]=0;time[1]=0;time[2]=0;time[3]=0;}
}
TH0=0xd8;TL0=0xf0;
TF0=0;
}
//計數器中斷程序
void counter() interrupt 3
{ while(P3_5==0);
alarm1();while(P3_5==0);
alarm2();while(P3_5==0);
minute();while(P3_5==0);
second();while(P3_5==0);
TH1=0XFF;TL1=0XFF;
TF1=0;
}
//
void main()
{
TMOD=0x51;
TH1=0xff;
TL1=0xff;
TH0=0xd8;
TL0=0xf0;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{ if(P3_6==0)//跑秒程序
{ while(P3_6==0);
for(k=0;k<4;k++)
paomiao[k]=0;
for(;P3_6!=0;)
{ for(k=0;k<4;k++)
{ P1=table[paomiao[k]];
if(k==2) P1_7=1;
P3=power[k];delay1ms(3);
}
}
while(P3_6==0);
for(k=0;k<4;k++)
temp[k]=paomiao[k];
for(;P3_6!=0;)
{ for(k=0;k<4;k++)
{ P1=table[temp[k]];
if(k==2)P1_7=1;
P3=power[k];delay1ms(5);
}
}
while(P3_6==0);
}
for(k=0;k<4;k++)//平常顯示
{ P1=table[time[k]];
if(k==2&&time[0]%2==0)P1_7=1;
P3=power[k];
delay1ms(1);
}
if(time[0]==dingshi[0]&&time[1]==dingshi[1]&&time[2]==dingshi[2]&&time[3]==dingshi[3])//定時程序
for(;;)
{ for(n=0;n<250;n++)//時間到時閃爍
for(k=0;k<4;k++)
{ P1=0xff;
P3=power[k];
delay1ms(1);
}
for(n=0;n<250;n++)
{P3|=0x0f;delay1ms(1);}
if(P3_6==0) {while(P3_6==0);break;}
}
}
}
七 元件清單:AT89C52,四聯數碼管,按鈕開關(3個),晶振(12MHZ),電容,電阻,電路板
以上是部分內容,完整版本的請下載附件
word格式的完整設計論文下載:
數字時鐘設計實驗報告.doc.rar
(23.05 KB, 下載次數: 21)
2016-1-30 20:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|