超声波测距程序(包括延时和数码管显示子程序)
超声波测距程序
超声波测距程序超声波程序如下:/**********************************包含头文件**********************************/#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。
基于C51的超声波测距仪设计 —数码管显示
{
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{disbuff[0]=S%1000/100; //百位
disbuff[1]=S%1000%100/10; //十位
disbuff[2]=S%1000%10 %10;} //个位
unsigned char const discode[]
={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0xff/*-*/};
//数码管显示码0123456789—和不显示
unsigned char const positon[3]={ 0xfc,0xfd,0xfe};
_nop_(); _nop_();_nop_(); _nop_(); _nop_();
_nop_();
TX=0;
}
}
实验结果
刻度值/m 实测值/m 误差/m
0.1
0.09
0.01
0.2
0.18
0.02
0.3
0.27
0.03
0.4
0.37
0.03
0.5
0.45
0.05
0.6
0.55
显示
timer++;
if(timer>=400)
{timer=0;
TX=1;
//800ms 启动一次模块
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
超声波测距程序设计
超声波测距程序设计超声波测距是一种常用的非接触式测距技术,其原理是利用超声波在空气中传播的特性进行测量。
在超声波测距程序设计中,需要考虑到硬件设备的选择、信号处理算法的设计以及数据分析与显示等方面。
下面是一份超声波测距程序设计的详细介绍。
首先,硬件设备的选择是超声波测距程序设计的第一步。
通常情况下,超声波测距传感器包括超声波发射器和接收器两部分。
超声波发射器发射出特定频率的超声波脉冲,接收器接收到反射的超声波并进行信号放大和处理。
根据具体的应用需求,可以选择适当的超声波测距传感器。
其次,需要设计合适的信号处理算法来处理接收到的超声波信号。
根据超声波的传播速度和回波时间差,可以计算出被测物体与传感器之间的距离。
常用的信号处理算法包括时间差测量法和周期测量法。
时间差测量法是一种基于超声波的往返时间计算距离的方法。
具体实现时,首先通过发射器发射出超声波脉冲,然后通过接收器接收到反射的超声波脉冲。
利用计时器记录下超声波发射和接收的时刻,然后通过时间差换算为距离。
周期测量法是一种基于超声波的周期计算距离的方法。
具体实现时,通过发射器发射出连续的超声波信号,接收器接收到反射的超声波信号。
通过计算接收到的超声波信号的周期,然后通过周期与传播速度计算得到距离。
在信号处理算法的设计中,需要考虑到测量误差的问题。
超声波信号在传播过程中会受到多种因素的影响,例如温度、湿度、气压等。
因此,需要进行一定的误差校正,以提高测量的准确性。
最后,数据分析与显示是超声波测距程序设计中的一个重要环节。
通过采集到的测量数据,可以对被测物体的距离进行分析和显示。
通常情况下,可以通过串口或者其他通信方式将测量数据传输到上位机,然后通过上位机进行分析和显示,以便用户进行观察和判断。
综上所述,超声波测距程序设计通常包括硬件设备的选择、信号处理算法的设计以及数据分析与显示等方面。
通过合理设计和实现,可以实现对被测物体距离的准确测量,并开发出符合实际需求的超声波测距应用系统。
超声波测距程序_代码全
/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。
3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。
超声波测距程序
#include <r eg52.h>//8052内核单片机#include <intrins.h>//调用_nop_()单周期延时//柳州市第一职业技术学校欧福强unsigned char L ED_SEG[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,0xf7,0 xff};unsigned char D1,D2,D3,D4;//数码管显示变量unsigned long j u_li;//距离变量unsigned int s hi_cha,haomi;//时差,以毫米为单位的长度unsigned char x un_huan_ci_shu;//记录主循环循环的次数unsigned char sqys,sdbxgs;//死区延时,设定波形输出个数sbit huibo=P1^7;//接收电路的回波信号sbit k ey1=P2^0;//调整死区时间sbit k ey2=P2^1;//调整波形个数void C SB_SC(unsigned char geshu)//超声波输出子程序,传递参数:超声波个数{//子程序开始P1=P1&0XFE;//准备输出do//do-while循环{//循环开始P1=P1^0X03;//P1.0和P1.1取反_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();//2µS延时,连同取反2µS共13µSP1=P1^0X03;//P1.0和P1.1取反_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();//2µS延时}while(--geshu);//循环结束,跳转回开始需要2µS,共12µSP1=P1|0X03;//结束输出}//子程序结束void y an_shi(unsigned int shuju)//延时,地球人都知道{//延时开始while(--shuju);//延时主体,不断减1,耗时}//延时结束void chushihua(void)//初始化子程序{//开始TMOD=0x01;//定时器0工作于16位模式(0-65535)sqys=200;//死区延时开机设定为200sdbxgs=20;//初始化时设定每次发送20个周期波形}//结束void c e_ju(void)//测距主程序(科技含量在这){//开始T H0=0X00;//定时器计数清零(高八位)T L0=0X00;//定时器计数清零(低八位)T F0=0;//清溢出标志T R0=1;//启动定时器开始计时C SB_SC(sdbxgs);//立即按传来的参数输出超声波y an_shi(sqys);//延时一段时间,防止发射波干扰while(huibo && (T F0==0));//等待回波信号及溢出信号//即如果没有收到回波就一直等待下去//但也不能死等,等待超过65535µS后仍然没有回波就放弃T R0=0;//收到回波或超时,停止定时器,冻结定时器的值if(T F0)//判断是否超时(定时器是否溢出){//如果条件成立(确实超过65535µS未收到回波)D1=D2=D3=D4=10;//超时未收到回波,显示"----"}//成立时处理完毕else//未超时并收到回波{//未超时,确实在发出超声波65535µS内收到回波s hi_cha=T H0*256+T L0;//从定时器中取出计时值,即往返时差j u_li=170L*s hi_cha;//距离=声速×往返时间÷2,即距离=170×往返时差//得到的距离单位是µM,因为定时器计得的时间为微秒haomi=j u_li/1000;//把得到的距离除以1000,得到以毫米为单位的长度数据D1=haomi/1000;//除以1000,得到米D2=haomi%1000/100;//模1000,剩下几百几百的数,除以100,得到分米D3=haomi%100/10;//模100,剩下几十几十的数,除以10,得到厘米D4=haomi%10;//直接模10,剩下几的数,得到毫米}//未超时处理完毕}//测距子程序处理完毕void L ED_SCAN(void)//数码管扫描子程序{//扫描程序开始P2=P2|0XF0;//通过或操作将P2高四位置1,关闭数码管①P0=0XdF&L ED_SEG[D1];//输出段码在P0口②P2=P2&0xBF;//通过与的方式将P2.6变成低电平,打开D1③y an_shi(500);//延时一段时间④P2=P2|0XF0;//同①P0=L ED_SEG[D2];//同②P2=P2&0xDF;//类似③y an_shi(500);//同④P2=P2|0XF0;//同①P0=L ED_SEG[D3];//同②P2=P2&0xEF;//类似③y an_shi(500);//同④P2=P2|0XF0;//同①P0=L ED_SEG[D4];//同②,但还要跟0X7F进行与运算,将小数点位变0 P2=P2&0x7F;//类似③y an_shi(500);//同④}//扫描程序结束void main(void)//主程序{//主程序开始chushihua();//初始化,设置定时器工作模式while(1)//主循环{//主循环开始L ED_SCAN();//扫描数码管x un_huan_ci_shu++;//主循环每循环一次,变量加一if(x un_huan_ci_shu>=5)//每循环5次,就进行一次测距,控制测距间隔时间 {//已达5次主循环P2=P2|0XF0;//关闭数码管,避免某个数码管长时间被点亮ce_ju();//调用测距子程序进行测距xun_huan_ci_shu=0;//循环计数变量清零}//测距间隔时间控制处理完毕if(!k ey1)//死区延时按钮被按下{//按键处理开始sqys=sqys+5;//死区延时增加if(sqys>250){sqys=0;}//越界检测并抓回D1=11;//关闭第一个数码管D2=sqys/100;//获得百位D3=sqys%100/10;//获得十位D4=sqys%10;//获得各位while(!k ey1)//按键是否持续按下{//循环开始,等待按键松开L ED_SCAN();//如果没有松开,扫描数码管,显示死区延时}//循环尾}//按键处理结束,按键已松开if(!k ey2)//波形个数按钮被按下{//按键处理开始sdbxgs=sdbxgs+1;//输出波形数量增加if(sdbxgs>100){sdbxgs=0;}//越界检测并抓回D1=11;//关闭第一个数码管D2=sdbxgs/100;//获得百位D3=sdbxgs%100/10;//获得十位D4=sdbxgs%10;//获得各位while(!k ey2)//按键是否持续按下{//循环开始,等待按键松开L ED_SCAN();//如果没有松开,扫描数码管,显示发波个数}//循环尾}//按键处理结束,按键已松开}//主循环结束}//主程序结束。
超声波测距C程序
#include<AT89X51.H>#include<intrins.h>/***************************数码管为共阴数码管***************************/sbit s0=P2^7;//个位选通sbit s1=P2^6;//十位选通sbit s2=P2^5;//百位选通sbit s3=P2^4;//千位选通sbit dp=P0^7;//小数点sbit in=P3^2;//外部中断,接CX20106的脚sbit csb=P3^3;//40KHz方波输出脚#define seg P0 //数码管的数据口为P1口#define uchar unsigned char#define uint unsigned int#define nop _nop_()/****************************/void init(void);//初始化void delay_nms(uint n);//延时nmsvoid delay100us();//延时usvoid display(uint dat);//4位数码管显示函数,只用了位void tran(void);//超声波测量函数/***************************/uint dis,H=100,L=20;uchar flag=0,high_time,low_time,m=0;uchar leddata[]={0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"0x76, //"H"0x38, //"L"0x37, //"n"0x3E, //"u"0x73, //"P"0x5C, //"o"0x40, //"-"0x00, //熄灭0x00 //自定义};void delay100us(){uchar i;for(i=0;i<50;i++);}/********************************** 函数名称:主函数修改日期:入口参数:无返回值: 无**********************************/ void main(void){init();while(1) //循环测量并显示{tran();//发送超声波信号测距display(dis);//显示距离}}/********************************** 函数名称:初始化函数修改日期:入口参数:无返回值: 无**********************************/ void init(void){TMOD=0x01;//定时器方式用于计时TH0=0;TL0=0; /* 设定T0的工作模式为*/EA=1;IT0=1;//下降沿有效,左传感器}/********************************** 函数名称:延时函数修改日期:入口参数:n返回值: 无**********************************/ void delay_nms(uint n){uchar i;while(n--){for(i=123;i>0;i--);}}/********************************** 函数名称:显示函数修改日期:入口参数:data返回值: 无**********************************/ void display(uint dat){uchar i,j,k;//分别为百十个位的缓存i=dat/100;//百位j=dat%100/10;//十位k=dat%100%10;//个位s3=1;s2=0;s1=1;s0=1;seg=~leddata[i];dp=0;delay_nms(2);dp=1;s2=1;s3=1;s2=1;s1=0;s0=1;seg=~leddata[j];delay_nms(2);s1=1;s3=1;s2=1;s1=1;s0=0;seg=~leddata[k];delay_nms(2);s0=1;}/**********************************函数名称:超声波测量函数修改日期:入口参数:无返回值: 无**********************************/ void tran(void){uchar i;float temp;TH0=0;TL0=0;//清定时TR0=1;//开定时for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;delay_nms(1);EX0=1;//开中断if(flag==1) //中断标志位置,说明有回波{ //以下为路程计算temp=high_time*256+low_time;temp=(temp/1000)/2;temp*=340;temp=temp/10;dis=(unsigned int)temp;flag=0;}}/********************************** 函数名称:中断函数修改日期:入口参数:无返回值: 无**********************************/void TT() interrupt 0{uint tmp;TR0=0;//关定时器ET0=0;//关外部中断flag=1; //置位标志位tmp=TH0*256+TL0; //读取定时器的值if((tmp>0)&&(tmp<60000))//判断是否超出范围,此设置的范围为到米,实际不能达到米{high_time=TH0;//把计时值放入缓冲low_time=TL0;}else//超出范围则重新测量{high_time=0;low_time=0;}}。
超声波测距 含51单片机程序与电路图1
超声波测距摘要该超声测距系统采用芯片STC89C52作为系统的主控制器,利用NE555作为本系统的脉冲发射源,结合3位7段数码管液晶显示,达到了较大的测试距离和较高的测量精度,并能实时显示且无明显失真。
关键字: 超声波测距实时第1章设计题目与要求1.1 设计要求采用压电式超声波换能器,使用单片机作为控制器,完成超声波测距仪的软硬件设计。
1.2 基本要求:(1)具有反射式超声波测距功能,测量距离0.1m~3.0m;(2)测量距离精度:误差±1cm;(3) 利用LED数码管显示测试距离;(4)实时显示测量的距离,显示格式为:□.□□米第2章系统总体方案论证2.1 系统总体方案题目要求设计一个利用超声波反射原理测量距离的超声波测距仪,并且具有实时同步显示,由此本系统可以划分为发射、接收、显示、主控制模块共四大模块,如图2.1所示:图2.1系统基本方框图针对技术指标的需要,为使系统的测量距离更远、精度更高,提高系统的整体完善性,现对以上系统各个功能模块进行一一的方案论证:2.2 主控制模块2.2.1 主控制模块概述主控制器模块其实就是一个简化的嵌入式系统。
嵌入式系统一般指非PC系统,有计算机功能但又不称之为计算机的设备或器材。
它是以应用为中心,软硬件可裁减的,适应应用系统对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。
嵌入式系统的核心是嵌入式微处理器。
2.2.2 主控制模块方案选择根据以上知识,考虑到目前市场上比较常用的AVR、61、51三种微控制器,我们有如下三种方案可供选择。
方案一:AVR单片机AVR单片机种类丰富,有AT tiny、AT90S、ATmeg系列,各个系列又有不同的型号,价格较适中。
相对来说,比起51单片机来说资源较丰富,内部也有集成A/D ,有PWM 输出,但在系统进一步扩展方面不是很好,这类单片机主要应用于工业控制领域,在语音处理方面没有什么优势。
方案二:SPCE061A.凌阳单片机的资源相对来说比较丰富,32K ×16bitFlash ,两路D/A ,1个全双工异步串行口(UART )方便其跟其他为控制通信。
超声波测距程序_代码全
/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。
3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。
超声波测距_C程序
超声波测距 C程序本探头是自带晶振的那种,只需发出一个脉冲,探头发出方波,等待回波并计时,液晶显示。
能避免超出测量距离的死等待,请大家完善。
//超声波模块程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intunsigned int time;unsigned int S,s_false;unsigned long num1;bit flag ;sbit Trig =P3^6;//定义引脚sbit Echo=P3^7;sbit lcdrs=P2^0;//命令数据sbit lcdrw=P2^1;//读写sbit lcde=P2^2;//能sbit led=P3^5;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 write_com(unsigned char com) {lcdrs=0;P0=com;delay(5);lcde=1;delay(5);lcde=0;}void write_data(unsigned char zifu) {lcdrs=1;P0=zifu;delay(5);lcde=1;delay(5);lcde=0;}void write_temp(uint t_emp){uchar qian,bai,shi,ge;qian=t_emp/1000;bai=(t_emp%1000)/100;shi=(t_emp%100)/10;ge=t_emp%10;write_com(0x80);write_data(0x30+qian);delay(1);write_data(0x30+bai);delay(1);write_data(0x30+shi);delay(1);write_data(0x30+ge); delay(1);delay(100);}/********************************************************/void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围 {flag=0; //中断溢出标志,失败TH0=0;TL0=0;TR0=0; //关闭计数}/********************************************************/void T1_timer() interrupt 3 //中断{TH1=(65536-50000)/256;TL1=(65536-50000)%256;num1++;if (num1==20){num1=0;led=~led;}}void StartModule() //启动模块{Trig=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Trig=0;}/********************************************************/void Count(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif(((S<8)||(S>=600))||flag==0) //超出测量范围显示“-”失败 {// flag=1;s_false=1000;write_com(0x80);write_data('e');delay(5);write_data('r');delay(5);write_data('r');delay(5);write_data('o');delay(5);write_data('r');delay(5);// write_temp(s_false);else{write_temp(S);}}/********************************************************//********************************************************/void init(){lcde=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);lcdrw=0;}//*************************************************************** void main(){// unsigned char TempCyc;delay(500); //启动等待,等LCM讲入工作状态lcdrw=0;init(); //LCM初始化delay(500); //延时片刻(可不要)while(1){TMOD=0x11; //设T0为方式1,GATE=1;TH0=0;TL0=0;ET0=1; //允许T0中断ET1=1;TR1=1;EA=1; //开启总中断Trig=0;Echo=0;while(1){StartModule();flag=1;// while(!Echo); //当echo为零时等待while((!Echo)&&flag); //当echo为零时等待,中断flag跳出等待 TR0=1; //开启计数while(Echo&&flag); //当echo为1计数并等待TR0=0; //关闭计数Count(); //计算delay(120); //80MS}}}。
超声波测距程序
temp=high_time*256+low_time; //temp-2000; temp=(temp/1000)/2; temp*=344; temp=temp/10; return temp; } /************************************** 外部中断服务函数 **************************************/ void TT() interrupt 2 { ui tmp; TR0=0;//关定时器0 ET1=0;//关外部中断 flag=1;//外部中断标志位 tmp=TH0*256+TL0; if((tmp>0)&&(tmp<60000)) { high_time=TH0; low_time=TL0; } else { high_time=0; low_time=0*****************/ void delay100us() { uc j; for(j=50;j>0;j--); } /**************************************** 发码播放函数;add为语音地址 *****************************************/ void send_com(uc add) { uc i; RST=1; RST=0; delay_nms(3); RST=1; delay_nms(20); CS1=0; delay_nms(5); for(i=0;i<8;i++) { CLK=0; if(add&1) DAT=1; else DAT=0; delay100us(); CLK=1; delay100us(); add=add>>1; } CS1=1; } /****************************************** *****************************************/ void sound(ui soud) { ui i,j,k;
超声波测距程序(有备注)
#include<reg51.h>#define uchar unsigned char#define uint unsigned intsfr P4 = 0xC0; //P4口定义sfr P4SW = 0XBB; //P4口寄存器定义void InitLCD(); //OLED初始化void LCD_P6x8Str(unsigned char x,unsigned char y,uint c); //OLED写函数sbit buzzer=P3^7; //蜂鸣器控制端.写0响sbit relay=P3^6; //继电器控制端.写0拨动//sbit led=P0^6; //LED控制端.写0亮sbit trig=P1^0; //超声波控制端sbit echo=P3^2; //超声波接收端uchar flag_succeed; //超声波回波标志uchar flag_move=0; //电机启动标志,1为相对前一个状态未启动uint h,l,time,distance; //时间、距离变量void delay20us() //20微妙延时函数{uchar k;for(k=0;k<100;k++);}void delay(uint z) //简单延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void motor() //电机驱动函数{if(distance>=130) //水用至限定水位{relay=1; //启动电机flag_move=1; //标记电机为启动过的状态}if(distance<=30 && flag_move==1)//水加至限定水位{relay=0; //关闭电机flag_move=0; //取消标记状态}}void main(){relay=0; //关闭电机P4SW=0xff; //P4口全设置成I/O口InitLCD(); //初始化清屏trig=0; //拉低控制脚TMOD=0x01; //定时器工作方式1EA=1; //开总中断while(1){EA=0; //关中断trig=1; //给高电平发送delay20us();//延时trig=0; //发送完毕while(echo==0); //等待回波引脚变高电平flag_succeed=0; //清除成功标志EA=1; //开总中断EX0=1; //开外部中断0TH0=0; //定时器0计数清零TL0=0;TF0=0; //定时器0中断标志清除TR0=1; //开定时器0中断delay(30); //简单延时,等待高电平结束TR0=0; //关定时器0中断EX0=0; //关外部中断0if(flag_succeed==1) //回波成功{time=h*256+l; //时间计算distance=time*0.172; //距离计算LCD_P6x8Str(1,1,distance); //距离显示motor(); //电机控制}if(flag_succeed==0) //回波失败{distance=0; //距离清零buzzer=0; //蜂鸣器报警}delay(90); //延时,防止回波混乱buzzer=1; //关闭蜂鸣器}}void int0() interrupt 0 //外部中断0中断函数{h=TH0; //提取计数数据l=TL0;flag_succeed=1; //回波接收成功EX0=0; //关外部中断0}void t0() interrupt 1 //定时器0中断函数{TH0=0; //计数清零TL0=0;}。
超声波测距仪程序
void offmsd();
void main() //主函数
{
EA=1; //开中断
TMOD=0x11; //设定时器0为计数,设定时器1定时
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器1中断,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
}
制作的超声波测距源程序
#include <REG2051.H>
#define k1 P3_4
#define csbout P3_5 //超声波发送
#define csbint P3_7 //超声波接收
P3=~digit&opto; //依次显示各位数
P1=~buffer; //显示数据送P1口
delay(20); //延时处理
P1=0xff; //P1口置高电平(关闭)
}
else timeToBuffer(); //将值转换成LED段码
offmsd();
scanLED(); //显示函数
if(s<sj2)
{
buffer[2]=0x76;
buffer[1]=0x76;
buffer[0]=0x76;
}
else if(s<sj1)
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
超声波测距编程步骤
超声波测距编程步骤介绍超声波测距是一种常用的测量距离的技术,通过发射超声波并接收其反射信号来计算距离。
本文将介绍超声波测距的编程步骤,包括硬件准备、软件编程和数据处理等内容。
硬件准备在进行超声波测距之前,我们需要准备以下硬件设备: 1. 超声波传感器:用于发射和接收超声波信号。
2. 微控制器:如Arduino、树莓派等,用于控制超声波传感器和进行测距计算。
3. 连接线:用于连接超声波传感器和微控制器。
软件编程下面是超声波测距的软件编程步骤:步骤一:引入库文件首先,我们需要引入超声波测距所需的库文件。
在Arduino中,可以使用Ultrasonic库来完成这一步骤。
步骤二:定义引脚接下来,我们需要定义超声波传感器的引脚。
通常,超声波传感器有两个引脚,一个用于发射超声波信号,一个用于接收反射信号。
在Arduino中,可以使用#define语句来定义引脚。
步骤三:初始化超声波传感器在进行测距之前,我们需要初始化超声波传感器。
在Arduino中,可以在setup()函数中调用Ultrasonic库的初始化函数来完成这一步骤。
步骤四:测量距离现在,我们可以开始进行距离测量了。
在Arduino中,可以使用Ultrasonic库的read()函数来获取超声波传感器返回的距离值。
步骤五:显示结果最后,我们可以将测量结果显示出来。
在Arduino中,可以使用Serial库的print()函数将距离值输出到串口监视器,或者使用LCD显示屏等外部设备来显示测量结果。
数据处理在进行超声波测距后,我们可能需要对测量数据进行进一步的处理。
以下是一些常见的数据处理方法:滤波处理由于超声波测距存在一定的误差,我们可以使用滤波算法对测量数据进行平滑处理,以提高测量的精确性和稳定性。
常用的滤波算法包括移动平均滤波、中值滤波等。
单位转换超声波测距通常返回的是时间值,我们可以将其转换为距离值。
根据超声波的传播速度和时间值,可以使用简单的公式将时间转换为距离,例如距离(cm)=时间(μs)*传播速度(cm/μs)。
超声波测距程序详解
超声波测距程序详解根据上节课的内容,我们知道超声波模块具有很强的方向性,并且传播过程是直线传播,根据该特点,我们从“空心大萝卜运用题”推导出了超声波测距的计算公式为:•距离=时间×速度=时间(μs)×0.017(cm/μs)好了现在来编程,在上述公式中,我们仅需要确定“时间”,就可以获得测量点与实际物体的距离,那么时间怎么算?让我们先来回顾一下我们之前介绍的超声波模块的知识:•超声波测距的基本原理:通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时;•由于触到被测物体后返回,故其实际的返回时间应除以2后,才能计算出正确的时间。
•模块的四个输出引脚及功能分别为:▪VCC:超声波模块电源供电端,接阿板的+5V;▪GND:接阿板的GND;▪Trig:控制端,输入10us的触发脉冲信号后,超声波模块向外发射超声波;▪Echo:接收端,超声波发射时,该脚同时变为高电平,待超声波接收器收到到反射波后,变为低电平,通过测量该高电平的时间,即可算出测量点到当前位置的距离。
让我们再来回顾一下测量脉冲时间的阿板函数——pulseIn():pulseIn()函数:作用:用于测量脉冲持续时间格式:pulseIn(pin,HIGH/LOW,timeout)•pin:要测量的引脚;•HIGH/LOW:当选择HIGH时,引脚脉冲由低电平变为高电平时,计时器开始计时,当引脚由高电平变为低电平时,计时器停止计时;若选择LOW时,引脚脉冲由高电平变为低电平时,计时器开始及时,当引脚由低电平变为高电平时,计时器停止计时。
从而可以得到脉冲宽度;•Timeout:可选项,在该时间内若无变化,则返回测量时长为零;返回值:返回测量时长,单位为μs(微秒)。
超声波测距数码管显示程序
/超声波模块显示程序#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Tx = P3^3; //产生脉冲引脚sbit Rx = P3^2; //回波引脚uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志//********函数声明void conversion(uint temp_data);void delay_20us();void pai_xu();void main(void) // 主程序{ uint distance_data,a,b;uchar CONT_1;i=0;flag=0;Tx=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;Tx=1;delay_20us();Tx=0; //产生一个20us的脉冲,在Tx引脚while(Rx==0); //等待Rx回波引脚变高电平succeed_flag=0; //清测量成功标志EX0=1; //打开外部中断TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //TR1=1; //启动定时器1EA=1;while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0; //关闭定时器1EX0=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;conversion(b);}i=0;}}}//***************************************************************//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //至成功测量的标志EX0=0; //关闭外部中断}//**************************************************************** //定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:P0=ge; P2=0x7f;flag++;break;case 0x01:P0=shi;P2=0xbf;flag++;break;case 0x02:P0=bai;P2=0xdf;flag=0;break;}}//显示数据转换程序void conversion(uint temp_data){uchar ge_data,shi_data,bai_data ;bai_data=temp_data/100 ;temp_data=temp_data%100; //取余运算shi_data=temp_data/10 ;temp_data=temp_data%10; //取余运算ge_data=temp_data;bai_data=SEG7[bai_data];shi_data=SEG7[shi_data]&0x7f;ge_data =SEG7[ge_data];EA=0;bai = bai_data;shi = shi_data;ge = ge_data ;EA=1;}//****************************************************************** void delay_20us(){ uchar bt ;for(bt=0;bt<60;bt++);}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;} }。
超声波测距程序
//超声波测距程序#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^6; //1602的数据/指令选择控制线sbit rw=P2^5; //1602的读写控制线sbit en=P2^7; //1602的使能控制线sbit trig=P2^0; //超声波测距模块Trigsbit echo=P2^1; //超声波测距模块Echobit flag1; //触发信号标志位//uchar count; //中断累加变量long int distance; //测量所得距离uchar code table1[]=" distance: " ; //定义字符数组显示数字void delay(uint n){uint x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}void lcd_wcom(uchar com){rs=0; //选择指令寄存器rw=0; //选择写P0=com; //把命令字送入P0delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要en=0;}/*------------------------------------------------1602写数据函数------------------------------------------------*/void lcd_wdat(uchar dat){rs=1; //选择数据寄存器rw=0; //选择写P0=dat; //把要显示的数据送入P0delay(5); //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。
超声波测距程序
我的超声波测距程序(近距离)2009-08-06 21:16/***********************************************************发射端用3组反相器功率放大接收端350倍放大有效距离10cm到70cm误差范围-3mm~+3mmIO端口P1.0用于产生发送端脉冲由于校准条件不行,本程序还未校准过,但精度已达到,如本程序对各位朋友有所帮助,请自行校准过***********************************************************/#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//#define V 347.889sbit FB = P1^0; //产生方波bit csover,first;uint avr;float ls; //上一次采样值idata uint distance[11];float lenth;float ceju();void delayms(unsigned char ms) // 延时子程序约1ms{unsigned char i;while(ms--){for(i = 0; i < 124; i++);}}void delay() // 延时子程序约150us{uchar i;for(i = 0; i < 15; i++);}void INT0_INT() interrupt 0{TR0=0;EX0=0;IE0=0;csover=1;}void timer1_int() interrupt 3 {TH1=60536/256;TL1=60536%256;lenth=ceju();}void init_ceju(){uchar i;for(i=0;i<11;i++){distance[i]=0;}for(i=0;i<11;i++){lenth=ceju();delayms(5);}first=0;ls=lenth;}float ceju(){uint idata tim[11],tem[5]; long sum;uchar k,i,j;uint t,time,temp;float s;csover=0;FB=0;IT0=0;FB=!FB;_nop_();_nop_();_nop_();_nop_();FB=!FB;_nop_();_nop_();_nop_();_nop_();FB=0;TR0=1; //打开定时器计时delay(); //延时躲过拖尾EX0=1; //打开外中断0IE0=0; //清中断标志,防止误中断t=1500; //用于判断超时 while((csover==0)&&(t>0)){t--;}if(t==0){return (0x00);}else{time=TH0*256+TL0+12;csover=0;TH0=0;TL0=0;}for(i=0;i<11;i++){distance[i]=distance[i+1];}distance[10]=time;for(i=0;i<11;i++){tim[i]=distance[i];}for(i=0;i<10;i++){for(j=i+1;j<11;j++){if(tim[i]>tim[j]){temp=tim[i];tim[i]=tim[j];tim[j]=temp;}else{;}}}for(i=3;i<8;i++){sum+=tim[i];}avr=sum/5;k=0;for(i=3;i<8;i++){if((tim[i]<avr+5)&&(tim[i]>avr-5)){tem[k++]=tim[i];}}sum=0;avr=0;for(i=0;i<k;i++){sum+=tem[i];}if(sum!=0) //sum =0说明所有数据全被滤掉{avr=sum/k;s=(0.347889*avr/2-35)/10+((0.347889*avr/2-35)/10-20)*0. 0335;avr=0;sum=0;k=0;if(s>10){k=9;}if(first==1){ls=s;return (s);}else{if((s-ls>0.15)||(ls-s>0.15)){return (ls);}else{ls=s;return (s); }}}else{return (0x00);}}void main(){first=1;TMOD=0x11;EA=1;init_ceju();TH1=60536/256;TL1=60536%256;ET1=1;TR1=1;while(1){;}}。
超声波测距C语言源程序代码
/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//****************************************************************************** *****///具有模式选择.#include<reg52.h>#define UC unsigned char#define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit GX = P3^1;//K7 //P3^3口(K2)为修改键,sbit SX = P3^6;//K6 //P3^2(K3)为测量键.sbit BX = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进行模式切换(K1、K4键)void xiaxian(); //修改函数,用来修改下限void shangxian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI max[3]={3,0,0}; //MIN,MAX 用来存储最大和最小值void MINxianshi(UI); //最小范围和最大范围的显示void MAXxianshi(UI);UC code CharacterCode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管数字字符(P2口)/********************************主函数*********************************************/void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MINxianshi(40); //1.50169000sMAXxianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MAX, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0x00; //防止最后显示的那个数码管一直亮MAX = max[0]*100 + max[1]*10 + max[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进行测量{while(1) /*先进行模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //结束测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0x00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MAX){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示结束}}/****************************************************************************** *****/void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0x00;//定时器的初值,定时器的定时为65536us,TL0 = 0x00;}/****************************************************************************** *****/void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){xiaxian();while(QD==0);shangxian();}/****************************************************************************** ****/void MINxianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0x00;delay(55500);}void MAXxianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]];delay(500);}P2 =~ 0x00;delay(55500);}/****************************************************************************** *****/void delay(UI T) //延时程序{while(T--);}/****************************************************************************** *****/void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;PX1 = 0;PT0 = 1;PX0 = 0;IT1 = 1; //外部中断0为跳变沿触发EX1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发EX0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0x01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0x00;//定时器的初值,定时器的定时为50us.TL0 = 0x00;/*1号定时器不用,所以没有TH1,TL1*/}/****************************************************************************** *****/void xiaxian() //修改下限{while(1){if(BX==0)//百位{P2=~0x00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(SX==0)//十位{P2=~0x00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(GX==0)//个位{P2=~0x00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0xff;break;}}}void shangxian() //修改上限{while(1){if(BX==0)//百位{P2=~0x00;max[0]++;if(max[0]==10)max[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(100);if(SX==0)//十位{P2=~0x00;max[1]++;if(max[1]==10)max[1]=0;delay(60000);标准文档实用文案}a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]]; delay(100);if(GX==0)//个位{P2=~0x00;max[2]++;if(max[2]==10)max[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]]; delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0xff;while(QD == 0);break;}}}/****************************************************************************** ******/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BEEP(0);
delayms(5);
pwm=1;
while(1)
{
send();
//TMOD=0X01;
flag2=1;
TH0=0;
TL0=0;
//EA=1;
//ET0=1;
juli=9999;
biaozhi=0;
display(juli);
}
}
void chaosheng() interrupt 1
{
if(flag1==1)
{
pwm=~pwm;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
while((jieshou==1)&&(biaozhi==0));
TR0=0;
flag2=0;
juli1=(float)(TH0*256+TL0+18)*170.0/1000.0;
juli=(uint)juli1;
if(biaozhi==1)
void BEEP(uchar a)//"a=0关,a=1开"
{
P2=0xa0;
if(a==1)
P0=0xff;
if(a==0)
P0=0x00;
P2=0x00;
}
void send()
{
TMOD=0X01;
TR0=0;
uchar code table1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//"数码管位选编码 1 2 3 4 5 6 7 8 "
void delayms(uint t)//"毫秒延时"
{
flag1=1;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
EA=1;
ET0=1;
TR0=1;
delayus(5);//"延时30us"
TR0=0;
flag1=0;
}
void display(uint m)//"可以显示4位数,可调整显示位数"
#include<stc12c5a.h>
#define uchar unsigned char
#define uint unsigned int
sbit pwm=P1^0;
sbit jieshou=P1^1;
uchar biaozhi=0,flag1=0,flag2=0,flag3=0;
{
uchar i,a,b,c,d;
a=m/1000;
b=m/100%10;
c=m/10%10;
d=m%10;
shu[0]=table[a];
shu[1]=table[b];
shu[2]=table[c];//"在此处与上0x7f即可使此位显示小数点"
uint time,juli;
float juli1;
uchar shu[8];
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//"共阳数码管编码 0 1 2 3 4 5 6 7 8 9 a b c d e f "
uint x,y;
for(x=t;x>0;x--)
for(y=850;y>0;y--);
}
void delayus(uint t)//"t=1时,6us延时"
Байду номын сангаас{
uint x,y;
for(x=t;x>0;x--)
for(y=1;y>0;y--);
}
shu[3]=table[d];
/*shu[4]=table[0];
shu[5]=table[0];
shu[6]=table[0];
shu[7]=table[0];*/
for(i=0;i<4;i++)
{
P2=0xe0;//"段选锁存器打开"
P0=shu[i];//"数码管段选"
P2=0X00;//"段选锁存器关闭"
P2=0xc0;//"位选锁存器打开"
P0=table1[i];//"数码管位选"
P2=0X00;//"位选锁存器关闭"
delayms(1);
}
}
void main()
}
if(flag2==1)
biaozhi=1;
}