超声波模块程序

合集下载

PIC18F4520单片机超声波测距主要部分程序

PIC18F4520单片机超声波测距主要部分程序

PIC18F4520单片机超声波测距主要部分程序测试环境:MPLAB IDE v8.73a单片机型号:PIC18F4520所需器件:超声波模块电路连接图如下:超声波测距子函数:unsigned int chaosheng(){unsigned int temp1,temp2;//定义两个无符号整型的变量用于存储距离值INPUT = 1;delay(50);//延时INPUT = 0;while(!OUTPUT);//当超声波的输出引脚输出高电平时,打开定时器0,开始计时TMR1ON = 1;while(OUTPUT);//当超声波的输出引脚输出低电平时,关闭定时器0,停止计时TMR1ON = 0;//计算超声波测出的距离temp1 = TMR1L;//将TMR1的低8位赋值给temp1变量temp2 = TMR1H;//将TMR1的高8位赋值给temp2变量temp2 = (temp2 << 8) + temp1;//temp2左移8位,加上temp1TMR1H = 0;//TMR1的高8位清零,为下一次测距做准备TMR1L = 0;//TMR1的低8位清零,为下一次测距做准备//距离 = 时间/2 * 速度//距离:distance;时间:temp2/2单位为&mu;s;速度:340m/s//这里注意下单位,需要进行换算让最终距离的单位为cm/sdistance = temp2 * 1.7/100;//有一定的误差,可以软件填补误差,根据实测值,在右侧的表达式上加减一误差数值。

return distance;//返回超声波测得的距离值,这里的distance为全局变量,可以在其他程序中用到,例如液晶显示部分,可以作为实参传递给其对应程序,用于显示。

}最后:很欣赏Google的面试题:用3句话向老太太讲清楚什么是数据库。

乔布斯说:&ldquo;最好的东西就是关注简单&rdquo;,因为简单的东西比复杂的东西更难做到。

HC-SR04 超声波模块 DEMO 程序(淳修良)

HC-SR04 超声波模块 DEMO 程序(淳修良)
#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
if(flag==1) //超出测量
{
flag=0;
printf("-----\n");
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
delayms(100); //100MS
}
}
/***********************************************************************************************************/
//HC-SR04 超声波测距模块 DEMO 程序
//晶振:11。0592
//程序
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1;
EA=1; //开启总中断

KS103超声波测距模块说明书

KS103超声波测距模块说明书
KS101B/KS103/KS103S 电性能参数:
工作电压:3.0V~5.5V 直流电源 工作时瞬间最大电流:10.6mA@5.0V, typical 工作电流:1.6-2.7 mA@5.0V, typical 休眠时最大耗电量:500uA@5.0V, typical (串口模式时不休眠) 功耗:使用纳瓦技术省电,5s 未收到 I2C 控制指令自动进入 uA 级休眠,并可随时被主机 I2C 控

I2C
(4)
数据。
Note 4: 这种总线钳制探测方式可以为客户获得更大的探测速度及效率,而不是通过定时器延时或 delay 函数延时每次探测都要至少等
待 65ms。换言之,用户大部分时候仅需要快速知晓 1m 范围内是否有障碍物。具体延时时间应大于表 1 所列各指令的最大探测时间。
如果不希望 SCL 线在探测时被拉低,可以通过发送指令 0xc3 指令,之后断电重启 KS101B/KS103/KS103S 后 SCL 线仍然不会拉低。如果想恢复 I2C 钳制及 SCL 拉低功能,发送
Note 1: 要达到最佳的工作状态推荐使用+5V 电源,低于 5V 的电压将影响测距量程。并且,严禁将 VCC 与 GND 接反,否则可能会
损坏电路。超过 3 秒钟的电路反接将可能导致不可恢复的损坏。
具体连线如下图所示(20 个):
VCC VCC
R1
R2
4.7K
4.7K
VCC SDA SCL GND
I2C 地址
寄存器 2
8 位数据指令
延时等待或查询 SCL

线是否为高?
3

接收 16 位 I2C 数据

多量程探测 探测指令从 0x01 到 0x2f,数值越大,信号增益越大。指令 0x01 对应量程约 100mm,0x02

超声波测距模块+程序

超声波测距模块+程序
#include <AT89x51.H>//器件配置文件
#include <intrins.h>
#define RX P0_1
#defineTX P0_2
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
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计数并等待
bit flag =0;
unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned charconst positon[3]={ 0xdf,0xef,0xf7};
unsigned char disbuff[4]={ 0,0,0,0,};
/********************************************************/
void Display(void)//扫描数码管
{
if(posit==0)
{P1=(discode[disbuff[posit]])&0x7f;}
//程序QQ:517535000

超声波模块HC-SR04简介以及编程

超声波模块HC-SR04简介以及编程

超声波模块HC-SR04简介以及编程1、本模块性能稳定,测度距离精确,模块高精度,盲区小。

产品应用领域:机器人避障物体测距液位检测公共安防停车场检测。

2、主要技术参数:1:使用电压:DC---5V2:静态电流:小于2mA3:电平输出:高5V4:电平输出:底0V5:感应角度:不大于15度6:探测距离:2cm-450cm7:高精度可达0.2cm实物图接线方式:VCC、trig(控制端)、 echo(接收端)、GND基本工作原理:(1)采用IO口TRIG触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

测试距离=(高电平时间*声速(340M/S))/2; 本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以达到你移动测量的值5、操作:初始化时将trig和echo端口都置低,首先向给trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉echo端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。

6、下面是飞思卡尔XS128单片机测距的程序:while(1){PT1AD0_PT1AD00 = 1;//给超声波模块输入高脉冲PITINTE_PINTE1=1; //打开PIT1定时器while(!(counter0>=4)); //等待20usPITINTE_PINTE1=0;counter0 = 0;//关闭定时器,计数清零PT1AD0_PT1AD00 = 0; //trig管脚拉低PORTB_PB0 = 0; //指示灯0while(!(PT1AD0_PT1AD01 == 1)); //等待echo输出上升沿PORTB_PB1 = 0; //指示灯1PITINTE_PINTE0=1; //打开PIT0定时器while(!(PT1AD0_PT1AD01 == 0)); //等待下降沿distance = counter*17/20; //计算距离,单位CMPITINTE_PINTE0=0; //关闭定时器PORTB_PB2 = 0; //指示灯2PITINTE_PINTE0=1; //打开定时器定时500ms,数码管显示 while(!(counter>=10000)){Showing(distance); //显示距离,精确1cm}PITINTE_PINTE0=0;counter=0; //关闭定时器,清零 }。

超声波模块HC-SR04

超声波模块HC-SR04

//超声波模块HC-SR04显示程序#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Tx = P3^2; //产生脉冲引脚sbit Rx = P3^3; //回波引脚uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管0-9 uint distance[4]; //测距接收缓冲区//收集4次测量以便取平均值uchar ge,shi,bai,qian,temp,flag,outcomeH,outcomeL,i; //自定义变量bit succeed_flag; //测量成功标志//********函数声明void delay_20us(){ uchar bt ;for(bt=0;bt<60;bt++);}//外部中断1,用做判断回波电平INT1_() interrupt 2 // 外部中断是2号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //置成功测量的标志EX1=0; //关闭外部中断}//****************************************************************//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:P0=ge; P2=0xef;flag++;break;case 0x01:P0=shi;P2=0xdf;flag++;break;case 0x02:P0=bai;P2=0xbf;flag++;break;case 0x03:P0=qian;P2=0x7f;flag=0;break;}}//显示数据转换程序void conversion(uint temp_data){EA=0; //计算前关闭总中断ge=temp_data%10; //除以10取余数得个位shi=temp_data/10%10; //除以10,小数点左移1位,再除以10取余数得十位bai=temp_data/100%10; //除以100,小数点左移2位,再除以10取余数得百位qian=temp_data/1000%10; //除以1000,小数点左移3位,再除以10取余数得千位//上面计算数值//下面查表qian=SEG7[qian]; //查询共阳数码管对应元素的值bai=SEG7[bai]; //查询共阳数码管对应元素的值shi=SEG7[shi]&0x7F;//此处并接小数点//查询共阳数码管对应元素的值,这里合并上小数点ge=SEG7[ge]; //查询共阳数码管对应元素的值,前三位是厘米,这一位代表毫米EA=1; //计算结束开启总中断}//******************************************************************void main(void) // 主程序{float distance_data; //定义一个浮点类型的变量i=0; //指针值i为零,即数组SEG7[0] ,第一个元素flag=0;//标志值,赋值为0Tx=0; //首先拉低脉冲输入引脚,做好提供20微秒高电平的准备TMOD=0x11; //两个定时器都要工作,定时器0,定时器1,16位工作方式,可以长时间计时TR0=1;//启动定时器0,以便于显示IT1=0; //中断触发方式:由高电平变低电平,引发外部中断,常讲的“下降沿触发”ET0=1; //打开定时器0中断,每个位按定设定的时间显示,被中断了就显示下一位。

超声波测距程序_代码全

超声波测距程序_代码全

/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。

3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。

超声波程序

超声波程序

本人收藏的的一些超声波程序,希望对大家有用(还有原理图,需要的话去我空间去下):程序一:#include <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; // 编码字节缓存变量uchar i,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2;// 延时用的循环变量uint distance,distance1,time; /距/ 离,timesbit IRsignal=P3T; //HS0038 接收头OUT 端直接连P3.2(INT0)sbit come=P3A3;sbit d=P1A1;// 发送码sbit BZ=P1A0;sbit s=P3A7;//38ksbit ss=P3A6;//38k uchar m;// 开关控制codeunsignedchar定时器 0 中断************************/ 延时0.9ms 子程序延时1ms 子程序//sbit n=P2;// 电机反转Seg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28显示段码void timer0() interrupt 1{TH0=(65536-count)/256;TL0=(65536-count)%256;S=~S;// 产生 38K 信号SS=~SS;//tt++;// 发送超声波个数void Delay0_9mS(void){uchar j,k;for(j=18;j>0;j--)for(k=20;k>0;k--);}}void Delay1ms(void)延时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) // 延时程序uchar i,j;for(i=2;i>0;i--)for(j=230;j>0;j--);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]]; //取出千位数,查表,输出。

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

//超声波模块程序
//超声波模块程序
//Trig = P2^0
//Echo = P3^2
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
int time;
int succeed_flag;
uchar timeL;
uchar timeH;
sbit Trig=P1^0;
sbit Echo=P3^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f}; uchar code table1[]={0,1,2,3,4,5,6,7};
//
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//
void delay_20us()
{
uchar a ;
for(a=0;a<100;a++);
}
//***************************************************************
//显示数据转换程序
void display(uint temp)
{
uchar ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
P2=table1[2];
P0=table[ge];
delay(1);
P2=table1[1];
P0=table[shi];
delay(1);
P2=table1[0];
P0=table[bai];
delay(1);
}
//***************************************************************
void main()
{
uint distance;
// test =0;
Trig=0; //首先拉低脉冲输入引脚
EA=1; //打开总中断0
TMOD=0x10; //定时器1,16位工作方式
while(1)
{
EA=0; //关总中断
Trig=1; //超声波输入端
delay_20us(); //延时20us
Trig=0; //产生一个20us的脉冲
while(Echo==0); //等待Echo回波引脚变高电平while(Echo == 0); 这////个句子就是说,当Echo的值为0的时候,程序停在这里,不再向下执行。

///一般与中断有关的程序会用这个中语句。

如果在中断中放入可以改变echo这//个变量的程序,当中断执行时,echo不再为0,这个语句自然就过去了。

succeed_flag=0; //清测量成功标志
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay(20); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
time=timeH*256+timeL;
distance=time*0.0172; //厘米
}
if(succeed_flag==0)
{
distance=0; //没有回波则清零
// test = !test; //测试灯变化
}
display(distance);
}
}
//*************************************************************** //外部中断0,用做判断回波电平
void exter() interrupt 0 // 外部中断0是0号
{
EX0=0; //关闭外部中断
timeH =TH1; //取出定时器的值
timeL =TL1; //取出定时器的值
succeed_flag=1;//至成功测量的标志
}
//**************************************************************** //定时器1中断,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
}
1602液晶显示的超声波模块程序
接口程序里边都有、、
#include<reg52.h>
//#include<delay.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^3;
sbit lcden=P2^2;
sbit trig=P2^0; //超声波发送
//sbit echo=P3^2; //超声波接受
//P0____________DB0-DB7
uchar dis[]="Disp_HC-SR04";
uchar num[]="0123456789";
uint distance;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}
void HC_init()
{
TMOD=0x09;
TR0=1;
TH0=0;TL0=0;
}
uint HC_jisuan()
{
uint dist,timer;
timer=TH0;
timer<<=8;
timer=timer|TL0;
dist=timer/53; //晶振11.0592MHz 距离cm=微秒us/58
return dist; //1个机器周期是12个时钟周期
timer*12/(58*11.0592)=timer/53
}
void HC_run()
{
uint tempH=0x00,tempL=0x00;
TH0=0;TL0=0;
trig=0;
trig=1;
delay(1);
trig=0;
while((TH0-tempH!=0||TL0-tempL!=0)||(TH0==0&&TL0==0)) {
tempH=TH0;
tempL=TL0;
}
delay(1);
}
void lcd_write_com(uchar com) //LCD写指令
{
lcdrs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcd_write_data(uchar date) //LCD写数据
{
lcdrs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcd_init() //LCD初始化
{
lcden=0;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
}
void lcd_display(uchar temp)
{
uint i;
lcd_write_com(0x82);
for(i=0;i<12;i++)
{
lcd_write_data(dis[i]);
}
lcd_write_com(0x80+0x41);
lcd_write_data('D');
lcd_write_data('i');
lcd_write_data('s');
lcd_write_data('t');
lcd_write_data('a');
lcd_write_data('n');
lcd_write_data('c');
lcd_write_data('e');
lcd_write_data(':');
lcd_write_data(num[temp/100]);
lcd_write_data(num[temp/10%10]);
lcd_write_data(num[temp%10]);
lcd_write_data('c');
lcd_write_data('m');
}
void main()
lcd_init();
HC_init();
while(1)
{
HC_run();
distance=HC_jisuan();
lcd_display(distance);
delay(200);
}
}。

相关文档
最新文档