超声波模块显示程序
超声波模块测试程序

//超声波模块显示程序#include <reg52.h> //包括一个52标准内核的头文件#include "lcd1602.h"#include "delay.h"#include "isd1820.h"uint distance[4]; //测距接收缓冲区uchar ge,shi1,bai,temp,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag=0; //测量成功标志void chulishuju();/***********************排序函数**************************/ void pai_xu(){uint t;if (distance[0]>distance[1]){t=distance[0];distance[0]=distance[1];distance[1]=t;}if(distance[0]>distance[2]){t=distance[2];distance[2]=distance[0];distance[0]=t;}if(distance[1]>distance[2]){t=distance[1];distance[1]=distance[2];distance[2]=t;}}void chulishuju(){uint distance_data,a,b;uchar CONT_1;i=0;if(succeed_flag==1){distance_data=outcomeH; //测量结果的高8位distance_data<<=8; //放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12; //因为定时器默认为12分频distance_data/=58; //微秒的单位除以58等于厘米} //为什么除以58等于厘米,Y米=(X秒*344)/2// X秒=(2*Y米)/344 ==》X秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零}distance[i]=distance_data; //将测量结果的数据放入缓冲区i++;if(i==3){distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;pai_xu();distance_data=distance[1];a=distance_data;if(b==a) CONT_1=0;if(b!=a) CONT_1++;if(CONT_1>=3){CONT_1=0;b=a;if(b>=50){yuyin_bobao();}}i=0;}}。
超声波测距1602显示程序

#include <A T89x51.H> //器件配置文件#include <intrins.h>#define RX P2_7#define TX P2_6#define LCM_RW P3_4 //定义LCD引脚#define LCM_RS P3_3#define LCM_E P3_5#define LCM_Data P1#define Key_Data P2_0 //定义Keyboard引脚#define Key_CLK P3_2#define Busy 0x80 //用于检测LCM状态字中的Busy标识void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void);void Delay400Ms(void);void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);unsigned char code mcustudio[] ={""};unsigned char code email[] = {"fhwxaoo@ "};unsigned char code Cls[] = {" "};unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};static unsigned char DisNum = 0; //显示用指针unsigned int time=0;unsigned long S=0;bit flag =0;unsigned char disbuff[4] ={ 0,0,0,0,};//写数据void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}//写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}//读数据unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}//读状态unsigned char ReadStatusLCM(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}void LCMInit(void) //LCM初始化{WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0F,1); // 显示开及光标设置}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 1); //发命令字WriteDataLCM(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x19) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/********************************************************/ void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>=700)||flag==1) //超出测量范围显示“-”{flag=0;DisplayOneChar(0, 1, ASCII[11]);DisplayOneChar(1, 1, ASCII[10]); //显示点DisplayOneChar(2, 1, ASCII[11]);DisplayOneChar(3, 1, ASCII[11]);DisplayOneChar(4, 1, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100;disbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;DisplayOneChar(0, 1, ASCII[disbuff[0]]);DisplayOneChar(1, 1, ASCII[10]); //显示点DisplayOneChar(2, 1, ASCII[disbuff[1]]);DisplayOneChar(3, 1, ASCII[disbuff[2]]);DisplayOneChar(4, 1, ASCII[12]); //显示M}}/********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/ void StartModule() //启动模块{TX=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}/********************************************************/void delayms(unsigned int ms){unsigned char i=100,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}/*********************************************************/ void main(void){unsigned char TempCyc;Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)DisplayListChar(0, 0, mcustudio);DisplayListChar(0, 1, email);ReadDataLCM();//测试用句无意义for (TempCyc=0; TempCyc<10; TempCyc++)Delay400Ms(); //延时DisplayListChar(0, 1, Cls);while(1){TMOD=0x01; //设T0为方式1,GA TE=1;TH0=0;TL0=0;ET0=1; //允许T0中断EA=1; //开启总中断while(1){StartModule();// DisplayOneChar(0, 1, ASCII[0]);while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算delayms(80); //80MS}}}。
基于51单片机的US-100(超声波模块)1602显示程序

/*****************************************************************************/Name: LCD1602+US-100+STC89C52HC-SR04 超声波测距模块串口程序晶振: 11.0592MDesigned by : 庶野琴风Date:2016/08/11QQ:397739038接线:模块TRIG接 P3.1 ECH0 接 P3.0RS(CS)接P2.0;RW(SID)接P2.1;E(SCLK)接P2.2;BF接P0.7;/*****************************************************************************/#include<reg52.h>#include<intrins.h>#define nops {_nop_();_nop_();_nop_();_nop_();}/******************************引脚及变量的定义****************************/ sbit RS = P2^0; // 寄存器选择位sbit RW = P2^1; // 读取选择位sbit E = P2^2;// 使能信号位sbit BF = P0^7; // 忙碌信号位unsigned char code Tab[] = {"0123456789"};unsigned char code string[] = {"range:2cm--4.5m"};char part,ge,shi,bai;char idata GLengthLoh[2];// 接收缓冲区bit success_flag;// 定义测试成功标志位/*********************************************************//********* /********* /*********函数名称: delay1ms(void)函数功能:延时 1 毫秒函数参数: void******************/******************/******************//*********************************************************/void delay1ms(void)// 误差-0.651041666667us{char a,b;for(b=102;b>0;b--)for(a=3;a>0;a--);}/*********************************************************//*********函数名称: delaynms(char n)******************//*********函数功能:延时n 个 1 毫秒******************//*********函数参数: n******************/ /*********************************************************/void delaynms(char n){char a;for(a = 0;a > n;a--)delay1ms();}/*********************************************************//*********函数名称: BusyTest(void)******************//*********函数功能:判断液晶模块忙碌状态******************//*********函数参数:返回值:result******************//*********************************************************/unsigned char BusyTest(){bit result;RS=0;RW=1;//RS为低电平,RW 为高电平时,可以读状态E=1; nops; result = BF; E=0;// 使能为高电平时可读取信息// 延时 40us,给硬件反应时间// 将忙碌标志位电平赋给result // 使能 1 到 0:执行指令return result;}/*********************************************************//*********函数名称: WriteInstruction(char dictate)*******//*********函数功能:将模式设置指令或显示地址写入液晶模块**/ /*********函数参数: dictate******************//*********************************************************/void WriteInstruction(char dictate){while(BusyTest() == 1);// 如果忙碌标志位忙碌则等待RS=0;RW=0;//RS/RW 位同时为低电平时可写入指令E=0;//使能0到 1:写入指令nops;P0 = dictate;// 将数据送入 P0 口,写入数据或地址nops;E=1;//使能0到 1:写入指令nops;E=0;//使能1到 0:执行指令}/*********************************************************//*********函数名称: WriteAddress(char x)*******//*********函数功能:指定字符显示的实际地址***********//*********函数参数: x******************//*********************************************************/void WriteAddress(char x){WriteInstruction(x|0x80);// 80H+地址码}/*********************************************************//*********函数名称: WriteData(char y)*******//*********函数功能:将数据(字符的标准ASCII码 )写入液晶模块 *//*********函数参数: y******************//*********************************************************/void WriteData(char y){while(BusyTest() == 1);// 如果忙碌标志位忙碌则等待RS=1;RW = 0;//RS 为高电平, RW 为低电平时,可以写入数据E=0;P0 = y;nops;E=1;nops;E=0;}/*********************************************************//*********函数名称: LCDInit(void)*******//*********函数功能:液晶模块初始化****************//*********函数参数: void******************//*********************************************************/void LCDInit(void){delaynms(15);// 延时 15 毫秒,首次写入液晶指令应给反应时间WriteInstruction(0x38);// 显示模式设置:16× 2 显示, 5× 7 点阵, 8 位数据接口delaynms(5);//延时 5秒,反应时间WriteInstruction(0x38);delaynms(5);//延时 5秒,反应时间WriteInstruction(0x38);delaynms(5);// 连续三次,确保初始化成功WriteInstruction(0x0c);// 显示模式设置:显示开,无光标,光标不闪烁delaynms(5);WriteInstruction(0x06);// 显示模式设置:显示光标右移,屏幕不移动delaynms(5);WriteInstruction(0x01);// 清屏delaynms(5);}/*********************************************************//********* /*********函数名称: UART_Send(char dat)函数功能:串口发送函数*******/****************//*********函数参数: dat******************/ /*********************************************************/void UART_Send(char dat){TI=0; SBUF = dat;//清发送标志//如果 TI为 0等待while (!TI);// 等待发送数据}/*********************************************************//*********函数名称: UART_Init()***************//*********函数功能:串口初始化函数****************//*********函数参数:无******************//*********************************************************/void UART_Init(){TH1 = 0xFD;TL1 = 0xFD;TMOD = 0x21;// 设置定时器 1 为模式 2;定时器 0 为模式 1 TH0 =(65536-2500)/256;// 约 2.50MS 定时器初值TL0 =(65536-2500)%256;// 约 2.50MS 定时器初值ET0 = 1;TR0 = 1;// 启动定时器TR1 = 1;// 启动定时器SM0SM1SM0 = 0;// 串口通信模式设置00 = 0SM1 = 1;//0 1 = 1//10 = 2//1 1 = 3 REN = 1;// 串口允许接收数据ES = 1;// 开串中断EA=1;}/*********************************************************//*********函数名称: UART_ISR(void)***************//*********函数功能:串口中断函数****************//*********函数参数: void******************//*********************************************************/void UART_ISR(void) interrupt 4{char temp,k;ES=0;if(RI){// 关中断RI=0;temp = SBUF;// 清接收标志GLengthLoh[k] = temp;k++;if(k == 2) //k= 数据长度k = 0;}ES=1;// 开中断}/*********************************************************//********* /********* /*********函数名称: timer0()函数功能:定时器函数函数参数: void***************/****************/******************//*********************************************************/timer0() interrupt 1//定时器0 中断是 1 号{TH0 =(65536-2500)/256; // 约TL0 =(65536-2500)%256; // 约2.50MS 定时器初值2.50MS 定时器初值TH0 = 0xef;TL0 = 0x94;// 写入定时器0 初始值}/*********************************************************//*********函数名称: conversion(int8 temp_data)*******//*********函数功能:数据转换****************//*********函数参数: temp_data******************//*********************************************************/void conversion(int temp_data){char part_data,ge_data,shi_data,bai_data;bai_data = temp_data / 1000;shi_data = (temp_data % 1000) / 100;ge_data = (temp_data % 100) / 10;part_data = temp_data % 10;EA=0;bai = bai_data;shi = shi_data;ge = ge_data;part = part_data;EA=1;}/*********************************************************//*********函数名称: main(void)*******/ /*********函数功能:主函数****************/ /*********函数参数: void******************/ /*********************************************************/void main(void){int k;long PreLength;LCDInit();// 调用液晶初始化函数delaynms(10);UART_Init();PreLength = 0;k = 0;while(1){WriteAddress(0x01);while(string[k] != '\0'){WriteData(string[k]);k++;}UART_Send(0X55);PreLength = GLengthLoh[0] * 256 + GLengthLoh[1] - 5;conversion(PreLength);WriteAddress(0x41); WriteData('J');// 从第 2 行第 6 列开始显示// 将特定的字符常量写入LCDWriteData('U');WriteData('L');WriteData('I');WriteData(':');if(PreLength <= 4500 && PreLength >= 20){WriteData(Tab[bai]);// 将百位数字的字符常量写入LCD WriteData(Tab[shi]);// 将十位数字的字符常量写入LCD WriteData(Tab[ge]);// 将个位数字的字符常量写入LCD WriteData('.');WriteData(Tab[part]);}else{WriteData('-');WriteData('-');WriteData('-');WriteData('-');WriteData('-');}WriteData(' ');WriteData('c');WriteData('m');} }。
超声波模块与lcd128 C语言程序

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//#define DATA P0 //数据输出端0~7sbit RS=P3^5; //LCD12864 RS端sbit RW=P3^6; //LCD12864 RW端sbit E =P3^4; //LCD12864 E 端sbit PSB =P3^7;sbit TX=P2^6;sbit RX=P2^7;sbit P2_0=P2^0;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;uchar disbuff[4]={ 0,0,0,0,};uint time=0;unsigned long S=0; //水位高度char flag =0;uchar ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','m'};/*********************************************延时子程序*********************************************/void Delay_1ms(uint x){uint j,i;for(j=0;j<x;j++){for(i=0;i<120;i++); //延时X乘以120}}/*********************************************LCD12864液晶测忙子程序(读状态)*********************************************/void Busy(){uchar busy;do{E = 0; //0为关闭使能端,1为打开使能端RS = 0; //1为数据,0为指令RW = 1; //1为读,0为写Delay_1ms(20); //延时20乘以120时间P0=0xFF;E = 1; //0为关闭使能端,1为打开使能端busy=P0; //读取P2状态Delay_1ms(20); //延时20乘以120时间E = 0; //0为关闭使能端,1为打开使能端}while(busy&0x80); //判断BUSY位是否工作:1为内部在工作,0为正常状态}/*********************************************LCD12864液晶数据写入子程序*********************************************/void Write_Data(uchar k){Busy(); //测忙RS=1; //1为数据,0为指令RW=0; //1为读,0为写E =1; //0为关闭使能端,1为打开使能端P0=k; //输入数据K到DA TADelay_1ms(20); //延时20乘以120时间E =0; //0为关闭使能端,1为打开使能端Delay_1ms(20); //延时20乘以120时间}/*********************************************LCD12864液晶命令写入子程序*********************************************/void Write_Cmd(uchar cmd){Busy(); //测忙RS=0; //1为数据,0为指令RW=0; //1为读,0为写E=1; //0为关闭使能端,1为打开使能端P0=cmd; //输入命令cmd到DATADelay_1ms(20); //延时20乘以120时间E=0; //0为关闭使能端,1为打开使能端Delay_1ms(20); //延时20乘以120时间}/*********************************************LCD12864液晶数据显示子程序*********************************************/void Disp(uchar y,uchar x,uchar *z){uchar Address;if(y==1){Address=0x80+x;} //Y判断第几行,X判断第几列,0x80为液晶行初始地址if(y==2){Address=0x90+x;}if(y==3){Address=0x88+x;}if(y==4){Address=0x98+x;}Write_Cmd(Address); //写入地址命令到LCD12864while(*z) //写入显示数据的大小{Write_Data(*z); //写入显示数据到LCD12864z++;Delay_1ms(1);}}void set_xy(uchar y,uchar x){uchar Address;if(y==1){Address=0x80+x;} //Y判断第几行,X判断第几列,0x80为液晶行初始地址if(y==2){Address=0x90+x;}if(y==3){Address=0x88+x;}if(y==4){Address=0x98+x;}Write_Cmd(Address); //写入地址命令到LCD12864}/*********************************************LCD12864液晶初始化子程序*********************************************/void Ini_Lcd(void){PSB=1;Delay_1ms(20);Write_Cmd(0x30); //基本指令集Delay_1ms(20);Write_Cmd(0x02); // 地址归位Delay_1ms(20);Write_Cmd(0x0c); //整体显示打开,游标关闭Delay_1ms(20);Write_Cmd(0x06); //游标右移Delay_1ms(20);Write_Cmd(0x80); //设定显示的起始地址Delay_1ms(20);Write_Cmd(0x01); //清除显示}void Conut(void) // 计算水位高度程序并显示在液晶上{time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>100)||flag==1) //超出测量范围显示“-”{flag=0;Disp(1,5,"-.--m");}else{S=100-S;disbuff[0]=S%1000/100;disbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;set_xy(1,5);Write_Data(ASCII[disbuff[0]]);Write_Data('.');Write_Data(ASCII[disbuff[1]]);Write_Data(ASCII[disbuff[2]]);Write_Data('m');if(S<=30){P1_0=0;P1_1=1;P1_2=1;P2_0=0;Disp(2,5,"M:ON ");}else if(S>=50){P1_0=1;P1_1=1;P1_2=0;P2_0=1;Disp(2,5,"M:OFF");}else{P1_1=0;P1_0=1;P1_2=1;}}}void StartModule() //启动超声波模块{int i;TX=1; //启动一次模块for(i=0;i<2;i++);TX=0;}void main(){Delay_1ms(10);Ini_Lcd(); //液晶初始化子程序Disp(1,0,"当前水位:"); //显示数据到LCD12864子程序Disp(2,0,"进水指示:");Disp(3,3,"杨宁");Disp(4,2,"08电(1) ");while(1){TMOD=0x01; //设T0为方式1,GA TE=1;TH0=0;TL0=0;ET0=1; //允许T0中断EA=1; //开启总中断while(1){StartModule();while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算// Delay_1ms(80); //80MS}}}void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{EA=0;flag=1;EA=1; //中断溢出标志}。
超声波模块HC-SR04

//超声波模块HC-SR04显示程序#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Tx = P3^2; //产生脉冲引脚sbit Rx = P3^3; //回波引脚uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管0-9 uint distance[4]; //测距接收缓冲区//收集4次测量以便取平均值uchar ge,shi,bai,qian,temp,flag,outcomeH,outcomeL,i; //自定义变量bit succeed_flag; //测量成功标志//********函数声明void delay_20us(){ uchar bt ;for(bt=0;bt<60;bt++);}//外部中断1,用做判断回波电平INT1_() interrupt 2 // 外部中断是2号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //置成功测量的标志EX1=0; //关闭外部中断}//****************************************************************//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:P0=ge; P2=0xef;flag++;break;case 0x01:P0=shi;P2=0xdf;flag++;break;case 0x02:P0=bai;P2=0xbf;flag++;break;case 0x03:P0=qian;P2=0x7f;flag=0;break;}}//显示数据转换程序void conversion(uint temp_data){EA=0; //计算前关闭总中断ge=temp_data%10; //除以10取余数得个位shi=temp_data/10%10; //除以10,小数点左移1位,再除以10取余数得十位bai=temp_data/100%10; //除以100,小数点左移2位,再除以10取余数得百位qian=temp_data/1000%10; //除以1000,小数点左移3位,再除以10取余数得千位//上面计算数值//下面查表qian=SEG7[qian]; //查询共阳数码管对应元素的值bai=SEG7[bai]; //查询共阳数码管对应元素的值shi=SEG7[shi]&0x7F;//此处并接小数点//查询共阳数码管对应元素的值,这里合并上小数点ge=SEG7[ge]; //查询共阳数码管对应元素的值,前三位是厘米,这一位代表毫米EA=1; //计算结束开启总中断}//******************************************************************void main(void) // 主程序{float distance_data; //定义一个浮点类型的变量i=0; //指针值i为零,即数组SEG7[0] ,第一个元素flag=0;//标志值,赋值为0Tx=0; //首先拉低脉冲输入引脚,做好提供20微秒高电平的准备TMOD=0x11; //两个定时器都要工作,定时器0,定时器1,16位工作方式,可以长时间计时TR0=1;//启动定时器0,以便于显示IT1=0; //中断触发方式:由高电平变低电平,引发外部中断,常讲的“下降沿触发”ET0=1; //打开定时器0中断,每个位按定设定的时间显示,被中断了就显示下一位。
超声波测距程序LCD液晶显示

超声波测距程序L C D液晶显示Hessen was revised in January 2021#include<>#include<>#define uint unsigned int#define uchar unsigned char#define NOP() {_nop_();_nop_();_nop_();_nop_();}//------LCD引脚-----sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^7;//------超声波引脚-------sbit Tx=P3^3; //触发控制信号输入Trigsbit Rx=P3^2; //回响信号输出 Echouchar code table[]={"Distance Test:"}; //LCD第一行显示uchar temp_dis[]= {" cm"}; //LCD第二行long int t,distance;uchar cache[4]={0,0,0,0};//--------延时-------void delay(uint ms){uint t;while(ms--)for(t=0;t<120;t++);}//-------读LCD状态-------uchar read_lcd_state(){uchar state;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();state=P0;LCD_EN=0;_nop_();return state;}//-------忙等待------void lcd_busy_wait(){while((read_lcd_state() & 0x80)==0x80);NOP();}//----------LCD写指令----------void lcd_write_com(uchar com){lcd_busy_wait();LCD_RS=0; //RS为0时,写指令,RS为1时,写数据LCD_RW=0;P0=com;NOP();LCD_EN=1;NOP();LCD_EN=0;}//----------LCD写数据----------void lcd_write_data(uchar dat){lcd_busy_wait();LCD_RS=1;LCD_RW=0;P0=dat;NOP();LCD_EN=1;NOP();LCD_EN=0;}//-------LCD初始化-------void lcd_init(){LCD_EN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------void set_lcd_pos(uchar p){lcd_write_com(p|0x80);}//---------液晶显示程序----------void lcd_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);}}void HC05_Init(){Tx=1; //触发脉冲NOP();NOP();NOP();NOP();Tx=0;distance=*t; //距离计算}void distance_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';}//------------主程序-----------void main(){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);}}//外部中断0void int0() interrupt 0{t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时TH0=0;TL0=0;}。
51单片机超声波模块的C语言程序

51单⽚机超声波模块的C语⾔程序//超声波模块程序//超声波模块程序//Trig = P2^0//Echo = P3^2#include#define uchar unsigned char#define uint unsigned intint time;int succeed_flag;uchar timeL;uchar timeH;sbit Trig=P1^0;sbit Echo=P3^2;uchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f};uchar code table1[]={0,1,2,3,4,5,6,7};//void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//void delay_20us(){uchar a ;for(a=0;a<100;a++);}//************************************************************ ***//显⽰数据转换程序void display(uint temp){uchar ge,shi,bai;bai=temp/100;shi=(temp%100)/10;ge=temp%10;P2=table1[2];P0=table[ge];delay(1);P2=table1[1];P0=table[shi];delay(1);P2=table1[0];P0=table[bai];delay(1);}//************************************************************ ***void main(){uint distance;// test =0;Trig=0; //⾸先拉低脉冲输⼊引脚EA=1; //打开总中断0TMOD=0x10; //定时器1,16位⼯作⽅式while(1){EA=0; //关总中断Trig=1; //超声波输⼊端delay_20us(); //延时20usTrig=0; //产⽣⼀个20us的脉冲while(Echo==0); //等待Echo回波引脚变⾼电平 succeed_flag=0; //清测量成功标志EA=1;EX0=1; //打开外部中断0TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //计数溢出标志TR1=1; //启动定时器1delay(20); //等待测量的结果TR1=0; //关闭定时器1EX0=0; //关闭外部中断0if(succeed_flag==1){time=timeH*256+timeL;distance=time*0.0172; //厘⽶}if(succeed_flag==0){distance=0; //没有回波则清零// test = !test; //测试灯变化}display(distance);}}//************************************************************ *** //外部中断0,⽤做判断回波电平void exter() interrupt 0 // 外部中断0是0号{EX0=0; //关闭外部中断timeH =TH1; //取出定时器的值timeL =TL1; //取出定时器的值succeed_flag=1;//⾄成功测量的标志}//************************************************************ **** //定时器1中断,⽤做超声波测距计时void timer1() interrupt 3 //{TH1=0;TL1=0;}1602液晶显⽰的超声波模块程序接⼝程序⾥边都有、、#include//#include#define uchar unsigned char#define uint unsigned intsbit lcdrs=P2^3;sbit lcden=P2^2;sbit trig=P2^0; //超声波发送//sbit echo=P3^2; //超声波接受//P0____________DB0-DB7uchar 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/58return dist; //1个机器周期是12个时钟周期 timer*12/(58*11.0592)=timer/53 }void HC_run(){uint tempH=0x00,tempL=0x00;TH0=0;TL0=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) {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);}}。
超声波测距LCD1602显示

超声波测距LCD1602显示超声波测距模块:1、采用IO口TRIG触发测距,给至少10us的高电平信号;2、模块自动发送8个40khz的方波,自动检测是否有信号返回;3、有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2。
液晶LCD1602电路接口超声波测距LCD1602显示程序源代码/*******************超声波测距1602显示********************* 单片机:51单片机* 开发环境:keil* 名称:超声波测距1602显示注意:用杜邦线将超声波模块的VCC接开发板5V对外供电接口用杜邦线将超声波模块的GND接开发板GND用杜邦线将超声波模块的Trig接单片机的P1.5用杜邦线将超声波模块的Echo接单片机的P1.6/************************包含头文件************************/#include <reg51.h>#define LCD_Data P0#define Busy 0x80/**************************宏定义**************************/#define SPEED_30C 3495 //30摄氏度时的声速,声速V=331.5+0.6*温度;#define SPEED_23C 3453 //23摄氏度时的声速,声速V=331.5+0.6*温度;/**************************位定义**************************/sbit ECHO = P2^1; //回声接收端口sbit TRIG = P2^0; //超声触发端口sbit BEEP = P2^3; //蜂鸣器sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_E = P2^5;/**********************定义变量和数组**********************/long int distance = 0; //距离变量unsigned char code table0[] = {" SL-51A "};unsigned char code table1[] = {" NO ECHO "};unsigned char code table2[] = {"Distance:xxx.xcm"};unsigned char count;void Delay5Ms(void);void delay(int In,int Out);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); /**********************************************************//* 函数名称 : Delay_xMs *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//**********************************************************/void Delay_xMs(unsigned int x){unsigned int i,j;for(i=0;i<x;i++){for(j=0;j<3;j++){;}}}/**********************************************************//* 函数名称 : delayt *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间数据 *//* 返回值 : 无 *//**********************************************************/void delayt(unsigned int x){unsigned char j;while(x-->0){for(j=0;j<125;j++){;}}}/*************************5ms延时函数**********************/void Delay5Ms(void){unsigned int TempCyc = 3552;while(TempCyc--);}/**************************延迟函数************************/void delay(int In,int Out) {int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/**********************************************************//* 函数名称 : Alarm *//* 函数描述 : 蜂鸣器发声函数 *//* 输入参数 : t *//* 参数描述 : 发声的次数 *//* 返回值 : 无 *//**********************************************************/void Alarm(unsigned char t){unsigned char i;for(i=0;i<t;i++){BEEP=0;delay(10,1000);BEEP=1;delay(10,1000);}}/**********************************************************//* 函数名称 : Init_timer *//* 函数描述 : 初始化单片机函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//**********************************************************/void Init_timer(void){TMOD=0x01; //定时器2初始化,设置为16位自动重装模式TL0=0x66;TH0=0xfc; //1msET0=1; //开定时器2EA=1; //总中断使能}/**********************************************************//* 函数名称 : Init_Parameter *//* 函数描述 : 初始化参数和IO口函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//**********************************************************/void Init_Parameter(void){TRIG=1;ECHO=1;count=0;distance=0;}/**********************************************************//* 函数名称 : display *//* 函数描述 : 显示数字 *//* 输入参数 : number,address *//* 参数描述 : number写入的数据 *//* 返回值 : 无 *//**********************************************************/ void display(int number){unsigned char b,c,d,e;b=(number/1000);c=(number/100)%10;d=(number/10)%10;e=number%10; DisplayOneChar(9,1,(0x30+b));DisplayOneChar(10,1,(0x30+c));DisplayOneChar(11,1,(0x30+d));DisplayOneChar(13,1,(0x30+e));}/**********************************************************//* 函数名称 : Trig_SuperSonic *//* 函数描述 : 发出声波函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//**********************************************************/ void Trig_SuperSonic(void) //出发声波{TRIG=1;delayt(1);TRIG=0;}/**********************************************************//* 函数名称 : Measure_Distance *//* 函数描述 : 计算距离函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//**********************************************************/ void Measure_Distance(void){unsigned char l;unsigned int h,y;TR0=1;while(ECHO){;}TR0=0;l=TL0;h=TH0;y=(h<<8)+l;y=y-0xfc66; //us部分distance=y+1000*count; //计算总时间TL0=0x66;TH0=0xfc;delayt(30);distance=SPEED_30C*distance/20000;}/*********************写数据函数***************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data=WDLCD;LCD_E=0; //若晶振速度太高可以在这后加小的延时LCD_E=0; //延时LCD_RS=1;LCD_RW=0;LCD_E=1;LCD_E=0;}/***********************写指令函数*************************/void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data=WCLCD;LCD_E=0;LCD_E=0;LCD_RS=0;LCD_RW=0;LCD_E=1;LCD_E=0;}/************************读数据函数************************/unsigned char ReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;return(LCD_Data);}/************************读状态函数************************/unsigned char ReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}/************************LCD初始化*************************/void LCDInit(void) //LCD初始化{LCD_Data=0;WriteCommandLCD(0x38,0);Delay5Ms(); //三次显示模式设置,不检测忙信号WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信号 WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}/***********************清屏函数***************************/void LCD_Clear(void){WriteCommandLCD(0x01,1);Delay5Ms();}/*******************按指定位置显示一个字符******************/void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData){Y&=0x1;X&=0xF; //限制X不能大于15,Y不能大于1if(Y)X|=0x40; //当要显示第二行时地址码+0x40;X|=0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/********************按指定位置显示一串字符*****************/void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if(X<=0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/**********************************************************//* 函数名称 : main *//* 函数描述 : 主函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//**********************************************************/void main(void){LCDInit();Init_timer();Init_Parameter();Alarm(2);DisplayListChar(0,0,table0);DisplayListChar(0,1,table1);while(1){Trig_SuperSonic(); //触发超声波发射while(ECHO==0){;} //等待回声Measure_Distance(); //计算脉宽并转换为距离DisplayListChar(0,1,table2);display(distance); //显示距离Init_Parameter(); //参数重新初始化delayt(100); //延时,两次发射之间要至少有10ms间隔 }}/**********************************************************//* 函数名称 : timer0 *//* 函数描述 : T0中断处理函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//**********************************************************/void timer0 (void) interrupt 1{TF0=0;TL0=0x66;TH0=0xfc;count++;if(count==18) //超声波回声脉宽最多18ms{TR0=0;TL0=0x66;TH0=0xfc;count=0;}}。
51单片机超声波温度显示程序加在一起

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuint flag,time;uint i;uint temp;void display_wd();void display_temp1();uchar code digit[10]={"0123456789"};uint bai,shi,ge,S,timer;uchar timeL,timeH;//超声波模块引脚的定义sbit TX=P1^4;sbit beep=P1^2;sbit RX=P1^3;//LCD12864引脚的定义sbit CS=P2^0;sbit SID=P2^1;sbit SCLK=P2^2;sbit PSB=P2^3;sbit DS=P1^1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//----------------------------------------以下是LCD12864的程序---------------------------- void send_command(uchar command_data){uchar i;uchar i_data;i_data=0xf8;CS=1;SCLK=0;for(i=0;i<8;i++) //第一字节,发送命令,11111000-些指令{SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data; /*获取命令的高四位,低四位补零*/i_data&=0xf0;for(i=0;i<8;i++) //第二字节{SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data<<=4;for(i=0;i<8;i++) //第三字节{SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;delay(10);}void send_data(uchar command_data) {uchar i;uchar i_data;i_data=0xfa;CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data<<=4;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;delay(10);}void lcd_string(char *strpoint){ register i=0;while(strpoint[i]!=0){send_data(strpoint[i]);i++;}}void start(){ send_command(0x80);lcd_string("前方的距离是:");//C编译系统本省也具有转换功能,所以也可以这样写send_command(0x93);send_data(bai+48);send_data(shi+48);send_data(ge+48);display_wd();display_temp1();}void lcd_init(){ PSB=0;delay(100);send_command(0x30); /*设置8位数据接口,基本指令模式。
超声波程序

本人收藏的的一些超声波程序,希望对大家有用(还有原理图,需要的话去我空间去):程序一:#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define count 4uchar data IRcode[4]; // 定义一个4 字节的数组用来存储代码uchar table[4]; uchar enled[4]={0x1f,0x2f,0x4f,0x8f};uchar CodeTemp,temp,tt; // 编码字节缓存变量uchari,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2;// 延时用的循环变量uint distance,distance1,time; // sbit IRsig nal=P3T; //HS0038 sbit come=P3A3;sbit d=P1A1;// 发送码sbit BZ=P1A0;sbit s=P3A7;//38ksbit ss=P3A6;//38kuchar m;// 开关控制//sbit n=P2;// 电机反转code距离,time接收头OUT端直接连P3.2(INT0) unsignedseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28}; 显示段码char ///**************************** void timer0() interrupt 1{TH0=(65536-count)/256; TL0=(65536-count)%256; s=~s;// 产生38K信号ss=~ss;//tt++;// 发送超声波个数}/**************************** ************************/ void Delay0_9ms(void) 定时器0 中断************************/ 延时0.9ms 子程序{uchar j,k;for(j=18;j>0;j--)for(k=20;k>0;k--); }/*************************** void Delay1ms(void){uchar i,j;for(i=2;i>0;i--)for(j=230;j>0;j--);}/*************************** void Delay4_5ms(void) {uchar i,j;for(i=10;i>0;i--)for(j=225;j>0;j--);}/**************************** ************************/ 延日寸1ms 了稈,序**********************/延时 4.5ms 子程序*********************程序void Delay(void){uchar i,j,k;for(i=100;i>0;i--)for(j=100;j>0;j--)for(k=3;k>0;k--);}/****************************************************/程序// 延时程序void ledDelay(unsigned int tc){ unsigned int i,j; for(i=0;i<10;i++) for(j=0;j<tc;j++);}/************************************************ ****************/// 定寸器1 中断, 用做超声波测距无回波void timer1() interrupt 3{ TR1=0; ET1=0;EX1=0;TH1=0;TL1=0;date=0;for(i=0;i<120;i++) {P2=enled[i%4]&m;//P2 口高四位控制数码管,低位陪分控制继电器 P0=seg7code[table[i%4]]; // 取出千位数,查表,输出。
51单片机超声波模块程序

51单片机超声波模块程序//main.c#include#include#include "lcd1602.h"unsigned char TimeH, TimeL;unsigned int time;float distance;char temp[16];sbit Trig = P1^0;sbit Echo = P1^1;void Timer0Init();void main(){Lcd1602Init();Trig = 0; //初始化while(1){Timer0Init();Trig = 1;while(Echo == 0); //当Echo变为高电平时立即启动定时器以减小误差TR0 = 1;while (Echo == 1);//等待捕获Echo从高到低的跳变TimeL = TL0; //当Echo由高到低,立即将TH0,TL0的值记下TimeH = TH0;Trig = 0;TR0 = 0;time = TimeH;time <<= 8;time += TimeL;distance = time * 0.017;//将distance的值以%f的格式,格式输出到字符数组temp中,变成字符串,//便于显示//sprintf在头文件stdio.h中sprintf(temp, "%f", distance);Lcd1602WriteStr(0x80, temp);}}void Timer0Init(){TMOD = 0X01;TH0 = 0;TL0 = 0;TF0 = 0;EA = 1;}void timer0() interrupt 1 //定时器0中断,防止溢出{TH0 = 0;TL0 = 0;}//lcd1602.h#ifndef __LCD1602_H__#define __LCD1602_H__#includesbit Lcd1602E = P2^7;sbit Lcd1602RW = P2^5;sbit Lcd1602RS = P2^6;void Lcd1602WriteCmd (unsigned char cmd);void Lcd1602WriteData (unsigned char dat);void Lcd1602BusyCheck();void Lcd1602WriteStr(unsigned char addr, unsigned char str[]); void Lcd1602Init ();#endif//lcd1602.c#include "lcd1602.h"#include#define Lcd1602DataPort P0#define Busy 0x80unsigned char ix;void Lcd1602Init (){Lcd1602WriteCmd (0x38);Lcd1602WriteCmd (0x0c);Lcd1602WriteCmd (0x06);Lcd1602WriteCmd (0x01);Lcd1602WriteCmd (0x80);}void Lcd1602WriteCmd(unsigned char cmd) {Lcd1602BusyCheck();Lcd1602RS = 0;Lcd1602RW = 0;Lcd1602DataPort = cmd;for (ix = 0xff; ix > 0; --ix);//延时Lcd1602E = 1;for (ix = 0xff; ix > 0; --ix);Lcd1602E = 0;for (ix = 0xff; ix > 0; --ix);Lcd1602RW = 1;}void Lcd1602WriteData (unsigned char dat) {Lcd1602BusyCheck();Lcd1602RS = 1;Lcd1602RW = 0;Lcd1602DataPort = dat;for (ix = 0xff; ix > 0; --ix);Lcd1602E = 1;for (ix = 0xff; ix > 0; --ix);Lcd1602E = 0;for (ix = 0xff; ix > 0; --ix);Lcd1602RW = 1;}void Lcd1602BusyCheck() //忙检测{Lcd1602RS = 0;Lcd1602RW = 1;for (ix = 0xff; ix > 0; --ix);Lcd1602E = 1;while ((Lcd1602DataPort & Busy) != 0); Lcd1602E = 0;}void Lcd1602WriteStr(unsigned char addr, unsigned char str[]) {unsigned char i;Lcd1602WriteCmd (addr);for (i = 0; i < strlen(str); i++)Lcd1602WriteData(str[i]);}。
超声波LCD显示测距程序

超声波L C D显示测距程序文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]/************************************************************** ****************/ /*Name:LCD12864(St7920/St7921)+超声波测距模块+STC89C52*//*DYP-ME007超声波测距模块DEMO程序*//*晶振:11.0592M*/*//*接线:模块TRIG接P1.2ECH0接P1.1*//*RS(CS)接P3.3;*//*RW(SID)接P3.4;*//*E(SCLK)接P3.5;*//*PSB接GND串行模式*//************************************************************** ****************/#include<AT89X51.H>#include<intrins.h>//引脚定义sbitRX=P1^1;sbitTX=P1^2;sbitCS=P3^3; //片选高电平有效单片LCD使用时可固定高电平sbitSID=P3^4; //数据sbitSCLK=P3^5; //时钟//FunctionDefinition 函数声明voidDelay(intnum);voidInit_DS18B20(void);unsignedcharReadOneChar(void);voidWriteOneChar(unsignedchardat); unsignedintReadTemperature(void);voidclock_out(unsignedchardd);unsignedcharclock_in(void);unsignedcharread_clock(unsignedcharord);voidwrite_clock(unsignedcharord,unsignedchardd);voidDisp(void);voidid_case1_key(void);voidid_case2_key(void);voidSet_time(unsignedcharsel,bitsel_1);voidTimer0_Init(void);voidInit_1302(void);voidSet_Bell(unsignedcharsel,bitsel_1);voidBell(void);//12864voidWrite_char(bitstart,unsignedcharddata);voidSend_byte(unsignedcharbbyte);voidDelaynms(unsignedintdi);voidLcd_init(void);voidDisp_img(unsignedchar*img);voidLCD_Write_string(unsignedcharX,unsignedcharY,unsignedchar*s );voidLCD_set_xy(unsignedcharx,unsignedchary); unsignedcharcode:.-"};unsignedcharcodewaves[]={"超声波测距系统"}; unsignedcharcodeznwk[]={"智能微控工作室"}; unsignedcharcodeCM[]={"M"};unsignedinttime=0;longS=0;bitflag=0;unsignedchardisbuff[4] ={0,0,0,0,};unsignedcharcodelogo[]={/*--调入了一幅图像:logo.bmp--*//*--宽度x高度=128x64欢迎使用本产品LOGO--*//*--调入了一幅图像:C:\DocumentsandSettings\lwd\桌面\新建文件夹\X.bmp--*//*--宽度x高度=128x64--*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x0C,0x00,0x00,0x40,0x70,0x00,0x0 0,0x00,0x80,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x1E,0x00,0x00,0x60,0x70,0x00,0x0 0,0x0F,0xE0,0x00,0x00,0x00,0x01,0xC0,0x00,0x60,0x3C,0x00,0x00,0xE0,0x60,0x00,0x1 F,0xFF,0xE0,0x00,0x00,0x00,0x03,0x80,0x00,0x70,0x70,0x40,0x00,0xE0,0x7E,0x00,0x1 F,0xE0,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x73,0xC3,0xF0,0x01,0xC3,0xFC,0x00,0x3 8,0xE1,0xC0,0x00,0x00,0x03,0xC6,0x3C,0x00,0x33,0x9F,0xF0,0x03,0x8F,0xC0,0x00,0x3 0,0xC1,0xC0,0x00,0x00,0x3F,0xEF,0xFE,0x00,0x03,0x1C,0xE0,0x07,0x01,0xCC,0x00,0x3 1,0xF1,0x80,0x00,0x00,0x79,0xDF,0xBC,0x00,0x06,0x18,0xC0,0x0E,0x01,0xFE,0x00,0x7 7,0xF9,0x80,0x00,0x00,0x01,0xB0,0x30,0x01,0xC6,0x19,0xC0,0x1E,0x7F,0xDE,0x00,0x6 F,0x83,0x80,0x00,0x00,0x23,0xAC,0x60,0x0F,0xE6,0xF1,0x80,0x3E,0x7B,0x38,0x00,0x6 1,0x83,0x00,0x00,0x00,0x37,0x0E,0x00,0x0F,0xC7,0xB7,0x80,0xEC,0x63,0x30,0x00,0xE 3,0x03,0x00,0x00,0x00,0x3E,0x0E,0x00,0x01,0x8F,0x37,0x01,0xCC,0x6F,0xF0,0x00,0xC 7,0xF7,0x00,0x00,0x00,0x1E,0x0C,0x00,0x03,0x1E,0x66,0x03,0x0C,0x7F,0x00,0x01,0xF F,0xE6,0x00,0x00,0x00,0x1E,0x1C,0x00,0x03,0x1C,0x60,0x02,0x19,0xAC,0x00,0x01,0x9 6,0x06,0x00,0x00,0x00,0x3E,0x3E,0x00,0x03,0x18,0x60,0x00,0x19,0xFC,0x00,0x03,0x8 6,0x0E,0x00,0x00,0x00,0x7E,0x36,0x00,0x03,0x00,0xC0,0x00,0x38,0x78,0x00,0x03,0x0 6,0x0C,0x00,0x00,0x00,0xE6,0x67,0x00,0x03,0x00,0xC0,0x00,0x30,0x78,0x00,0x06,0x0 C,0x0C,0x00,0x00,0x01,0xC6,0xC3,0x80,0x7F,0xF0,0xC0,0x00,0x30,0xFE,0x00,0x0E,0x0 C,0x1C,0x00,0x00,0x03,0x81,0x83,0xC0,0x78,0xFF,0x80,0x00,0x61,0xCF,0x80,0x1C,0x0 8,0x18,0x00,0x00,0x06,0x07,0x03,0xE0,0x00,0x1F,0xFF,0xE0,0x67,0x07,0xE0,0x38,0x1 8,0xF8,0x00,0x00,0x08,0x0E,0x01,0xF8,0x00,0x07,0xFF,0x80,0xCE,0x03,0xF8,0x60,0x0 0,0x70,0x00,0x00,0x00,0x18,0x01,0xF8,0x00,0x01,0xFC,0x00,0xC0,0x01,0xFC,0xC0,0x0 0,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0xE0,0x00,0x01,0xE0,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x3F,0xE0,0x00,0xFF,0xF0,0x00,0x3 8,0x00,0xE0,0x00,0x00,0x00,0x0C,0x00,0x00,0x0F,0xFF,0x80,0x00,0xF8,0xF0,0x00,0x3 8,0x00,0xE0,0x00,0x00,0x00,0x0C,0xF0,0x00,0x0F,0xC7,0x00,0x00,0x60,0xE0,0x00,0x3 8,0x00,0xE0,0x00,0x00,0x00,0x1F,0xF0,0x00,0x01,0x8E,0x00,0x00,0x60,0xC0,0x00,0x7 0,0x01,0xC0,0x00,0x00,0x07,0xFF,0x80,0x00,0x01,0x8C,0x00,0x00,0xE1,0x80,0x00,0x7 0,0x01,0xC0,0x00,0x00,0x07,0xF8,0x00,0x00,0x01,0x98,0x00,0x00,0xDF,0xC0,0x00,0x7 0,0x01,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xBF,0xE0,0x00,0xFF,0x00,0x00,0x6 0,0x01,0x80,0x00,0x00,0x00,0xFC,0x00,0x00,0x7F,0xFF,0xE0,0x00,0xC0,0x00,0x00,0xE 0,0x03,0x80,0x00,0x00,0x01,0xFE,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0xC 0,0x03,0x00,0x00,0x00,0x03,0xB7,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x3C,0x00,0xC 0,0x03,0x00,0x00,0x00,0x07,0x67,0x00,0x00,0x60,0x00,0x00,0x03,0x9F,0xFE,0x00,0x8 0,0x02,0x00,0x00,0x00,0x0E,0x63,0x80,0x00,0xE0,0x00,0x01,0xFF,0xCF,0x1E,0x01,0x8 0,0x06,0x00,0x00,0x00,0x1C,0xE1,0xE0,0x00,0xC0,0x00,0x00,0xE3,0x9C,0x38,0x01,0x8 0,0x06,0x00,0x00,0x00,0x38,0xC1,0xF8,0x01,0xC0,0x00,0x00,0xC3,0x18,0x30,0x00,0x0 0,0x00,0x00,0x00,0x00,0xE0,0xFC,0xFE,0x03,0x80,0x00,0x01,0xC7,0x18,0x60,0x00,0x0 0,0x00,0x00,0x00,0x01,0xDF,0xF8,0xFE,0x03,0x00,0x00,0x01,0x8E,0x1B,0xE0,0x07,0x0 0,0x1C,0x00,0x00,0x07,0x07,0x80,0x00,0x07,0x00,0x00,0x01,0xFF,0x3F,0xE0,0x07,0x0 0,0x1C,0x00,0x00,0x0C,0x03,0x80,0x00,0x0E,0x00,0x00,0x01,0xF0,0x38,0x00,0x0F,0x0 0,0x3C,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x01,0x00,0x20,0x00,0x06,0x0 0,0x18,0x00,0x00,0x00,0x03,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,};/************************************************************** ****************/voidLcd_init(void) //初始化LCD{Delaynms(10);//启动等待,等LCM讲入工作状态CS=1;Write_char(0,0x30);//8位介面,基本指令集Write_char(0,0x0c);//显示打开,光标关,反白关Write_char(0,0x01);//清屏,将DDRAM的地址计数器归零}/************************************************************** ****************/voidWrite_char(bitstart,unsignedcharddata)//写指令或数据{unsignedcharstart_data,Hdata,Ldata;if(start==0)start_data=0xf8; //写指令elsestart_data=0xfa;//写数据Hdata=ddata&0xf0; //取高四位Ldata=(ddata<<4)&0xf0;//取低四位Send_byte(start_data); //发送起始信号Delaynms(5);//延时是必须的Send_byte(Hdata); //发送高四位Delaynms(1);//延时是必须的Send_byte(Ldata); //发送低四位Delaynms(1);//延时是必须的}/************************************************************** ****************/voidSend_byte(unsignedcharbbyte)//发送一个字节{unsignedchari;for(i=0;i<8;i++){SID=bbyte&0x80;//取出最高位SCLK=1;SCLK=0;bbyte<<=1;//左移}}/************************************************************** ****************/voidDelaynms(unsignedintdi)//延时{unsignedintda,db;for(da=0;da<di;da++)for(db=0;db<10;db++);}/************************************************************** ****************/voidDisp_img(unsignedchar*img) //图形方式12864显示字模221横向取膜{unsignedchari,j;unsignedintk=0;Write_char(0,0x36);//图形方式for(i=0;i<32;i++){Write_char(0,0x80+i);Write_char(0,0x80);for(j=0;j<16;j++){Write_char(1,img[k++]);}}for(i=0;i<32;i++){Write_char(0,0x80+i);Write_char(0,0x88);for(j=0;j<16;j++){Write_char(1,img[k++]);}}}/************************************************************** ****************/voidClr_Scr(void)//清屏函数{Write_char(0,0x01);}/************************************************************** ****************/voidLCD_set_xy(unsignedcharx,unsignedchary){ //设置LCD显示的起始位置,X为行,Y为列unsignedcharaddress;switch(x){case0:address=0x80+y;break;case1:address=0x80+y;break;case2:address=0x90+y;break;case3:address=0x88+y;break;case4:address=0x98+y;break;default:address=0x80+y;break;}Write_char(0,address);}/************************************************************** ****************/voidLCD_Write_string(unsignedcharX,unsignedcharY,unsignedchar*s) { // 中英文字符串显示函数LCD_set_xy(X,Y);while(*s){Write_char(1,*s);s++;Delaynms(1);}}/************************************************************** ****************/voidLCD_Write_number(unsignedchars)// 数字显示函数{Write_char(1,num[s]);Delaynms(1);}/************************************************************** ****************/voidLcd_Mark2(void){Clr_Scr();//清屏LCD_Write_string(1,0,znwk);//LCD_Write_string(2,0,waves);//LCD_Write_string(3,7,CM);//}/********************************************************/ voidConut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=time*1.87/100;//算出来是CM 11。
超声波测距12864显示程序带语音播报

#include <string.h>
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2 //数据口
sbit RS=P3^7;
flag=0;
time=0;
P16=1;
}
if((flag==1)&&(time>=200)&&(time<=500)){
Dis_string(1,0,"距离");
Dis_string(1,7,"米");
display(time,4);
Dis_string(2,2,string2);
}
void main()
{
flag=0;
P0=0XFF;
P14=0;
P15=0;
P16=0;
LcdInit(); //液晶初始化
Clear_txt();//清除液晶上的的文本
Dis_string(0,2,"欢迎使用");
Dis_string(2,0,"超声波测距离系统");
void DelayMs(uint z)
{
uint x,y;
for(x=z;x!=0;x--)
for(y=255;y!=0;y--);
}
//延时函数
void delay(unsigned int MS)
{
超声波测距模块说明

最近做超声波测距,就是简单的测量引脚高电平的时间。
思路是这样的1.使用8MHZ时钟,不分频初始化Timerx_Init(235,1);//8Mhz的计数频率,计数到235为1cm距离2. PA0高电平时,打开定时器,测量时间while(PAin(0)){TIM3->CR1|=0x01; //使能定时器3}TIM3->CR1|=0x00; //关闭定时器3S=temp/2 //测量距离为总路程一半temp=0;//计数值清零3.计数到235时,产生中断,进入中断函数。
执行temp++操作void TIM3_IRQHandler(void){if(TIM3->SR&0X0001)//溢出中断{temp++;}TIM3->SR&=~(1<<0);//清除中断标志位}4.得出距离值S初学定时器,这样测距思路对吗实际测试后,S值一直为0,为什么超声波测距模块说明1.模块引脚从左到右(见图)模块引脚分别为:VCC、trig(控制端)、echo(接收端)、out(空脚)、GND2.主要技术参数:1:使用电压:DC5V2:静态电流:小于2mA3:电平输出:高电平VCC-0.2V 低<0.2V4:感应角度:不大于15 度5:探测距离:0.02m-5m6:探测精度:3mm(既然探测精度精确到毫米,就是说数据可以显示到毫米级,也就是四位数了!)板上接线方式:VCC、trig(控制端)、echo(接收端)、out(空脚)、GND。
OUT 脚为防盗模块时的开关量输出脚,测距模块不用此脚!3.使用方法:(1)采用IO 触发测距,给TRIG 至少10us 的高电平信号(实际上25us 最佳);此处通过IO口给一个高电平就行了。
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;(3)有信号通过ECHO 返回,ECHO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.此处用定时器定时看看到底多长时间!这里要检测高电平信号,本产品使用方法简单,用单片机IO 口控制TRIG 发一个10us以上(25us最佳)的高电平,就可以在接收口(ECHO)等待高电平输出.当ECHO 从低变到高就可以开定时器计时,当ECHO 变为低电平时就可以读定时器的值,此时就为此次测距的时间,据公式:测试距离=(高电平时间*声速(340m/s))/2,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了!在程序编写上应该注意的问题:第一个问题:基于SPI通信方式的一片74CH595驱动的四个数码管的显示的实现。
超声波模块代码

超声波模块代码超声波模块代码超声波模块是一种常用的传感器,可以用来测量距离。
在很多项目中都需要使用到超声波模块,比如智能小车、智能家居等。
本文将介绍超声波模块的代码实现。
一、硬件准备在编写代码之前,需要先准备好超声波模块及其连接线。
超声波模块通常有4个引脚:VCC、GND、Trig和Echo。
其中VCC和GND分别接到电源正负极,Trig接到单片机的输出口,Echo接到单片机的输入口。
二、代码实现1.初始化首先需要定义Trig和Echo引脚的端口号,并设置其为输出和输入状态:#define Trig_Pin P0_0 //定义Trig引脚为P0.0#define Echo_Pin P0_1 //定义Echo引脚为P0.1void Init() //初始化函数{Trig_Pin = 0; //将Trig引脚置为低电平Echo_Pin = 1; //将Echo引脚置为高电平}```2.发送信号发送信号即向Trig引脚输出一个10us的高电平信号,然后再将其置为低电平:```cvoid SendSignal() //发送信号函数{Trig_Pin = 1; //将Trig引脚置为高电平Delay10us(); //延时10usTrig_Pin = 0; //将Trig引脚置为低电平}其中Delay10us()是一个延时函数,用来产生10us的延时。
3.接收信号接收信号即读取Echo引脚的状态,并计算出超声波传播的时间:```cint ReceiveSignal() //接收信号函数{int time = 0;while(Echo_Pin == 0); //等待Echo引脚变为高电平while(Echo_Pin == 1) //计算超声波传播时间{time++;Delay1us();if(time > 500) break; //防止死循环}return time;}```其中Delay1us()是一个延时函数,用来产生1us的延时。
超声波模块单片机程序

|DB1-----P1.1 |DB5-----P1.5 |RS-------P3.3 |
|DB2-----P1.2 |DB6-----P1.6 |E--------P3.5 |
|DB3-----P1.3 |DB7-----P1.7 |VLCD接1K电阻到GND|
sbit test = P1^1; //测试用引脚
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
#define Key_Data P3_3 //定义Keyboard引脚
#define Key_CLK P3_2
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfrP2M1 = 0X95;
sfrP2M0 = 0X96;
//***********************************************
sbit Trig = P1^0; //产生脉冲引脚
sbit Echo = P3^2; //回波引脚
超声波模块HC-SR04调试以及数码管显示

超声波模块HC-SR04简介以及编程1、本模块性能稳定,测度距离精确,模块高精度,盲区小。
产品应用领域:机器人避障物体测距液位检测公共安防停车场检测。
2 主要技术参数:1:使用电压:DC---5V2:静态电流:小于2mA3:电平输出:高5V4:电平输出:底0V5:感应角度:不大于15度6:探测距离:2cm-450cm7:高精度可达0.2cm实物图接线方式:VCC、trig(控制端)、echo(接收端)、GND基本工作原理:(1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2; 本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以达到你移动测量的值操作:初始化时将trig 和echo 端口都置低,首先向给 trig 发送至少10 us 的高电平脉冲(模块自动向外发送8个40K 的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo 的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。
下面是飞思卡尔XS128单片机测距的程序:while(1){PT1AD0_PT1AD00 = 1;//给超声波模块输入高脉冲PITINTE_PINTE1=1; //打开PIT1定时器while(!(counter0>=4)); //等待20usPITINTE_PINTE1=0;counter0 = 0;//关闭定时器,计数清零PT1AD0_PT1AD00 = 0; //trig管脚拉低PORTB_PB0 = 0; //指示灯0while(!(PT1AD0_PT1AD01 == 1)); //等待echo输出上升沿PORTB_PB1 = 0; //指示灯1PITINTE_PINTE0=1; //打开PIT0定时器while(!(PT1AD0_PT1AD01 == 0)); //等待下降沿distance = counter*17/20; //计算距离,单位CMPITINTE_PINTE0=0; //关闭定时器PORTB_PB2 = 0; //指示灯2PITINTE_PINTE0=1; //打开定时器定时500ms,数码管显示while(!(counter>=10000)){Showing(distance); //显示距离,精确1cm}PITINTE_PINTE0=0;counter=0; //关闭定时器,清零}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WriteData(string[k]);
k++; //指向下字符数组一个元素
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0; //将E恢复低电平
return result;
}
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38); //连续三次,确保初始化成功
delay(5);
WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
//超声波模块显示程序
#include <reg52.h> //包括一个52标准内核的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
IT0=0; //由高电平变低电平,触发外部中断
//ET0=1; //打开定时器0中断
}
i=0;
flag=0;
Tx=0; //首先拉低脉冲输入引脚
TMOD=0x10; //定时器0,定时器1,16位工作方式
// TR0=1; //启动定时器0
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms ,给硬件一点反应时间
}
void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
uchar k; //定义变量i指向字符串数组元素
LcdInitiate(); //调用LCD初始化函数
uchar kk,ww,ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
#define ulong unsigned long
sbit Tx = P3^3; //产生脉冲引脚
sbit Rx = P3^2; //回波引脚
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
delay(10); //延时10ms,给硬件一点反应时间
WriteAddress(0x01); // 从第1行第3列开始显示
k = 0; //指向字符数组的第1个元素
while(string[k] != '\0')
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
//uchar code SEG7x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
void pai_xu();
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚