找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6186|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

超聲波測(cè)距Proteus仿真,帶lcd顯示,功能簡(jiǎn)單,單片機(jī)程序也簡(jiǎn)單

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint  unsigned int
#define uchar unsigned char
#define NOP() {_nop_();_nop_();_nop_();_nop_();}
//------LCD引腳-----
sbit lcd_rs=P0^6;
sbit lcd_en=P0^7;
//------超聲波引腳-------
sbit Tx=P3^3;  //觸發(fā)控制信號(hào)輸入
sbit Rx=P3^2;  //回響信號(hào)輸出
uchar xuehao[]={"ID:1606050220"};
uchar xingming[]={"NAME:zhoujikai"};
uchar code table[]={" Distance Test:"};  //LCD第一行顯示
uchar temp_dis[]= {"    000.0 cm"};    //LCD第二行
long int t,distance;
uchar cache[4]={0,0,0,0};
//--------延時(shí)-------
void delay(uint ms)
{
uint t;
while(ms--)
  for(t=0;t<120;t++);
}
void write_com(uchar com);//init_lcd()函數(shù)需要用到,所以先提前聲明
//************LCD1602初始化函數(shù)************************
void init_lcd()
{
write_com(0x38);    //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
write_com(0x08);    //寫(xiě)一個(gè)字符后地址指針加1
write_com(0x01);    //顯示清零,數(shù)據(jù)指針清零
write_com(0x06);    //寫(xiě)一個(gè)字符后地址指針加1
write_com(0x0c);    //關(guān)顯示,光標(biāo)不顯示不閃爍
}

//************LCD1602寫(xiě)指令函數(shù)************************
void write_com(uchar com)   //lcd1602寫(xiě)指令:rs低電平,rw低電平,en從高電平變?yōu)榈碗娖?br /> {
delay(5);
lcd_rs = 0;      // 選擇寫(xiě)指令
lcd_en = 0;      // 將使能端置0
P2 = com;      // 將要寫(xiě)的命令送到數(shù)據(jù)總線上
delay(5);      // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
lcd_en = 1;      // 由于初始化已將lcd_en置為0,使能端給一個(gè)高脈沖,
delay(5);      // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
lcd_en = 0;      // 將使能端置0以完成脈沖
}

//************LCD1602寫(xiě)數(shù)據(jù)函數(shù)************************
void write_data(uchar date)//lcd1602寫(xiě)數(shù)據(jù):rs高電平,rw低電平,en從高電平變低電平
{
delay(5);
lcd_rs = 1;      // 選擇寫(xiě)數(shù)據(jù)
lcd_en = 0;      // 將使能端置0
P2 = date;      // 將要寫(xiě)的數(shù)據(jù)送到數(shù)據(jù)總線上
delay(5);      // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
lcd_en = 1;      // 由于初始化已將lcd_en置為0,使能端給一個(gè)高脈沖,
delay(5);      // 延時(shí)5ms,待數(shù)據(jù)穩(wěn)定
lcd_en = 0;      // 將使能端置0以完成脈沖
}
//************LCD1602顯示函數(shù)******************
void lcd1602_display(uchar *q,uchar *p)//*通過(guò)指針p和q分別指向兩個(gè)數(shù)組的第一個(gè)數(shù),然后進(jìn)行數(shù)組掃描顯示,一次性顯示兩行字符
{
write_com(0x80);      // 現(xiàn)將數(shù)據(jù)指針定位到第一行第一個(gè)字處
while(*q!='\0')
{
  write_data(*q);
  q++;
  delay(1);
}
write_com(0xc0);    // 現(xiàn)將數(shù)據(jù)指針定位到第二行第一個(gè)字處
while(*p!='\0')
{
  write_data(*p);
  p++;
  delay(1);
}
}
//************LCD1602顯示歡迎函數(shù)******************
void welcome()        //掃描顯示學(xué)號(hào)加姓名,幾秒延時(shí)后結(jié)束
{
init_lcd();
lcd1602_display(xuehao,xingming);
delay(2000);   
}
void HC05_Init()                          //超聲波模塊初始化函數(shù)
{
Tx=1;      //觸發(fā)脈沖
NOP();NOP();NOP();NOP();
Tx=0;
distance=0.172*t;   //距離計(jì)算
}
void distance_convert(long int dat)             //距離計(jì)算函數(shù)
{
cache[0]=dat/1000;
cache[1]=dat/100%10;
cache[2]=dat/10%10;
cache[3]=dat%10;
temp_dis[4]=cache[0]+'0';
temp_dis[5]=cache[1]+'0';
temp_dis[6]=cache[2]+'0';
temp_dis[8]=cache[3]+'0';
}
//------------主程序-----------
void main()
{

      
        welcome();
        
        init_lcd();
        delay(5);
TMOD=0x09;        //定時(shí)器T0工作方式1  GATE0=1
EA=1;   //開(kāi)總中斷
TR0=1;   //啟動(dòng)定時(shí)器
EX0=1;   //開(kāi)外部中斷
IT0=1;   //設(shè)置為下降沿中斷方式
while(1)
{
  HC05_Init();
  distance_convert(distance);
  lcd1602_display(table,temp_dis);  
  
}
}
//外部中斷0
void int0() interrupt 0
{
t=(TH0*256+TL0); //計(jì)算高電平持續(xù)的時(shí)間,上升沿到來(lái)時(shí)候開(kāi)始計(jì)時(shí),下降沿到來(lái)進(jìn)入外部中斷,關(guān)閉計(jì)時(shí)器,停止計(jì)時(shí)
TH0=0;
TL0=0;
}


代碼很簡(jiǎn)單,lcd顯示屏直接修改程序就能顯示

全部資料51hei下載地址:
超聲波測(cè)距二代2.rar (31.12 KB, 下載次數(shù): 208)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:243394 發(fā)表于 2019-7-12 12:31 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:328380 發(fā)表于 2020-6-27 21:54 | 只看該作者
樓主,你這個(gè)protues是哪個(gè)版本的?
回復(fù)

使用道具 舉報(bào)

地板
ID:794020 發(fā)表于 2020-6-30 17:17 來(lái)自手機(jī) | 只看該作者
博主,為什么在proteus里找不到SR04
回復(fù)

使用道具 舉報(bào)

5#
ID:912079 發(fā)表于 2021-4-29 18:13 來(lái)自手機(jī) | 只看該作者
樓主牛逼,竟然仿真出來(lái)了
回復(fù)

使用道具 舉報(bào)

6#
ID:971249 發(fā)表于 2022-4-10 14:44 | 只看該作者
Proteus仿真需要用8.8版本來(lái)打開(kāi),里面有程序,如圖2
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表