哪位高手有51单片机超声波模块测距LCD1602显示的电路图和C程序,跪求!!!!(超声波模块是买好的那种)

发布于2022-01-13 15:46:18
4个回答
admin
网友回答2022-01-13
#include"reg52.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int uchar code table[]={ '0','1','2','3','4','5','6','7','8','9' };// 显示段码值0123456789 sbit LCD_EN=P3^4; //定义LCD使能端 sbit LCD_RS=P3^5; //定义LCD读写端 sbit dula=P2^6; //数码管段先端 sbit wela=P2^7; //数码管位先端 /***********************************************/ /**********超声波检测引脚和变量定义*******************************/ sbit Trig=P2^4;// 定义HC-SR04发送端 sbit Echo=P2^5;//定义HC-SR04接收端 uint gewei='0'; //测量距离的个位 uint shiwei='0'; // 测量距离的十位 uint baiwei='0'; //测量距离的百位 uint qianwei='0'; uint s,time,flag; /***********************************************/ /**********延时MS函数*******************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /***********************************************/ /**********延时uS函数*******************************/ void delay_uS(uint z) { while(z--); } /**********************************************8/ /**********写命令*******************************/ void write_com(uchar com) { LCD_RS=0; LCD_EN=0; delay(5); P0=com; LCD_EN=1; delay(5); LCD_EN=0; } void write_data(uchar date) { LCD_RS=1; LCD_EN=0; delay(5); P0=date; LCD_EN=1; delay(5); LCD_EN=0; } /**********************************************/ /***********************************************/ /**********LCD1602初始化函数*******************************/ void init() { dula=0; wela=0; LCD_EN=0; write_com(0x38); //设置16X2显示,5X7点阵显示 write_com(0x0c); //开显示,不显光标 write_com(0x06); //显示一个字符后,地址指针加1且光标加1 write_com(0x01); //清屏 delay(5); write_com(0x80+1); //从第一行0X10地址位开始显示 } /***********************************************/ /**********计算距离函数*******************************/ void count(void) { time=TH0*256+TL0; //检测 所需时间 TH0=0; TL0=0; s=time*0.17*1.136*0.9674;// 计算距离,算出来的单位是CM gewei=table[s%10]; shiwei=table[s/10%10]; baiwei=table[s/100%10]; qianwei=table[s/1000]; } /***********************************************/ /**********T0中断函数*******************************/ void Time0() interrupt 1 //T0中断用作计数器溢出,超出测距范围 { flag=1; //中断溢出标志 } /***********************************************/ /**********启动模块函数*******************************/ void startmodle(void) //启动检测模块 { uchar i; // for(i=0;i<10;i++) // { Trig=1; //启动一次检测模块 delay_uS(20); Trig=0; //停止向检测模块Trig端发送高电平 } //} /***********************************************/ /**********中断初始化函数*******************************/ void InterruptInit(void) //中断初始化 { TMOD=0x01; //高T0工作方式为方式1,GATE=1 TH0=0; TL0=0; ET0=1; //允许T0中断 EA=1; // 开启总中断 } /***********************************************/ /**********显示函数*******************************/ void Display(void) { write_com(0x80+1); write_data(qianwei); write_com(0x80+2); write_data('.'); write_com(0x80+3); write_data(baiwei); write_com(0x80+4); write_data(shiwei); write_com(0x80+5); write_data(gewei); write_com(0x80+6); write_data('M'); } /***********************************************/ /**********主函数*******************************/ void main(void) { init(); //初始化LCD1602 while(1) { Display(); // 显示 距离,以M为单位 InterruptInit(); //中断初始化 startmodle(); // 启动检测模块 while(!Echo); //当接收为零时等待 TR0=1; //开启计数 while(Echo); //当接收为1计数并等待 TR0=0; //关闭计数 count(); //计算距离 Display(); // 显示 距离,以M为单位 delay(500); //延时80MS } }
admin
网友回答2022-01-13
超声波模块一般会配套相应的应用程序的,你找卖家要相关的程序资料就是。
admin
网友回答2022-01-13
1602液晶显示 的超声波模块程序 接口程序里边都有、、 #include //#include #include #define uchar unsigned char #define uint unsigned int sbit lcdrs=p2^3; sbit lcden=p2^2; sbit trig=p2^0; //超声波发送 //sbit echo=p3^2; //超声波接受 //p0____________db0-db7 uchar dis[]="disp_hc-sr04"; uchar num[]="0123456789"; uint distance; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=121;y>0;y--); } void hc_init() { tmod=0x09; tr0=1; th0=0;tl0=0; } uint hc_jisuan() { uint dist,timer; timer=th0; timer<<=8; timer=timer|tl0; dist=timer/53; //晶振11.0592mhz 距离cm=微秒us/58 return dist; //1个机器周期是12个时钟周期 timer*12/(58*11.0592)=timer/53 } void hc_run() { uint temph=0x00,templ=0x00; th0=0;tl0=0; trig=0; trig=1; delay(1); trig=0; while((th0-temph!=0||tl0-templ!=0)||(th0==0&&tl0==0)) { temph=th0; templ=tl0; } delay(1); } void lcd_write_com(uchar com) //lcd写指令 { lcdrs=0; p0=com; delay(1); lcden=1; delay(1); lcden=0; } void lcd_write_data(uchar date) //lcd写数据 { lcdrs=1; p0=date; delay(1); lcden=1; delay(1); lcden=0; } void lcd_init() //lcd初始化 { lcden=0; lcd_write_com(0x38); lcd_write_com(0x0c); lcd_write_com(0x06); lcd_write_com(0x01); } void lcd_display(uchar temp) { uint i; lcd_write_com(0x82); for(i=0;i<12;i++) { lcd_write_data(dis[i]); } lcd_write_com(0x80+0x41); lcd_write_data('d'); lcd_write_data('i'); lcd_write_data('s'); lcd_write_data('t'); lcd_write_data('a'); lcd_write_data('n'); lcd_write_data('c'); lcd_write_data('e'); lcd_write_data(':'); lcd_write_data(num[temp/100]); lcd_write_data(num[temp/10%10]); lcd_write_data(num[temp%10]); lcd_write_data('c'); lcd_write_data('m'); } void main() { lcd_init(); hc_init(); while(1) { hc_run(); distance=hc_jisuan(); lcd_display(distance); delay(200); } }
admin
网友回答2022-01-13
我有个 怎么发给你啊 我很少百度 见我百度名字哈

回到
顶部