仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (96.68 KB, 下載次數: 57)
下載附件
2022-3-23 22:08 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h> //聲明void _nop_(void);
- #defineuint unsigned int
- #defineuchar unsigned char
- #defineNOP() {_nop_();_nop_();_nop_();_nop_();}
- sbit PL=P1^0;
- //------LCD引腳-----
- sbit LCD_RS=P2^6; //將P2.6引腳定義為LCD寄存器選擇
- sbitLCD_RW=P2^5; //將P2.5引腳定義為LCD讀寫信號線
- sbitLCD_EN=P2^7; //將P2.7引腳定義為LCD使能端
- //------超聲波引腳-------
- sbitTx=P3^3; //觸發控制信號輸入
- sbit Rx=P3^2; //回響信號輸出
- ucharcode table[]={"Distance Test:"}; //LCD第一行顯示
- uchartemp_dis[]= {"000.0 cm"}; //LCD第二行
- longint t,distance;
- ucharcache[4]={0,0,0,0};
- //--------延時-------
- voiddelay(uint ms)
- {
- uint t;
- while(ms--)
- for(t=0;t<120;t++);
- }
- //-------讀LCD狀態-------
- ucharread_lcd_state()
- {
- uchar state;
- LCD_RS=0; //LCD選擇指令寄存器
- LCD_RW=1; //LCD進行讀操作
- LCD_EN=1; //LCD使能端為高電平
- _nop_(); // 產生一條NOP指令
- state=P0;
- LCD_EN=0; //LCD使能端為低電平
- _nop_();
- returnstate; //返回函數
- }
- //-------忙等待------
- voidlcd_busy_wait()
- {
- while((read_lcd_state() &0x80)==0x80);
- NOP();
- }
- //----------LCD寫指令----------
- voidlcd_write_com(uchar com)
- {
- lcd_busy_wait();
- LCD_RS=0; //RS為0時,寫指令,RS為1時,寫數據
- LCD_RW=0; //LCD進行寫操作
- P0=com; //把命令字送入P0
- NOP(); //延時一個機器周期1us
- LCD_EN=1;
- NOP();
- LCD_EN=0;
- }
- //----------LCD寫數據----------
- voidlcd_write_data(uchar dat)
- {
- lcd_busy_wait();
- LCD_RS=1;
- LCD_RW=0;
- P0=dat; //把要顯示的數據送入P0
- NOP();
- LCD_EN=1;
- NOP();
- LCD_EN=0;
- }
- //-------LCD初始化-------
- voidlcd_init()
- {
- LCD_EN=0;
- lcd_write_com(0x38); //LCD顯示模式設置
- lcd_write_com(0x0c); //LCD顯示開/關及光標設置
- lcd_write_com(0x06); //當寫一個字符后地址指針加1,且光標加1
- lcd_write_com(0x01); //顯示清屏
- }
- //---------設置液晶顯示位置-----------
- voidset_lcd_pos(uchar p)
- {
- lcd_write_com(p|0x80);
- }
- //---------液晶顯示程序----------
- voidlcd_print(uchar p,uchar *s,uint low)
- {
- uint num;
- set_lcd_pos(p);
- for(num=0;num<low;num++)
- {
- lcd_write_data(s[num]);
- delay(1);
- }
- }
- voidHC05_Init()
- {
- Tx=1; //觸發脈沖
- NOP();NOP();NOP();NOP();
- Tx=0;
- distance=0.1725*t; //距離計算
- }
- voiddistance_convert(long int dat)
- {
- cache[0]=dat/1000;
- cache[1]=dat/100%10;
- cache[2]=dat/10%10;
- cache[3]=dat%10;
- temp_dis[0]=cache[0]+'0';
- temp_dis[1]=cache[1]+'0';
- temp_dis[2]=cache[2]+'0';
- temp_dis[4]=cache[3]+'0';
- }
- //------------主程序-----------
- voidmain()
- {
- PL=1;
- delay(20);
- PL=1;
- delay(1000);
- PL=0;
-
- lcd_init();
- delay(5);
- TMOD=0x19;
- EA=1; //開總中斷
- TR0=1; //啟動定時器
- EX0=1; //開外部中斷
- IT0=1; //設置為下降沿中斷方式
- while(1)
- {
- HC05_Init();
- distance_convert(distance);
- lcd_print(0x01,table,14);
- lcd_print(0x44,temp_dis,8);
- }
- }
- //外部中斷0
- voidint0() interrupt 0
- {
- t=(TH0*256+TL0); //計算高電平持續的時間,上升沿到來時候開始計時,下降沿到來進入外部中斷,關閉計時器,停止計時
- TH0=0;
- TL0=0;
- }
復制代碼
51hei.png (13.39 KB, 下載次數: 58)
下載附件
2022-3-23 22:08 上傳
Keil代碼與Proteus仿真下載:
基于單片機超聲波測距系統 語音提示 程序hex 原理圖.zip
(60.45 KB, 下載次數: 163)
2018-7-3 17:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|