視頻鏈接:https://www.bilibili.com/video/BV1ik4y1677Q
#include #include #define uchar unsigned char #define uint unsigned int #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^2; sbit LCD1602_RW=P2^1; sbit LCD1602_RS=P2^0; sbit Trig = P1^0; sbit Echo = P1^1; unsigned long S=0; bit flag =0; unsigned int DIstance,time; /******************************************************************************* * 函 數 名 : Lcd1602_Delay1ms * 函數功能 : 延時函數,延時1ms * 輸 入 : c * 輸 出 : 無 * 說 名 : 該函數是在12MHZ晶振下,12分頻單片機的延時。 *******************************************************************************/ void Lcd1602_Delay1ms(uint c) //誤差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 數 名 : LcdWriteCom * 函數功能 : 向LCD寫入一個字節的命令 * 輸 入 : com * 輸 出 : 無 *******************************************************************************/ void LcdWriteCom(uchar com) //寫入命令 { LCD1602_E = 0; //使能 LCD1602_RS = 0; //選擇發送命令 LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = com; //放入命令 Lcd1602_Delay1ms(1); //等待數據穩定 LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); //保持時間 LCD1602_E = 0; } /******************************************************************************* * 函 數 名 : LcdWriteData * 函數功能 : 向LCD寫入一個字節的數據 * 輸 入 : dat * 輸 出 : 無 *******************************************************************************/ void LcdWriteData(uchar dat) //寫入數據 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //選擇輸入數據 LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = dat; //寫入數據 Lcd1602_Delay1ms(1); LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); //保持時間 LCD1602_E = 0; } /******************************************************************************* * 函 數 名 : LcdInit() * 函數功能 : 初始化LCD屏 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x38); //開顯示 LcdWriteCom(0x0c); //開顯示不顯示光標 LcdWriteCom(0x06); //寫一個指針加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //設置數據指針起點 } //按指定位置顯示一個字符 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40; X |= 0x80; // 算出指令碼 LcdWriteCom(X); //這里不檢測忙信號,發送地址碼 LcdWriteData(DData); } //按指定位置顯示一串字符 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) { unsigned char ListLength; ListLength = 0; Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到達字串尾則退出 { if (X <= 0xF) //X坐標應小于0xF { DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符 ListLength++; X++; } } } void StartModule() //啟動模塊 { Trig=1; //啟動一次模塊 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0; } void Conut(void) { StartModule(); while(!Echo); //當RX為零時等待 TR0=1; //開啟計數 while(Echo); //當RX為1計數并等待 TR0=0; //關閉計數 time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100; //算出來是CM DIstance = S; if((S?>=700)||flag==1) //超出測量范圍顯示“-” { flag=0; DisplayOneChar(0, 1, '0'); DisplayOneChar(1, 1, '.'); //顯示點 DisplayOneChar(2, 1, '0'); DisplayOneChar(3, 1, '0'); DisplayOneChar(4, 1, 'M'); //顯示M } else { DisplayOneChar(0, 1, (char)(S/100+'0')); DisplayOneChar(1, 1, '.'); //顯示點 DisplayOneChar(2, 1, (char)(S/10%10+'0')); DisplayOneChar(3, 1, (char)(S%10+'0')); DisplayOneChar(4, 1, 'M'); //顯示M } } void zd0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍 { flag=1; //中斷溢出標志 } void Sr04_Init() { TMOD=0x01; //設T0為方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允許T0中斷 EA=1; //開啟總中斷 } void main() { Sr04_Init(); LcdInit(); DisplayListChar(0,0,"Welcome"); while(1) { Conut(); } }
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Proteus
+關注
關注
79文章
1692瀏覽量
106370 -
中斷
+關注
關注
5文章
895瀏覽量
41391 -
超聲波測距
+關注
關注
5文章
246瀏覽量
37860
發布評論請先 登錄
相關推薦
超聲波測距原理
為此,文中嘗試以單片機AT89S52為核心,利用一對40 kHz壓電超聲傳感器設計一款體積較小、價格低廉、精度較高、具有溫度補償、實時LCD顯示和報警的超聲波測距儀。1
發表于 04-25 11:32
Proteus中的超聲波測距
本帖最后由 huhaihang 于 2015-4-11 16:21 編輯
求高手幫忙,誰會在Proteus中仿真超聲波測距?請指教,謝謝!
發表于 04-11 15:55
基于STM32超聲波測距設計的合集
ARM內核芯片STM32F103ZET6的32位嵌入式微處理器與帶有溫度補償的US-100超聲波測距模塊實現聲波測距。STM32的串口資源相當豐富,能提供5路串口,通過微處理器的串口實
發表于 09-05 16:13
評論