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

正文內(nèi)容

51單片機(jī)超聲波測距設(shè)計(編輯修改稿)

2025-07-26 17:45 本頁面
 

【文章內(nèi)容簡介】 sys_init()。 //初始化 display()。 //顯示 sta_flag=0。 //標(biāo)準(zhǔn)復(fù)位 waitforstarting: //檢測按鍵 while(START)。 for(i=0。i20。i++) delay1ms()。 if(START) goto waitforstarting。 BUZZER=0。 //蜂鳴器鳴音一次提示按鍵按下 i=100000。 while(i)。 BUZZER=1。 i=100000。 while(i)。 TR0=1。 //啟動定時器0 ET0=1。 testtemp()。 //啟動溫度轉(zhuǎn)換 while(1) { if(sta_flag) //60MS到了,超聲波已經(jīng)發(fā)送 { while(0==CSBIN)。 //等待超聲波返回 TR1=0。 jsh=TH1。 //停止計數(shù) jsl=TL1。 if(15==count) //1S到,檢測溫度 { temp=wd()。 count=0。 testtemp()。 //重新啟動轉(zhuǎn)換 display()。 //刷新顯示 } puter()。 //計算距離 hextobcd()。 //轉(zhuǎn)化成BCD碼 sta_flag=0。 //標(biāo)志清零 } } }void sys_init(void) { uchar i。 for(i=0。i29。i++) //顯示清零 { num[i]=0。} TMOD=0x11。 TH0=0x15。 TL0=0xA0。 P0=0。 CNT=0。 //超聲波發(fā)送關(guān)閉 CSBIN=1。 EA=1。 //開放總中斷 Init_LCD()。 } 40KHz超聲波發(fā)送程序超聲波的每過60ms發(fā)送一次,通過定時器T0中斷中發(fā)送超聲波,超聲波發(fā)送后延時一段時間后返回,防止余波被接收頭接收誤判,程序如下: /***************************************************** 定時器0溢出中斷函數(shù),每60MS溢出 *****************************************************/ void timer0(void)interrupt 1 using 0 { TH0=0x15。 TL0=0xA0。 TH1=0。 TL1=0。 sta_flag=1。 //標(biāo)志置為1 count++。 //計次單元加1 _nop_()。 //開始發(fā)送超聲波40KHz _nop_()。 _nop_()。 CNT=1。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 CNT=0。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 TR1=1。 //啟動定時器1計數(shù) delay15(50)。 //延時避開直達(dá)信號} 超聲波的接收和處理超聲波由超聲波接收頭接收,程序中通過指令: Wile(0==CSBIN);來查詢,接收到超聲波信號后往下面執(zhí)行,進(jìn)行計算處理。本設(shè)計中需注意當(dāng)距離過遠(yuǎn)或者沒有返回信號時候,定時器T1的溢出必須處理。 DS18B20溫度采集程序 DS18B20的工作流程是,初始化ROM操作指令存儲器操作指令數(shù)據(jù)傳輸。其工作時序包括:初始化時序、寫時序和讀時序。(1)DS18B20的初始化DS18B20的初始化的實質(zhì)是使DS18B20復(fù)位,主要是通過判斷存在脈沖的形式來實現(xiàn)的。首先主機(jī)發(fā)復(fù)位脈沖,即寬度范圍為的負(fù)脈沖,拉高15~90以延時等待,然后通過輸入/輸出線讀存在脈沖,為低說明存在,復(fù)位成功;否則說明不存在,復(fù)位失敗,必須對DS18B20重新初始化。/************************************* DS18B20復(fù)位函數(shù)**************************************/void Init_18B20(void)//初始化18B20 {DQ = 1。 //DQ復(fù)位 Delay(10)。 DQ = 0。 //單片機(jī)將DQ拉低 Delay(80)。 //480us DQ = 1。 //拉高總線 Delay(10)。 //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 if(DQ) flag=0。 else flag=1。 Delay(20)。 } (2)字節(jié)寫入DS18B20程序字節(jié)寫入的時序是拉低輸入/輸出線至少15以作為起始信號,按從低位到高位的順序取出欲寫入字節(jié)中的1位數(shù)據(jù),寫入輸入/輸出線,延時等待15后將輸入/輸出線拉高作為停止信號,以等待下一位的寫入。寫入程序如下:/********************字節(jié)寫入函數(shù)*****************************/void WriteOneChar(unsigned char dat)//寫一個字節(jié){ unsigned char i = 0。 for (i = 8。 i 0。 i) { DQ = 0。 DQ = datamp。0x01。 //寫入命令 Delay(5)。 DQ = 1。 dat=1。 //移位為寫入下一位準(zhǔn)備 }}(3) 字讀DS18B20程序讀取過程結(jié)合下面函數(shù)說明/********************字讀函數(shù)*****************************/uchar ReadOneChar(void)//讀一個字節(jié){ uchar i = 0。 uchar dat = 0。 for (i = 8。 i 0。 i) { DQ = 0。 // 給脈沖信號 dat = 1。 DQ = 1。 // 給脈沖信號 if(DQ) dat |= 0x80。 //拼裝處理 Delay(15)。 } return (dat)。}從上面可以看出,16位數(shù)據(jù)同樣是從低位到高位被逐一讀取的,而且讀取的溫度為補(bǔ)碼的形式,使用前必須進(jìn)行補(bǔ)碼轉(zhuǎn)換。(4) DS18B20溫度讀取函數(shù) /*****************讀取溫度函數(shù)*******************/ uint wd(void) { unsigned int a = 0, b = 0, t = 0。 Init_18B20()。 //初始化DS18B20 WriteOneChar(0xCC)。 //跳過讀序號列號的操作 WriteOneChar(0xBE)。 //讀取溫度寄存器 a = ReadOneChar()。 //讀取一個字節(jié) b = ReadOneChar()。 t = b。 t = 8。 t = t | a。 //字節(jié)合并 return (t)。 //返回結(jié)果給調(diào)用} 距離計算程序 距離計算中,實行了溫度補(bǔ)償和夾角補(bǔ)償。程序如下: /**************************************** 距離計算函數(shù) ****************************************/ void puter(void) //距離計算函數(shù) { float c,d,s。 uint t。 if(temp0x8000) //溫度大于0 c=+*temp*。 else //溫度小于0 c=*temp*。 t=jsh*256+jsl120。 //計數(shù)時間 d=(c*t*)/2。 d*=d。 //直角三角形勾股定理 s=。 //補(bǔ)償 distance=sqrt(s)。 //開方運算} 數(shù)據(jù)轉(zhuǎn)換程序經(jīng)過求的數(shù)據(jù)原碼無法直接用于顯示,必須轉(zhuǎn)換為LCD所接受的BCD碼的形式,而且在溫度補(bǔ)償和距離計算中沒有考慮小數(shù)點的存在,而實際顯示必須考慮小數(shù)和有效位數(shù),這樣就必須對數(shù)據(jù)進(jìn)行取舍。 /************************************** 數(shù)據(jù)轉(zhuǎn)換函數(shù) **************************************/ void hextobcd(void) //轉(zhuǎn)化成2進(jìn)制 { float tp。 unsigned long int tmp。 fuhao=0。 if(temp0x8000) tp=temp*。 else //溫度小于0,求補(bǔ)碼得到原碼 { bm()。 tp=temp*。 fuhao=1。 } tp*=10。 tmp=tp。 num[12]=tmp/100。 //數(shù)據(jù)轉(zhuǎn)換后放到顯示數(shù)組里面 if(fuhao) num[12]=num[12]|0x80。 //最高位加上負(fù)號 num[13]=tmp/10(tmp/100)*10。 tmp=distance。 num[25]=tmp/1000。 tmp%=1000。 num[26]=tmp/100。 tmp%=100。 num[27]=tmp/10。 tmp%=10。 num[28]=tmp/1。 } LCD顯示程序 LCD液晶顯示程序分為液晶初始化、讀忙、寫指令和寫數(shù)據(jù)操作,液晶顯示器是一塊慢器件,所以在執(zhí)行每條指令之前必須確定模塊忙標(biāo)志為低電平(不忙),否側(cè)此指令無效。液晶顯示程序如下:/************************************ LCD顯示函數(shù) **************************************/void display(void){ { uchar a,b,d。 //Init_LCD()。 Write_Comm(0x01)。//清顯示 Write_Comm(0x80)。//寫首地址 for(a=0。a16。a++) { d=dispbuf[a]。
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1