版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
.Word資料單片機實驗項目中期報告多功能萬年歷課程名稱:單片機原理及應用組別:第二十組小組成員:****************班級:****************總體設計由于我們實驗是在網(wǎng)上購買的現(xiàn)成的開發(fā)板來學習和使用的,故在方案的選擇上也只能限于開發(fā)板設計好的電路和芯片。系統(tǒng)分為主控模塊、時鐘電路模塊、溫度檢測模塊,按鍵掃描模塊,LCD顯示模塊,電源電路、復位電路、晶振電路等模塊。該設計采用STC89C52芯片實現(xiàn)單片機萬年歷功能。設計應具有時間顯示,年月日顯示等功能。依據(jù)需求可擴展實現(xiàn)農(nóng)歷顯示功能。運用proteus進行仿真,實現(xiàn)電路仿真。運用C語言實現(xiàn)軟件相關功能。焊接并完成作品調(diào)試。詳細設計各模塊、元器件的型號及功能主控模塊采用AT89C52單片機,STC89C52,ATMEL的51系列單片機。支持串口下載,使用非常方便,且具有很大的價格優(yōu)勢。缺點是僅支持串口下載,不支持在線下載,使用中會有些不方便。按鍵模塊用四個按鍵,用于調(diào)整時間,顯示模塊采用LCD1602,時鐘電路模塊采用DS1302時鐘芯片實現(xiàn)對時間、日期的操作,溫度模塊使用18B20實現(xiàn)度溫度的操作。流程圖軟件仿真電路圖實物連接圖目前實現(xiàn)的功能(錄制視頻)小組分工情況李彪:連接電路,進行程序的燒寫。王進:收集資料,參與相關連接。于紅紅:程序讀寫,對實物的介紹。進度安排(截止時間12月23日)項目實驗已完成近70%,有些功能還不能實現(xiàn),有待完善,預計二十號完成。附錄(程序)#include<reg52.h> //調(diào)用單片機頭文件#defineucharunsignedchar//無符號字符型宏定義 變量范圍0~255#defineuintunsignedint //無符號整型宏定義 變量范圍0~65535#include"eeprom52.h"#include"nongli.h"bitflag_200ms;bitflag_100ms;sbitbeep=P3^7; //蜂鳴器定義bitflag_beep_en;uintclock_value;//用作鬧鐘用的sbitdq=P3^1; //18b20IO口的定義sbithw_P32=P3^2; //紅外遙控IO口的定義bitflag_jiema_en=0;//紅外解碼成功標志位ucharhw_table[4]; //紅外解碼數(shù)據(jù)緩沖區(qū)uintt_high=300,t_low=100;uinttemperature;//溫度變量ucharflag_nl;//農(nóng)歷陽歷顯示標志位/********紅外遙控器按鍵的操作碼************** 紅外遙控對應的數(shù)據(jù)字節(jié)hw_table[2] 454647 444043 071509 16190d 0c185e 081c5a 42524a*******************************************/ucharmenu_1,menu_2;ucharkey_time,flag_value;//用做連加的中間變量bitkey_500ms;ucharn_nian,n_yue,n_ri; //農(nóng)歷顯示的函數(shù)#include"ds1302.h"#include"lcd1602.h"/***********100us的延時函數(shù)***12M晶振**************/voiddelay_100us(ucharz){ //12Mucharx,y;for(x=0;x<z;x++)for(y=0;y<20;y++);}/******************把數(shù)據(jù)保存到單片機內(nèi)部eeprom中******************/voidwrite_eeprom(){ SectorErase(0x2000); byte_write(0x2000,fen1); byte_write(0x2001,shi1); byte_write(0x2002,open1); byte_write(0x2003,t_high%256); byte_write(0x2004,t_high/256); byte_write(0x2005,t_low%256); byte_write(0x2006,t_low/256); byte_write(0x2058,a_a); }/******************把數(shù)據(jù)從單片機內(nèi)部eeprom中讀出來*****************/voidread_eeprom(){ fen1=byte_read(0x2000); shi1=byte_read(0x2001); open1=byte_read(0x2002); t_high=byte_read(0x2004); t_high<<=8; t_high|=byte_read(0x2003); t_low=byte_read(0x2006); t_low<<=8; t_low|=byte_read(0x2005); a_a=byte_read(0x2058);}/**************開機自檢eeprom初始化*****************/voidinit_eeprom(){ read_eeprom(); //先讀 if(a_a!=43) //新的單片機初始單片機內(nèi)問eeprom { fen1=3; shi1=8; open1=1; t_high=350; t_low=100; a_a=34; write_eeprom(); //保存數(shù)據(jù) } }/***********************18b20初始化函數(shù)*****************************/voidinit_18b20(){ bitq; dq=1; //把總線拿高 delay_uint(1); //15us dq=0; //給復位脈沖 delay_uint(80); //750us dq=1; //把總線拿高等待 delay_uint(10); //110us q=dq; //讀取18b20初始化信號 delay_uint(20); //200us dq=1; //把總線拿高釋放總線}/*************寫18b20內(nèi)的數(shù)據(jù)***************/voidwrite_18b20(uchardat){ uchari; for(i=0;i<8;i++) { //寫數(shù)據(jù)是低位開始 dq=0; //把總線拿低寫時間隙開始 dq=dat&0x01;//向18b20總線寫數(shù)據(jù)了 delay_uint(5); //60us dq=1; //釋放總線 dat>>=1; } }/*************讀取18b20內(nèi)的數(shù)據(jù)***************/ucharread_18b20(){ uchari,value; for(i=0;i<8;i++) { dq=0; //把總線拿低讀時間隙開始 value>>=1; //讀數(shù)據(jù)是低位開始 dq=1; //釋放總線 if(dq==1) //開始讀寫數(shù)據(jù) value|=0x01; delay_uint(5); //60us 讀一個時間隙最少要保持60us的時間 } returnvalue; //返回數(shù)據(jù)}/*************讀取溫度的值讀出來的是小數(shù)***************/uintread_temp(){ uintvalue; ucharlow; //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳過64位ROM write_18b20(0x44); //啟動一次溫度轉(zhuǎn)換命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳過64位ROM write_18b20(0xbe); //發(fā)出讀取暫存器命令 EA=0; low=read_18b20(); //讀溫度低字節(jié) value=read_18b20();//讀溫度高字節(jié) EA=1; value<<=8; //把溫度的高位左移8位 value|=low; //把讀出的溫度低位放到value的低八位中 value*=0.625; //轉(zhuǎn)換到溫度值小數(shù) returnvalue; //返回讀出的溫度帶小數(shù)}/******************1ms延時函數(shù)*******************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/******************寫星期函數(shù)*******************/voidwrite_week(ucharhang,ucharadd,ucharweek)//寫星期函數(shù){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); switch(week) { case1:write_data('M');//星期數(shù)為1時,顯示 write_data('O'); write_data('N'); break; case2:write_data('T');//星期數(shù)據(jù)為2時顯示 write_data('U'); write_data('E'); break; case3:write_data('W');//星期數(shù)據(jù)為3時顯示 write_data('E'); write_data('D'); break; case4:write_data('T');//星期數(shù)據(jù)為4是顯示 write_data('H'); write_data('U'); break; case5:write_data('F');//星期數(shù)據(jù)為5時顯示 write_data('R'); write_data('I'); break; case6:write_data('S');//星期數(shù)據(jù)為6時顯示 write_data('T'); write_data('A'); break; case7:write_data('S');//星期數(shù)據(jù)為7時顯示 write_data('U'); write_data('N'); break; }}/*************時鐘顯示***************/voidinit_1602_ds1302(){ write_sfm2_ds1302(1,1,shi); //顯示時 write_sfm2_ds1302(1,4,fen); //顯示分 write_sfm2_ds1302(1,7,miao); //顯示秒 write_week(2,12,week);// write_sfm1(1,14,week); //顯示星期 write_sfm3_18B20(1,11,temperature); //顯示溫度 if(flag_nl==0)//顯示陽歷 { write_sfm2_ds1302(2,2,nian);//顯示年 write_sfm2_ds1302(2,5,yue); //顯示月 write_sfm2_ds1302(2,8,ri); //顯示日 } else //顯示農(nóng)歷 { write_sfm2_ds1302(2,2,n_nian); //顯示年 write_sfm2_ds1302(2,5,n_yue); //顯示月 write_sfm2_ds1302(2,8,n_ri); //顯示日 } } /*************定時器0初始化程序***************/voidinit_time0() { EA=1; //開總中斷 TMOD=0X01; //定時器0、工作方式1 ET0=1; //開定時器0中斷 TR0=1; //允許定時器0定時}/*************鬧鐘報警函數(shù)***************/voidmenu_dis(){ staticucharmm,value; if(flag_100ms==1) //100ms執(zhí)行一次 { flag_100ms=0; if(open1==1) //如果鬧鐘打開 { if((miao==0)&&(fen==fen1)&&(shi==shi1)) { flag_beep_en=1; //有報警打開蜂鳴器響的標志位 } if(flag_beep_en==1) //鬧鐘以被打開 { clock_value++; if(clock_value<=30) beep=~beep; //蜂鳴器叫3秒 //1分鐘后自動關閉鬧鐘 value++; if(value>=10) { value=0; mm++; if(mm>=60) { mm=0; flag_beep_en=0; beep=1; } } } } }}/********************獨立按鍵程序*****************/ucharkey_can; //按鍵值voidkey() //獨立按鍵程序{ staticucharkey_new; key_can=20;//按鍵值還原 P3|=0x78;//對應的按鍵IO口輸出為1 if((P3&0x78)!=0x78) //按鍵按下 { delay_1ms(1); //按鍵消抖動 if(((P3&0x78)!=0x78)&&(key_new==1)) { //確認是按鍵按下 key_new=0; switch(P3&0x78) { case0x70:key_can=4;break; //得到按鍵值 case0x68:key_can=3;break; //得到按鍵值 case0x58:key_can=2;break; //得到按鍵值 case0x38:key_can=1;break; //得到按鍵值 }// write_sfm2(1,0,key_can); //顯示按鍵值 } } else key_new=1; }/**********************設置函數(shù)************************/voidkey_with(){ if(key_can==1) //設置鍵 { menu_1++; if(menu_1==4) //設置時間 { menu_2=1; write_string(1,0,"--W:"); write_string(2,0,"20--"); } if(menu_1==2) //設置鬧鐘 { menu_2=1; write_string(1,0,"setclock"); write_string(2,0,"Y00:00"); } if(menu_1==3) //設置溫度上下限 { menu_2=1; write_string(1,0,"setwendu"); write_string(2,0,"H:.L:."); write_zifu(2,6,0xdf);//顯示度 write_zifu(2,14,0xdf);//顯示度 } if(menu_1>2)//回到正常顯示 { menu_1=0; write_guanbiao(1,2,0); //關閉光標 init_1602_dis_csf();//初始化液晶顯示 } } if(key_can==5) { menu_1=0; write_guanbiao(1,2,0); //關閉光標 init_1602_dis_csf();//初始化液晶顯示 } if(key_can==2) //選擇鍵 { flag_200ms=1; if(menu_1==1) //設置時間 { menu_2++; if(menu_2>7) menu_2=1; } if(menu_1==2) //設置鬧鐘 { menu_2++; if(menu_2>3) menu_2=1; } } if(menu_1==1) { if(menu_2==1) //設置時 { if(key_can==3) //加 { shi+=0x01; if((shi&0x0f)>=0x0a) shi=(shi&0xf0)+0x10; if(shi>=0x24) shi=0; } if(key_can==4) //減 { if(shi==0x00) shi=0x24; if((shi&0x0f)==0x00) shi=(shi|0x0a)-0x10; shi--; } } if(menu_2==2) //設置分 { if(key_can==3) //加 { fen+=0x01; if((fen&0x0f)>=0x0a) fen=(fen&0xf0)+0x10; if(fen>=0x60) fen=0; } if(key_can==4) //減 { if(fen==0x00) fen=0x5a; if((fen&0x0f)==0x00) fen=(fen|0x0a)-0x10; fen--; } } if(menu_2==3) //設置秒 { if(key_can==3) //加 { miao+=0x01; if((miao&0x0f)>=0x0a) miao=(miao&0xf0)+0x10; if(miao>=0x60) miao=0; } if(key_can==4) //減 { if(miao==0x00) miao=0x5a; if((miao&0x0f)==0x00) miao=(miao|0x0a)-0x10; miao--; } } if(menu_2==4) //設置星期 { if(key_can==3) //加 { week+=0x01; if((week&0x0f)>=0x0a) week=(week&0xf0)+0x10; if(week>=0x08) week=1; } if(key_can==4) //減 { if(week==0x01) week=0x08; if((week&0x0f)==0x00) week=(week|0x0a)-0x10; week--; } } if(menu_2==5) //設置年 { if(key_can==3) //加 { nian+=0x01; if((nian&0x0f)>=0x0a) nian=(nian&0xf0)+0x10; if(nian>=0x9a) nian=1; } if(key_can==4) //減 { if(nian==0x01) nian=0x9a; if((nian&0x0f)==0x00) nian=(nian|0x0a)-0x10; nian--; } } if(menu_2==6) //設置月 { if(key_can==3) //加 { yue+=0x01; if((yue&0x0f)>=0x0a) yue=(yue&0xf0)+0x10; if(yue>=0x13) yue=1; } if(key_can==4) //減 { if(yue==0x01) yue=0x13; if((yue&0x0f)==0x00) yue=(yue|0x0a)-0x10; yue--; } } if(menu_2==7) //設置日 { if(key_can==3) //加 { ri+=0x01; if((ri&0x0f)>=0x0a) ri=(ri&0xf0)+0x10; if(ri>=0x32) ri=0; } if(key_can==4) //減 { if(ri==0x01) ri=0x32; if((ri&0x0f)==0x00) ri=(ri|0x0a)-0x10; ri--; } } write_sfm2_ds1302(1,2,shi); //顯示時 write_sfm2_ds1302(1,5,fen); //顯示分 write_sfm2_ds1302(1,8,miao); //顯示秒 write_sfm1(1,14,week); //顯示星期 write_sfm2_ds1302(2,3,nian); //顯示年 write_sfm2_ds1302(2,6,yue); //顯示月 write_sfm2_ds1302(2,9,ri); //顯示日 switch(menu_2) //光標顯示 { case1:write_guanbiao(1,2,1);break; case2:write_guanbiao(1,5,1);break; case3:write_guanbiao(1,8,1);break; case4:write_guanbiao(1,14,1);break; case5:write_guanbiao(2,3,1);break; case6:write_guanbiao(2,6,1);break; case7:write_guanbiao(2,9,1);break; } write_time(); //把時間寫進去 } /***************設置鬧鐘*********************/ if(menu_1==2) { if(menu_2==1) //設置鬧鐘開關 { if(key_can==3) { open1=1; //鬧鐘開 } if(key_can==4) { open1=0; //鬧鐘關 } } if(menu_2==2) //設置鬧鐘時 { if(key_can==3) //加 { shi1+=0x01; if((shi1&0x0f)>=0x0a) shi1=(shi1&0xf0)+0x10; if(shi1>=0x24) shi1=0; } if(key_can==4) //減 { if(shi1==0x00) shi1=0x5a; if((shi1&0x0f)==0x00) shi1=(shi1|0x0a)-0x10; shi1--; } } if(menu_2==3) //設置秒 { if(key_can==3) //加 { fen1+=0x01; if((fen1&0x0f)>=0x0a) fen1=(fen1&0xf0)+0x10; if(fen1>=0x60) fen1=0; } if(key_can==4) //減 { if(fen1==0x00) fen1=0x5a; if((fen1&0x0f)==0x00) fen1=(fen1|0x0a)-0x10; fen1--; } } if(open1==1) write_string(2,4,"Y"); else write_string(2,4,"N"); write_sfm2_ds1302(2,7,shi1); //顯示鬧鐘時 write_sfm2_ds1302(2,10,fen1); //顯示鬧鐘分 switch(menu_2) //光標顯示 { case1:write_guanbiao(2,4,1);break; case2:write_guanbiao(2,7,1);break; case3:write_guanbiao(2,10,1);break; } write_eeprom();//保存鬧鐘時間 } }/***********紅外遙控程序**************/voidhongwai_dis(){ if(flag_jiema_en==1) { flag_jiema_en=0; beep=0; //蜂鳴器叫一聲 delay_1ms(50); beep=1; switch(hw_table[2]) { case0x40:key_can=1;break;//得到按鍵值 case0x44:key_can=2;break;//得到按鍵值 case0x15:key_can=3;break;//得到按鍵值 case0x07:key_can=4;break;//得到按鍵值 case0x43:key_can=5;break;//得到按鍵值 } key_with(); hw_table[2]=0; //把數(shù)據(jù)清零 }}/***********外部中斷0初始化程序****************/voidinit_int0() //外部中斷0初始化程序{ EX0=1; //允許外部中斷0中斷 EA=1; //開總中斷 IT0=1; //外部中斷0負跳變中斷}/*****************主函數(shù)********************/voidmain(){ beep=0; //開機叫一聲 delay_1ms(150); P0=P1=P2=P3=0xff; //單片機IO口初始化為1 init_ds1302(); //ds1302初始化 init_1602(); //lcd1602初始化 init_1602_dis_csf();//lcd1602初始化顯示 init_eeprom();//開始初始化保存的數(shù)據(jù) temperature=read_temp(); //先讀出溫度的值 delay_1ms(650); temperature=read_temp(); //先讀出溫度的值 while(1) { key(); //按鍵程序 if(key_can<10) { if(flag_beep_en==0)//只有鬧鐘關了的時候才能進入設置 key_with(); else { flag_beep_en=0; //按下任意鍵可關閉鬧鐘 beep=1; clock_value=0; read_time
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)意公關推廣合同(2篇)
- 易錯點12 抗日戰(zhàn)爭時期的主要史實與時間-備戰(zhàn)2023年中考歷史考試易錯題(解析版)
- 2025承包合同書企業(yè)范文
- 2024年度天津市公共營養(yǎng)師之三級營養(yǎng)師測試卷(含答案)
- 2024年度四川省公共營養(yǎng)師之四級營養(yǎng)師模擬試題(含答案)
- 2024年度四川省公共營養(yǎng)師之二級營養(yǎng)師自我檢測試卷A卷附答案
- 2025種子代理購銷合同書
- 2025年中國咖啡杯行業(yè)發(fā)展前景預測及投資策略研究報告
- 2025年中國注射用重組鏈激酶行業(yè)市場全景評估及發(fā)展前景預測報告
- 2025年中國廉價航空運輸行業(yè)市場全景分析及投資策略研究報告
- 餐飲店購銷合同
- 文化資源數(shù)字化技術有哪些
- 2023年杭州聯(lián)合銀行校園招聘筆試歷年高頻考點試題答案詳解
- 灌裝軋蓋機和供瓶機設備驗證方案
- 《國家中藥飲片炮制規(guī)范》全文
- 《鈷鉧潭西小丘記》教學設計(部級優(yōu)課)語文教案
- 人教版五年級下冊數(shù)學講義
- 安全工器具-變壓器絕緣油課件
- 瓦楞紙箱工藝流程演示文稿
- 神通數(shù)據(jù)庫管理系統(tǒng)v7.0企業(yè)版-3概要設計說明書
- 安置房項目二次結構磚砌體工程專項施工方案培訓資料
評論
0/150
提交評論