




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片機課程設計報告自行車測速儀學院信息工程學院專業信息工程(電子信息工程方向>年級班別2018級<4)班學號3110002980學生姓名XXX指導教師XXX申請成績XXXO890avxlRSb5E2RGbCAP主要特點或功能答辯記錄1.可以測試自行車的車速2018開始時間:年12月2.可以顯示和修改實時時間結束時間1、設計要求:考題:3.可以顯示實時溫度4.記錄自行車所走過的路程答辯結果:人選此題,難度系數:中;此自行車測速儀<傳感器必須自己做)(每班最多85.斷電保存路程變量顯示題除非所有硬件自己做,并用于實際自行車上,否則不能得優或良>O890avxlRSp1EanqFDPw基本功能:能實時顯示自行車的行駛速度附加功能:實時時鐘,行駛里程累計2.設計思路:首先是選擇基于51單片機來設計這個產品,這個產品主要的功能是用來測量自行車的車速,既然要測車速,那就要用到傳感器,所以選擇了紅外光電傳感器,它的檢測頭里也裝有一個發光器和一個收光器,但前方沒有反光板.正常情況下發光器發出的光收光器是找不到的.當檢測物通過時擋住了光,并把光部分反射回來,收光器就收到光信號,輸出一個開關信號.在沒有遮擋物時,傳感器輸出端輸出一個高電平,當有遮擋物時,輸出端就會輸出低電平,那樣就可以利用單片機的計數功能,把傳感器輸出的信號輸入到單片機的外部脈沖輸入端,可以通過測試脈沖數來算出車速,具體實現是利用單片機的計數功能實現下降沿計數,然后在兩秒內統計出自行車走過的圈數,算出自行車車輪的周長,再乘以圈數,再除以時間兩秒,就得到車速,然后在lcd上面顯示,還可以算出自行車的路程,也利用單片機的定時中斷功能可以設置和顯示實時時間,還可以利用單片機上自帶的溫度傳感器 ds18b20測出實時溫度,在 lcd上顯示出來.O890avxlRSDXDiTa9E3d3.任務分工:XXX<100%)4.設計步驟:1/201.先完成lcd的顯示代碼,使單片機上的 lcd能正常顯示數字,字符.2,利用單片機的定時計數功能,首先在 lcd上顯示實時時間能每秒加一 .3.通過對按鍵的掃描檢測,實現對實時時間的設置 .例如按下按鍵,使能設置時間<斷開計時中斷),再分別設置三個按鍵分別實現對小時,分鐘,秒的設置 <按下一次加一) O890avxlRSRTCrpUDGiT.4.通過單片機的計數功能,即外部脈沖信號輸入到引腳 P3.5<T1),電平從1到0跳變,則計數器加一.把紅外光電傳感器的信號輸出端接到引腳P3.5,自行車車輪的周長,再乘以圈數,再除以時間兩秒,就得到車速,然后在lcd上面顯示.O890avxlRS5PCzVD7HxA5.車輪的周長乘以圈數<每次累加起來),就可以得到自行車走過的路程,并在lcd上顯示出來.6.利用單片機上的溫度傳感器 ds18b20,把得到的溫度數據轉化并顯示在 lcd上.5,.程序流程<含流程圖及詳細步驟解釋)2/20開始1初始化2 3 5Key6key=01=04ynyn路得到得到速程溫度度值清ET零=0液晶顯示
6 7 8 9Key key Key Key2=0 3=0 4=0 5=0n ny nyynyh+ m s+ ET1 +1 1 =1O890avxlRSjLBHrnAILg流程圖詳細步驟解釋:1.程序開始運行,初始化.2.判斷key6=0,即鍵6是否被按下,按下則對路程清零,否則顯示累計的路程值.利用單片機上的溫度傳感器ds18b20,不斷得到實時溫度值.4.把TMOD=01010001,即把T1作為計數器,把 T0作為定時器,利用定時功能實現實時時間的顯示,即實現每秒加一,利用 T1的計數功能,記錄由傳感器輸出的脈沖數,然后可以換算成速度,還可以算出走過的路程.O890avxlRSxHAQX74J0X3/205.判斷key1是否為0,即key1是否被按下,若按下,則令 ET0=0<停止定時中斷),便于設置時間.O890avxlRSLDAYtRyKfE6.判斷key2是否被按下,若按下則令小時 h加一.7.判斷key3是否被按下,若按下則令分鐘 m加一.8.判斷key4是否被按下,若按下則令秒 s加一.9.判斷key5是否被按下,若按下則令 ET0=1,TR0=1允許并啟動定時中斷.6.操作步驟及方法:1.電源開關,把線接好后先下載程序,再按電源開關,實現冷啟動 .2.1602液晶顯示模塊.分別顯示速度,路程,時間,溫度 .3.這些是獨立按鍵,通過這些按鍵可以實現設置實時時間.<第一行對應為key1,key2,key3,key4,第二行第三個對應key5,第四個為key6),key1按下,則令ET0=0<停止定時中斷),便于設置時間.Key2按下則令小時h加一,key3按下則令分鐘m加一,key4按下則令秒s加一,key5按下則令ET0=1,TR0=1允許并啟動定時中斷..O890avxlRSZzz6ZB2Ltk4/204.紅外光電傳感器模塊,有三個引腳,分別是接地,接電源,輸出信號端接P3^5,分別用杜邦線連接.5.溫度傳感器ds18b20,對傳感器的輸出數據進行處理,然后在lcd上顯示溫度值5/207.設計過程遇到的問題,原因及解決方法:日期時間 問題和難點描述 問題原因及解決方法2018/12/179:00選擇用51單片機,但是沒51去問同學借了一塊單片機2018/12/1810:00對51單片機還不熟悉通過去圖書館找書,還有看原理圖,結合實例,熟悉51的每個模塊2018/12/198:30按鍵檢測時,按鍵抖動查看資料,用延時來實現按鍵消抖2018/12/2010:00對傳感器不太熟悉上網查看大量資料,并挑選出適合的紅外光電傳感器2018/12/2214:00對51自帶的溫度傳感器不熟上網查看資料,實現溫度結悉果的獲取,并在lcd上顯示2018/12/249:00各個模塊結合在一起時,但把芯片取下來,換到其他的單片機卻不能下載程序同一芯片型號的單片機下載下面附上代碼:代碼分為五個模塊: 1.主函數模塊,2.時間和路程處理模塊,3.1602lcd顯示模塊,4溫度處理模塊,5斷電保存模塊.O890avxlRSdvzfvkwMI151單片機都適用,只需修改一下對應的引腳即可 .1.主函數模塊:6/20#include<reg52.h>#include<Time_Journey.h>#include<Lcd.h>#include<Temp.h>#include<delay.h>#include<stc_eeprom.h>externunsignedlongintt1。voidmain(>{uchara,i。ucharre[4]={0}。Initlcd(>。time_init(>。EA=0。re[0]=read_add_data(0x2003>。delay(5>。re[1]=read_add_data(0x2002>。delay(5>。re[2]=read_add_data(0x2001>。delay(5>。re[3]=read_add_data(0x2000>。delay(5>。EA=1。t1=0。for(i=0。i<4。i++>{t1=t1<<8。t1=t1|re[i]。}while(1>{time_set(>。 //調用時間設置函數speed_display(>。 //調用速度顯示函數delay(5>。journey_display(>。 //調用路程顯示函數delay(5>。time_display(>。 //調用時間顯示函數delay(5>。tem_change(>。for(a=20。a>0。a-->7/20{get_temperature(>。 //得到溫度值函數display_temp(>。 //顯示溫度函數}}}2.時間和路程處理模塊uchars,m,h,i。ucharcount1,count2,count3。uchartemp1。unsignedlongintsp1,jour1,t1。ucharsp[4]={0}。 //速度ucharjour[7]={0}。 //路程ucharwr[4]={0}。voidtime_init(>{TMOD=0x51。//01010001,T1做計數器,T0做定時器TH0=(65536-50000>/256。 //定時器T0的高8位設置初值TL0=(65536-50000>%256。 //定時器T0的低8位設置初值TH1=0x00。 //計數器的初值為 0TL1=0x00。EA=1。 //開總中斷ET0=1。 //允許定時器0溢出中斷TR0=1。 //啟動定時器0TR1=1。}voidTime0(void>interrupt1using1//定時器T0的中斷編號為 1,使用第1組工作寄存器 O890avxlRSrqyn14ZNXI{count1++。//每產生1次中斷,中斷累計次數加 1count2++。count3++。if(count3==40>{8/20delete_add_data(0x2000>。delay(5>。wr[0]=t1&0xff。wr[1]=(t1>>8>&0xff。wr[2]=(t1>>16>&0xff。wr[3]=(t1>>24>&0xff。for(i=0。i<4。i++>{EA=0。write_add_data(0x2000+i,wr[i]>。delay(5>。EA=1。}}if(key6==0>//路程清零{delay(100>。if(key6==0>{t1=0。TH1=0。TL1=0。jour[6]=0。jour[5]=0。jour[4]=0。jour[3]=0。jour[2]=0。jour[1]=0。jour[0]=0。}}if(count2==40> //兩秒鐘測一次轉了多少圈9/20{count2=0。temp1=TL1。sp1=3212*temp1。sp[3]=sp1/10000。sp[2]=sp1/1000%10。sp[1]=sp1/100%10。sp[0]=sp1/10%10。t1=t1+temp1。jour1=189*t1。jour[6]=jour1/1000000%10。jour[5]=jour1/100000%10。jour[4]=jour1/10000%10。jour[3]=jour1/1000%10。jour[2]=jour1/100%10。jour[1]=jour1/10%10。jour[0]=jour1%10。TH1=0。TL1=0。//計數器的值清零}if(count1==20>//如果中斷次數計滿20次,即定時1s{count1=0。//中斷累計次數清0s++。 //秒加1}if(s==60> //如果計滿60秒{s=0。 //秒清0m++。 //分鐘加1}10/20if(m==60> //如果計滿60分{m=0。 //分鐘清0h++。 //小時加1}if(h==24>//如果計滿24小時{h=0。 //小時清0}TH0=(65536-50000>/256。 //定時器T0高8位重新賦初值TL0=(65536-50000>%256。 //定時器T0低8位重新賦初值}voidtime_set(>//設置時間函數{if(key1==0>{delay(100>。 //延時消抖if(key1==0>{TR0=0。ET0=0。//停止計時TL0=0。TH0=0。}}if(key2==0>//key2設置小時{delay(100>。if(key2==0>{if(h==23>{h=0。}else{h=h+1。}}11/20}if(key3==0>//key3設置分鐘{delay(100>。if(key3==0>{if(m==59>{h=h+1。m=0。}else{m=m+1。}}}if(key4==0>//key4設置秒{delay(100>。if(key4==0>{if(s==59>{m=m+1。s=0。}else{s=s+1。}}}if(key5==0>//按下key5,啟動定時器繼續計時{delay(100>。if(key5==0>{ET0=1。TR0=1。}12/20}}voidspeed_display(> //顯示速度(km/h>函數{Displayonechar(0,0,sp[3]+0x30>。Displayonechar(1,0,sp[2]+0x30>。Displayonechar(2,0,0x2e>。Displayonechar(3,0,sp[1]+0x30>。Displayonechar(4,0,sp[0]+0x30>。}voidjourney_display(>//顯示路程(m>函數{Displayonechar(8,0,jour[6]+0x30>。Displayonechar(9,0,jour[5]+0x30>。Displayonechar(10,0,jour[4]+0x30>。Displayonechar(11,0,jour[3]+0x30>。Displayonechar(12,0,jour[2]+0x30>。Displayonechar(13,0,0x2e>。Displayonechar(14,0,jour[1]+0x30>。Displayonechar(15,0,jour[0]+0x30>。}voidtime_display(>//顯示時間函數{Displayonechar(0,1,h/10+0x30>。Displayonechar(1,1,h%10+0x30>。Displayonechar(2,1,0x3a>。Displayonechar(3,1,m/10+0x30>。Displayonechar(4,1,m%10+0x30>。Displayonechar(5,1,0x3a>。Displayonechar(6,1,s/10+0x30>。Displayonechar(7,1,s%10+0x30>。}3.1602lcd顯示模塊voidWaitforenable(>//檢測忙信號子函數{dataport=0xff。lcm_rs=0。lcm_rw=1。_nop_(>。lcm_en=1。_nop_(>。_nop_(>。while(dataport&0x80>。//檢測到忙信號就等待13/20lcm_en=0。}voidWritecommandlcm(ucharcmd,ucharattribc>//寫命令到lcm子函數O890avxlRSEmxvxOtOco{if(attribc>Waitforenable(>。lcm_rs=0。lcm_rw=0。_nop_(>。dataport=cmd。_nop_(>。lcm_en=1。_nop_(>。_nop_(>。lcm_en=0。}voidWritedatalcm(uchardataw>{Waitforenable(>。lcm_rs=1。lcm_rw=0。_nop_(>。dataport=dataw。_nop_(>。lcm_en=1。_nop_(>。_nop_(>。lcm_en=0。}voidInitlcd(>//函數名為Initlcd的lcm初始化子函數{Writecommandlcm(0x38,1>。//8位數據傳送,2行顯示,5x7字型,檢測忙信號O890avxlRSSixE2yXPq5Writecommandlcm(0x08,1>。//關閉顯示,檢測忙信號Writecommandlcm(0x01,1>。//清屏,檢測忙信號Writecommandlcm(0x06,1>。//顯示光標右移設置,檢測忙信號Writecommandlcm(0x0c,1>。//顯示屏打開,光標不顯示,不閃爍,檢測忙信號}voidDisplayonechar(ucharx,uchary,ucharddata>//顯示指定坐標一個字符的子函數O890avxlRS6ewMyirQFL{y&=1。//限定范圍為0~1x&=15。//限定范圍為0~15if(y>x|=0x40。//若y為1<顯示第二行),地址碼+0x40x|=0x80。//指令碼為地址碼+0x80Writecommandlcm(x,0>。//將指令x寫入lcm,忽略忙信號檢測<顯示光標定位,數字顯示位置)O890avxlRSkavU42VRUs14/20Writedatalcm(ddata>。 //寫入要顯示的字符}4.溫度處理模塊sbitds=P3^7。//單總線引腳ucharflag。uinttemp。voidTempDelay(ucharus>{while(us-->。}voidds_reset(void>{ds=1。_nop_(>。 //1usds=0。TempDelay(68>。//當總線停留在低電平超過480us,總線上所以器件都將被復位,這里//延時約530us總線停留在低電平超過480μs,總線上的所有器件都將被復位.O890avxlRSy6v3ALoS89_nop_(>。ds=1。//產生復位脈沖后,微處理器釋放總線,讓總線處于空閑狀態TempDelay(10>。//釋放總線后,以便從機18b20通過拉低總線來指示其是否在線,存在檢測高電平時間:15~60us,所以延時44usO890avxlRSM2ub6vSTnP_nop_(>。_nop_(>。_nop_(>。if(ds==0>flag=1。elseflag=0。TempDelay(20>。//存在檢測低電平時間: 60~240us,所以延時約140us_nop_(>。_nop_(>。ds=1。 //再次拉高總線,讓總線處于空閑狀態/**/}/*----------------------------------------讀/寫時間隙:DS1820的數據讀寫是通過時間隙處理位和命令字來確認信息交換 .------------------------------------------*/bitds_read_bit(void>//讀一位{bitdat。15/20ds=0。 //單片機<微處理器)將總線拉低_nop_(>。 //讀時隙起始于微處理器將總線拉低至少 1usds=1。 //拉低總線后接著釋放總線,讓從機 18b20能夠接管總線,輸出有效數據_nop_(>。_nop_(>。 //小延時一下,讀取 18b20上的數據,因為從ds18b20上輸出的數據O890avxlRS0YujCfmUCw//在讀"時間隙"下降沿出現15us內有效dat=ds。 //主機讀從機18b20輸出的數據,這些數據在讀時隙的下降沿出現//15us內有效O890avxlRSeUts8ZQVRdTempDelay(20>。//所有讀"時間隙"必須60~120us,這里77usreturn(dat>。//返回有效數據}uchards_read_byte(void>//讀一字節{ucharvalue,i,j。value=0。 //一定別忘了給初值for(i=0。i<8。i++>{j=ds_read_bit(>。value=(j<<7>|(value>>1>。//這一步的說明在一個 word文檔里面}return(value>。 //返回一個字節的數據}voidds_write_byte(uchardat>//寫一個字節{uchari。bitonebit。 //一定不要忘了,onebit是一位for(i=1。i<=8。i++>{onebit=dat&0x01。dat=dat>>1。if(onebit> //寫1{ds=0。_nop_(>。_nop_(>。//看時序圖,至少延時1us,才產生寫"時間隙"ds=1。//寫時間隙開始后的15μs內允許數據線拉到高電平TempDelay(20>。//所有寫時間隙必須最少持續60us}else //寫0{ds=0。TempDelay(20>。//主機要生成一個寫 0時間隙,必須把數據線拉到低電16/20平并保持至少60μs,這里64usO890avxlRSsQsAEJkW5Tds=1。_nop_(>。_nop_(>。}}}voidtem_change(> //溫度轉換{ds_reset(>。delay(3>。 //約2msds_write_byte(0xcc>。 //寫跳過讀ROM指令ds_write_byte(0x44>。 //寫溫度轉換指令}/*----------------------------------------獲得溫度:------------------------------------------*/uintget_temperature(> //讀取寄存器中存儲的溫度數據{floatwendu。uchara,b。ds_reset(>。delay(3>。 //約2msds_write_byte(0xcc>。ds_write_byte(0xbe>。a=ds_read_byte(>。//讀低八位b=ds_read_byte(>。 //讀高八位temp=b。temp<<=8。 //兩個字節組合為一個字節temp=temp|a。wendu=temp*0.0625。 //一次讀取十六位,之后將低 11位轉換為十進制后乘以0.0625便使所測實際溫度 aPkqouInQMGMsIasNXkAtemp=wendu*100+0.5。 // 乘以100表示讀取小數點后面 2位,+0.5表示四舍五入aPkqouInQMTIrRGchYzgreturntemp。 //temp是整型}voiddisplay_temp(>{Displayonechar(9,1,(temp/1000>%10+0x30>。17/20Displayonechar(10,1,(temp/100>%10+0x30>。Displayonechar(11,1,0x2e>。Displayonechar(12,1,(temp/10>%10+0x30>。Displayonechar(13,1,temp%10+0x30>。Displayonechar(14,1,0xdf>。Displayonechar(15,1,'C'>。}5.斷電保存處理模塊//寄存器定義,因為<reg52.h>頭文件里面沒有這個定義sfrisp_data=0xe2。sfrisp_addrh=0xe3。sfrisp_addrl=0xe4。sfrisp_cmd=0xe5。sfrisp_trig=0xe6。sfrisp_contr=0xe7。//這斷話要看看//擦除片內EEPROM的一個扇區//擦除只能以扇區為最小單位進行,沒法只擦除一個字節//一個扇區是512個字節//本函數參數里面的地址落在哪個扇區,則該扇區內數據都將被擦除//例如:STC89C52RC片內EEPROM第一扇區開始地址為 0x2000,結束地址為0x21ff//如果調用delete_add_data(2001>。 則第一扇區內數據都將被擦除//擦除成功后,該扇區內各字節都將變為 0xffvoiddelete_add_data(unsignedintaddress>擦//除扇區aPkqouInQM7EqZcWLZNX{unsignedchar。iisp_addrl=address。isp_addrh=address>>8。isp_contr=0x01。isp_contr=isp_contr|0x81。//0x80ifSYSCLK<40MHz,0x81ifSYSCLK<20MHz,0x82ifSYSCLK<10MHz,0x83ifSYSCLK<5MHzaPkqouInQMlzq7IGf02Eisp_cmd=0x03。 //擦除扇區命令isp_trig=0x46。isp_trig=0xb9。for(i=0。i<3。i++>。isp_addrl=0xff。isp_addrh=0xff。isp_contr=0x00。isp_cmd=0x00。isp_trig=0x00。}18/20//對STC片內
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑設計答辯匯報
- 冷鏈物流行業發展前景分析
- 2025建筑工程合同爭議解析
- 2025物流服務外包合同(專業律師審核起草修訂)
- 幼兒園假期安全教育指南
- 2025租房合同協議書標準版
- 2025合同管理規章:公章、資質、合同及其它證書的使用與保管辦法
- 2025投資合同轉讓協議書
- 手術室細節護理
- 2025住宅房屋租賃合同協議范本
- SH/T 1673-1999工業用環己烷
- GB/T 9661-1988機場周圍飛機噪聲測量方法
- GB 29541-2013熱泵熱水機(器)能效限定值及能效等級
- FZ/T 07019-2021針織印染面料單位產品能源消耗限額
- 重癥醫學科各項規章制度匯編
- 社會組織培訓概述課件
- 春節作文優秀課件
- 三角函數的應用論文Word版
- 農業創業風險控制與防范培訓課件
- 生物制造國內外狀況課件
- 幼兒園大班數學口算練習題可打印
評論
0/150
提交評論