版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔傾情為你奉上精選優(yōu)質(zhì)文檔傾情為你奉上專心專注專業(yè)專心專注專業(yè)精選優(yōu)質(zhì)文檔傾情為你奉上專心專注專業(yè)指導(dǎo)教師評定成績: 審定成績: 自 動 化 學(xué) 院計算機控制技術(shù)課程設(shè)計報告 設(shè)計題目:基于單片機的超聲波測距系統(tǒng)設(shè)計單位(二級學(xué)院): 學(xué) 生 姓 名: 專 業(yè): 班 級: 學(xué) 號: 指 導(dǎo) 教 師: 負(fù) 責(zé) 項 目: 設(shè)計時間:二一四 年 五 月自動化學(xué)院制目錄TOC o 1-3 u 一、設(shè)計題目 定時器模塊。TO定時器用于超聲波測距的計時。T1定時器用于主程序掃 描時間的控制。(2)主程序源代碼 void main()send_wave(); /測距離函數(shù)smg_display()
2、; /處理距離顯示函數(shù)time_init(); /定時器初始化init_eepom(); /初始化eepom(讀取set_d)while(1)if(flag_300ms = 1) /300ms執(zhí)行一次flag_300ms = 0;clock_h_l(); /報警函數(shù)send_wave(); /測距離函數(shù)if(menu_1 = 0) /沒有鍵按下時才給緩沖數(shù)組賦新值smg_display(); /處理距離顯示函數(shù)if(zd_break_en = 1) /自動退出設(shè)置界面程序zd_break_value +; /每300ms加一次if(zd_break_value 100) /30秒后自動退出設(shè)置
3、界面menu_1 = 0; smg_i = 3;zd_break_en = 0;zd_break_value = 0; key(); /按鍵檢測函數(shù)if(key_can P32* 超聲波接收=P33 按鍵用的接口是P2口*待改進的地方:溫度補償,提高精度*當(dāng)前的缺陷: 不能測出4m的距離*測量單位:米(m)*/#include #include #include #include #define uchar unsigned char #define uint unsigned int/數(shù)碼管段選定義 設(shè) 0 1 2 3 4 5 6 7 8 9uchar code smg_duan=0 xc0
4、,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/數(shù)碼管位選uchar dis_smg4 =0,1,2,3;sbit smg_we1 = P34; /數(shù)碼管位選端口sbit smg_we2 = P35;sbit smg_we3 = P36;sbit smg_we4 = P37;sbit c_send = P31; /超聲波發(fā)射sbit c_recive = P30; /超聲波接收uchar flag_hc_value; /超聲波中間變量sbit beep = P23; /蜂鳴器IO口定義uchar smg_i = 3; /顯示數(shù)碼管
5、的個數(shù):3bit flag_300ms ; /主程序300ms處理一次的標(biāo)識符 bit key_500ms ; /按鍵程序500ms處理一次的標(biāo)識符long distance; /定義測量距離uint set_d; /定義設(shè)定距離uchar flag_csb_juli; /超聲波超出量程 long flag_time0; /按鍵的IO變量的定義uchar key_can; /按鍵值的變量uchar zd_break_en,zd_break_value; /自動退出設(shè)置界面uchar menu_ljsd = 10; /用來控制連加的速度bit flag_lj_en; /按鍵連加使能bit fla
6、g_lj_3_en; /按鍵連3次連加后使能 加的數(shù)就越大了 uchar key_time; /定時器用,作為連加的中間變量,按鍵時間uchar flag_value;/定時器用,作為連加的中間變量uchar menu_1; /菜單設(shè)計的變量uchar a_a; /設(shè)定值寫入單片機標(biāo)志符/*數(shù)碼管位選函數(shù)*/void smg_we_switch(uchar i)switch(i)case 3: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;case 2: smg_we1 = 1; smg_we2 = 0; smg_we3 =
7、 1; smg_we4 = 1; break;case 1: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;case 0: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;/*數(shù)碼管顯示函數(shù)*/void display()static uchar i; i+;if(i = smg_i) /smg_i=3,i = 0;smg_we_switch(i); /調(diào)用位選函數(shù)P1 = dis_smgi; /段選 /*把數(shù)據(jù)保存到單片機內(nèi)部eepom中*/void wr
8、ite_eepom()SectorErase(0 x2000);byte_write(0 x2000, set_d % 256);/寫入set_d值byte_write(0 x2001, set_d / 256);byte_write(0 x2058, a_a);/a_a標(biāo)識符/*把數(shù)據(jù)從單片機內(nèi)部eepom中讀出來*/void read_eepom()set_d = byte_read(0 x2001);/讀出set_d值set_d = 5) /確認(rèn)無鍵按下key_value = 0;key_new = 1; /置位key_new,表初始無鍵按下flag_lj_en = 0; /關(guān)閉連加的使
9、能flag_lj_3_en = 0; /關(guān)閉3秒后連加的使能flag_value = 0; /連加變量清零key_time = 0; write_eepom(); /值(set_d)寫入單片機else /初始無鍵按下if(P2 & 0 x07) != 0 x07) /按鍵檢測(5次)key_value +; else key_value = 0;if(key_value = 5) /確認(rèn)按鍵key_value = 0;key_new = 0;flag_lj_en = 1; /連加使能zd_break_en = 1; /自動退出設(shè)置界使能zd_break_value = 0; /自動退出設(shè)置界變
10、量清零,30秒后退出設(shè)置界面key_can = 20;if(key_500ms = 1) /連按500ms,啟動連加key_500ms = 0;key_new = 0;key_old = 1;zd_break_value = 0; /自動退出設(shè)置界變量清零,30秒后退出設(shè)置界面if(key_new = 0) & (key_old = 1) /確認(rèn)有鍵按下switch(P2 & 0 x07)case 0 x06: key_can = 1; break; /得到k2鍵值(設(shè)定鍵)case 0 x05: key_can = 2; break; /得到k3鍵值(加)case 0 x03: key_ca
11、n = 3; break; /得到k4鍵值(減) key_old = key_new; /初始化標(biāo)識符/*按鍵處理數(shù)函數(shù)*/void key_with()if(key_can = 1) /得到k2鍵值(設(shè)定鍵)menu_1 +;if(menu_1 = 2)menu_1 = 0;if(menu_1 = 0) /退出設(shè)定界面menu_ljsd = 10; /連加速度控制變量(復(fù)位為500ms)dis_smg0 = smg_duandistance % 10; /測量值顯示用dis_smg1 = smg_duandistance / 10 % 10 ; dis_smg2 = smg_duandist
12、ance / 100 % 10 & 0 x7f; smg_i = 3;if(menu_1 = 1) /設(shè)置界面menu_ljsd = 1; /連加速度變量(50ms)dis_smg0 = smg_duanset_d % 10; /設(shè)定值顯示用dis_smg1 = smg_duanset_d / 10 % 10; dis_smg2 = smg_duanset_d / 100 % 10 & 0 x7f ; dis_smg3 = 0 x88;smg_i = 4; /A,設(shè)定值修改標(biāo)識符if(menu_1 = 1) /設(shè)置報警值if(flag_lj_3_en = 0) /三次連加之后速度加快menu_
13、ljsd = 10 ; /500ms 加減一次else menu_ljsd = 1; /50ms 加減一次if(key_can = 2) /得到k3鍵值(加)set_d + ; if(set_d 350)set_d = 350;dis_smg0 = smg_duanset_d % 10; /設(shè)定值顯示dis_smg1 = smg_duanset_d / 10 % 10 ; dis_smg2 = smg_duanset_d / 100 % 10 & 0 x7f; dis_smg3 = 0 x88;if(key_can = 3) /得到k4鍵值(減)set_d - ; if(set_d =0;i-
14、) _nop_(); /執(zhí)行一條_nop_()指令就是1us /*超聲波測距程序*/void send_wave()long temp = 888;c_send = 1; /10us的高電平觸發(fā) delay();c_send = 0; TH0 = 0; /給定時器0清零TL0 = 0;TR0 = 0; /關(guān)定時器0定時flag_hc_value = 0;while(!c_recive); /當(dāng)c_recive為零時等待TR0=1;while(c_recive) /當(dāng)c_recive為1計數(shù)并等待flag_time0 = TH0 * 256 + TL0;if(flag_hc_value 1) |
15、 (flag_time0 21000) /當(dāng)超聲波超過測量范圍時,顯示3個888TR0 = 0;flag_csb_juli = 2;temp = 888;flag_hc_value = 0;break ;else flag_csb_juli = 1;if(flag_csb_juli = 1) /距離處理TR0=0; /關(guān)定時器0定時EA = 0;temp = TH0; /讀出定時器0的時間temp = temp * 256 + TL0;temp /= 59; /HC-SR04超聲波模塊 距離(厘米)=T*uS/58.823EA = 1;if(temp 380) /如果大于3.8m就超出超聲波的
16、量程temp = 888; EA = 0;distance = temp; /距離 EA = 1;/*冒泡排序(最大值沉底)*/int iBuff5;void choise(int *a,int n) /選擇法排序 int i,j,k,temp; for(i=0;in-1;i+) k=i; /給記號賦值 for(j=i+1;jaj) k=j; /是k總是指向最小元素*/ if(i!=k) /當(dāng)k!=i是才交換,否則ai即為最小 temp=ai; ai=ak; ak=temp; /*測量距離處理及顯示函數(shù)*/void smg_display()int Buff5;char i;if(distan
17、ce = 95)return; /95去掉iBuff4 = iBuff3;iBuff3 = iBuff2;iBuff2 = iBuff1;iBuff1 = iBuff0;iBuff0 = (int)distance;for(i = 0; i5; i+) Buffi = iBuffi;choise(Buff,5); /調(diào)用choise函數(shù),冒泡排序distance = (long)Buff2; /取得排序后5值的中間值,以消弱誤觸,穩(wěn)定測量結(jié)果 EA = 0; /關(guān)中斷dis_smg0 = smg_duandistance % 10; /取百分位(厘米級)dis_smg1 = smg_duand
18、istance / 10 % 10; /取十分位(分米級)dis_smg2 = smg_duandistance / 100 % 10 & 0 x7f; /取個 位(米級)EA = 1; /開中斷/*報警函數(shù)*/void clock_h_l()static uchar value;if(distance = 5)beep = beep; /蜂鳴器報警else value = 0; beep = 1; /取消報警void main()send_wave(); /測距離函數(shù)smg_display(); /處理距離顯示函數(shù)time_init(); /定時器初始化init_eepom(); /初始化eepom(讀取set_d)while(1)if(flag_300ms = 1) /300ms執(zhí)行一次flag_300ms = 0;clock_h_l(); /報警函數(shù)send_wave(); /測距離函數(shù)if(menu_1 = 0) /沒有鍵按下時才給緩沖數(shù)組賦新值smg_display(); /處理距離顯示函數(shù)if(zd_break_en = 1) /自動退出設(shè)置界面程序zd_break_value +; /每300ms加一次if(zd_break_value 100) /30秒后自動退出設(shè)置界面menu_1 = 0; smg_i = 3;zd_bre
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆河北唐山市樂亭第一中學(xué)高三數(shù)學(xué)第一學(xué)期期末調(diào)研模擬試題含解析
- 能干的小手課件
- 農(nóng)產(chǎn)品加工借款居間協(xié)議
- 時尚買手店裝修工程
- 大宗農(nóng)產(chǎn)品運輸協(xié)議樣本
- 保健食品代理運輸合同范本
- 產(chǎn)業(yè)園綠化設(shè)計合同樣書
- 低碳環(huán)保用地居間協(xié)議范例
- 體育賽事服務(wù)居間合同范本
- 4S店裝修大包合同范本
- 送貨簡易合同范本(2篇)
- 3-4單元測試-2024-2025學(xué)年統(tǒng)編版語文六年級上冊
- 2024-2030年中國濱海旅游行業(yè)發(fā)展分析及投資戰(zhàn)略研究咨詢報告
- 八年級物理第一次月考卷(考試版A3)(遼寧專用人教版2024第1~3章第2節(jié))
- 2024-2030年中國農(nóng)村商業(yè)銀行行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資前景研究報告
- 2024至2030年中國商業(yè)POS機行業(yè)現(xiàn)狀調(diào)研及未來發(fā)展展望報告
- 2024年新青島版六年級上冊(六三制)科學(xué)全冊知識點
- 公共衛(wèi)生突發(fā)事件應(yīng)急處理與防治考核試卷
- 5.2 外力作用與地表形態(tài)高三地理一輪復(fù)習(xí)課件
- NB/T 11446-2023煤礦連采連充技術(shù)要求
- 護理美學(xué)-第一章 美學(xué)概述
評論
0/150
提交評論