這是一個基于51單片機設計的超聲波四方向測距系統,能夠在LCD1602上顯示四路的距離,通過調試,可以執行。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (57.67 KB, 下載次數: 65)
下載附件
2018-6-20 03:16 上傳
0.png (28.5 KB, 下載次數: 62)
下載附件
2018-6-20 03:16 上傳
0.png (57.71 KB, 下載次數: 68)
下載附件
2018-6-20 03:17 上傳
單片機源程序如下:
- #include "LCD1602DRV.h"
- #include "STCEEPROM.h"
- sbit RX1 = P3^3;
- sbit RX2 = P3^4;
- sbit RX3 = P3^5;
- sbit RX4 = P3^6;
- sbit TX = P3^7;
- sbit LED3 = P2^2;
- sbit LED2 = P2^1;
- sbit LED1 = P2^0;
- sbit SPEAK = P2^3;
- sbit KEY1 = P1^3;
- sbit KEY2 = P1^4;
- sbit KEY3 = P1^5;
- uint time=0;
- uint timer=0;
- uint S=0,S1=0,S2=0,S3=0,S4=0;
- bit flag =0;
- uchar KEY_flag=0;
- //延時函數
- void Conut(void)
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- S=(time*1.87)/100; //算出來是CM
- if((S>=700)||flag==1) //超出測量范圍顯示“-”
- {
- flag=0;
- }
- }
- void main(void)
- {
- uint SET_H=90,SET_L=30;
- LCD1602_Init();//液晶初始化
- SetRowCol(0,0);
- printf("000 000 000 000");
- SetRowCol(1,0);
- printf("Set H: L: ");
- TMOD=0x11; //設T0為方式1,GATE=1;
- TH0=0;
- TL0=0;
- TH1=0xf8; //2MS定時
- TL1=0x30;
- ET0=1; //允許T0中斷
- ET1=1; //允許T1中斷
- TR1=1; //開啟定時器
- EA=1; //開啟總中斷
- EA=0;
- //SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);
- //SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);
- EA=1;
- while(1)
- {
- while(!RX1); //當RX為零時等待
- TR0=1; //開啟計數
- while(RX1); //當RX為1計數并等待
- TR0=0; //關閉計數
- Conut();
- S1=S;
- /////////////////////////////
- while(!RX2); //當RX為零時等待
- TR0=1; //開啟計數
- while(RX2); //當RX為1計數并等待
- TR0=0; //關閉計數
- Conut();
- S2=S;
- /////////////////////////////
- while(!RX3); //當RX為零時等待
- TR0=1; //開啟計數
- while(RX3); //當RX為1計數并等待
- TR0=0; //關閉計數
- Conut();
- S3=S;
- /////////////////////////////
- while(!RX4); //當RX為零時等待
- TR0=1; //開啟計數
- while(RX4); //當RX為1計數并等待
- TR0=0; //關閉計數
- Conut();
- S4=S;
- /////////////////////////////////////
- SetRowCol(0,0);
- printf("%3d",S1);
- SetRowCol(0,4);
- printf("%3d",S2);
- SetRowCol(0,8);
- printf("%3d",S3);
-
- SetRowCol(0,12);
- printf("%3d",S4);
- /////////////////////////////////
- if((S1>SET_H)&&(S2>SET_H)&&(S3>SET_H)&&(S4>SET_H))//遠,不報警
- {
- LED1=0;LED2=1;LED3=1;SPEAK=0;
- delayms(10);
- }
- if((S1<SET_H&&S1>SET_L)||(S2<SET_H&&S2>SET_L)||(S3<SET_H&&S3>SET_L)||(S4<SET_H&&S4>SET_L))//中,警告
- {
- LED1=1;LED2=1;LED3=0;SPEAK=1;
- delayms(10);
- }
- if((S1<SET_L)||(S2<SET_L)||(S3<SET_L)||(S4<SET_L))//近,報警
- {
- LED1=1;LED2=0;LED3=1;SPEAK=1;
- delayms(10);
- }
- if(!KEY1)
- {
- delayms(10);
- if(!KEY1)
- {
- KEY_flag++;
- ISP_ERASE(0x2c00); //注意:字節編程時必須要先要擦除整個扇區
- ISP_PROGRAM(0x2c00, SET_H/256);
- ISP_PROGRAM(0x2c01, SET_H);
- ISP_PROGRAM(0x2c02, SET_L/256);
- ISP_PROGRAM(0x2c03, SET_L);
- }
- while(!KEY1);
- delayms(10);
- }
- if(!KEY2)
- {
- delayms(10);
- if(!KEY2)
- {
- if(KEY_flag%2==0)SET_H++;
- if(KEY_flag%2==1)SET_L++;
- }
- while(!KEY2);
- delayms(10);
- }
- if(!KEY3)
- {
- delayms(10);
- if(!KEY3)
- {
- if(KEY_flag%2==0)SET_H--;
- if(KEY_flag%2==1)SET_L--;
- }
- while(!KEY3);
- delayms(10);
- }
- SetRowCol(1,6);
- printf("%03d",SET_H);
- SetRowCol(1,12);
- printf("%03d",SET_L);
- }
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
- {
- flag=1; //中斷溢出標志
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載(仿真+源代碼):
keil.zip
(167.1 KB, 下載次數: 117)
2018-6-19 17:43 上傳
點擊文件名下載附件
四路超聲波測距儀加顯示 下載積分: 黑幣 -5
|