超声波测距程序(详细C语言数码管显示)

合集下载

超声波测距程序

超声波测距程序

超声波测距程序超声波程序如下:/**********************************包含头文件**********************************/#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。

C语言超声波测距程序 亲测可运行! 附代码数据

C语言超声波测距程序 亲测可运行!  附代码数据

#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^0; //1602的数据/指令选择控制线sbit rw=P2^1; //1602的读写控制线sbit en=P2^2; //1602的使能控制线sbit trig=P2^5; //超声波测距模块Trigsbit echo=P3^2; //超声波测距模块Echobit flag1; //触发信号标志位//uchar count; //中断累加变量long int distance; //测量所得距离unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字/*------------------------------------------------延时函数------------------------------------------------*/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++){;}}}/*------------------------------------------------1602写命令函数------------------------------------------------*/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准备接收数据,也就是检测忙信号,这点非常重要。

超声波C语言程序

超声波C语言程序
函数名:Send_Bao()
功能:从串口发送一个数据包
入口参数:指向要发送的数据包地址
************************************************************************/
void Send_Bao( char *Data)
{
char j=0;
超声波测距C程序
#include<reg51.h>
#include"MAX485.h"
#define uint unsigned int
#define uchar unsigned char
long int time,l; /*时间*/
bit CLflag; /*测量标志*/
sbit Trig=P2^0; /*发射*/
{
/*外部中断0,用于检测接收信号*/
TR0=0; /*关闭定时器0 */
EX0=0; /*关中断*/
time=TL0;
time+=TH0*256;
l=time*ss;
l=l/2;
CLflag=1;
}
/********************主程序*************************/
TMOD=TMOD|0x20; //定时器T1工作在模式2,即八位自动重装模式
TH1=0xFD;
TL1=0xFD; //波特率为9600,在11.0592M的时钟下
TR1=1*********************************************************************
for(i=0;i<j;)
i++;

超声波测距仪C语言程序.txt

超声波测距仪C语言程序.txt
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
{
csbcj();
if(s>sj3)
void scanLED(); //显示函数
void timeToBuffer(); //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
}
}
}
void k1cl()
{
sj1=sj1+5;
if(sj1>100)
sj1=30;
s=sj1;
}
void k2cl()
{
sj2=sj2+5;
if(sj2>500)
sj2=40;
s=sj2;
}
void k3cl()
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;
void csbcj();
void delay(j); //延时函数
if((P3&0x10)==0) //判断3位是否显示完
key=0;
digit>>=1; //循环右移1位
}
}
void timeToBuffer() //转换段码功能模块
}
void delay(i)
{
while(--i);
}
void timer1int (void) interrupt 3 using 2
{
TH1=0x9E;

超声波测距用数码管显示

超声波测距用数码管显示

#include<reg52.h> //库文件#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端sbit RX=P1^0;sbit TX=P1^1;uchar bai,shi,ge;unsigned int time=0;unsigned int timer=0;unsigned char posit=0;unsigned long S=0;bit flag =0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}/********************************************************/ void display(){dula=1;P0=table[bai]; //送段选数据dula=0;P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时wela=1; //原来段选数据通过位选锁存器造成混乱P0=0x7e; //送位选数据wela=0;delayms(1); //延时dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0x7d;wela=0;delayms(1);dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0x7b;wela=0;delayms(1);}/********************************************************/ void Conut(){time=TH0;time=((time<<8)|TL0);TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>=700)||flag==1) //超出测量范围显示“-”{flag=0;bai=0;shi=0;ge=0;}else{bai=S%1000/100; //分出百,十,和个位shi=S%1000%100/10;ge=S%1000%10 %10;}}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块{TH1=0xf8;//TL1=0x30;//display();timer++;if(timer>=10){timer=0;TX=1; //800MS 启动一次模块//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();// _nop_();//_nop_();// _nop_();// _nop_();//_nop_();//_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}}/*********************************************************/void main( void ){TMOD=0x11; //设T0为方式1,GA TE=1;TH0=0;TL0=0;TH1=0xf8; //2MS定时TL1=0x30;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1; //开启总中断while(1){while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut();//计算}}/********************************************************************结束*********************************************************************/。

超声波测距数码管显示

超声波测距数码管显示

《单片机课程设计》设计报告设计课题:超声波测距专业班级:电子信息工程xxx班学生姓名: wang da na指导教师: cai设计时间: 2015年7月9日赣南师范学院科技学院数学与信息科学系超声波测距一、设计任务与要求1.设计任务:(1)利用超声波测量距离。

(2)使用数码管显示测出的距离。

(3)在超出一定的范围后进行报警。

二、方案设计与论证1设计方案采用单片机来控制超声波测距,信号线发射到与超声波发射器相连的信号端,超声波发射器向既定方向发射,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物将产生回波,超声波接收器接收回波,产生电平变化。

通过单片机设计一个程序,处理超声波接受的信号,计算出发射与接受的时间差,并根据距离公式计算出距离,用数码管显示。

把所测出的距离分范围,超出2米或小于0.1米蜂鸣器报警,当处于正常范围时立即停止报警。

2 原理框图数码管声超显示模单51模片报警模块系统原理框图)图(1三、电路设计1. 电路设计图(2)电路图2. 主要性能参数计算(1)超声波测距模块本测距系统采用超声波渡越时间检测法。

其原理为:检测从发射传感器发射的超声波经气体介质传播到接收传感器的时间t,这个时间就是渡越时间,然后求出距离l。

设l为测量距离,t为往返时间差,超声波的传播速度为c,则有l=ct/2。

超声波接收器收到反射波就立即停止计时。

再由单片机计算出距离,送数码管显示测量结果。

超声波测距的算法设计: 超声波在空气中传播速度为每秒钟340米(15℃时)。

t2是接收超声波时刻,t1是超声波声波发射时刻,t2-t1得出的是一个时间差的绝对值,假定t2-t1=0.03S,则有340m×0.03S=10.2m。

由于在这10.2m的时间里,超声波发出到遇到返射物返回的距离如下:如图2-2-1为测距原理。

.图(3)测距原理因为θ/2角度较小,可以忽略不计,所以L≈S。

超声波发出到遇到返射物返回的距离如下:L=C x ( t2 -t1 )/ 2 ;由于超声波也是一种声波,其声速c与空气温度有关,一般来说,温度每升高1摄氏度,声速增加0.6米/秒。

超声波测距程序

超声波测距程序

#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程序

超声波测距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;}}。

[转载]超声波测距原理图及程序

[转载]超声波测距原理图及程序

[转载]超声波测距原理图及程序原文地址:超声波测距原理图及程序作者:电子制作本超声波测距电路的单片机是AT89C51单片机,由四位数码管显示测量的距离,接收电路由CAX20106A组成,发射电路是74HC06组成。

#include<reg51.h>#include<math.h>#define uint unsigned int#define uchar unsigned charlong int time;bit CLflag;char cshu;#define T12us (256-12)sbit VOLCK=P1^0;//接收从P3^2口输入,采用外部中断方式sbit S1=P2^1;sbit S2=P2^3;sbit S3=P2^5;sbit S4=P2^7;sbit alam=P3^7; //报警unsigned char number[5];unsigned char temp_number[5];unsigned char fr_alam; //报警频率控制计数unsigned char icont; //距离计数char code table[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7}; //数字0-9的编码//{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};void delay( int j){int i;for(i=0;i<j;i++);}void display(void){P0=~table[number[4]];S1=0;delay(200);S1=1;P0=~(table[number[3]]|0x20);S2=0;delay(200);S2=1;P0=~table[number[2]];S3=0;delay(200);S3=1;P0=~table[number[1]];S4=0;delay(200);S4=1;}void init_CTC(void ){TMOD = 0x21;ET0 = 0;}void init_INT( ){IP=0x01;TCON=0;}void main(){init_CTC( );init_INT( ); CLflag=1; cshu=0;IE=0x80; ET1=1; ET0=1;TR1=0; TR0=0;TL1=T12us; TH1=T12us; while(1){CLflag=0;cshu=0;EX0=0;TH1=T12us;TL1=T12us;TL0 = 0; TH0 = 0; VOLCK=0;TR1=1;while(cshu<20) ;TR1=0;TR0=1;EX0=1;display(); //调用显示// Distance_Frequency(); //调用距离频率转化程序fr_alam++; //程序执行次数加1 用于控制报警频率与距离成正比if(icont>0) //表示距离控制位达到报警时{if(fr_alam>=icont){fr_alam=0;alam=~alam; //蜂鸣器取反一次,即响一声}}else //不报警时{alam=1;}}}//=========距离与频率之间的转化============== void Distance_Frequency(void){//以下语句用于计算距离与报警的频率大小if(number[3]>0) //表示距离大于1米时,不报警icont=0;else //否则{if(number[2]>0) //小于1米时,但分米大于0时,报警频率与分米的数据成正比{switch(number[2]){case 9: icont=9; break;case 8: icont=8; break;case 7: icont=7; break;case 6: icont=6; break;case 5: icont=5; break;case 4: icont=4; break;case 3: icont=3; break;case 2: icont=2; break;case 1: icont=1; break;default: break;}}else //距离只在厘米时,高频率输出报警{if(number[1]>0)icont=1;elseicont=0;}}}void Timetojuli(void){long i;i=(long)time*170;temp_number[4]=i/10000000;i=i-temp_number[4]*10000000;temp_number[3]=i/1000000;i=i-temp_number[3]*1000000;temp_number[2]=i/100000;i=i-temp_number[2]*100000;temp_number[1]=i/10000;i=i-(long)temp_number[1]*10000;temp_number[0]=i/1000;//以下用于控制是否测到距离,如全为0,表明没有测到距离资料来源于网络,由电子小制作_我爱制作_电子DIY制作套件整理。

51单片机开发板-超声波测距-数码管显示

51单片机开发板-超声波测距-数码管显示

计算机技术系项目工作报告课程名称单片机开发板设计与制作实训班级学号姓名项目名称超声波测距,数码管显示实训日期/时间2015.6.23-2015.7.5 地点指导教师同组成员仪器设备(参考资料)计算机、Keil uVision2、Proteus ISIS 电烙铁、开发板、HC-SR04超声波模块实训内容(任务安排)1焊接开发板2自选课题3开发与调试4项目汇报与总结一、项目名称与要求项目名称:超声波测距,数码管显示功能描述:采用HC-SR04超声波模块,STC89C52单片机以及数码管显示设计的一种超声波测距显示器,可以实现测量物体到仪器距离以及显示等功能,可以测量范围为2cm –450cm ,精确度为1cm。

是一种结构简单、性能稳定、使用方便、价格低廉的超声波距离测量器,具有一定的实用价值。

二、项目设计思路1、硬件资源单片机开发板(携带数码管);HC-SR04超声波模块;STC89C52芯片;2、软件设计思路软件设计采用C语言编程,运用模块化程序设计思想,对不同功能模块的程序进行分别编程,以便移植或调用,这样使软件层次结构清晰,有利于软件的调试修改。

软件设计思路是:系统初始化、发射脉冲串、计时、接收输入脉冲,接收串口输入速度值、计算距离、显示距离值、重复。

超声波测距算法设计如下:超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就会被超声波接收器R接收到。

这样,只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器于反射物体的距离。

该距离的计算公式如下:d=s/2(v×t)/2其中:d为被测物于测距器的距离;s为声波的来回路程;v为声速;t为声波来回所用的时间。

超声波测距原理图如下:3、项目涉及的知识点说明HC-SR04超声波模块简介:实物图:正面:背面:HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 1cm;模块包括超声波发射器、接收器与控制电路。

具有实时语音播报功能的超声波测距仪(C程序)

具有实时语音播报功能的超声波测距仪(C程序)
value ++;
if(value > 10)//3秒钟自动播放一次
{
value = 0;
if(distance == 888)
{
Send_threelines(0x0d);//语音播放已超出量程
}
else
{
Send_threelines(yujing[2]);//语音播放
Send_threelines(0x0b);
include调用单片机头文件defineucharunsignedchar无符号字符型宏定义变量范围0255defineuintunsignedint无符号整型宏定义变量范围065535include数码管段选定义ucharcodesmgdu0xc00xf90xa40xb00x990x920x820xf80x800x900x880x830xc60xa10x860x8e0xff
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/***********************数码显示函数*****************************/
void display()
{
static uchar i;
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
sbit smg_we1 = P3^4;//数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
sbit c_send = P3^2;//超声波发射

超声波测距c语言程序

超声波测距c语言程序

//超声波模块显示程序#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit Tx = P3^3; //产生脉冲引脚sbit Rx = P3^2; //回波引脚sbit fmq=P1^7;uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9 uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志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;}//20us延时函数void delay_20us(){ uchar bt ;for(bt=0;bt<22;bt++);}//1ms基准延时程序void delay1ms(unsigned int i){unsigned char j;while(i--){for(j=0;j<115;j++){;}}}//产生1KHZ频率声音的函数void beep(){fmq=0;delay1ms(500);fmq=1;delay1ms(500);}// 主程序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 < 50);//等待测量的结果,周期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;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);if(b>0&&b<200){fmq=0;delay1ms(100);fmq=1;}}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;}}。

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示)#include<reg52.h> //头文件#include<intrins.h>// _nop_() 函数延时1US用#include <stdio.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#define nop _nop_()sbit csb=P1^0;//超声波发送端口为P1.0sbit bai=P2^2;//数码管百位sbit shi=P2^1;//数码管十位sbit ge=P2^0;//数码管个位uchar flag;//超声波接收标志float juli1;//距离变量,用来数码管显示用int juli;uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0到9的代码int xianshi[3];void delayshow(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void ledshow(void){xianshi[0]=juli/100;xianshi[1]=((juli%100)/10);xianshi[2]=juli%10;bai=0;P0=table[xianshi[0]];delayshow(2);bai=1;delayshow(2);shi=0;P0=table[xianshi[1]];delayshow(2);shi=1;delayshow(2);ge=0;P0=table[xianshi[2]];delayshow(2);ge=1;delayshow(2);}/***************n个ms函数*******************/ void delay_nms(uint ms) //delay ms 函数{uchar i;while(ms--){for(i=0;i<123;i++);}}/************************************************ 延时100us函数***********************************************/ void delay100us(){uchar j;for(j=50;j>0;j--);}/********************************************** 发送超声波函数,实测为38KHz信号,4个这样的方波***********************************************/ void tran(){uchar i;for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;//关超声波发送ET0=1;EA=1;delay100us();//延时100us左右后再开中断,避免直接回来的回波//理论上可以测量的最小距离为:0.0001×344=0.0344M=3.44CMEX0=1;//打开外部中断1TR0=1;//开定时0}void main(){uchar i;delay_nms(10);//等待单片机复位TMOD=0x11;//定时器0方式1用于计时TL0=0;TH0=0;IT0=0;//中断0下降沿有效EA=1;while(1){tran();//发送超声波while(flag==0);//等待接收if(flag==1){juli1*=17.2;//计算距离,因为时间是来回的时间,声速为344M/S 除以2就为172juli1=juli1/1000;juli=(int)(juli1);flag=0;for(i=0;i<50;i++)ledshow();juli=0;}else{juli=0;//超出距离显示000for(i=0;i<10;i++)ledshow();flag=0;}}}/*超声接收程序(外中断0)*/void cs_r() interrupt 0{EX0 = 0;//关闭外部中断0,也就是超声波接收中断TR0 = 0;//关闭定时器0EA=0;juli1=TH0*256+TL0-100;//减去开始延时的100usTL0=0;//清定时0TH0=0;flag= 1;//成功接收标志置1}/*超时清除程序(定时器中断T0)*/void overtime() interrupt 1{EA=0;TL0=0;//清定时0TH0=0;EX0 = 0;//关闭定时器0的中断TR0 = 0;//关闭定时器0ET0 = 0;//关闭定时器0的中断flag= 2;//接收标志置2}。

超声波测距_C程序

超声波测距_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}}}。

超声波测距C语言源程序代码

超声波测距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;}}}/****************************************************************************** ******/。

超声波测距程序

超声波测距程序

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

超声波测距程序(详细C语言数码管显示)
#include<reg52.h> //头文件
#include<intrins.h>// _nop_() 函数延时1US用
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
sbit csb=P1^0;//超声波发送端口为P1.0
sbit bai=P2^2;//数码管百位
sbit shi=P2^1;//数码管十位
sbit ge=P2^0;//数码管个位
uchar flag;//超声波接收标志
float juli1;//距离变量,用来数码管显示用
int juli;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0到9的代码
int xianshi[3];
void delayshow(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ledshow(void)
{
xianshi[0]=juli/100;
xianshi[1]=((juli%100)/10);
xianshi[2]=juli%10;
bai=0;
P0=table[xianshi[0]];
delayshow(2);
bai=1;
delayshow(2);
shi=0;
P0=table[xianshi[1]];
delayshow(2);
shi=1;
delayshow(2);
ge=0;
P0=table[xianshi[2]];
delayshow(2);
ge=1;
delayshow(2);
}
/***************n个ms函数*******************/ void delay_nms(uint ms) //delay ms 函数
{
uchar i;
while(ms--)
{
for(i=0;i<123;i++);
}
}
/************************************************ 延时100us函数
***********************************************/ void delay100us()
{
uchar j;
for(j=50;j>0;j--);
}
/********************************************** 发送超声波函数,实测为38KHz信号,4个这样的方波***********************************************/ void tran()
{
uchar i;
for(i=8;i>0;i--)
{
csb=!csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;//关超声波发送
ET0=1;
EA=1;
delay100us();//延时100us左右后再开中断,避免直接回来的回波
//理论上可以测量的最小距离为:0.0001×344=0.0344M=3.44CM
EX0=1;//打开外部中断1
TR0=1;//开定时0
}
void main()
{
uchar i;
delay_nms(10);//等待单片机复位
TMOD=0x11;//定时器0方式1用于计时
TL0=0;
TH0=0;
IT0=0;//中断0下降沿有效
EA=1;
while(1)
{
tran();//发送超声波
while(flag==0);//等待接收
if(flag==1)
{
juli1*=17.2;//计算距离,因为时间是来回的时间,声速为344M/S 除以2就为172
juli1=juli1/1000;
juli=(int)(juli1);
flag=0;
for(i=0;i<50;i++)
ledshow();
juli=0;
}
else
{
juli=0;//超出距离显示000
for(i=0;i<10;i++)
ledshow();
flag=0;
}
}
}
/*超声接收程序(外中断0)*/
void cs_r() interrupt 0
{
EX0 = 0;//关闭外部中断0,也就是超声波接收中断
TR0 = 0;//关闭定时器0
EA=0;
juli1=TH0*256+TL0-100;//减去开始延时的100us
TL0=0;//清定时0
TH0=0;
flag= 1;//成功接收标志置1
}
/*超时清除程序(定时器中断T0)*/
void overtime() interrupt 1
{
EA=0;
TL0=0;//清定时0
TH0=0;
EX0 = 0;//关闭定时器0的中断
TR0 = 0;//关闭定时器0
ET0 = 0;//关闭定时器0的中断
flag= 2;//接收标志置2
}。

相关文档
最新文档