二、功能说明
1、采用三个超声波测距,速度快,精度高,精度1毫米。
2、按键设置设置报警距离,上限和下限。
3、LCD1602液晶显示。
4、结构简洁,稳固,高效。
本系统采用USB电源供电,提供电源线,可以插到电脑、手机充电器、充电宝上供电,十分方便。
三、按键说明
系统三个按键,从左往右风别是,设置切换、加、减。
视频演示:
制作出来的实物图如下:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
元件清单:
单片机源程序如下:
- #include<reg52.h>
- #include <intrins.h>
- #include "LCD1602.h"
- #include "STCEEPROM.h"
- sbit RX1 = P3^4;
- sbit RX2 = P3^5;
- sbit RX3 = P3^6;
- sbit TX = P3^7;
- sbit LED = P2^1;
- sbit SPEAK = P2^0;
- sbit KEY1 = P1^3;
- sbit KEY2 = P1^4;
- sbit KEY3 = P1^5;
- unsigned int time=0;
- unsigned int timer=0;
- unsigned int S=0,S1=0,S2=0,S3=0;
- unsigned int SET_H=100,SET_L=10;
- bit flag =0;
- unsigned char Table[3]={0};
- unsigned char KEY_flag=0;
- //延时函数
- void Delay_ms(int jj)
- {
- int ii;
- while(jj--)
- for(ii=0;ii<116;ii++);
- }
- 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)
- {
- LCD1602_init();//液晶初始化
- //////////////////////0123456789ABCDEF
- LCD1602_Disp_ZF(0x80," : : ",16);
- //0123456789ABCDEF
- LCD1602_Disp_ZF(0x80+0X40,"Set H: L: ",16);
- 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;
- Delay_ms(10);
- /////////////////////////////
- while(!RX2); //当RX为零时等待
- TR0=1; //开启计数
- while(RX2); //当RX为1计数并等待
- TR0=0; //关闭计数
- Conut();
- S2=S;
- Delay_ms(10);
- /////////////////////////////
- while(!RX3); //当RX为零时等待
- TR0=1; //开启计数
- while(RX3); //当RX为1计数并等待
- TR0=0; //关闭计数
- Conut();
- S3=S;
- Delay_ms(10);
- /////////////////////////////////////
- Table[0]= S1/100+0X30;
- Table[1]= S1%100/10+0X30;
- Table[2]= S1%10+0X30;
- LCD1602_Disp_ZF(0x80,Table,3);
- Table[0]= S2/100+0X30;
- Table[1]= S2%100/10+0X30;
- Table[2]= S2%10+0X30;
- LCD1602_Disp_ZF(0x86,Table,3);
- Table[0]= S3/100+0X30;
- Table[1]= S3%100/10+0X30;
- Table[2]= S3%10+0X30;
- LCD1602_Disp_ZF(0x8C,Table,3);
- /////////////////////////////////
- if((S1>SET_H||S1<SET_L)||(S2>SET_H||S2<SET_L)||(S3>SET_H||S3<SET_L))
- P2 = 0X00;
- else
- P2 = 0XFF;
- if(!KEY1)
- {
- Delay_ms(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);
- }
- if(!KEY2)
- {
- Delay_ms(10);
- if(!KEY2)
- {
- if(KEY_flag%2==0)SET_H++;
- if(KEY_flag%2==1)SET_L++;
- }
- }
- if(!KEY3)
- {
- Delay_ms(10);
- if(!KEY3)
- {
- if(KEY_flag%2==0)SET_H--;
- if(KEY_flag%2==1)SET_L--;
- }
- }
- Table[0]= SET_H/100+0X30;
- Table[1]= SET_H%100/10+0X30;
- Table[2]= SET_H%10+0X30;
- LCD1602_Disp_ZF(0x86+0x40,Table,3);
- Table[0]= SET_L/100+0X30;
- Table[1]= SET_L%100/10+0X30;
- Table[2]= SET_L%10+0X30;
- LCD1602_Disp_ZF(0x8C+0x40,Table,3);
- }
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
- {
- flag=1; //中断溢出标志
- }
- /********************************************************/
- void zd3() interrupt 3
- {
- TH1=0xf8;
- TL1=0x30;
- timer++;
- if(timer>=100)
- {
- timer=0;
- TX=1; //200MS 启动一次模块
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_();_nop_();
- _nop_(); _nop_(); _nop_();
- TX=0;
- }
- }
复制代码
所有资料51hei提供下载:
66-基于51单片机超声波三方向测距系统LCD1602资料 (1).rar
(7.63 MB, 下载次数: 103)
|