超声波串口显示测距程序

合集下载

一款串口输出超声波测距模块使用范例

一款串口输出超声波测距模块使用范例

一款串口输出超声波测距模块使用范例一、模块简介:该串口输出超声波测距模块采用STC11F04E单片机作处理器,工作电源:DC5V,工作电流10mA。

测量数据输出方式为TTL串口输出,数据格式为标准的ASCII码,数据由:空格位(起始位)+百+十位+个位。

工作方式有两种:一是连续测量方式;二是查询测量方式。

测量范围:方式一:5cm~200cm(盲区5cm);方式二:25cm~350cm(盲区25cm)。

测量过程中,当接收不到障碍物反射的回波时,输出“C C C”,当测量低于下限值(在盲区内)时显示“- - -”。

测量结果由模块上的输出端口输出,输出方式为串口(TTL电平)输出。

测量结果可通过电脑进行显示。

模块使用串口通讯可靠性更高,同时可以通过电脑串口采集数据,编写通讯程序非常的便捷。

波特率:1200校验位:无数据位:8停止位:无ASCII码数据格式:空格位(起始位)+百+十位+个位。

二、模块的使用设置下图为模块的背面图片。

图中标有A、B、C短接焊盘是作为设置测量方式用;标有0-7的短路焊盘是设置查询方式下的模块地址用。

方式1:设置为小盲区期测量。

设置方法,标号为B 的焊盘即单片机的P3.5 脚与地断开,这时的测量范围为:5-200;这种方式下,测量盲区值小,适合长时间近距离测量用。

方式2: 设置为远距离测量,这种方式,盲区值相对较大,测量相对较远一些,设置方法:将标号为B的焊盘即单片机的P3.5 脚与地短接,这时的测量范围为:25-350厘米。

方式3:连续方式测量。

将标号为A的焊盘即单片机的P3.4 脚与地断开,这时模块测量方式是连续的进行测量,测量间隔为1-2次/秒,每测量一次,就将测量结果通过串口送出。

方式4:查询方式测量。

将标号为A的焊盘即单片机的P3.4 脚与地短接,这时的测量方式为查询方式测量,即通过控制设备向模块发出一个命令后,模块才测量一次。

超声波测距并报警最终程序

超声波测距并报警最终程序

//超声波模块显示程序#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longuchar a ;sbit Tx = P3^3; //产生脉冲引脚sbit Rx = P3^2; //回波引脚sbit bell = P3^6; //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);void delay_20us();void delay(uint z);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;a: 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;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<100){uchar c=0;for(c=200;c>0;c--){bell=~bell;delay(1);}i=0;goto a;}else if (b<200){uchar c=0;for(c=200;c>0;c--){bell=~bell;delay(2);}i=0;goto a;}}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 delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。

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

超声波测距模块SR04测试程序51单片机(串口助手,串口通信)

超声波测距模块SR04测试程序51单片机(串口助手,串口通信)

超声波测距模块SR04测试程序51单⽚机(串⼝助⼿,串⼝通信)#include#includetypedef unsigned char uint8;typedef unsigned int uint16;sbit Trig=P3^3;//触发引脚定义sbit Echo=P3^2;//测量引脚定义uint16 distance;//定义全局变量/******************************************延时让Trig引脚产⽣⼤于10us的脉冲********************************************/void delay(){uint8 i;for(i=0;i<100;i++);}//初始化void init(){EA=1;//开总中断IT0=0;//外部中断0,低电平触发TMOD|=0x01;//定时器0 ⼯作模式1TH0=0;TL0=0;TR0=0;}//串⼝设置void UART_init(){SCON=0x50;TMOD=0x20;TH1=0xFD;TL1=0xFD;TR1=1;}//发送⼀个字节void UART_send_byte(uint8 dat){SBUF=dat;while(TI==0);TI=0;}//发送⼀组测得的distancevoid UART_send_dat(uint16 temp){UART_send_byte((temp/10000)%10 + '0');UART_send_byte((temp/1000)%10 + '0');UART_send_byte((temp/100)%10 + '0');UART_send_byte((temp/10)%10 + '0');UART_send_byte('.');UART_send_byte(temp%10 + '0');UART_send_byte('c');UART_send_byte('m');}//主函数main(){UART_init();//初始化init(); //初始化Trig=0;//先把引脚拉低while(1)//进⼊循环{Trig=1;delay();//产⽣脉冲Trig=0;while(Echo==0);//等待引脚被拉⾼TR0=1;//打开定时器0EX0=1;//打开中断while(TH0<250);//正在测量数据,需要等待TR0=0;TL0=0;TH0=0;UART_send_dat(distance);//向串⼝发送测得的distanceUART_send_byte('\r');UART_send_byte('\n');}}void extra_interrupt() interrupt 0 //外部中断0{distance=(256*TH0+TL0)*0.184;//测得最⼩精度位mm(晶振为11059200Hz)//P0=Echo;EX0=0;//关闭中断}/********************关于上式的计算**************(256*TH0+TL0)机器周期个数⼀个机器周期*⾳速/2=(12/11059200)*340/2=0.184*************************************************/。

超声波测距程序c

超声波测距程序c

#include<reg51.h>#include<intrins.h> //包含_nop_()函数定义的头文件#include<1602.h>#define uchar unsigned char#define uint unsigned intfloat time;int s,total=0,i;float v;bit flag=0; //定义标志位/****************位定义***************************/sbit Trig =P1^0; //超声波信号发生引脚sbit Echo=P1^1; //超声波信号接收引脚sbit feng=P2^4; //蜂鸣器引脚/***************显示******************************/uchar code num[]={"0123456789.merror"};uchar code JL[]={"distance:"}; //显示距离uchar disbuff[]={0,0,0,0};//缓存区间/*****************************************************函数功能:延时1ms注:不同单片机不同晶振需要对此函数进行修改***************************************************/void Lcd_delay1ms(){unsigned char i,j;for(i=0;i<90;i++)for(j=0;j<1;j++);}/***************************************************** 函数功能:延时若干毫秒入口参数:n***************************************************/void Lcd_delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)Lcd_delay1ms();}函数功能:判断液晶模块的忙碌状态返回值:result。

超声波测距程序说明书

超声波测距程序说明书

#include<reg51.h>#include<string.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit shizhong=P0^1; //164 时钟线sbit shuju=P0^0; //164 数据线sbit chufa=P2^0; //触发信号输入端unsigned int PWMBJ,i,m,j,k,juli,juli1,juli2;unsigned char code szi[]={0XEE,0X82,0XDC,0XD6,0XB2,0X76,0X7E, 0XC2,0XFE,0XF6};//控制字 0~9uint T;void delay(uint z)//延时子程序 { uint x,y; for(x=10;x>0;x--) for(y=z;y>0;y--); }void xianshi(uint x,uint y) //显示子程序{ char aa; int c; m=y%10;//个位k=y/10;//十位j=x%10;//次高位i=x/10;//最高位for (c=0;c<4;c++)//送四个数{ if(c==0) aa=szi[i];else if(c==1) aa=szi[j];else if(c==2)aa=szi[k]&0xFE;else aa=szi[m];for(i=0;i<8;i++) //每个数送八位{ shizhong=0; //产生下降沿shuju=aa&1;aa=aa>>1; //右移一位shizhong=1; }}delay(2000); }void main(){TMOD=0x19;EA=1; //开总中断TR0=1;//启动定时器 0EX0=1; //开外部中断 0IT0=1; //下降沿中断while(1){ chufa=1;_nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); chufa=0;juli=0.17*T;//计算距离()juli1=juli/100;//高二位juli2=juli%100;//第二位xianshi(juli1,juli2);//调用现实函数}}/*-----------------------------------------------内容:通过标准程序静态显示字符引脚定义如下: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>sbit RS = P2^0; //定义端口sbit RW = P2^1;sbit EN = P2^2;sbit echo=P1^1; //接收端sbit trig=P1^0; //发射端sbit Beap=P2^3; //蜂鸣器sbit Key_Data=P2^4; //按键发射#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 P0unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'}; unsigned char disbuff[4] ={ 0,0,0,0,};unsigned long S=0;unsigned char Flag;unsigned int time;unsigned int t=500;/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/ void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_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);}/*------------------------------------------------LCD初始化函数------------------------------------------------*/void LCD_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); /*显示开及光标设置*/}/*-------------------------------------------------初始化超声波测距仪,定时器,中断---------------------------------------------------*/void init(){echo=0;trig=0;Flag=1;LCD_Write_Char(7,0,'o');LCD_Write_Char(8,0,'k');TMOD=0x01; //设T0为方式1TH0=0;TL0=0;ET0=1; //允许T0中断TR0=0;EA=1; //开启总中断}/*------------------------------------------------定时器0中断函数--------------------------------------------------*/void timer0() interrupt 1{TH0=0;TL0=0;Flag=0; //标志位,当检测超过65ms退出等待回波,继续下一次检测,非常必要}/*------------------------------------------------超声波测距仪触发模块-------------------------------------------------*/void startmodule(){trig=1; //15us 启动一次模块_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();trig=0;}/*------------------------------------------------键盘扫描函数--------------------------------------------------*/unsigned char KeyScan(void){if(!Key_Data) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!Key_Data) //再次确认按键是否按下,没有按下则退出{while(!Key_Data);//如果确认按下按键等待按键释放,没有则退出{return 1;}}}}/*------------------------------------------------主函数------------------------------------------------*/void main(void){LCD_Init();LCD_Clear();//清屏init();while (1){if(KeyScan()){ t=500;startmodule();while(!echo); //起始为0,当为1时,开始计时TR0=1; //开启计数while(echo&&Flag); //当echo为1计数并等待//flag标志位,当检测超过65ms退出等待回波,继续下一次检测TR0=0; //停止计时time=(TH0*256+TL0)*(12/11.0592);TH0=0;TL0=0; //关闭计数S=(time*1.7)/100;if((S<1)||(S>400)||(Flag==0)) //小于1cm大于4m超出测量范围显示'----' {Flag=1;LCD_Write_Char(0, 1, ASCII[11]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[11]);LCD_Write_Char(3, 1, ASCII[11]);LCD_Write_Char(4, 1, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100; //把s的1-3位数存在disbuffdisbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;LCD_Write_Char(0, 1, ASCII[disbuff[0]]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[disbuff[1]]);LCD_Write_Char(3, 1, ASCII[disbuff[2]]);LCD_Write_Char(4, 1, ASCII[12]); //显示MDelayMs(500);}while(t){t--;DelayMs(1); //发出大约500Hz的方波频率越大声音越尖Beap=!Beap;}}}}。

超声波测距程序LCD液晶显示

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

超声波测距串口输出

超声波测距串口输出超声波测距模块:(1):采用IO口TRIG触发测距,给至少10us的高电平信号;(2):模块自动发送8个40khz的方波,自动检测是否有信号返回;(3):有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

测试距离=(高电平时间*声速(340M/S))/2。

超声波测距串口输出程序源代码/*******************超声波测距串口输出********************** 单片机:51单片机* 开发环境:keil* 名称:超声波测距串口输出* 说明:波特率9600注意:用杜邦线将超声波模块的VCC接开发板5V对外供电接口用杜邦线将超声波模块的GND接开发板GND用杜邦线将超声波模块的Trig接单片机的P1.5用杜邦线将超声波模块的Echo接单片机的P1.6/************************包含头文件************************/#include <reg52.h>/**************************宏定义**************************/#define SPEED_30C 3495 //30摄氏度时的声速,声速V=331.5+0.6*温度;#define SPEED_23C 3453 //23摄氏度时的声速,声速V=331.5+0.6*温度;/**************************位定义**************************///FOSC = 11.0592MHz,12T模式,SMOD=0#define reload_count_1200bps 0xe8#define reload_count_2400bps 0xf4#define reload_count_4800bps 0xfa#define reload_count_9600bps 0xfdsbit ECHO = P1^6; //回声接收端口sbit TRIG = P1^5; //超声触发端口sbit BEEP = P2^3; //蜂鸣器/**********************定义变量和数组**********************/long int distance = 0; //距离变量unsigned char count;void Delay5Ms(void);void delay(int In,int Out);unsigned char zifuchuan[]="SSLV WELCOME!"; //待显示字符。

超声波测距程序

在主函数里一直发高低脉冲;
然后把超声波接收回波信号的引脚, 设置为浮空输入,并且设置为上升沿中断:
在中断服务函数里,开关定时器,统计高脉冲宽度。
****************************************************************************/
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
// TIM3->DIER|=1<<0; //允许更新中断
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
PAout(1)=0;delay_ms(500);
}
}
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化

超声波测距程序流程

超声波测距程序流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 初始化初始化超声波传感器,设置相关参数,如触发引脚、接收引脚等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TX=0;
}
/********************************************************/
void main(void)
{
TMOD=0x21;//设T0为方式1,GATE=1;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop测距程序
/***********************************************************************************************************/
//DYP-ME007超声波测距模块DEMO程序
ET0=1; //允许T0中断
TR1=1;//开启定时器
TI=1;
EA=1;//开启总中断
while(1)
{
StartModule();
while(!RX);//当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
Conut();//计算
delayms(100);//100MS
//晶振:11。0592
//接线:模块TRIG接P1.2 ECH0接P1.1
//串口波特率9600
/***********************************************************************************************************/
if(flag==1)//超出测量
{
flag=0;
printf("-----\n");
}
printf("S=%f\n",S);
}
/********************************************************/
void delayms(unsigned int ms)
#include <AT89X51.H>
#include <intrins.h>
#include <STDIO.H>
#define uchar unsigned char
#define uint unsigned int
#define RX P1_1
#define TX P1_2
unsigned int time=0;
unsigned int timer=0;
float S=0;
bit flag =0;
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100; //算出来是CM
{
flag=1;//中断溢出标志
}
/********************************************************/
void StartModule()//T1中断用来扫描数码管和计800MS启动模块
{
TX=1;//800MS启动一次模块
_nop_();
_nop_();
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/********************************************************/
void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围
相关文档
最新文档