單片機課程設計任務書
題 目
基于51單片機的電子表
課題性質
工程設計
課題來源
自選
指導教師
主要內容
(參數(shù))
利用51單片機實現(xiàn)以下功能:
電子時鐘可以正常計時。
可以對電子時鐘進行調節(jié)。
調節(jié)時有光標閃爍。
任務要求
(進度)
第1-2天:熟悉課程設計任務及要求,查閱技術資料,確定設計方案。
第3-4天:按照確定的方案設計單元電路。要求畫出單元電路圖,元件及元件參數(shù)選擇要有依據(jù),各單元電路的設計要有詳細論述。
第5-6天:軟件設計,編寫程序。
第7-8天:軟件調試。
第9-10天:撰寫課程設計報告。要求內容完整、圖表清晰、文理流暢、格式規(guī)范、方案合理、設計正確,篇幅合理。
目錄
1 系統(tǒng)概述
1.1 設計目的
1.2 設計內容
1.3 設計目標
2 方案論證
2.1 用開發(fā)板進行電子鐘的設計
2.2 用實物進行電子鐘的
3 硬件設計
3.1 系統(tǒng)的原理
3.2 部分電路圖
3.3 I/O分配
3.4 元器件選型
4 軟件設計
4.1 主源程序
4.2 lcd1602源程序
4.3 1302時鐘源程序
5 系統(tǒng)調試
設計心得
參考文獻
1.jpg (217.47 KB, 下載次數(shù): 31)
下載附件
2018-11-21 18:31 上傳
1 系統(tǒng)概述
1.1 設計目的1.熟悉DS1302的工作原理與過程 2.熟悉LCD1602液晶屏的工作原理和過程 3.熟悉掌握51的c程序編寫 4結合DS1302和LCD1602液晶屏設計出電子表 1.2 設計內容1.使液晶屏中顯示秒分時日月年星期等功能 2.液晶屏中的初始時間可調節(jié) 3.液晶屏中的時間日期可調 4每次調節(jié)時都有光標閃爍 1.3 設計目標1.在51開發(fā)板上能夠實現(xiàn)時間日期的顯示 2.學會開發(fā)板的基礎知識 3.可穩(wěn)定調節(jié)和計時 4.熟悉掌握c語言的編寫 2 方案論證
2.1 用開發(fā)板進行電子鐘的設計用開發(fā)板進行設計時,可以采用keil4軟件中51功能,在其中編寫c語言,然后生成hex文件,根據(jù)設計的需要查資料進行編寫。對于新手來說,這是一個不錯的選擇,可以隨時進行錯誤的識別和更改,大大提高了效率,為以后的單片機學習打下基礎。在用開發(fā)板進行編寫程序時,先進行主函數(shù)的編寫,然后根據(jù)主函數(shù)所需要的東西,再繼續(xù)編寫其他程序。在主函數(shù)中,主要是按鍵的設置和時間調節(jié)的循環(huán)。然后再加入lcd和ds1302的功能便可以實現(xiàn)時鐘的顯示。這樣做不僅節(jié)約了成本,還為以后編寫程序打下了基礎。 2.2 用實物進行電子鐘的用實物進行設計,需要進行元器件的焊接,并且在焊接過程中易出現(xiàn)錯誤導致設計的失敗,而且用匯編語言進行編寫程序時,會增加設計難度,通常來說,一條c語言可以轉化成多條匯編語言,相比較,用開發(fā)板進行設計更方便,所以選擇用開發(fā)板進行設計。 3 硬件設計
3.1 系統(tǒng)的原理開發(fā)板通過USB自動下載電路下載開發(fā)板連接電腦的裝置,然后給開發(fā)板供電,然后通過DS1302時鐘芯片、LCD1602、開關、STC89C52芯片各自引腳連接在一起,組成基本的硬件連接,然后在keil4上面編寫軟件,經(jīng)過開發(fā)板自帶的燒錄軟件運行程序。 圖一:系統(tǒng)工作原理圖 3.2 部分電路圖
圖二:STC89C52芯片引腳連線 
圖三:LCD1602液晶屏引腳連線 
圖四:開關引腳連線 
圖5:USB自動下載電路引腳連線 
圖6:DS1302時鐘芯片引腳連線 3.3 I/O分配LCD1602的DB0到DB7 8個引腳接p0口,RS接p2.6口,RW接p2.5口,E接p2.7口。如圖三所示 開關的K1接RXT(p3.1),K2接TXD(p3.0),K3接p3.2,K4接p3.3。如圖四所示 DS1302芯片的SCLK引腳接p3.6,I/O引腳接p3.4,CE引腳接p3.5。如圖六所示 3.4 元器件選型LCD1602液晶屏一個 DS1302時鐘芯片一個 STC89C52芯片一個 晶振、電阻、電容、開關若干
5 系統(tǒng)調試下載開發(fā)板自帶的燒錄軟件,調試運行結果如下 
圖7:運行結果 
圖8:運行初始狀態(tài) 
圖9:調節(jié)后的時間 在調試過程中,一開始沒有光標的閃爍,不確定具體調節(jié)的是那一位,后來根據(jù)lcd1602的原理設置其閃爍,知道調節(jié)后是哪一個時間和日期。后來在設置星期的時候怎么都設置,怎么都不出來7,后來檢查源程序,發(fā)現(xiàn)程序中不包含7,修改以后,可以實現(xiàn)時間日期的準確調節(jié),并能夠準確的按照時鐘連續(xù)運行下去。 設計心得經(jīng)過這次課程設計,讓我充分認識了自己的不足,太多的基礎知識不知道,導致這個過程變得非常艱難。最開始的時候是準備做一個上課講過的簡單的時鐘,僅僅包含有時分秒,直接弄上一個編程語言然后就可以實現(xiàn)了,但是還有許多的 定義不知道如何去設置,于是就在開發(fā)板上面找到包含時分秒日月星期年的程序,然后看最基礎的教學視頻,把lcd1602和1302時鐘芯片還有開關等組裝成一個時鐘秒表,其中的程序有錯誤的,有何自己設計不同的,于是便根據(jù)最基本的知識來看程序,然后進行修改,稍微有點錯誤就會導致程序的無法進行,可見學習單片機是一個嚴謹?shù)倪^程,容不得絲毫馬虎。反正是最后做出來的時候,只有一個感覺,太累了,好不容易。如果基礎知識牢固的話,那么現(xiàn)在的我應該是很隨意的就設計出來這個電子表,但是實際情況卻不是這樣,花了大量的時間去重新學習基礎知識,使設計緩慢的進行下去。 在設計的過程中,遇到過很多的困難,像windows8上面裝keil4,出現(xiàn)了不兼容的問題,在網(wǎng)上多處搜索得到的答案都是換windows7,但問了多個以前裝過keil4的同學,終于知道了如何解決,設置系統(tǒng)不更新,然后根據(jù)開發(fā)板贈送的光盤上面的步驟一步步完成了安裝,然后對整個程序進行修改,無奈的是改完程序后編譯沒有錯誤,但是就是顯示不出來東西,找了好久也找不到解決的辦法,只好用源程序進行簡單的修改來實現(xiàn)我的功能。可以這樣說,這次的課程設計是一次不成功的設計。在以后的學習中,一定要認真學習,熟練的掌握單片機與編程知識。
4 軟件設計
4.1 主源程序
- void main()
- {
- unsigned char i;
- Int0Configuration();
- LcdInit();
- Ds1302Init();
- while(1)
- {
- if(SetState==0)
- {
- Ds1302ReadTime();
- }
- else
- {
- if(K1==0) //檢測按鍵K1是否按下
- {
- Delay10ms(); //消除抖動
- if(K1==0)
- {
- SetPlace++;
- if(SetPlace>=7)
- SetPlace=0;
- }
-
- while((i<50)&&(K1==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
- }
- if(K2==0) //檢測按鍵K2是否按下
- {
- Delay10ms(); //消除抖動
- if(K2==0)
- {
- TIME[SetPlace]++;
- if((TIME[SetPlace]&0x0f)>9) //換成BCD碼。
- {
- TIME[SetPlace]=TIME[SetPlace]+6;
- }
- if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小時只能到23
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
- {
- TIME[SetPlace]=0;
- }
- if((TIME[SetPlace]>=0x8)&&(SetPlace==5)) //周只能到7
- {
- TIME[SetPlace]=1;
- }
- if(SetPlace==5) //月只能到12
- {
- TIME[SetPlace]=;
- }
- }
-
- while((i<50)&&(K2==0)) //檢測按鍵是否松開
- {
- Delay10ms();
- i++;
- }
- i=0;
-
- }
- }
- LcdDisplay();
- }
-
- }
復制代碼
4.2 lcd1602源程序 void LcdDisplay()
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16); //時
LcdWriteData('0'+(TIME[2]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16); //分
LcdWriteData('0'+(TIME[1]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16); //秒
LcdWriteData('0'+(TIME[0]&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+(TIME[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+(TIME[3]&0x0f));
LcdWriteCom(0x8D);
LcdWriteData('0'+(TIME[5]&0x07)); //星期
4.3 1302時鐘源程序
- void Ds1302Write(uchar addr, uchar dat)
- {
- uchar n;
- RST = 0;
- _nop_();
-
- SCLK = 0;//先將SCLK置低電平。
- _nop_();
- RST = 1; //然后將RST(CE)置高電平。
- _nop_();
-
- for (n=0; n<8; n++)//開始傳送八位地址命令
- {
- DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
- addr >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;
- _nop_();
- }
- for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;
- _nop_();
- }
-
- RST = 0;//傳送數(shù)據(jù)結束
- _nop_();
- }
復制代碼
完整的Word格式文檔51黑下載地址:
基于51單片機的電子表.docx
(1.06 MB, 下載次數(shù): 19)
2018-11-21 18:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|