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

合集下载

51单片机超声波测距程序

51单片机超声波测距程序
dula=1; P0=list[bai]; dula=0; P0=0xff;
wela=1; P0=0xfe; wela=0; delay(1); }
文档
标准实用文案
/* 被调用子函数 */ void diaoyong()
{ uint i; EA=0; echo=1;
高 trig=1; delay20us(); trig=0; while(echo==0);
{
time=timeh*256+timel;// 计算测定距离,并显示
distance=time*0.1720;
display(distance);
}
if(0,同
时灯闪烁
{
distance=0;
test=!test;
}
}
/* 主函数 */
文档
标准实用文案
// 测试灯
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 };
void main() {
initime0(); test=0; trig=0; EA=1; while(1) {
diaoyong(); display(distance); } }
文档
标准实用文案
// 超声波测距,测距范围 2cm-400cm; #include<reg52.h> #include<intrins.h>

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; //位申明

51 超声波 程序

51 超声波 程序
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
case 0x01:P0=shi;P2=0xbf;flag++;break;
case 0x02:P0=bai;P2=0xdf;flag=0;break;
}
}
//显示数据转换程序
void conversion(uint temp_data)
{
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;
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0x7f;flag++;break;
i=0;
flag=0;
Tx=0; //首先拉低脉冲输入引脚

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

基于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;

(完整word版)用51单片机实现HC-SR04超声波测距程序(word文档良心出品)

(完整word版)用51单片机实现HC-SR04超声波测距程序(word文档良心出品)

#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Trig = P1^0; //产生脉冲引脚sbit Echo = P3^2; //回波引脚sbit test = P1^1; //测试用引脚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 main(void) // 主程序{uint distance_data,a,b;uchar CONT_1;i=0;flag=0;test =0;Trig=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;Trig=1;delay_20us();Trig=0; //产生一个20us的脉冲,在Trig引脚while(Echo==0); //等待Echo回波引脚变高电平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*256+outcomeL;distance_data= (distance_data*1.87)/100;} //为什么除以58等于厘米,Y米=(X 秒*344)/2// X秒=(2*Y米)/344 ==》X 秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零test = !test; //测试灯变化}/********************************************每循环3次就显示结果一次*********************************************/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);}}}//***************************************************************//外部中断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=0xfe;flag++;break;case 0x01:P0=shi;P2=0xfd;flag++;break;case 0x02:P0=bai;P2=0xfb;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];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<100;bt++);}。

51单片机超声波测距源代码

51单片机超声波测距源代码

51单⽚机超声波测距源代码/* 超声波模块的TRIG管脚接在单⽚机的P20⼝,ECHO管脚接在单⽚机的P21⼝其他的电源管脚接在单⽚机开发板上电源⼝即可。

*/#include"reg51.h"#include"intrins.h" //包含的头⽂件,⽤到了intrins.h的_nop_();延时⽂件sbit RX=P2^1; //定义管脚,⽤到的是P2上的两个双向I/O⼝sbit TX=P2^0;unsigned int time=0; //声明变量,注意单⽚机中⼀般都是⽤⽆符号的Unsigned类型变量,在Keil中,char是8位变量,int是16位变量unsigned int timer=0;unsigned char posit=0;unsigned int S=0;bit flag =0; //bit顾名思义,是1位的变量//--定义使⽤的IO--//#define GPIO_DIG P0 //此处定义的I/O是数码管显⽰要⽤到的I/O,若只⽤到串⼝则可以去掉sbit LSA=P2^2; //此处定义的是74LS138译码器的管脚,同理,只⽤到串⼝的话可以去掉sbit LSB=P2^3;sbit LSC=P2^4;//--定义全局变量--//unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显⽰码,也是供数码管显⽰⽤的,可以去掉unsigned char disbuff[4] ={ 0,0,0,0,};/******************************************************************************** 函数名 : DigDisplay* 函数功能 : 使⽤数码管显⽰* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void DigDisplay(){unsigned char i;unsigned int j;for(i=0;i<8;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显⽰第0位case(1):LSA=1;LSB=0;LSC=0; break;//显⽰第1位case(2):LSA=0;LSB=1;LSC=0; break;//显⽰第2位case(3):LSA=1;LSB=1;LSC=0; break;//显⽰第3位case(4):LSA=0;LSB=0;LSC=1; break;//显⽰第4位case(5):LSA=1;LSB=0;LSC=1; break;//显⽰第5位case(6):LSA=0;LSB=1;LSC=1; break;//显⽰第6位case(7):LSA=1;LSB=1;LSC=1; break;//显⽰第7位}GPIO_DIG=disbuff[i]; //发送段码j=10; //扫描间隔时间设定while(j--);GPIO_DIG=0x00;//消隐}}/********************************************************/void Conut(void){time=TH0*256+TL0; //根据定时器数据计算时间TH0=0; //初始化定时器TL0=0;S= (int)(time*0.17); //算出来是CMif((S>=4000)||flag==1) //超出测量范围显⽰“ERR0”{flag=0;disbuff[0]=0x3f; //“-”disbuff[1]=0x50; //“-”disbuff[2]=0x50; //“-”disbuff[3]=0x79; //“-”}else //分离各位显⽰的数字{disbuff[3]=DIG_CODE[S%10000/1000];disbuff[2]=DIG_CODE[S%1000/100];disbuff[1]=DIG_CODE[S%100/10];disbuff[0]=DIG_CODE[S%10/1];}}/********************************************************/void zd0() interrupt 1 //T0中断⽤来判断是否超过测距范围{flag=1; //若中断溢出,则超过测距范围,标记量置1。

基于51单片机超声波测距报警系统课程设计

基于51单片机超声波测距报警系统课程设计

基于51单片机超声波测距报警系统课程设计一、引言超声波测距技术是一种常见的非接触式测距技术,具有测距范围广、精度高等优点。

在日常生活中,超声波测距技术被广泛应用于车辆倒车雷达、智能家居中的人体感应等领域。

本文将介绍基于51单片机的超声波测距报警系统的课程设计。

二、设计思路本课程设计主要分为硬件设计和软件设计两部分。

硬件部分主要包括超声波模块、LCD显示屏、蜂鸣器等模块的连接和电路设计;软件部分主要包括51单片机程序设计及LCD显示程序编写。

三、硬件设计1. 超声波模块连接超声波模块是实现测距功能的核心部件。

在本课程设计中,我们采用HC-SR04型号的超声波模块。

该模块需要连接到51单片机上,具体连接方式如下:- 将VCC引脚连接到51单片机上的5V电源;- 将GND引脚连接到51单片机上的GND;- 将Trig引脚连接到P2.0口;- 将Echo引脚连接到P2.1口。

2. LCD显示屏连接LCD显示屏用于显示测距结果和报警信息。

在本课程设计中,我们采用1602型号的LCD显示屏。

该模块需要连接到51单片机上,具体连接方式如下:- 将VSS引脚连接到51单片机上的GND;- 将VDD引脚连接到51单片机上的5V电源;- 将VO引脚连接到一个10K电位器,再将电位器两端分别接到GND 和5V电源;- 将RS引脚连接到P1.0口;- 将RW引脚连接到P1.1口;- 将EN引脚连接到P1.2口;- 将D4-D7引脚分别连接到P0口的高四位。

3. 蜂鸣器连接蜂鸣器用于报警。

在本课程设计中,我们采用被动式蜂鸣器。

该模块需要连接到51单片机上,具体连接方式如下:- 将正极引脚(一般为长针)连接到51单片机上的P3.7口;- 将负极引脚(一般为短针)连接到51单片机上的GND。

四、软件设计1. 51单片机程序设计在本课程设计中,我们采用Keil C51作为编程工具,使用C语言编写程序。

主要程序流程如下:- 定义超声波模块的Trig和Echo引脚;- 定义LCD显示屏的RS、RW、EN和D4-D7引脚;- 定义蜂鸣器的引脚;- 定义变量存储测距结果和报警状态;- 初始化LCD显示屏、超声波模块等模块;- 循环执行以下操作:- 发送超声波信号并计算回波时间,从而得到距离值;- 根据距离值判断是否需要报警,并控制蜂鸣器发出报警声音;- 将测距结果和报警状态显示在LCD显示屏上。

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]]; //取出千位数,查表,输出。

555和cx20106a的超声波测距仪C51程序

555和cx20106a的超声波测距仪C51程序
OUTSEG=table[qian];
delay(5);
}
if((qian==0)&&(bai==0))
OUTBIT=0x00;
else
{
OUTBIT=0x04;
OUTSEG=table[bai];
delay(5);
}
if((qian==0)&&(bai==0)&&(shi==0))
dl=0;
delay(1);
xh=1;
flag0=1;
while(flag0)
{
i++;
xh=0;
if(d2==0)
{
flag0=0;
flag=1;
TR0=0;
}
if(i==1000)
{
flag0=0;
flag=0;
break;
}
default: {
show(2,qian,bai,shi,ge);
flag=0;
}
ge=distance%10;
}
//----显示距离----//
void show(flag,qian,bai,shi,ge)
{
OUTBIT=0x10;
OUTSEG=table[flag];
delay(5);
if(qian==0)
OUTBIT=0x00;
else
{
OUTBIT=0x08;
}
}
}
//----外部中断0---//
void exterior() interrupt 0

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单片机程序与电路图1

超声波测距 含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 )方便其跟其他为控制通信。

(整理)用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单片机超声波测距程序

// 超声波测距,测距范围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]);}。

超声波测距离,51单片机程序

超声波测距离,51单片机程序

超声波测距离,51单片机程序程序:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code table[] ={"dis "}; uchar code table1[]={" "};unsigned char code ASCII[15] ={'0','1','2','3','4','5','6','7','8','9','.','-','M'};sbit rs=P2^4;sbit lcden=P2^6;sbit echo = P1^7;sbit trig= P1^6 ;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 delay(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void write_com(uchar com){//写液晶命令函数rs=0;lcden=0;P0=com;delay(3);lcden=1;delay(3);lcden=0;}void write_date(uchar date){//写液晶数据函数rs=1;lcden=0;P0=date;delay(3);lcden=1;delay(3);lcden=0;}void init(){//初始化函数uchar num;lcden=0;rs=0;write_com(0x38);//1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++)//写入液晶固定部分显示{write_date(table[num]);delay(3);}write_com(0x80+0x40);for(num=0;num<5;num++){write_date(table1[num]);delay(3);}}void write_dianya(uchar add,char date){//1602液晶刷新时分秒函数4为时,7为分,10为秒char bai,shi,ge;bai=date%1000/100;shi=date%1000%100/10;ge=date%1000%10 %10;write_com(0x80+0x40+add);write_date(0x30+bai);write_date(ASCII[10]) ;write_date(0x30+shi);write_date(0x30+ge);write_date(ASCII[12]);}void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100+2; //算出来是CM}void StartModule() //启动模块{trig=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();trig=0;}void Delay400Ms(void){unsigned char T empCycA = 5;unsigned int T empCycB;while(T empCycA--){T empCycB=7269;while(T empCycB--);}}void main()init();Delay400Ms(); //启动等待,等LCM讲入工作状态//LCM初始化c++)Delay400Ms(); //延时TMOD=0x01; //设T0为方式1,GATE=1;TH0=0;TL0=0;ET0=1; //允许T0中断EA=1;while(1){StartModule(); //启动模块while(!echo); //当RX为零时等待TR0=1; //开启计数while(echo); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算delay(80); //80MSwrite_dianya(0,S);delay(5);}。

超声波测距并实时监控距离报警51C程序

超声波测距并实时监控距离报警51C程序
if(succeed_flag==1)
{
time=timeH * 256+timeL;
distance=time*0.0172; //厘米
if( distance < jiexian )
{
//uchar i;
// for( i = 5; i > 0;i --)//鸣五下蜂鸣器和闪五下LED
-------------------------------------*/
void timer1() interrupt 3
{
TH1=0;
TL1=0;
}
{
timeH =TH1;//取出定时器的值
timeL =TL1;//取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
/*-------------------------------------
定时器1中断,用做超声波测距计时
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0;//定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay(20);//等待测量的结果
TR1=0;//关闭定时器1
EX0=0; //关闭外部中断0
{
warning = !warning;
LED = !LED;
}
/*------------延时函数---------*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)

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

单片机课件第13章 基于C51单片机的超声波导航模块.

单片机课件第13章 基于C51单片机的超声波导航模块.

第一章 MCS—51单片机硬件结构及指令系统
13.3 设计案例
10.3.2 硬件电路设计 基于C51单片机的超声波距离检测电路原理如图13—5所示。
5V 左轮驱动电机 M 1 2 右轮驱动电机 GND M C3 + AT89C51 GND 9 R1 10K C1 C2 30PF 12MHZ 30PF 18 XTA1 19 XTA2 20 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P1.0 P1.1 VCC P1.3 GND 1602LCD GDN Vcc V0 D0 D1 D2 D3 D4 D5 D6 D7 E R/W RS BLA BLK 超声波传感器
n=n+1; while(--n) delay_nµ s(900); }
主讲:雷道仲
第一章 MCS—51单片机硬件结构及指令系统
9.3 设计案例
10.3.3 软件设计
任务一:超声波距离测量 本任务是根据超声波传感器的时序原理图,应用c51单片机定时/计数器实现 对前方物体距离的测量并在LCD模块上显示
主讲:雷道仲
第一章 MCS—51单片机硬件结构及指令系统
13.2 必备知识
13.2.2 位差超声波距离传感器工作时序
图13-2 位差超声波传感器工作时序图
主讲:雷道仲
第一章 MCS—51单片机硬件结构及指令系统
13.2 必备知识
13.2.2 位差超声波距离传感器工作时序
注意:位差超声波距离传感器在下列情况下不能精确地测量距离:
任务一:超声波距离测量 本任务是根据超声波传感器的时序原理图,应用c51单片机定时/计数器实现 对前方物体距离的测量并在LCD模块上显示
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机驱动超声波测距模块C51程序#include;#define uchar unsigned char#define uint unsigned int#define ulong unsigned long//******************* 函数声明**************************void init_Total(); //总初始化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[]=&quot; distance &quot;; uchar code table2[]=&quot; &quot;;//初始化显示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_Total()* 功能:总初始化* 入口参数:NULL* 全局变量:NULL* 返回值:NULL************************************************* *************************************/void init_Total(){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_Total();//总初始化while(1){TR1=1;//启动定时器1TR0=1;//启动定时器0send_T(); //发送100us超声波脉冲delay_300us();//延时300us跳过盲区EX1=1; //开外部中断1while(!flag); //等待回波或定时器T1溢出if(flag==1) //回波{Count_TH=TH1;//读计数器T1的高位TH1Count_TL=TL1;//读计数器T1的低位TL1t=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;}}。

相关文档
最新文档