51单片机1602显示的超声波测距源程序

合集下载

超声波测距程序

超声波测距程序

超声波测距程序超声波程序如下:/**********************************包含头文件**********************************/#include#include "1602.h"/************************************宏定义************************************/#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;/************************************位定义************************************/sbit INPUT = P3^2; //回声接收端口sbit OUTPUT = P1^0; //超声触发端口sbit Beep = P2^0 ; // 蜂鸣器/********************************定义变量和数组********************************/long int distance=0; //距离变量uchar table[]=" Welcome to ";uchar table0[]=" chaoshengbo ";uchar table1[]="There's no echo.";uchar table2[]=" csbcj ";uchar table3[]="Distance:";uchar count;/***********************************函数声明***********************************/extern void initLCD();extern void write_date(uchar date);extern void write_com(uchar com);extern void delay(uint x);/************************************************************** ****************//* 函数名称 : 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++ ){;}}}/************************************************************** ****************//* 函数名称 : Alarm *//* 函数描述 : 蜂鸣器发声函数 *//* 输入参数 : t *//* 参数描述 : 发声的次数 *//* 返回值 : 无 *//************************************************************** ****************/void Alarm(uchar t){uchar i;for(i = 0;i < t;i++){Beep = 1;Delay_xMs(1000);Beep = 0;Delay_xMs(1000);}}/************************************************************** ****************//* 函数名称 : delayt *//* 函数描述 : 延时函数 *//* 输入参数 : x*//* 参数描述 : 延时时间数据 *//* 返回值 : 无 *//************************************************************** ****************/void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}/************************************************************** ****************//* 函数名称 : Init_MCU *//* 函数描述 : 初始化单片机函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Init_MCU(void){TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式TL0 = 0x66;TH0 = 0xfc; //1msET0 = 1; //开定时器2EA = 1; //总中断使能}/************************************************************** ****************//* 函数名称 : Init_Parameter *//* 函数描述 : 初始化参数和IO口函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//******************************************************************************/void Init_Parameter(void){OUTPUT =1;INPUT = 1;count = 0;distance = 0;}/************************************************************** ****************//* 函数名称 : display_char *//* 函数描述 : 显示字符串函数 *//* 输入参数 : point,address *//* 参数描述 : 写入的字符串的地址指针 1602显示对应的地址 */ /* 返回值 : 无 *//************************************************************** ****************/void display_char(uchar *point,uchar address){uchar i;write_com(0x80 + address);for(i = 0;i < 16; i++){write_date(*point);point++;}}/************************************************************** ****************//* 函数名称 : display *//* 函数描述 : 显示数字*//* 输入参数 : number,address *//* 参数描述 : number写入的数据,address地址 *//* 返回值 : 无 *//************************************************************** ****************/void display(int number,uchar address){uchar b,c,d,e;b= (number / 1000);c= (number / 100) % 10;d = (number / 10) % 10;e = number % 10;write_com(0x80 + address);write_date(b + 48);write_date(c + 48);write_date(d + 48);write_date(46); //小数点的ASCIIwrite_date(e + 48);write_date(99); //"c"的ASCIIwrite_date(109); //"m"的ASCII}/************************************************************** ****************//* 函数名称 : Trig_SuperSonic *//* 函数描述 : 发出声波函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Trig_SuperSonic(void)//出发声波{OUTPUT = 1;delayt(1);OUTPUT = 0;}/************************************************************** ****************//* 函数名称 : Measure_Distance *//* 函数描述 : 计算距离函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Measure_Distance(void){uchar l;uint h,y;TR0 = 1;while(INPUT){;}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 = VELOCITY_30C * distance / 20000;}/************************************************************** ****************//* 函数名称 : main *//* 函数描述 : 主函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void main(void){Beep = 0;rw = 0;initLCD();Init_MCU();Init_Parameter();Alarm(2);display_char(table,0x00);display_char(table0,0x40);Delay_xMs(30000);display_char(table2,0x00);display_char(table1,0x40);while(1){Trig_SuperSonic(); //触发超声波发射while(INPUT == 0) //等待回声{;}Measure_Distance(); //计算脉宽并转换为距离display_char(table3,0x40);display(distance,0x49); //显示距离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;}}/************************************************************** ****************/1602程序如下:/************************************宏定义************************************/#define uchar unsigned char#define uint unsigned int/************************************位定义************************************/sbit dula = P2^6;sbit wela = P2^7;sbit rs = P2^3;sbit rw = P2^4;sbit lcden = P2^5;/************************************************************** ****************//* 函数名称 : delay *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//************************************************************** ****************/void delay(uint x){uint a,b;for(a = x;a > 0;a--){for(b = 10;b > 0;b--){;}}}/************************************************************** ****************//* 函数名称 : write_com *//* 函数描述 : 1602写命令函数 *//* 输入参数 : com*//* 参数描述 : 控制命令 *//* 返回值 : 无 *//************************************************************** ****************/void write_com(uchar com){P0 = com;rs = 0;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : write_date *//* 函数描述 : 1602写数据函数 *//* 输入参数 : date *//* 参数描述 : 要写入的数据 *//* 返回值 : 无 *//******************************************************************************/void write_date(uchar date){P0 = date;rs = 1;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : initLCD *//* 函数描述 : 1602初始化函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void initLCD(void){dula = 0;wela = 0;write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x01);delay(20);}/************************************************************** ****************/51程序如下:#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */ sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B;sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99;/* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5;sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。

用51单片机设计超声波测距系统的设计原理及电路(附源程序)

用51单片机设计超声波测距系统的设计原理及电路(附源程序)

基于51单片机的超声波测距仪说明书引言超声波测距仪,可应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。

利用超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。

利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制。

一、性能要求该超声波测距仪,要求测量范围在0.08-3.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。

二、工作原理及方案论证超声波传感器及其测距原理超声波是指频率高于20KHz的机械波。

用超声波传感器产生超声波和接收超声波,习惯上称为超声波换能器或超声波探头。

超声波传感器有发送器和接收器.超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。

超声波测距的原理一般采用渡越时间法TOF(timeofflight)。

首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。

根据要求并综合各方面因素,采用AT89C52单片机作为主控制器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成,超声波测距仪的系统框图如下图所示:图1 超声波测距仪系统设计框图三、系统硬件部分硬件部分主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。

1.单片机系统及显示电路单片机采用AT89C52来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。

单片机通过P1.1引脚发射脉冲控制超声波的发送,然后单片机不停的检测外中断0口INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。

计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。

显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管驱动。

51单片机超声波测距离(带温度补偿)

51单片机超声波测距离(带温度补偿)

超声波模块原理图:发射接收原理图PCB:51单片机原理图:软件部分C语言程序:/*=========================================================== =========调试要求:1.MCU:A T89S52芯片或AT89C522.晶振:12MHz调试注意:本程序带温度补偿,采用DS18B20测量温度1.LCD1602液晶屏有显示后,才接入超声波模块。

2.注意超声波模块电源的极性。

不清楚请参好淘宝的电路图3.没有选用频率为12MHz晶振,用了别的频率晶振,单片机定时器的测量值与发出的40KHz频率脉冲不对。

4.使用者经常误发出20KHZ脉冲当40KHZ脉冲。

(40KHz频率脉冲,周期25us,占空比为50% = 12.5us)5.如果是用开发板调超声波模块,请检查开发板上的电路是否与超声波模块的控制脚复用了, 若复用了,请通过跳线分开发板上的电路。

6如果使用的是万用板,请确定单片机的复位电路和晶振电路是否正常,同时单片机的31脚(EA)记得接高电平。

============================================================= =======*/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//===============================LCD1602接口定义=====================/*-----------------------------------------------------|DB0-----P2.0 | DB4-----P2.4 | RW-------P0.1 ||DB1-----P2.1 | DB5-----P2.5 | RS-------P0.2 ||DB2-----P2.2 | DB6-----P2.6 | E--------P0.0 ||DB3-----P2.3 | DB7-----P2.7 | 注意,P0.0到P0.2需要接上拉电阻---------------------------------------------------============================================================= */#define LCM_Data P2 //数据接口#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCM_RW = P0^1; //读写控制输入端,LCD1602的第五脚sbit LCM_RS = P0^2; //寄存器选择输入端,LCD1602的第四脚sbit LCM_E = P0^0; //使能信号输入端,LCD1602的第6脚//===============================超声波模块定义========================sbit RemPin =P3^2;// 接收端(这个不能修改,因为是外部中断(INT0)的引脚) sbit TxPin =P3^1;// 发射端//******************************************************************** ***//ds18b20数字温度传感器控制引脚定义sbit dq_ds18b20=P3^3;//定义控制DS18B20//******************************************************************** ***//LCD显示模块的函数声明void WriteDataLCM (uchar WDLCM);//LCD模块写数据void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令uchar ReadDataLCM (void);//LCD模块读数据uchar ReadStatusLCM (void);//读LCD模块的忙标void DisplayOneChar (uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符void DisplayListChar (uchar X,uchar Y,uchar delayms,uchar code *DData); void DisplayCursorPos (uchar X, uchar Y);void LCMInit (void);void DisplayIntData (uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu);void DisplayCharData (uchar X, uchar Y,uchar ZiFu);//******************************************************************** **//延时函数声明void delay25us_40KHz(unsigned char us);void DelayUs(uint us);void DelayMs(uint Ms);void delay_3us();//3US的延时程序void delay_8us(unsigned int t);//8US延时基准程序void delay_50us(unsigned int t);//延时50*T微妙函数的声明//******************************************************************** ***//DS18B20测温函数定义void w_1byte_ds18b20(uchar value);//向DS18B20写一个字节uchar r_1byte_ds18b20(void);//从DS18B20读取一个字节的数据void rest_ds18b20(void);//DS18B20复位程序void readtemp_ds18b20(void);//读取温度void display_temp(void);//温度显示程序//******************************************************************** ***//参数定义uint length = 0; // 测距的长度0.00Muchar flag = 0; // 测距的标志有信号接收=1uchar templ,temph;uint speed;//根据温度计算出来的声音速度uchar t_b,t_s,t_g,t_x;//从左到右分别存储温度百位,十位,个位,小数位uchar flag1;//温度正负性暂存,1为正数,0为负数const unsigned char tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x0 8,0x09,0x09};/*=========================================================== ================主程序============================================================= ================*/void main(void){uchar i;LCMInit(); //1602初始化EX0 = 1; //允许总中断中断,使能INT0 外部中断ET0 = 1;TMOD=0x11; //设定T0为16位时器,设定T1为16位时器DisplayOneChar( 0,14,'m');DisplayListChar(0,0,0, "Distanc: "); //显示字符串while(1){readtemp_ds18b20();display_temp();//显示温度for(i=0;i<20;i++){DisplayIntData(0, 13,length,5,3);//显示测量距离TH0=0x00;TL0=0x00;TR0=1; //启动定时器0EA = 1; //允许所有中断delay25us_40KHz(15); //发出脉冲信号DelayMs(200);}}}//******************************************************************** ***********//温度显示函数void display_temp(){if(flag1==1)//温度为正数时的显示程序{DisplayOneChar( 1,2,'+');}else{DisplayOneChar( 1,2,'-');}//显示温度信息DisplayOneChar( 1,0,'T');DisplayOneChar( 1,1,':');DisplayOneChar( 1,3,t_s+0x30);DisplayOneChar( 1,4,t_g+0x30);DisplayOneChar( 1,5,'.');DisplayOneChar( 1,6,t_x+0x30);//显示速度信息DisplayOneChar( 1,8,'S');DisplayOneChar( 1,9,':');DisplayOneChar( 1,10,speed/100%10+0x30);DisplayOneChar( 1,11,speed/10%10+0x30);DisplayOneChar( 1,12,speed%10+0x30);DisplayOneChar( 1,13,'M');DisplayOneChar( 1,14,'/');DisplayOneChar( 1,15,'S');}//****************************************************//读取温度void readtemp_ds18b20(void){uchar temp32;rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0x44); //启动温度转换delay_8us(2);rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度templ=r_1byte_ds18b20();temph=r_1byte_ds18b20();if((temph&0xf0))//判断温度的正负性{flag1=0;temph=-temph;templ=-templ;t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据speed=331.4-0.607*(temp32 | templ);}else//为正数{t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据flag1=1;speed=311.4+0.607*(temp32 | templ);}}/*=========================================================== =========功能:在1602显示一个整数数据说明:显示一个整数数据-9999->32625. 从右至左显示数据5位:============================================================= =========*/void DisplayIntData(uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu) {uchar i=0,k=0, BCD[5]={0};if(Digit>5) Digit=5;if(ZhengShu<0){k=1;//负数示志位ZhengShu=-ZhengShu;}BCD[4] =ZhengShu / 10000; //求出万位数据ZhengShu = ZhengShu % 10000;BCD[3] =ZhengShu / 1000; //求出千位数据ZhengShu = ZhengShu % 1000;BCD[2] =ZhengShu / 100; //求出百位数据ZhengShu = ZhengShu % 100;BCD[1] =ZhengShu / 10; //求出十位数据BCD[0] =ZhengShu % 10; //求出个位数据for(i=0;i<Digit;i++)//输出显示的数值{if((i==XiaoShu)&&(0!=XiaoShu)){DisplayOneChar(X,Y-i,'.');//输出小数点Y= Y-1;}DisplayOneChar(X,Y-i,BCD[i]+0x30); //显示一个字符}if(k==1)DisplayOneChar(X,Y-1,'-');//输出负符}//****************************************************************//读一个字节uchar r_1byte_ds18b20(void){uchar i=0;uchar value= 0;for (i=0;i<8;i++){value>>=1;dq_ds18b20=0;// DQ_L;delay_3us();dq_ds18b20=1; //DQ_H;delay_8us(2);if(dq_ds18b20==1) value|=0x80;delay_8us(6); //延时40us}dq_ds18b20=1;return value;}//******************************************************************** ***********//子程序功能:向DS18B20写一字节的数据void w_1byte_ds18b20(uchar value){uchar i=0;for(i=0;i<8;i++){dq_ds18b20=1;delay_3us();dq_ds18b20=0;delay_8us(2);if (value& 0x01) dq_ds18b20=1; //DQ = 1delay_50us(1); //延时50us 以上delay_8us(2);value>>=1;}dq_ds18b20=1; //DQ = 1}//;**************************************************//ds18b20复位子程序void rest_ds18b20(void){rest:delay_3us(); //稍做延时delay_3us();dq_ds18b20=1;delay_3us();dq_ds18b20=0;// DQ_L;delay_50us(11);//480us<T<960usdq_ds18b20=1;//拉高总线delay_8us(5);if(dq_ds18b20==1){return;}delay_50us(2); //延时90usif(dq_ds18b20==1){return;}else{goto rest;}}//==============================超声波模块测试子程序================================================/*=========================================================== =========注意:是用12MHz晶振设定延时时间:x*25us 与产生40KHZ的脉冲============================================================= =======*/void delay25us_40KHz(unsigned char us){while(us--){TxPin = 0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TxPin = 1;_nop_();_nop_();_nop_();_nop_();}TxPin = 1;}/*=========================================================== ==================中断程序的入口(注意:接收与发射的电平是相反的)============================================================= ==================*/void init0int() interrupt 0{uint timer_us = 0;TR0=0; //关闭定时器0timer_us =TH0*256+TL0;if(timer_us>190)timer_us=timer_us-180; //修正测距的距离if(timer_us<=735){timer_us=timer_us-96;//二次修正}if(timer_us>5059){timer_us+=29;}if(timer_us>5470){timer_us+=29;}if(timer_us>6410){timer_us+=29;}if(timer_us>7410){timer_us+=29;}if(timer_us>8410){timer_us+=29;}if(timer_us>9410){timer_us+=29;}if(timer_us>10410){timer_us+=29;}length = ((unsigned long)(speed)*timer_us)/2000;//计算长度,是扩大100倍flag = 0;EA = 0; //禁止所有中断}/*=========================================================== =========功能:在1602显示一个字符数据说明:显示一个字符数据0~256. 从左至右显示数据3位============================================================= =========*/void DisplayCharData(uchar X, uchar Y,uchar ZiFu){uchar i=0;uchar V alueBCD[3];V alueBCD[0] = ZiFu / 100; //求出百位数据ZiFu = ZiFu % 100;V alueBCD[1] = ZiFu / 10; //求出十位数据V alueBCD[2] = ZiFu % 10; //求出个位数据for(i=0;i<3;i++)//输出显示的数值{DisplayOneChar(X,Y+i,V alueBCD[i]+0x30); //显示一个字符}}/*=========================================================== ================超出测量时间============================================================= ================*/void timer0int (void) interrupt 1{TR0=0; //关闭定时器0length = 0; //超出测量时间显示示0flag = 1; //EA = 0; //禁止所有中断}/*=========================================================== ===========LCM初始化============================================================= =========*/void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置DelayMs(100);}/*=========================================================== =========显示光标的位置============================================================= =======*/void DisplayCursorPos( unsigned char X, unsigned char Y){X &= 0x1;Y &= 0xF; //限制Y不能大于15,X不能大于1if (X) Y |= 0x40; //当要显示第二行时地址码+0x40;Y |= 0x80; // 算出指令码WriteCommandLCM(Y, 1); //这里不检测忙信号,发送地址码}/*=========================================================== =========按指定位置显示一串字符:第X 行,第y列注意:字符串不能长于16个字符============================================================= =========*/void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData){unsigned char ListLength;ListLength = 0;X &= 0x1;Y &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]!='\0') //若到达字串尾则退出{if (Y <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;Y++;DelayMs(delayms);//延时显示字符串}elsebreak;//跳出循环体}}/*=========================================================== =========设定延时时间:x*1us============================================================= =======*/void DelayUs(uint us){while(us--);}/*=========================================================== =========设定延时时间:x*1ms============================================================= =======*/void DelayMs(uint Ms){uint i,TempCyc;for(i=0;i<Ms;i++){TempCyc = 250;while(TempCyc--);}}//==============================LCD1602显示子程序================================================/*=========================================================== ==========写数据函数: E =高脉冲RS=1 RW=0============================================================= =========*/void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/*=========================================================== =========写指令函数: E=高脉冲RS=0 RW=0============================================================= =========*/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);}/*=========================================================== =========正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。

51单片机超声波测距

51单片机超声波测距

//超声波模块显示程序#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Tx = P3^1; //产生脉冲引脚sbit Rx = P3^0; //回波引脚sbit dula=P2^6;sbit wela=P2^7;uchar code dispbit[]={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f};//共阴极数码管显示位码uchar code SEG7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//数码管0-9 uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,outcomeH,outcomeL,i, dispcount; //自定义寄存器static unsigned char count=0;uint temp_data,distance_data;uchar dispbuf[4]; //显示缓冲区void delay_20us();//********函数声明//void conversion(uint temp_data);void display(){dula = 0;dula = 1;P0 = SEG7[dispbuf[dispcount]]; //根据dispcount当前计算值到dispbuf//显示缓冲存储区取待显示值作为参数到//SEG7段码存储区取显示段码赋给P0口dula = 0;wela = 0;wela = 1;P0 = dispbit[dispcount]; //根据dispcount当前计算值到dispbit位选存储区//取显示位码赋给P0口wela = 0;dispcount++;if(dispcount == 4) //共4位显示位{dispcount = 0;}count++;if(count == 100) //约25MS读取一次{count = 0;}}//void delay_20us();void main(void) // 主程序{Tx=0; //首先拉低脉冲输入引脚TMOD=0x01; //定时器0,定时器1,16位工作方式IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断// EX0=1; //关闭外部中断EA=1; //打开总中断TH0 =(65536-2500)/256; //约2.50MS定时器初值TL0 =(65536-2500)%256; //约2.50MS定时器初// EA=1;//Rx=1; //while(1) //程序循环{Tx=1;delay_20us(); //产生一个20us的脉冲,在Tx引脚Tx=0;TR0=1; //启动定时器0EX0=1; //打开外部中断//TF1=0; //}}//***************************************************************//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{TR0=0;// EX0=0; //关闭外部中断outcomeH =TH0; //取出定时器的值outcomeL =TL0; //取出定时器的值TH0 =(65536-2500)/256; //约2.50MS定时器初值TL0 =(65536-2500)%256; //约2.50MS定时器初值TH0 = 0xef; TL0 = 0x94; //写入定时器0初始值distance_data=outcomeH; //测量结果的高8位distance_data<<=8; //放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据// distance_data*=12; //因为定时器默认为12分频distance_data/=58;dispbuf[0] = distance_data / 1000; //千位dispbuf[1] = distance_data % 1000 / 100; //百位dispbuf[2] = distance_data % 100 / 10; //十位dispbuf[3] = distance_data % 10; //个位display();}//****************************************************************//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0 =(65536-2500)/256; //约2.50MS定时器初值TL0 =(65536-2500)%256; //约2.50MS定时器初值TH0 = 0xef; TL0 = 0x94; //写入定时器0初始值dispbuf[0] = 10; //显示"-"dispbuf[1] = 10; //显示"-"dispbuf[2] = 10; //显示"-"dispbuf[3] = 10; //显示"-"display();}//******************************************************************void delay_20us(){ uchar bt ;for(bt=0;bt<60;bt++);}。

基于51单片机的US-100(超声波模块)1602显示程序

基于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');} }。

基于51单片机控制的超声波测距程序

基于51单片机控制的超声波测距程序
sj2=40;
s=sj2;
}
void k3cl()
{
sj3=sj3+10;
if(sj3> 500)
sj3=100;
sj1-1;
sx1=sx1/csbc;
mqs=sx1/4.5;
}
void offmsd()
{
if (buffer[0] == 0x3f)
buffer[0] = 0x00;
if((P3&0x10)==0)//判断3位是否显示完
key=0;
digit> > =1; //循环右移1位
}
}
void timeToBuffer() //转换段码功能模块
{
xm0=s/100;
xm1=(s-100*xm0)/10;
xm2=s-100*xm0-10*xm1;
buffer[2]=convert[xm2];
void delay(j);//延时函数
void scanLED();//显示函数
void timeToBuffer();//显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();
void main()//主函数
}
{
csbds=0;
cl=1;
}
}
void csbcj()
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
i=10;
while(i--)
{
csbout=!csbout;

51单片机超声波测距程序

51单片机超声波测距程序

// 超声波测距,测距范围2cm-400cm;#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char sbittrig=P1A0;sbit echo二卩3八2;sbit test=P1A1; // 测试灯sbit dula=P2A6;sbit wela=P2A7;sbit BEEP=P2A3;uint timeh,timel,distance;uint ge,shi,bai,xiaoshu,flag,time;/* 共阴极数码管不带小数点代码表*/ uchar code list[]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 ,0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 };/* 共阴极数码管带小数点代码表*/ uchar code listtwo[] ={ 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/* 长延时函数*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);/* 短延时函数*/ void delay20us() {uchar a;for(a=0;a<100;a++); }/* 报警函数*/void beer(){// BEEP=0; delay(10);}/* 定时器初始化*/ void initime0() {TMOD=0x01;TH0=0;EA=0;ET0=0;EX0=0;}/* 外部中断函数*/ void estern() interrupt 0 {timeh=TH0;timel=TL0;beer();flag=1;EX0=0;TR0=0;}/* 显示函数*/void display(distance) bai=distance/1000;shi=distance%1000/100; ge=distance%100; xiaoshu=distance%10; // 进入中断,标志位就置 1 // 同时关断外部中断和定时P0=list[xiaoshu]; dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(2);dula=1;P0=listtwo[ge]; dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(2);dula=1;P0=list[shi]; dula=0;wela=1;P0=0xfd; wela=0;delay(1);dula=1;P0=list[bai]; dula=0;P0=0xff;wela=1;P0=0xfe; wela=0;delay(1);}/* 被调用子函数 */ void diaoyong(){ uinti;EA=0;echo=1; // 为了检测电平的高低,首先必须拉高trig=1;delay20us();trig=0;while(echo==0);向下执行flag=0;EA=1;EX0=1;TR0=1;TH0=0;TL0=0;for(i=0;i<100;i++) display(distance); // 用 100 次显示循环来延时, 解决数码管// 如果进入中断 即接收到超声波就 // 接收到就清除标志位 // 同时打开总中断 // 打开外部中断 // 开定时器 // 定时器清零// 等待测量的结果显示不亮问题}// delay(50); // 用延时函数数码管闪烁TR0=0; // 延时一段时间后关断定时器EX0=0; // 延时一段时间后关断外部中断if(flag==1) // 如果进入中断,说明测距已经测好{time=timeh*256+timel;// 计算测定距离,并显示distance=time*0.1720;display(distance);}if(flag==0) // 如果没有进入中断,距离为0,同时灯闪烁{distance=0;test=!test;}}/* 主函数*/void main(){initime0();test=0;trig=0;EA=1;while(1){ diaoyong();display(distance);。

51单片机超声波模块程序

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]);}。

超声波测距—1602显示

超声波测距—1602显示

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit ech0=P3^2;sbit trig=P1^4;sbit rs=P1^2;sbit rw=P1^1;sbit en=P1^0;unsigned int time,timeH,timeL,distance;unsigned char succeed_flag;/**************************延时函数*******************************/ void delay(unsigned int z){unsigned char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); //延时1ms}/*************************延时20us***********************************/ void delay_20us(){unsigned char a;for(a=0;a<10;a++);}/**************液晶1602显示程序**************************/void write_com(unsigned char com) //写命令{rs=0;rw=0;P2=com;delay(5);en=1;delay(5);en=0;}void write_data(unsigned char date) //写数据{rs=1;rw=0;P2=date;delay(5);en=1;delay(5);en=0;}/************************液晶字符输入**************************/ void zifu_1602(unsigned char *str) //写字符{while(*str!='\0'){write_data(*str);str++;}}/**************************数字输入*****************************/ void shuzi_1602(unsigned char dat) //写数字{unsigned char dat1;dat1=dat+'0';write_data(dat1);}/************************液晶输入的位置*************************/ void weizhi_1602(unsigned char x,unsigned char y){if(x==1){write_com(0x80+y); //第一行}if(x==2){write_com(0x80+0x40+y); //第二行}}/***************************液晶显示函数***************************/ void display(unsigned int k){unsigned char aa,bb,cc;aa=distance / 100;bb=distance / 10%10;cc=distance % 10;weizhi_1602(1,4);shuzi_1602(aa);weizhi_1602(1,5);shuzi_1602(bb);weizhi_1602(1,6);shuzi_1602(cc);}/****************************液晶初始化******************************/ void init(){rw=0;en=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);weizhi_1602(1,2);zifu_1602("S");weizhi_1602(1,3);zifu_1602("=");weizhi_1602(1,7);zifu_1602("c");weizhi_1602(1,8);zifu_1602("m");}void main(){init();trig=0;EA=1;TMOD=0X10; //定时器1,16位工作方式while(1){EA=0;trig=1; //触发控制信号delay_20us();trig=0; //产生一个延时为20us的波while(ech0==0); //等待echo回波引脚边为高电平succeed_flag=0; //清测量成功标志EA=1;EX0=1; //开外部中断0TH1=0;TL1=0; //定时器1清0TF1=0; //计数溢出标志TR1=1; //启动定时器1delay(20); //等待测量结果TR1=0; //关闭定时器1EX0=0; //关闭外部中断0if(succeed_flag==1){time=timeH*256+timeL;distance=time*1.87/100; //cmdisplay(distance);}if(succeed_flag==0) //无回波,清0{distance=0;}}}void exter() interrupt 0 //外部中断0,判断回波电平{timeH=TH1;timeL=TL1; //取出定时器值succeed_flag=1; //成功测量的标志EX0=0; //关闭外部中断}void timer1() interrupt 3 //定时器1中断,用做超声波测距计时{TH1=0;TL1=0;}。

用51单片机设计超声波测距系统的设计原理及电路(附源程序)

用51单片机设计超声波测距系统的设计原理及电路(附源程序)

基于51单片机的超声波测距仪说明书引言超声波测距仪,可应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。

利用超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。

利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制。

一、性能要求该超声波测距仪,要求测量范围在0.08-3.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。

二、工作原理及方案论证超声波传感器及其测距原理超声波是指频率高于20KHz的机械波。

用超声波传感器产生超声波和接收超声波,习惯上称为超声波换能器或超声波探头。

超声波传感器有发送器和接收器.超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。

超声波测距的原理一般采用渡越时间法TOF(timeofflight)。

首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。

根据要求并综合各方面因素,采用AT89C52单片机作为主控制器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成,超声波测距仪的系统框图如下图所示:图1 超声波测距仪系统设计框图三、系统硬件部分硬件部分主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。

1.单片机系统及显示电路单片机采用AT89C52来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。

单片机通过P1.1引脚发射脉冲控制超声波的发送,然后单片机不停的检测外中断0口INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。

计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。

显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管驱动。

51单片机驱动超声波测距模块C51程序

51单片机驱动超声波测距模块C51程序

51单片机驱动超声波测距模块C51程序51单片机驱动超声波测距模块C51程序#include;#define uchar unsigned char#define uint unsigned int#define ulong unsigned long//******************* 函数声明**************************void init_T otal(); //总初始化void init_T0(); //初始化定时器T0void init_T1(); //初始化定时器T1void init_inter0();//初始化外部中断1void send_T();void delay(uint z);//延时一段时间void delay_300us();//延时300usvoid delay_100us();//延时100us//*********************************************** *********sbit lcdrs=P1^7;sbit lcdrw=P3^1;sbit lcden=P1^5;//1602液晶控制端sbit send=P1^0;//sbit BEEP=P2^5;sbit wei=P2^6;sbit duan=P2^7;volatile uchar Count_TH ,Count_TL;//分别读计数器T1的高位TH1,低位TL1uchar t0,flag;uint time;uchar code table1[]=" distance "; uchar code table2[]=" ";//初始化显示void write_com(uchar com)//1602写指令函数{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar datb)//1602写数据函数{ lcdrs=1;P0=datb;delay(1);lcden=1;delay(1);lcden=0;}void distance(uchar addr,uint datb){uchar bai,shi,ge ;bai=datb/100;shi=datb%100/10;ge=datb%10;write_com(0x80+0x40+addr);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);}/************************************************ *************************************** 名称:void init_T otal()* 功能:总初始化* 入口参数:NULL* 全局变量:NULL* 返回值:NULL**************************************************************************************/void init_T otal(){init_T0(); //初始化定时器T0为工作方式2 init_T1(); //初始化定时器T1为工作方式1 init_inter0();//初始化外部中断1EA=1; //开总中断}/*************************************************************************************** 名称:void init_T0()* 功能:初始化定时器T0为工作方式2* 入口参数:NULL* 全局变量:NULL* 返回值:NULL**************************************************************************************/void init_T0(){TMOD=0X12;TH0=0XE7;TL0=0XE7;EA=0;ET0=1;TR0=1;}/************************************************ *************************************** 名称:void init_T1()* 功能:初始化定时器T1为工作方式1* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void init_T1(){TMOD=0X12;TH1=0;TL1=0;EA=0;ET1=1;TR1=1;}/************************************************ *************************************** 名称:void init_inter1()* 功能:初始化外部中断1为低电平触发方式* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void init_inter0(){IT0=0; //低电平触发EA=0;EX0=0; //关外部中断1}/************************************************ *************************************** 名称:void inter_T0() interrupt 1* 功能:定时器T0中断函数产生40KHZ的方波* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void inter_T0() interrupt 1{send=~send;}/************************************************ *************************************** 名称:void inter_T1() interrupt 3* 功能:定时器T1中断函数* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void inter_T1() interrupt 3{TR1=0;EX0=0; //关外部中断0TH1=0;TL1=0;flag=2;}/************************************************ *************************************** 名称:void inter1() interrupt 2* 功能:外部中断1函数* 入口参数:NULL* 全局变量:Count_TH,Count_TL* 返回值:NULL************************************************* *************************************/void inter0() interrupt 0{TR1=0;EX0=0;flag=1;}/************************************************ *************************************** 名称:void send_T()* 功能:发送10个超声波脉冲* 入口参数:NULL* 全局变量:Count* 返回值:NULL************************************************* *************************************/void send_T(){delay_100us();//发送100us的方波TR0=0;//关定时器T0}/************************************************ *************************************** 名称:void delay(uint z)* 功能:延时一段时间* 入口参数:z* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void delay(uint z){uint x,y;for(x=z;x>;0;x--)for(y=1000;y>;0;y--);}/************************************************ *************************************** 名称:void delay_300us()* 功能:延时300us* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void delay_300us(){uint x;for(x=75;x>;0;x--);}/************************************************ *************************************** 名称:void delay_100us()* 功能:延时100us* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void delay_100us(){uint x;for(x=24;x>;0;x--);}//*********************************************** ****************************************void main(){uint t,s;init_T otal();//总初始化while(1){TR1=1;//启动定时器1TR0=1;//启动定时器0send_T(); //发送100us超声波脉冲delay_300us();//延时300us跳过盲区EX1=1; //开外部中断1while(!flag); //等待回波或定时器T1溢出if(flag==1) //回波{Count_TH=TH1;//读计数器T1的高位TH1 Count_TL=TL1;//读计数器T1的低位TL1 t=Count_TH*256+Count_TL;s=(33140*t)/400000;distance(4,s);//液晶1602显示距离 }/* else //定时器T1溢出{Count_TH=0XFE;Count_TL=0X7F;// P2=Count_TH;P2=Count_TL;}*/delay(150);flag=0;//标志位清0TH1=0; //T1清0重新计时TL1=0;}}。

51单片机超声波测距

51单片机超声波测距

51单片机超声波测距
一、总述
超声波模块的使用方法:控制口Trig发一个10US 以上的高电平,就可以在接收口Echo等待高电平输出。

高电平持续的时间就是超声波从发射到返回的时间。

根据高电平的时长即可算出距离。

模块探测距离为:2cm-400cm。

系统使用STC89C52的P1.0口连接超声波测距模块的Trig口对其进行控制,外部中断P3.2口连接超声波测距模块的Echo口用于接收超声波模块传回的高电平。

使用1602液晶进行显示。

二、硬件电路设计
三、软件程序设计
四、其他
在使用时发现在2m范围内此模块灵活准确,误差在毫米范围。

超出2m后对待测距物体的平整程度和对准角度要求非常高。

其他资料可参考使用说明书。

51单片机的液晶显示超声波测距仪

51单片机的液晶显示超声波测距仪

#include"1602.h"#define uchar unsigned char#define uint unsigned intsbittring = P1^3; //超声波控制端sbit echo = P3^2; //回波必须接在外部中断引脚上sbitledwarn = P2^0; //报警灯,低电平亮sbit beep = P2^1; //报警蜂鸣器uintdisplayCount;//显示计数uint time = 0;//时间unsigned long distance ;//距离float distancef;//浮点型的数据uintflagSucceed = 0; //测量成功标志位uintflagDisplay = 0; //开显示标志位void delay_20us(){uchari ;for(i=0;i<140;i++);}voidinit_shuju(){tring = 0;distance = 0;displayCount = 0;}void init_waibu0(){IT0 = 0; //外部引脚为低时触发中断EX0=0; //关闭外部中断}void timer0_Init(){TMOD = 0x11; //定时器0和1工作在16位方式TH0 = (65535-45872)/256;TL0 = (65535-45872)%6;TR0 = 1; //启动定时器ET0 = 1; //允许定时器0中断}void timer1_Init(){TMOD = 0x11; //定时器0和1工作在16位方式TH1 = 0;TL1 = 0;ET1 = 1; //定时器1中断允许}void wbzd0() interrupt 0//下降沿触发{time =TH1*256+TL1; //取出定时器的值flagSucceed = 1; //置成功测量的标志EX0=0; //关闭外部中断// TR1=0;}void timer0() interrupt 1 // 定时器0{TH0 = (65535-45872)/256;TL0 = (65535-45872)%6;displayCount ++;if (displayCount>= 20) //1秒钟显示一次{flagDisplay = 1; //开显示displayCount = 0;}}void start_csb() //启动csb模块{tring = 1;delay_20us();tring = 0;}void main(){EA=0;init_shuju();init_waibu0();timer0_Init();timer1_Init();L1602_init();L1602_string(1,1,"welcome my ");L1602_string(2,1,"test distance "); delay1(1);while(1){EA=0;//关闭总中断start_csb();while(echo==0);//变高则进入下一步flagSucceed = 0;TR1=1; //启动定时器1开始计数EA = 1;EX0=1;TH1= 0;TL1= 0;TF1= 0; //定时器1溢出标志位while (TH1<90) ; //盲区TR1 = 0; //关闭定时器1EX0 = 0; //关闭外部中断if(flagSucceed==1) //一次测试成功,则计算距离,单位为厘米{distancef = time * 1.085;//微妙为单位distancef /=58;//单位为厘米distance = distancef*10+0.5;//如果距离小于20cm,则声光报警if ((flagSucceed == 1) && (distance <= 200)){ledwarn = 0;beep = 0;delay1(1);beep = 1;delay1(1);}else{ledwarn = 1;beep = 1;}}if (flagDisplay == 1) //1秒显示时间到{if(flagSucceed==0)//没有测试成功{L1602_string(1,1," can't distance ");L1602_string(2,1," ------ ");}else{//LCD显示数据L1602_string(1,1,"distance result:");L1602_string(2,1," cm ");L1602_int(2,5,distance);}flagDisplay = 0;}}}。

51单片机超声波测距

51单片机超声波测距

flag=0; TR0=0; TH0=0; TL0=0; IE0=0; }
//重置 flag 变量 //停止计数 //定时器重装初值(高八位) //定时器重装初值(低八位) //外中断 0 请求标志清零
Байду номын сангаас
void send() { fa=0;delay_3();_nop_();fa=1;delay_3(); fa=0;delay_3();_nop_();fa=1;delay_3(); fa=0;delay_3();_nop_();fa=1;delay_3(); TH0=0;TL0=0;//定时器装初值 TR0=1; //发送完后启动定时器 EX0=1; //外部中断允许位 IE0=0; //中断标志位清零 EA=1; //开启总中断 } void Display() { uint i; A[10]=Number[temp_B/1000]; A[11]=Number[temp_B/100%10]; A[12]=Number[temp_B%10]; write_cmd(0x90); for(i=0;i<16;i++) { write_dat(A[i]); } } void main() { init_time(); LCD_INIT(); while(1) { send(); // // // // // while(flag==0) { Display(); temp_C++; //当没执行中断时,flag=0,执行下面的语句
51 单片机超声波测距程序
#include<reg52.h> #include<intrins.h> #include"LCD12864Driver.h" #define unchar unsigned char #define unint unsigned int #define unlong unsigned long uchar A[]={"超声波测距 CM"}; uchar Number[]={"0123456789"}; sbit fa=P1^0; sbit di=P3^2; //位申明

超声波测距1602显示程序

超声波测距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单片机超声波测距C程序

51单片机超声波测距C程序

51单片机超声波测距C程序(2018-01-26 14:09:10>超声波检测原理超声波测距的程序流程图程序如下://超声波模块程序〃超声波模块程序//Trig = P2A0//Echo = P3A2#in elude <reg52.h>#defi ne uchar un sig ned char#defi ne uint un sig ned int//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。

wela=1 。

P0=0xf7。

wela=0 。

dula=1 。

P0=table[bai] 。

delay(1> 。

dula=1 。

P0=0x00 。

// 关位码dula=0 。

wela=1 。

P0=0xef 。

wela=0 。

dula=1 。

P0=table[shi] 。

dula=0 。

delay(1> 。

dula=1 。

P0=0x00。

// 关位码dula=0 。

dula=1 。

P0=table[ge] 。

dula=0 。

wela=1 。

P0=0xdf 。

wela=0。

dula=1 。

P0=0x00。

// 关位码dula=0 。

}//***************************************************************void main(>{uint distance 。

51单片机红外解码、超声波测距程序(详细解释程序)

51单片机红外解码、超声波测距程序(详细解释程序)

// c51红外解码、超声波测距程序#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; //距离,timesbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)sbit come=P3^3;sbit d=P1^1;//发送码sbit BZ=P1^0;sbit s=P3^7;//38ksbit ss=P3^6;//38kuchar m;// 开关控制//sbit n=P2;//电机反转code unsigned charseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28}; //显示段码/**************************** 定时器0中断************************/void timer0() interrupt 1{TH0=(65536-count)/256;TL0=(65536-count)%256;s=~s;//产生38K信号ss=~ss;//tt++;//发送超声波个数}/**************************** 延时0.9ms子程序************************/void Delay0_9ms(void){uchar j,k;for(j=18;j>0;j--)for(k=20;k>0;k--);}/***************************延时1ms子程序**********************/void Delay1ms(void){uchar i,j;for(i=2;i>0;i--)for(j=230;j>0;j--);}/***************************延时4.5ms子程序**********************/ void Delay4_5ms(void){uchar i,j;for(i=10;i>0;i--)for(j=225;j>0;j--);}/**************************** 解码延时子程序************************/ 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;}/***********************显示程序*********************/ void Led(int date) //显示函数{ int i;table[0]=date/1000;table[1]=date/100%10;table[2]=date/10%10;table[3]=date%10;date=0;for(i=0;i<120;i++){P2=enled[i%4]&m;//P2口高四位控制数码管,低位陪分控制继电器P0=seg7code[table[i%4]]; //取出千位数,查表,输出。

毕业设计之超声波测距测序+1602显示

毕业设计之超声波测距测序+1602显示
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/10; //算出来是CM
if((S>=3000)||flag==1) //超出测量范围显示“-”
while (DData[ListLength]>0x19) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
LCM_E = 1;
}
//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51 单片机1602 显示的超声波测距源程序
制作超声波测距仪,是很多学生、单片机爱好者学习单片机动手实践的一个实作项目,这款超声波测距程序,针对目前比较广泛使的HC-SR04 超声波模块而设计的,这款1602 显示的超声波测距距源程序,单片机是51 系列
单片机,超声波测距模块先用的是HC-SRO4 超声波测距模块,单片机的晶振是12M,接线:模块TRIG 接P2.5 ECH0 接P3.2,当距离超出测量时,范
围显示-,显示单位是CM。

这款程序由于硬件比较简单,制作时焊接工作量小,几乎是百分之百的成功,也可以用PROTEUS 软件直接进行。

需要超声
波测距仿真配套的爱好者,可百度搜索:电子乐屋,这个网上有很多款超声波测距仿真资料。

#include[reg52.h> //注意请把[ 换成#include [intrins.h> //
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2; //1602 的数据/指令选择控制线
sbit rw=P2; //1602 的读写控制线。

相关文档
最新文档