freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于單片機的超聲波測距儀的設(shè)計與實現(xiàn)畢業(yè)論文-資料下載頁

2025-08-18 14:37本頁面

【導(dǎo)讀】件共同實現(xiàn)了帶溫度補償功能可報警的超聲波測距儀。我們以AT89C52作為主控芯片,通過計算超聲波往返時間從而測量與前方障礙物的距離,并在LCD顯示。然后單片機進行處理運算,把測量距離與設(shè)定的報警距離值進行比較判斷,在不同溫度下,超聲波的傳播速度是有差別的,所以我們通過DS18B20. 測溫單元進行溫度補償,減小因溫度變化引起的測量誤差,提高測量精度。儀可以實現(xiàn)4m以內(nèi)的精確測距,經(jīng)驗證誤差小于3mm。

  

【正文】 *****/ void delay_1ms(uint q) { uint i,j。 for(i=0。iq。i++) for(j=0。j120。j++)。 } /**********************處理距離函數(shù) ***************************/ void smg_display() { dis_smg[0] = smg_du[distance % 10]。 dis_smg[1] = smg_du[distance / 10 % 10]。 dis_smg[2] = smg_du[distance / 100 % 10] amp。 0x7f。 } /***************把數(shù)據(jù)保存到單片機內(nèi)部 eeprom中 ****************/ void write_eeprom() 34 { SectorErase(0x2020)。 byte_write(0x2020, set_d % 256)。 byte_write(0x2020, set_d / 256)。 byte_write(0x2058, a_a)。 } /******************把數(shù)據(jù)從單片機內(nèi)部 eeprom中讀出來 *****************/ void read_eeprom() { set_d = byte_read(0x2020)。 set_d = 8。 set_d |= byte_read(0x2020)。 a_a = byte_read(0x2058)。 } /**************開機自檢 eeprom初始化 *****************/ void init_eeprom() { read_eeprom()。 //先讀 if(a_a != 1) //新的單片機初始單片機內(nèi)問 eeprom { set_d = 50。 a_a = 1。 write_eeprom()。 } } /********************獨立按鍵程序 *****************/ uchar key_can。 //按鍵值 void key() //獨立按鍵程序 { static uchar key_new。 key_can = 20。 //按鍵值還原 P2 |= 0x07。 if((P2 amp。 0x07) != 0x07) //按鍵按下 35 { delay_1ms(1)。 //按鍵消抖動 if(((P2 amp。 0x07) != 0x07) amp。amp。 (key_new == 1)) { //確認是按鍵按下 key_new = 0。 switch(P2 amp。 0x07) { case 0x06: key_can = 3。 break。 //得到 k2 鍵值 case 0x05: key_can = 2。 break。 //得到 k3 鍵值 case 0x03: key_can = 1。 break。 //得到 k4 鍵值 } } } else key_new = 1。 } /*******************數(shù)碼管的位選 ******************/ void smg_we_switch(uchar i) { switch(i) { case 0: smg_we1 = 0。 smg_we2 = 1。 smg_we3 = 1。 smg_we4 = 1。 break。 case 1: smg_we1 = 1。 smg_we2 = 0。 smg_we3 = 1。 smg_we4 = 1。 break。 case 2: smg_we1 = 1。 smg_we2 = 1。 smg_we3 = 0。 smg_we4 = 1。 break。 case 3: 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) 36 i = 0。 smg_we_switch(i)。 //位選 P1 = dis_smg[i]。 //段選 } /***********************18b20 初始化函數(shù) ************************/ void init_18b20() { bit q。 dq = 1。 //把總線拿高 delay_uint(1)。 //15us dq = 0。 //給復(fù)位脈沖 delay_uint(80)。 //750us dq = 1。 //把總線拿高 等待 delay_uint(10)。 //110us q = dq。 //讀取 18b20 初始化信號 delay_uint(20)。 //200us dq = 1。 //把總線拿高 釋放總線 } /*******************寫 18b20 內(nèi)的 數(shù)據(jù) *********************/ void write_18b20(uchar dat) { uchar i。 for(i=0。i8。i++) { //寫數(shù)據(jù)是低位開始 dq = 0。 //把總線拿低寫時間隙開始 dq = dat amp。 0x01。 //向 18b20 總線寫數(shù)據(jù)了 delay_uint(5)。 // 60us dq = 1。 //釋放總線 dat = 1。 } } /*******************讀取 18b20 內(nèi)的數(shù)據(jù) *********************/ uchar read_18b20() 37 { uchar i,value。 for(i=0。i8。i++) { dq = 0。 //把總線拿低讀時間隙開始 value = 1。 //讀數(shù)據(jù)是低位開始 dq = 1。 //釋放總線 if(dq == 1) //開始讀寫數(shù)據(jù) value |= 0x80。 delay_uint(5)。 //60us 讀一個時間隙最少要保持 60us 的時間 } return value。 //返回數(shù)據(jù) } /******************讀取溫度的值 、 讀出來的是小數(shù) ***************/ uint read_temp() { uint value。 uchar low。 //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會影響到 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 *= 。 //轉(zhuǎn)換到溫度值 38 return value。 //返回讀出的溫度 } /*********************小延時函數(shù) ********************/ void delay() { _nop_()。 //執(zhí)行一條 _nop_()指令就是 1us _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 } /*********************超聲波測距程序 ************************/ void send_wave() { c_send = 1。 //10us 的高電平觸發(fā) delay()。 c_send = 0。 TH0 = 0。 //給定時器 0 清零 TL0 = 0。 TR0 = 0。 //關(guān)定時器 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_time0 40000)) //當(dāng)超聲波超過測量范圍時,顯示 3 個 888 { 39 TR0 = 0。 flag_csb_juli = 2。 distance = 888。 break 。 } else { flag_csb_juli = 1。 } } if(flag_csb_juli == 1) { TR0=0。 //關(guān) 定時器 0 定時 distance =flag_time0。 //讀出定時器 0 的時間 // distance *= 340 / 2 * 。 // = 340M / 2 = 170M = 算出來是米 if(temperature = 45) distance *= wendu_buchang1[temperature] / * 。 // = 340M / 2 = 170M = 算出來是米 else distance *= 358 / * 。 // = 340M / 2 = 170M = 算出來是米 if((distance 500)) //距離 = 速度 * 時間 { distance = 888。 //如果大于 } } } /*********************定時器 0、定時器 1 初始化 ******************/ void time_init() { EA = 1。 //開總中斷 TMOD = 0X11。 //定時器 0、定時器 1 工作方式 1 40 ET0 = 1。 //開定時器 0 中斷 TR0 = 1。 //允許定時器 0 定時 ET1 = 1。 //開定時器 1 中斷 TR1 = 1。 //允許定時器 1 定時 1 } /****************按鍵處理數(shù)碼管顯示函數(shù) ***************/ void key_with() { if(key_can == 1) //設(shè)置鍵 { menu_1 ++。 if(menu_1 = 3) { menu_1 = 0。 smg_i = 3。 //只顯示 3 位數(shù)碼管 } if(menu_1 == 1) { smg_i = 4。 //只顯示 4 位數(shù)碼管 } } if(menu_1 == 1) //設(shè)置報警 { if(key_can == 2) { set_d ++ 。 //加 1 if(set_d 400) set_d = 400。 } if(key_can == 3) { set_d 。 //減 1 if(set_d = 1) 41 set_d = 1。 } dis_smg[0] = smg_du[set_d % 10]。 //取小數(shù)顯示 dis_smg[1] = smg_du[set_d / 10 % 10] 。 //取個位顯示 dis_smg[2] = smg_du[set_d / 100 % 10] amp。 0x7f 。 //取十位顯示 dis_smg[3] = 0x88。 //a write_eeprom()。 //保存數(shù)據(jù) } } /****************報警函數(shù) ***************/ void clock_h_l() { s
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1