電子時鐘設(shè)計實驗報告_第1頁
電子時鐘設(shè)計實驗報告_第2頁
電子時鐘設(shè)計實驗報告_第3頁
電子時鐘設(shè)計實驗報告_第4頁
電子時鐘設(shè)計實驗報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

..>單片機電子時鐘設(shè)計報告設(shè)計任務(wù)本次課程設(shè)計的電子時鐘電路,是基于單片機STC89C52、時鐘芯片和液晶顯示,運用C語言編程實現(xiàn)。電子時鐘可以顯示日期的年、月、日和時間的時、分、秒,具有復(fù)位功能。系統(tǒng)硬件設(shè)備及芯片簡介數(shù)字電子鐘系統(tǒng)設(shè)計已經(jīng)成熟,但是目前系統(tǒng)設(shè)計時根本都是采用LED作為顯示電路,造成硬件電路復(fù)雜、功耗高、產(chǎn)品體積龐大等特點;液晶顯示模塊由于具有低功耗、壽命長、體積小、顯示內(nèi)容豐富、價格低、接口控制方便等優(yōu)點,因此在各類電子產(chǎn)品中被極廣泛地推廣和應(yīng)用。字符型液晶顯示模塊是一類專門用于顯示字母、數(shù)字、符號等點陣式液晶顯示模塊。本系統(tǒng)設(shè)計采用字符型液品顯示模塊LCD1602作為顯示器件,這樣不僅簡化了系統(tǒng)的硬件設(shè)計,而且極大地提高了系統(tǒng)的可靠性。1 LCD162簡介字符型液晶顯示模塊LC602已經(jīng)是單片機應(yīng)用設(shè)計中最常用的信息顯示器件。2可以顯示兩行,每行6個字符采用+V電源供電外圍電路配置簡單價格廉價具有很高的性價比。2 LCD162功能介紹2.1引腳功能2采用標準4〔無背光或6〔帶背光接口,各引腳功能見表。表1引腳功能符號符號引腳說明符號引腳說明1VSS電源地9D2DataI/O2VDD電源正極10D3DataI/O3VL號1D4DataI/O4RS數(shù)據(jù)/命令選擇端12D5DataI/O5R/W讀/寫選擇端13D6DataI/O6E使能信號14D7DataI/O7D0DataI/O15BLA背光源正極8D1DataI/O16BLK背光源負極2.2LCD1602讀寫指令2讀寫指令較多且較復(fù)雜具體使用可以查相關(guān)資料,下面僅列出最常用的的一些命令:①寫指令38H:顯示模式設(shè)置;②寫指令08H:顯示關(guān)閉;③寫指令01H:顯示清屏;④寫指令06H:顯示光標移動設(shè)置;⑤寫指令0CH:顯示開及光標設(shè)置。2.3LCD1602讀寫操作時序LCD1602讀寫操作時序總體上來說是比較簡單的,掌握其有兩種方法:一種是只看時序圖,另外一種方法是直接記憶和總結(jié)讀寫時電平上下和變化。很顯然第二種更簡單和直接,下面就列出典型讀寫的時序要求,以方便編寫程序。讀狀態(tài):輸入:RS=L,RW=H,E=H。 輸出:D0-D7=狀態(tài)字。寫指令:輸入:RS=L,RW=L,D0-D7=指令碼,E=上升沿。輸出:無?!病匙x數(shù)據(jù):輸入:=H,=,E=。輸出:-7=數(shù)據(jù)。輸出:無。2.4LCD1602顯示方法字位7上位7置為人。3 數(shù)字電鐘硬件電路設(shè)計硬件電路系統(tǒng)設(shè)計主要由單片機最小系統(tǒng)、輸入電路、輸出電路等組成。單片機最小系統(tǒng)同所有單片機系統(tǒng),在此不作討論。輸入電路主要時間調(diào)節(jié)電路,為簡化系統(tǒng)我們使兩個外部中斷來調(diào)節(jié)"時〞和"分〞數(shù)值,即將、1分別接兩個按鈕LD顯示器和單片機接口電路可以采用總線方式或者是模擬口線方式,本設(shè)計采用第二種方式,即以單片機I/O模擬控制信號。具體電路見圖,0口作為數(shù)據(jù),并接上拉電阻提升電壓,.0接D的S端、.1接D的/W端、.2接D的E端"分〞調(diào)節(jié)按鈕接INT"時〞調(diào)節(jié)按鈕接,圖1省略了電源和單片機最小系統(tǒng)電路。圖1數(shù)字電子鐘硬件電路設(shè)計電路圖及程序電路圖如下原理圖如下:程序共有四段程序,用Keil仿真是程序列表如圖Reg*52.h程序為:#ifndef__AT89*52_H__#define__AT89*52_H__sfrP0=0*80;sfrSP=0*81;sfrDPL=0*82;sfrDPH=0*83;sfrPCON=0*87;sfrTCON=0*88;sfrTMOD=0*89;sfrTL0=0*8A;sfrTL1=0*8B;sfrTH0=0*8C;sfrTH1=0*8D;sfrP1=0*90;sfrSCON=0*98;sfrSBUF=0*99;sfrP2=0*A0;sfrIE=0*A8;sfrP3=0*B0;sfrIP=0*B8;sfrT2CON=0*C8;sfrT2MOD=0*C9;sfrRCAP2L=0*CA;sfrRCAP2H=0*CB;sfrTL2=0*CC;sfrTH2=0*CD;sfrPSW=0*D0;sfrACC=0*E0;sfrB=0*F0;/*------------------------------------------------P0BitRegisters------------------------------------------------*/sbitP0_0=0*80;sbitP0_1=0*81;sbitP0_2=0*82;sbitP0_3=0*83;sbitP0_4=0*84;sbitP0_5=0*85;sbitP0_6=0*86;sbitP0_7=0*87;/*------------------------------------------------PCONBitValues------------------------------------------------*/#defineIDL_0*01#defineSTOP_0*02#definePD_0*02/*Alternatedefinition*/#defineGF0_0*04#defineGF1_0*08#defineSMOD_0*80/*------------------------------------------------TCONBitRegisters------------------------------------------------*/sbitIT0=0*88;sbitIE0=0*89;sbitIT1=0*8A;sbitIE1=0*8B;sbitTR0=0*8C;sbitTF0=0*8D;sbitTR1=0*8E;sbitTF1=0*8F;/*------------------------------------------------TMODBitValues------------------------------------------------*/#defineT0_M0_0*01#defineT0_M1_0*02#defineT0_CT_0*04#defineT0_GATE_0*08#defineT1_M0_0*10#defineT1_M1_0*20#defineT1_CT_0*40#defineT1_GATE_0*80#defineT1_MASK_0*F0#defineT0_MASK_0*0F/*------------------------------------------------P1BitRegisters------------------------------------------------*/sbitP1_0=0*90;sbitP1_1=0*91;sbitP1_2=0*92;sbitP1_3=0*93;sbitP1_4=0*94;sbitP1_5=0*95;sbitP1_6=0*96;sbitP1_7=0*97;sbitT2=0*90;/*E*ternalinputtoTimer/Counter2,clockout*/sbitT2E*=0*91;/*Timer/Counter2capture/reloadtrigger&dirctl*//*------------------------------------------------SCONBitRegisters------------------------------------------------*/sbitRI=0*98;sbitTI=0*99;sbitRB8=0*9A;sbitTB8=0*9B;sbitREN=0*9C;sbitSM2=0*9D;sbitSM1=0*9E;sbitSM0=0*9F;/*------------------------------------------------P2BitRegisters------------------------------------------------*/sbitP2_0=0*A0;sbitP2_1=0*A1;sbitP2_2=0*A2;sbitP2_3=0*A3;sbitP2_4=0*A4;sbitP2_5=0*A5;sbitP2_6=0*A6;sbitP2_7=0*A7;/*------------------------------------------------IEBitRegisters------------------------------------------------*/sbitE*0=0*A8;/*1=EnableE*ternalinterrupt0*/sbitET0=0*A9;/*1=EnableTimer0interrupt*/sbitE*1=0*AA;/*1=EnableE*ternalinterrupt1*/sbitET1=0*AB;/*1=EnableTimer1interrupt*/sbitES=0*AC;/*1=EnableSerialportinterrupt*/sbitET2=0*AD;/*1=EnableTimer2interrupt*/sbitEA=0*AF;/*0=Disableallinterrupts*//*------------------------------------------------P3BitRegisters(Mnemonics&Ports)------------------------------------------------*/sbitP3_0=0*B0;sbitP3_1=0*B1;sbitP3_2=0*B2;sbitP3_3=0*B3;sbitP3_4=0*B4;sbitP3_5=0*B5;sbitP3_6=0*B6;sbitP3_7=0*B7;sbitR*D=0*B0;/*Serialdatainput*/sbitT*D=0*B1;/*Serialdataoutput*/sbitINT0=0*B2;/*E*ternalinterrupt0*/sbitINT1=0*B3;/*E*ternalinterrupt1*/sbitT0=0*B4;/*Timer0e*ternalinput*/sbitT1=0*B5;/*Timer1e*ternalinput*/sbitWR=0*B6;/*E*ternaldatamemorywritestrobe*/sbitRD=0*B7;/*E*ternaldatamemoryreadstrobe*//*------------------------------------------------IPBitRegisters------------------------------------------------*/sbitP*0=0*B8;sbitPT0=0*B9;sbitP*1=0*BA;sbitPT1=0*BB;sbitPS=0*BC;sbitPT2=0*BD;/*------------------------------------------------T2CONBitRegisters------------------------------------------------*/sbitCP_RL2=0*C8;/*0=Reload,1=Captureselect*/sbitC_T2=0*C9;/*0=Timer,1=Counter*/sbitTR2=0*CA;/*0=Stoptimer,1=Starttimer*/sbitE*EN2=0*CB;/*Timer2e*ternalenable*/sbitTCLK=0*CC;/*0=SerialclockusesTimer1overflow,1=Timer2*/sbitRCLK=0*CD;/*0=SerialclockusesTimer1overflow,1=Timer2*/sbitE*F2=0*CE;/*Timer2e*ternalflag*/sbitTF2=0*CF;/*Timer2overflowflag*//*------------------------------------------------T2MODBitValues------------------------------------------------*/#defineDCEN_0*01/*1=Timer2canbeconfiguredasup/downcounter*/#defineT2OE_0*02/*Timer2outputenable*//*------------------------------------------------PSWBitRegisters------------------------------------------------*/sbitP=0*D0;sbitFL=0*D1;sbitOV=0*D2;sbitRS0=0*D3;sbitRS1=0*D4;sbitF0=0*D5;sbitAC=0*D6;sbitCY=0*D7;/*------------------------------------------------InterruptVectors:InterruptAddress=(Number*8)+3------------------------------------------------*/#defineIE0_VECTOR 0/*0*03E*ternalInterrupt0*/#defineTF0_VECTOR 1/*0*0BTimer0*/#defineIE1_VECTOR 2/*0*13E*ternalInterrupt1*/#defineTF1_VECTOR 3/*0*1BTimer1*/#defineSIO_VECTOR 4/*0*23Serialport*/#defineTF2_VECTOR 5/*0*2BTimer2*/#defineE*2_VECTOR 5/*0*2BE*ternalInterrupt2*/#endifLCD1602驅(qū)動程序為:#ifndefLCD_CHAR_1602_2005_4_9#defineLCD_CHAR_1602_2005_4_9#include<intrins.h>//PortDefinitions**********************************************************sbitLcdRs =P2^0;sbitLcdRw =P2^1;sbitLcdEn =P2^2;//內(nèi)部等待函數(shù)**************************************************************************unsignedcharLCD_Wait(void){ LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); //while(DBPort&0*80);//在用Proteus仿真時,注意用屏蔽此語句,在調(diào)用Goto*Y()時,會進入死循環(huán), //可能在寫該控制字時,該模塊沒有返回寫入完備命令,即DBPort&0*80==0*80 //實際硬件時翻開此語句 LcdEn=0; returnDBPort; }//向LCD寫入命令或數(shù)據(jù)************************************************************#defineLCD_COMMAND 0//Command#defineLCD_DATA 1//Data#defineLCD_CLEAR_SCREEN 0*01//清屏#defineLCD_HOMING 0*02//光標返回原點voidLCD_Write(bitstyle,unsignedcharinput){ LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();//注意順序 LcdEn=1; _nop_();//注意順序 LcdEn=0; _nop_(); LCD_Wait(); }//設(shè)置顯示模式************************************************************#defineLCD_SHOW 0*04//顯示開#defineLCD_HIDE 0*00//顯示關(guān) #defineLCD_CURSOR 0*02 //顯示光標#defineLCD_NO_CURSOR 0*00//無光標 #defineLCD_FLASH 0*01//光標閃動#defineLCD_NO_FLASH 0*00//光標不閃動voidLCD_SetDisplay(unsignedcharDisplayMode){ LCD_Write(LCD_COMMAND,0*08|DisplayMode); }//設(shè)置輸入模式************************************************************#defineLCD_AC_UP 0*02#defineLCD_AC_DOWN 0*00//default#defineLCD_MOVE 0*01//畫面可平移#defineLCD_NO_MOVE 0*00//defaultvoidLCD_SetInput(unsignedcharInputMode){ LCD_Write(LCD_COMMAND,0*04|InputMode);}//移動光標或屏幕************************************************************/*#defineLCD_CURSOR 0*02#defineLCD_SCREEN 0*08#defineLCD_LEFT 0*00#defineLCD_RIGHT 0*04voidLCD_Move(unsignedcharobject,unsignedchardirection){ if(object==LCD_CURSOR) LCD_Write(LCD_COMMAND,0*10|direction); if(object==LCD_SCREEN) LCD_Write(LCD_COMMAND,0*18|direction);}*///初始化LCD************************************************************voidLCD_Initial(){ LcdEn=0; LCD_Write(LCD_COMMAND,0*38);//8位數(shù)據(jù)端口,2行顯示,5*7點陣 LCD_Write(LCD_COMMAND,0*38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//開啟顯示,無光標 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC遞增,畫面不動}//************************************************************************voidGoto*Y(unsignedchar*,unsignedchary){ if(y==0) LCD_Write(LCD_COMMAND,0*80|*); if(y==1) LCD_Write(LCD_COMMAND,0*80|(*-0*40));}voidPrint(unsignedchar*str){ while(*str!='\0') { LCD_Write(LCD_DATA,*str); str++; }}/*voidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace){ unsignedchari; LCD_Write(LCD_COMMAND,0*40|(place*8)); for(i=0;i<8;i++) LCD_Write(LCD_DATA,user[i]);}*///************************************************************************#endifIntrins.h程序為:#ifndef__INTRINS_H__#define__INTRINS_H__e*ternvoid_nop_(void);e*ternbit_testbit_(bit);e*ternunsignedchar_cror_(unsignedchar,unsignedchar);e*ternunsignedint_iror_(unsignedint,unsignedchar);e*ternunsignedlong_lror_(unsignedlong,unsignedchar);e*ternunsignedchar_crol_(unsignedchar,unsignedchar);e*ternunsignedint_irol_(unsignedint,unsignedchar);e*ternunsignedlong_lrol_(unsignedlong,unsignedchar);e*ternunsignedchar_chkfloat_(float);e*ternvoid_push_(unsignedchar_sfr);e*ternvoid_pop_(unsignedchar_sfr);#endifDS1302時鐘程序為:#ifndef_REAL_TIMER_DS1302_2003_7_21_#define_REAL_TIMER_DS1302_2003_7_21_sbitDS1302_CLK=P1^6;//實時時鐘時鐘線引腳sbitDS1302_IO=P1^7;//實時時鐘數(shù)據(jù)線引腳sbitDS1302_RST=P1^5;//實時時鐘復(fù)位線引腳sbitACC0=ACC^0;sbitACC7=ACC^7;typedefstruct__SYSTEMTIME__{ unsignedcharSecond; unsignedcharMinute; unsignedcharHour; unsignedcharWeek; unsignedcharDay; unsignedcharMonth; unsignedcharYear; unsignedcharDateString[9]; unsignedcharTimeString[9];}SYSTEMTIME; //定義的時間類型#defineAM(*) *#definePM(*) (*+12) //轉(zhuǎn)成24小時制#defineDS1302_SECOND 0*80#defineDS1302_MINUTE 0*82#defineDS1302_HOUR 0*84#defineDS1302_WEEK 0*8A#defineDS1302_DAY 0*86#defineDS1302_MONTH 0*88#defineDS1302_YEAR 0*8C#defineDS1302_RAM(*) (0*C0+(*)*2) //用于計算DS1302_RAM地址的宏voidDS1302InputByte(unsignedchard) //實時時鐘寫入一字節(jié)(內(nèi)部函數(shù)){unsignedchari;ACC=d;for(i=8;i>0;i--){DS1302_IO=ACC0; //相當(dāng)于匯編中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC>>1;}}unsignedcharDS1302OutputByte(void) //實時時鐘讀取一字節(jié)(內(nèi)部函數(shù)){unsignedchari;for(i=8;i>0;i--){ACC=ACC>>1; //相當(dāng)于匯編中的RRCACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;}return(ACC);}voidWrite1302(unsignedcharucAddr,unsignedcharucDa) //ucAddr:DS1302地址,ucData:要寫的數(shù)據(jù){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr); //地址,命令DS1302InputByte(ucDa); //寫1Byte數(shù)據(jù)DS1302_CLK=1;DS1302_RST=0;}unsignedcharRead1302(unsignedcharucAddr) //讀取DS1302*地址的數(shù)據(jù){unsignedcharucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr|0*01);//地址,命令ucData=DS1302OutputByte();//讀1Byte數(shù)據(jù)DS1302_CLK=1;DS1302_RST=0;return(ucData);}voidDS1302_SetProtect(bitflag)//是否寫保護{ if(flag) Write1302(0*8E,0*10); else Write1302(0*8E,0*00);}voidDS1302_SetTime(unsignedcharAddress,unsignedcharValue)//設(shè)置時間函數(shù){ DS1302_SetProtect(0); Write1302(Address,((Value/10)<<4|(Value%10)));}voidDS1302_GetTime(SYSTEMTIME*Time){ unsignedcharReadValue; ReadValue=Read1302(DS1302_SECOND); Time->Second=((ReadValue&0*70)>>4)*10+(ReadValue&0*0F); ReadValue=Read1302(DS1302_MINUTE); Time->Minute=((ReadValue&0*70)>>4)*10+(ReadValue&0*0F); ReadValue=Read1302(DS1302_HOUR); Time->Hour=((ReadValue&0*70)>>4)*10+(ReadValue&0*0F); ReadValue=Read1302(DS1302_DAY); Time->Day=((ReadValue&0*70)>>4)*10+(ReadValue&0*0F); ReadValue=Read1302(DS1302_WEEK); Time->Week=((ReadValue&0*70)>>4)*10+(ReadValue&0*0F); ReadValue=Read1302(DS1302_MONTH); Time->Month=((ReadValue&0*70)>>4)*10+(ReadValue&0*0F); ReadValue=Read1302(DS1302_YEAR); Time->Year=((ReadValue&0*70)>>4)*10+(ReadValue&0*0F); }voidDateToStr(SYSTEMTIME*Time){ Time->DateString[0]=Time->Year/10+'0'; Time->DateString[1]=Time->Year%10+'0'; Time->DateString[2]='-'; Time->DateString[3]=Time->Month/10+'0'; Time->DateString[4]=Time->Month%10+'0'; Time->DateString[5]='-'; Time->DateString[6]=Time->Day/10+'0'; Time->DateString[7]=Time->Day%10+'0'; Time->DateString[8]='\0';}voidTimeToStr(SYSTEMTIME*Time){ Time->TimeString[0]=Time->Hour/10+'0'; Time->TimeString[1]=Time->Hour%10+'0'; Time->TimeString[2]=':'; Time->TimeString[3]=Time->Minute/10+'0'; Time->TimeString[4]=Time->Minute%10+'0'; Time->TimeString[5]=':'; Time->TimeString[6]=Time->Second/10+'0'; Time->TimeString[7]=Time->Second%10+'0'; Time->DateString[8]='

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論