要求:1.秒表最長計時為23:59:59; 2.秒表精度為1秒; 3.設置三個按鍵,分別為啟動,暫停和清零; 4. 用數碼管(或液晶)進行顯示。
電路模塊介紹2.3.1時鐘電路圖 3時鐘振蕩電路 在內部方式時鐘電路中,必須在XTAL1和XTAL2引腳兩端跨接石英晶體振蕩器和兩個微調電容構成振蕩電路。 2.3.2按鍵電路圖 4按鍵電路 按鍵電路分矩陣鍵盤和獨立按鍵兩種。獨立按鍵式直接用I/O口線構成的單個按鍵電路,其特點是每個按鍵單獨占用一根I/O口線,每個按鍵的工作不會影響其他I/O口線的狀態。獨立式按鍵電路配置靈活,軟件結構簡單,但每個按鍵必須占用一個I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜采用。 本次設計采用的是獨立按鍵,按鍵處理設置為: 按下K1鍵,啟動;K2鍵,暫停;K3鍵,清零。 2.3.3顯示電路圖 5顯示電路 顯示電路中使用的是8位共陰極數碼管,其中,由P2口進行位選,P0口進行段選并利用數碼管進行動態顯示。 2.3.4復位電路圖 6復位電路 51單片機一般要求的是高電平復位。復位電路的目的就是在上電的瞬間提供一個與正常工作狀態下相反的電平。一般利用電容電壓不能突變的原理,將電容與電阻串聯,上電時刻,電容沒有充電,兩端電壓為零,此時,提供復位脈沖,電源不斷的給電容充電,直至電容兩端電壓為電源電壓,電路進入正常工作狀態。
3.軟件設計3.1軟件簡介Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境(μVision)將這些部分組合在一起。運行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統。 C51工具包的整體結構,μVision與Ishell分別是C51 for Windows 和for Dos的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發流程。開發人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及C51編譯器編譯生成目標文件(.obj)。目標文件可由LIB51創建生成庫文件,也可以與庫文件一起經L51連接定位生成絕對目標文件(.abs)。abs文件由OH51轉換成標準的hex文件,以供調試器dScope51或tScope51使用進行源代碼級調試,也可由仿真器使用直接對目標板進行調試,也可以直接寫入程序存貯器如EPROM中。 使用獨立的Keil仿真器時,注意事項: *仿真器標配11.0592MHz的晶振,但用戶可以在仿真器上的晶振插孔中換插其他頻率的晶振。 *仿真器上的復位按鈕只復位仿真芯片,不復位目標系統。 *仿真芯片的31腳(/EA)已接至高電平,所以仿真時只能使用片內ROM,不能使用片外ROM;但仿真器外引插針中的31腳并不與仿真芯片的31腳相連,故該仿真器仍可插入到擴展有外部ROM(其CPU的/EA引腳接至低電平)的目標系統中使用。
3.2流程圖
51hei.png (3.52 KB, 下載次數: 64)
下載附件
2020-11-19 17:36 上傳
51hei.png (13.35 KB, 下載次數: 61)
下載附件
2020-11-19 17:36 上傳
3.3設計思路利用單片機16位定時/計數器方式,TMOD為0X01。每1ms計數一次,共計1000次即1s,此時秒單位進一;當秒數值達到60時,秒數值清零,分單位進一;分數值達到60時,時單位進一,分數值清零,以此達到時鐘功能。k1控制中斷總開關,用來控制計數器工作。按下k1鍵啟動中斷,按下k2鍵關閉,k3鍵則用來控制秒、分、時的數值清零。
4.總結本次設計主題為基于單片機設計的時鐘電路,體現了AT89C51的簡易性、可控性等諸多優良特性。用單片機來設計時鐘電路,其優點十分明顯,即穩定性高、方便維護和操作簡單。但它的缺點也較明顯,即難以滿足較為復雜的功能。 拿到課題后,我們小組每個成員先上網查閱資料以及翻閱單片機課本,復習本次設計內容,比如七段譯碼顯示器、計數器、振蕩器等等。然后根據設計要求畫出整體設計框架。做完準備工作后就正式開始設計與繪圖。 在軟件設計過程中我們遇到了許多困難,其中最主要的困難是設計好按鍵程序后,進行實際開發板測試時按鍵無法工作,我們經過多次檢查和測試后發現是由于P2口控制數碼管位選時連續發送的數據對按鍵造成了干擾,最后我們更換了接口,解決了這個問題。 我們小組從這次的設計中收獲頗多,不僅溫習了一遍大二學過的單片機編程知識,而且還加深了對單片機的理解,感受到了設計的樂趣。
附錄1.總電路圖 8總電路圖 2.程序代碼- #include<reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- void Delayms(uint x);
- sbit L=P2^0;
- sbit LA=P2^1;
- sbit LB=P2^2;
- void Display();
- sbit key1=P1^5;
- sbit key2=P1^6;
- sbit key3=P1^7;
- /*位碼*/uchar tablew[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
- /*位選*/uchar shu[8]={0};
- /*共陰極*/
- uchar table6[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uint aa,bb,cc,dd;
- void main()
- {
- TMOD=0x01;//設置工作方式
- TH0=(65536-1000)/256;//設置定時器高八位
- TL0=(65536-1000)%256;//設置定時器低八位
- ET0=1;//打開定時器T0的中斷開關
- TR0=1;//啟動定時器T0工作
- EA=0;//打開總中斷開關
- while(1)
- {
- uchar mshi,mge,fshi,fge,sshi,sge;
- if(key1==0)
- {
- EA=1;
- }
- else if(key2==0)
- {
- EA=0;
- }
- else if(key3==0)
- {
- bb=0;cc=0;dd=0;
- }
- else;
- mshi=bb/10;
- mge=bb%10;
- if(bb>59)
- {
- bb=0;
- cc++;
- }
- fshi=cc/10;
- fge=cc%10;
- if(cc>59)
- {
- cc=0;
- dd++;
- }
- sshi=dd/10;
- sge=dd%10;
- if(dd>23)
- {
- dd=0;
- }
- shu[7]=table6[mge];
- shu[6]=table6[mshi];
- shu[5]=0x40;
- shu[4]=table6[fge];
- shu[3]=table6[fshi];
- shu[2]=0x40;
- shu[1]=table6[sge];
- shu[0]=table6[sshi];
- Display();
- }
- }
- void int0_0() interrupt 1
- {
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- aa++;//1ms加一次
- if(aa>1000)
- {
- aa=0;
- bb++;//1S加一次
- }
- }
- void Display()
- {
- uint i;
- for(i=0;i<8;i++)
- {
- P2=tablew[i];
- P0=shu[i];
- Delayms(1);
- }
- }
- void Delayms(uint x)
- {
- uchar j;
- while(x--)
- {
- for(j=0;j<125;j++);
- }
- }
復制代碼
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便保存):
基于單片機的電子時鐘.docx
(272.49 KB, 下載次數: 53)
2020-11-19 12:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|