萬年歷的設計與制作(基于單片機)_第1頁
萬年歷的設計與制作(基于單片機)_第2頁
萬年歷的設計與制作(基于單片機)_第3頁
萬年歷的設計與制作(基于單片機)_第4頁
萬年歷的設計與制作(基于單片機)_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

湖北理工學院電氣與電子信息工程學院智能電子產品設計與制作設計題目:萬年歷的設計與制作專業(yè)班級:學號:姓名:指導教師:李玉平王海華設計時間:2012/5/28?2012/6/10設計地點:K2—407

智能電子產品設計與制作課程設計成績評定表姓名學號專業(yè)班級課程設計題目:課程設計答辯或質疑記錄:成績評定依據:實物制作(40%):課程設計考勤情況(20%):課程設計答辯情況(20%):完成設計任務及報告規(guī)范性(20%):最終評定成績(以優(yōu)、良、中、及格、不及格評定)指導教師簽字:2012年6月10日電氣與電子信息工程學院課程設計報告電氣與電子信息工程學院課程設計報告#Write_LCD_Command(0x01);}//向DS1302中寫入一字節(jié)(上升沿寫入)voidWrite_Byte_TO_DS1302(ucharx){uchari;for(i=0;i<8;i++)//循環(huán)8次寫入數(shù)據{IO=x&0x01;//每次傳輸?shù)妥止?jié)SCLK=0;delayus(2);SCLK=1;x>>=1;//右移一位}}//從DS1302中讀取一字節(jié)(下降沿讀取)ucharGet_Byte_FROM_DS1302(){uchari,dat=0x00;for(i=0;i<8;i++){if(IO)dat|=0x80;SCLK=1;delayus(2);SCLK=0;dat>>=1;}returndat/16*10+dat%16;//將讀出的BCD碼值轉化為十進制}//從DS1302的指定地址讀取一字節(jié)數(shù)據ucharRead_Data(ucharaddr){uchardat;RST=0;SCLK=0;RST=1;Write_Byte_TO_DS1302(addr);//先寫地址在讀取dat=Get_Byte_FROM_DS1302();RST=0;SCLK=1;returndat;}//向指定的地址寫入一字節(jié)數(shù)據voidWrite_DS1302(ucharadd,ucharnum){RST=0;SCLK=0;RST=1;Write_Byte_TO_DS1302(add);//先寫地址再寫數(shù)據Write_Byte_TO_DS1302(num);RST=0;SCLK=1;}//讀取當前日期時間voidGetDateTime(){uchari,addr=0x81;//讀取秒地址開始(地址最高位10表示要讀/寫clock數(shù)據,//最低位表示是讀(1)還是寫(0)for(i=0;i<7;i++){DateTime[i]=Read_Data(addr);addr+=2;}}//禁止涓流充電voiddenot(){Write_DS1302(0x8e,0x00);//寫控制字節(jié),取消寫保護Write_DS1302(0x90,0x8b);//禁止涓流充電Write_DS1302(0x8e,0x80);//加保護}//寫改動后的數(shù)據到DS1302中voidSetDateTime(){uchari;Write_DS1302(0x8e,0x00);//寫控制字節(jié),取消寫保護for(i=0;i<7;i++){Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));}Write_DS1302(0x8e,0x80);//加保護}//判斷是否為閏年ucharIsLeapYear(uinty){if((y%4==0&&y%100!=0)||(y%400==0))return1;elsereturn0;}//根據設定的日期自動刷新星期voidRefreshWeekday(){uinti,d,w=5;//已知1999.12.31是周五for(i=2000;i<2000+DateTime[6];i++){d=IsLeapYear(i)?366:365;w=(w+d)%7;}for(d=0,i=1;i<DateTime[4];i++)d+=days[i];d+=DateTime[3];DateTime[5]=(w+d)%7+1;}//根據按鍵情況調整時間voidDateTime_Adjust(charx){switch(Adjust_Index){case6://年00--99if(x==1){DateTime[6]++;if(DateTime[6]==100)DateTime[6]=0;}else{DateTime[6]--;if(DateTime[6]==0xff)DateTime[6]=99;}days[2]=IsLeapYear(2000+DateTime[6])?29:28;if(DateTime[3]>days[DateTime[4]])DateTime[3]=days[DateTime[4]];RefreshWeekday();break;case4://月01--12if(x==1){DateTime[4]++;if(DateTime[4]==13)DateTime[4]=1;}else{DateTime[4]--;if(DateTime[4]==0)DateTime[4]=12;}days[2]=IsLeapYear(2000+DateTime[6])?29:28;if(DateTime[3]>days[DateTime[4]])DateTime[3]=days[DateTime[4]];RefreshWeekday();break;case3://日days[2]=IsLeapYear(2000+DateTime[6])?29:28;if(x==1){DateTime[3]++;if(DateTime[3]>days[DateTime[4]])DateTime[3]=1;}else{DateTime[3]--;if(DateTime[3]==0)DateTime[3]=days[DateTime[4]];}if(DateTime[3]>days[DateTime[4]])DateTime[3]=days[DateTime[4]];RefreshWeekday();break;case2://時if(x==1){DateTime[2]++;if(DateTime[2]==24)DateTime[2]=0;}else{DateTime[2]--;if(DateTime[2]==0xff)DateTime[2]=23;}break;case1://分if(x==1){DateTime[1]++;if(DateTime[1]==60)DateTime[1]=0;}else{DateTime[1]--;if(DateTime[1]==0xff)DateTime[1]=59;}break;case0://秒if(x==1){DateTime[0]++;if(DateTime[0]==60)DateTime[0]=0;}else{DateTime[0]--;if(DateTime[0]==0xff)DateTime[0]=59;}break;}}//復位,初始化DS18B20voiddsreset(){do{DQ=1;//DQ復位delayus(4);//延時DQ=0;//DQ拉低delayus(75);//精確延時480us~~960usDQ=1;//拉高delayus(5);}while(DQ==1);delayus(50);//最少480us}//讀一個字節(jié)函數(shù)uchartmpread(void){uchari=0;uchardat=0;for(i=8;i>0;i--){DQ=0;//給脈沖信號dat>>=1;DQ=1;//給脈沖信號if(DQ)dat|=0x80;delayus(4);//延時〉30us}return(dat);}//寫一個字節(jié)函數(shù)voidtmpwritebyte(uchardat){uinti;ucharj;bittestb;for(j=1;j<=8;j++){testb=dat&0x01;//低位在前dat=dat>>1;if(testb)//寫“1“{DQ=0;i++;i++;DQ=1;i=8;while(i>0)i--;}else//寫”0"{DQ=0;i=8;while(i>0)i--;DQ=1;i++;i++;}}}//開始獲取溫度并轉換voidTempChang(){dsreset();delayms(1);tmpwritebyte(Oxcc);//*跳過讀序列號*/tmpwritebyte(0x44);//*啟動溫度轉換*/}//獲取溫度并轉換Get_Temp(){uchara,b;dsreset();delayms(1);tmpwritebyte(Oxcc);//*跳過讀序列號*/tmpwritebyte(Oxbe);//*讀取溫度*/a=tmpread();b=tmpread();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<=0x07ff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue二tvalue*0.625+0.5;//溫度值擴大10倍,精確到1位小數(shù),return(tvalue);//小數(shù)點第二位四舍五入}//溫度報警voidtempbaojing(){ucharc;if((tvalue>=0x040)&(tvalue<=0x00)){for(c=0;c<5;c++){buzz=~buzz;delayms(10);}}}//溫度值顯示模塊voidDS18B20Disp()//溫度值顯示{Temp_BUFFER[1]=tvalue/1000+0x30;//百位數(shù)Temp_BUFFER[2]=tvalue%1000/100+0x30;//十位數(shù)Temp_BUFFER[3]=tvalue%100/10+0x30;//個位數(shù)Temp_BUFFER[4]=0x2e;//寫小數(shù)點Temp_BUFFER[5]=tvalue%10+0x30;//小數(shù)位Temp_BUFFER[6]=0xdf;//寫溫度單位Temp_BUFFER[7]=0x43;if(tflag==0)Temp_BUFFER[0]=0x20;//正溫度不顯示符號elseTemp_BUFFER[0]=0x2d;//負溫度顯示負號:-if(Temp_BUFFER[1]==0x30){Temp_BUFFER[1]=Temp_BUFFER[0];//如果百位為0,不顯示Temp_BUFFER[0]=0x20;if(Temp_BUFFER[2]==0x30){Temp_BUFFER[2]=Temp_BUFFER[1];//在百位為0的同時十位為0,不顯示Temp_BUFFER[1]=0x20;}}}//主函數(shù)voidmain(){uchartcount=0;Initialize_LCD();denot();EA=1;EX0=1;IT0=1;while(1){TempChang();Get_Temp();tempbaojing();DS18B20Disp();LCD_ShowString(8,1,Temp_BUFFER);if(tvalue>=310){tcount++;//單片機沒執(zhí)行到此需要約0.2s;if(tcount==2){tcount=0;led"=l;}}elseled=1;if(Adjust_Index==-1)GetDateTime();Refresh_LCD_BUFFER();LCD_ShowString(0,0,LCD_DSY_BUFFER1);LCD_ShowString(0,1,LCD_DSY_BUFFER2);LCD_ShowString(11,0,week[DateTime[5]-1]);}}//中斷0服務程序voidint0()interrupt0{if(K1==0){delayms(100);if(K1==0){while(!K1);if(Adjust_Index==-1||Adjust_Index==0)Adjust_Index=7;Adjust_Index--;f(Adjust_Index==5)Adjust_Index=4;//跳過星期的調整,自行刷新switch(Adjust_Index){case6:Write_LCD_Command(0x8f);//寫‘N'Write_LCD_Data(0x4e);break;case4:Write_LCD_Command(0x8f);//寫‘Y'Write_LCD_Data(0x59);break;case3:Write_LCD_Command(0x8f);//寫'R'Write_LCD_Data(0x52);break;case2:Write_LCD_Command(0x8f);//寫‘S'Write_LCD_Data(0x53);break;case1:Write_LCD_Command(0x8f);Write_LCD_Data(0x46);//寫'F'break;case0:Write_LCD_Command(0x8f);Write_LCD_Data(0x4d);//寫‘M'break;}}}elsef(K2==0&&Adjust_Index!=-l)//加{delayms(100);if(K2==0){while(!K2);DateTime_Adjust(1);}}elsef(K3==0&&Adjust_Index!=-l)//減{delayms(100);if(K3==0){while(!K3);DateTime_Adjust(-1);}}elsef(K4==0&&Adjust_Index!=-l)//確定{delayms(100);if(K4==0){while(!K4);SetDateTime();Adjust_Index=-1;Write_LCD_Command(0x8f);//去除標志位Write_LCD_Data(0x20);}}elsef(K5==0&&Adjust_Index!=-l)//取消{delayms(100);if(K5==0){while(!K5);Adjust_Index=-1;Write_LCD_Command(0x8f);//去除標志位Write_LCD_Data(0x20);}}}五、調試1、建立工程和仿真圖(1)打開proteus軟件,新建一個工程,然后在工作窗口內畫好原理圖并保存。(2)打開keil軟件新建一個工程,選擇所用單片機的型號,然后新建一個文件保存為?c文件并添加到工程中去,開始寫源程序,寫好后編譯生成Hex文件。(3)將生成的Hex文件下載到單片機內,觀察結果,并調試,觀察數(shù)碼管上是否有相應正確的變化。若結果不正確,思考問題的所在,修改源程序,繼續(xù)調試,直到觀察到正確的運行結果。2、keil軟件調試結果圖7C程序調試結果3、proteus軟件仿真結果LCD-門35口0口?-X3旳8CLKRETVCC3■wilmriiBG1s■T2-■s□-bXTHJJpnrvArnFEEHADIPEIHAD二XTA12pnTAmPD.^AD*P口STUSP口后AD6RBTPD.TCXDTPZIU-'CP2.1KCpz^A-nPSSIAL£P2.^A12EKP2SA13FZjQfAd*P*1□p-qrvR^nP*l*1PlP12P32?FIDP1PA/TDP1£P3fnP1ApiAimrP17pi.TiHF圖8仿真結果六、實物的組裝與調試1.實物的組裝由于班上每組同學設計題目,所以采取的是手工焊接。于是我自己畫pcb板可是一上午過去了,還是畫不好,下午只好根據已畫的pcb及原理圖來對元器件進行擺放和布局,這對電路板最后的走線增添了一定的難度。2、實物焊接小小的板,在我們的不懈努力下終于焊好了。焊接電路如下圖。圖9焊接實物圖3、調試電路焊接完成后,插上usb線,加上5v電壓,只有電源供電的指示燈亮著,而顯示器沒有任何反應。于是,開始排查電路中那個模塊出現(xiàn)了問題。首先當然想到的是顯示器總存在著虛焊的點。利用萬用表,測著每個引腳與接地短的電壓,發(fā)現(xiàn)了果然有幾個點存在著虛焊現(xiàn)象。排除這一問題后,加上電壓,顯示器亮了,卻沒有顯示日期。結果發(fā)現(xiàn)AT89C51芯片沒有加載程序。將其改正后,電路基本上實現(xiàn)了我們所需的日期和溫度的顯示功能。當我們嘗試著讓每個鍵是否能正常調時時,發(fā)現(xiàn)全部按鍵按下沒有什么反應。剛開始想著是否是按鍵出現(xiàn)了問題,利用萬用表檢測,發(fā)現(xiàn)按鍵工作狀態(tài)是對的。最終將問題鎖定在了74HC08芯片上,結果發(fā)現(xiàn)少接了一根線。接好后,按鍵都能正常調時了。經過不懈的努力我們的萬年歷終于做成功了。調試結果如下圖:■MBW■■■IK山山審A■圖10調試實物圖七、心得體會本次課程設計是做一個多功能的電子萬年歷。經過一學期的學習后,應用起Proteus軟件時便顯得得心應手,對程序的編譯,以及生成相應的hex文件,將匯編源程序加載等也能熟練掌握。而且通過此次做電子萬年歷使我對單片機更加感興趣了,雖然我還沒有能力自己編寫復雜的程序,但我將會在以后的學習中更加深入地學習它。通過這兩周的課程設計,我學到了不少的知識。把以前沒有學好的模擬電路的知識進行了補充和加強,這使我受益匪淺。并加深了我對于單片機和數(shù)字電路的認識,相信在今后的學習和工作中我會做的越來越好。通過查

溫馨提示

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

評論

0/150

提交評論