msp430超声波测距程序
超声波测距程序
超声波测距程序超声波程序如下:/**********************************包含头文件**********************************/#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。
课程设计-超声波测距+实际 MSP430 单片机与 proteus 中虚拟 51 单片机串口通信仿真
课题名称超声波测距+实际MSP430 单片机与proteus 中虚拟51 单片机串口通信仿真姓名学号年级专业指导老师完成日期2017年05 月27 日摘要随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的就是实现实际单片机与proteus 中的虚拟单片机进行串口通信,采用MSP430F149 单片机为控制核心、以单线数字温度传感器DS18B20 来完成温度信号的采集、温度以数宇的方式显示在LCD1602 液晶上,最终实现温度的采集、显示。
利用集成的超声波测距模块测出与障碍物之间的距离。
并且利用UART 串口通信将实时数据发送给 proteus 中的虚拟单片机,虚拟单片用的是 AT89C51 单片机。
51 单片机把接收到的数据用液晶模块显示出来,实现和实际单片机电路同步显示,并且设有报警电路,当距离小于5cm 时进行报警。
关键词:超声波测距、MSP430 单片机、LCD 液晶显示、proteus 仿真、AT89C51目录1. 绪论.....................................................................................................1.1. MSP430 单片机概述 (1)1.2. MSP430 的特点 (2)1.3. 课题研究的主要内容 (3)2. 系统总体方案设计.........................................................................................2.1. 控制系统的原理图 (4)2.2. 超声波测距的原理 (4)2.2.1. 超声波发生器 (5)2.2.2. 超声波测距原理 (5)2.2.3. 超声波测距误差分析 (6)2.2.3.1. 温度误差 (7)2.2.3.2. 时间误差 (7)2.3. 温度测量原理 (8)3. 硬件系统与软件系统设计...................................................................................3.1. 硬件部分 (8)3.1.1. MSP430F149 单片机 (8)3.1.1.1. MSP430F149 的组成 (9)3.1.1.2. MSP430F149 的定时器及转换模块 (9)3.1.2. 单线数字温度传感器DS18B20 (9)3.1.2.1. 温度传感器DS18B20 特点 (10)3.1.2.2. 温度传感器DS18B20 内部结构 (10)3.1.2.3. DS18B20 读/写时序图: (13)3.1.3. 超声波测距模块 (13)3.1.3.1. HC-SR04 超声波模块原理图 (13)3.1.3.2. 实物图: (14)3.1.3.3. 电气参数: (14)3.1.3.4. 超声波时序图: (15)3.1.4. 报警模块 (15)3.1.5. 液晶显示模块 (16)3.2. 软件部分 (16)3.2.1. 主处理的流程图 (16)3.2.2. 温度采集DS18B20 模块 (18)3.2.3. 超声波传感器模块 (19)3.2.4. 报警模块 (20)4. Proteus 中虚拟单片机的仿真系统设计..........................................................................4.1. Proteus 简介 (20)4.2. ISISI 编辑器介绍 (21)4.3. Proteus 中虚拟单片机仿真图搭建 (23)4.3.1. 51 单片机最小系统电路 (23)4.3.2. proteus 中1602 液晶电路 (23)4.3.3. 虚拟终端以及串口电路 (24)4.4. 在Proteus 中画出完整的电路图 (25)4.5. 配置Proteus 中的虚拟串口 (25)4.5.1. 虚拟串口配置 (25)4.5.2. 配置虚拟终端 (26)4.6. 在µVision4 IDE 中编写51 代码 (26)4.6.1. Keil 中写代码 (26)4.6.2. .HEX 文件添加到虚拟51 单片机 (27)4.7. Proteus 仿真 (27)5. 电路调试及误差分析 (28)5.1. 电路的调试 (28)5.2. 系统的误差分析 (28)5.2.1. 声速引起的误差 (28)5.2.2. 单片机时间分辨率的影响 (29)6. 总结 (30)7. 附录 (31)7.1. 附录1-----本课题的实物图: (31)7.2. 附录2-----实际单片机(430)程序代码: (32)7.3. 附录3-----proteus 虚拟单片机(51)程序代码: (38)8. 参考文献 (42)1. 绪论本章简要介绍单片机技术在工业上的主要应用,MSP430 单片机的概述及特点,以及课题研究的主要内容。
超声波测距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 G* = P3^1;//K7 //P3^3口(K2)为修改键,sbit S* = P3^6;//K6 //P3^2(K3)为测量键.sbit B* = 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 *ia*ian(); //修改函数,用来修改下限void shang*ian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI ma*[3]={3,0,0}; //MIN,MA* 用来存储最大和最小值void MIN*ianshi(UI); //最小围和最大围的显示void MA**ianshi(UI);UC code CharacterCode[10] = {0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f};//数码管数字字符(P2口)/********************************主函数*********************************************/ void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MIN*ianshi(40); //1.50169000sMA**ianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MA*, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0*00; //防止最后显示的那个数码管一直亮MA* = ma*[0]*100 + ma*[1]*10 + ma*[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 =~ 0*00;//防止最后显示的那个数码管一直亮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 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MA*){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 = 0*00;//定时器的初值,定时器的定时为65536us,TL0 = 0*00;}/***********************************************************************************/ void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){*ia*ian();while(QD==0);shang*ian();}/**********************************************************************************/ void MIN*ianshi(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 =~ 0*00;delay(55500);}void MA**ianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(500);}P2 =~ 0*00;delay(55500);}/***********************************************************************************/ void delay(UI T) //延时程序{while(T--);}/***********************************************************************************/ void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;P*1 = 0;PT0 = 1;P*0 = 0;IT1 = 1; //外部中断0为跳变沿触发E*1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发E*0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0*01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0*00;//定时器的初值,定时器的定时为50us.TL0 = 0*00;/*1号定时器不用,所以没有TH1,TL1*/}/***********************************************************************************/ void *ia*ian() //修改下限{while(1){if(B*==0)//百位{P2=~0*00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(S*==0)//十位{P2=~0*00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(G*==0)//个位{P2=~0*00;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 = 0*ff;break;}}}void shang*ian() //修改上限{while(1){if(B*==0)//百位{P2=~0*00;ma*[0]++;if(ma*[0]==10)ma*[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(100);if(S*==0)//十位{P2=~0*00;ma*[1]++;if(ma*[1]==10)ma*[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(100);if(G*==0)//个位{P2=~0*00;ma*[2]++;if(ma*[2]==10)ma*[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0*ff;while(QD == 0);break;}}}/************************************************************************************/。
基于msp430单片机的超声波测距系统设计与实现
摘要本设计的内容是基于单片机MSP430的超声波测距系统。
主要是利用超声波的特点,将超声波测距系统与MSP430单片机结合起来,设计出测距报警系统。
当超声波传感器与障碍物的距离小于所设定的安全距离时,系统能发出声光警报,并随着距离的不断接近,报警频率不断提高。
与此同时还在液晶上显示出当前距离以及安全距离。
工作时超声波发射器发出超声波脉冲,超声波接收器接受到遇到障碍物反射回来的反射波,然后准确的测量超声波从发射到遇到障碍物反射返回的这段时间,根据超声波的传播速度,计算出到障碍物的距离。
本设计采用软、硬件结合的方法,并在Proteus中进行了系统仿真。
关键词:MSP430 超声波测距Abstract The content of this design is the ultrasonic ranging system based on single-chip 忽略puter MSP430. Mainly using the characteristics of ultrasonic 忽略bined ultrasonic ranging system with MSP430 single chip micro忽略puter, design range alarm system. When the ultrasonic sensors and obstacle distance is less than the safe distance set, the system can send out sound and light alarm, and with the close distance, alarm frequency increasing. At the same time also on the LCD shows the current distance and a safe distance. Work issue ultrasonic pulse ultrasonic emitter, ultrasonic receivers accept reflected the reflection to encounter obstacles, and then the accurate measurement of ultrasonic from launch to detect obstacles to reflect back to this period of time, according to the ultrasonic wave propagationvelocity, calculate the distance to the obstacles.This design adopts the method of bining software and hardware, and has carried on the system in the Proteus simulation.Keywords: Microcontroller MSP430 Ultrasonic Ranging目录前言 (1)第1章系统总体方案与框架 (2)1.1 设计整体思路与基本原理 (2)1.2 系统总体概述 (2)第2 章实现系统硬件设计 (4)2.1 主控模块 (4)2.2 超声波测距模块 (4)2.3 LCD显示模块 (6)2.4 声光报警模块 (10)2.5 系统参数调整模块 (10)第3 章系统软件设计 (11)3.1 运行方式控制程序流程设计 (11)第4 章电路调试及性能分析 (13)4.1 电路的调试 (13)4.1.1电源的选择 (13)4.1.2 蜂鸣器 (14)4.2 测试及结果分析 (14)结论 (15)致谢 (17)参考文献 (18)附件 (19)前言随着社会经济的迅速发展,人们生活水平不断提高,越来越多的人都拥有自己的汽车。
msp430超声波测距程序
#include "msp430x14x.h"#include "1602.c"#define uint unsigned int#define uchar unsigned charvoid USARTinit();void timeinit();long static uint distance=0;uchar table[]="gu zhuanyuan";/*void delay(uint y){uint x;for(;y>0;y--)for(x=100;x>0;x--);}*/uchar i=0,j=0;void main( ){// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;// USARTinit();P1DIR|=BIT0;P2DIR=0XFF;timeinit();lcdinit();display_string(3,1,table);P1IE=BIT1;P1IES&=~BIT1;while(1){P1OUT|=BIT0;delay(1);P1OUT&=~BIT0;delay(1000);display_one(1,0,(distance/10000)%10+0x30);display_one(2,0,(distance/1000)%10+0x30);display_one(3,0,(distance/100)%10+0x30);display_one(4,0,(distance/10)%10+0x30);display_one(5,0,distance%10+0x30);}void timeinit(){TACTL=TASSEL_2+ID_3+MC_1;//ID_2表示八分频!MC_1表示连续计数模式!BCSCTL2=0x88;//选择SMCLK的信号源XT2CLK(8MHz)CCR0=65535;_EINT(); //打开总中断!}#pragma vector=PORT1_VECTOR__interrupt void port1_int(void){if((P1IN&BIT1)==BIT1){TACTL|=MC_1+TACLR;P1IES|=BIT1;}else{TACTL&=~MC_3;P1IES&=~BIT1;distance=TAR*5/3;P2OUT=TAR;}P1IFG&=~BIT1;}#include "msp430x14x.h"#define uint unsigned int#define uchar unsigned charvoid lcdinit();void writecommand(uchar wdata);void writedata(uchar wdata);void delay(uint y);void display_xy(uchar x,uchar y);void display_one(uchar x,uchar y,uchar c);void display_string(uchar x,uchar y,uchar *s);{P4DIR=0XFF;P3DIR=0xff;delay(1);writecommand(0x38); //必须要有,显示模式设置,设置为16*2显示,5*7点阵,8位数据接口!// delay(50);writecommand(0x08); //关闭显示,要不要都可以writecommand(0x01); //显示清屏writecommand(0x0f); //开显示,显示光标,光标闪烁!!writecommand(0x06); //读/写作用时地址自动加一}void writecommand(uchar wdata){P3OUT &=~BIT0; //使RS=0,表示写命令P3OUT &=~BIT1; //rw=0,表示向1602里面写数据// P3OUT &=~BIT2; //E=0delay(1);P3OUT |=BIT2; //使能E置一P4OUT=wdata; //送命令delay(10); //短暂延时,代替检测忙状态,产生方波!P3OUT &=~BIT2; //使能E=0,下降沿将命令货数据送入1602}void writedata(uchar wdata){P3OUT |=BIT0; //使RS=1,表示写数据P3OUT &=~BIT1; //rw=0,表示向1602里面写数据// P3OUT &=~BIT2; 可以加,也可以不加!!delay(1);P3OUT |=BIT2;P4OUT=wdata;delay(10);P3OUT &=~BIT2;}{uint x;for(;y>0;y--)for(x=100;x>0;x--);//用8MHz的总频率!!!}void display_xy(uchar x,uchar y) //找字符串的地址!!{if(y==0x01){x=x+0x40+0x80; //首地址0X80,,第二行地址0X80+0X40!}else{x=0x80+x;}writecommand(x);}void display_string(uchar x,uchar y,uchar *s) //显示字符串{display_xy(x,y);while(*s){writedata(*s);s++;}}void display_one(uchar x,uchar y,uchar c) //显示一个字符!{display_xy(x,y);writedata(c);}。
基于MSP430G2553的超声波测距讲解
本科自主创新设计题目: 基于MSP430_launchpad超声波测距系统姓名孙尚威学院电子工程学院专业电子信息科学与技术班级2013211202学号2013210849班内序号04指导教师赵同刚2015年5月目录第1章绪论 (3)1.1项目简介 (3)1.2项目功能目标 (3)第2章超声波测距原理 (3)2.1超声波简介 (3)2.2超声波测距原理 (4)第3章方案论证 (4)3.1设计思路 (4)3.2硬件系统结构设计 (4)第4章主要元件介绍 (5)4.1单片机MSP430 LAUNCHPAD M430G2553 (5)4.2超声波传感器HC-SR04 (6)4.35110LCD液晶显示屏 (6)第5章软件设计 (7)5.1主程序流程 (7)5.2子程序设计 (8)5.2.1 超声波发送子程序及超声波接收中断子程序 (8)5.2.2 距离计算子程序 (8)5.2.3 液晶显示程序 (9)第6章系统调试及误差分析 (10)6.1系统焊接 (10)6.2误差及特性分析 (10)附录一:主要程序 (12)第1章绪论1.1 项目简介本设计介绍了基于单片机控制的超声测距仪的原理:由MSP430单片机控制定时器产生超声波脉冲并计时,计算超声波自发射至接收的往返时间,从而得到实测距离。
用四位LCD液晶屏显示距离。
整个硬件电路由超声波发射模块、超声波接收模块、单片机控制模块、显示模块组成。
在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。
相关部分附有硬件电路图、程序流程图,给出了系统构成、电路原理及程序设计。
此系统具有易控制、可读性强和流程清晰等优点。
但稳定性有待提高,后续有待实现显示数据实时刷新的功能1.2 项目功能目标采用单片机作为主控制器,可实现低成本、高精度、微型化测距系统。
实现50cm-300cm的基本指标的障碍物距离测试,能够实现障碍物距离的实时显示,精确到厘米。
当被测距离小于预设报警值是,红灯亮起,提示距离过近。
基于单片机的超声波测距仪设计与实现
编号:桂林理工大学博文管理学院实习实训课程指导教程——《单片机应用实践》——《电子设计与应用实践》基于单片机的超声波测距仪设计与实现2015年9月摘要由于超声波的指向性强,能量消耗缓慢,在介质中转播的距离较远,因而超声波经常用于距离的测量,如测距仪和物体位置测量仪等都可以通过超声波来实现。
该系统介绍了一种基于MSP430单片机的超声波脉冲测距预警倒车雷达系统。
该系统以空气中超声波的传播速度为确定条件,利用反射超声波测量待测距离。
并且描述了系统研制的理论基础,超声波传感器等部分的电路设计以及使用了性能优良的单片机对系统起到了积极的作用。
关键词:单片机;测距;超声波目录1 项目要求 (4)2项目分析和系统设计 (4)3 硬件设计 (4)3.1单片机选型模块 (5)3.2 SDM-IO集成模块 (5)3.3 1602液晶显示模块 (6)3.4系统电源 (6)4 软件设计 (6)4.1主程序 (6)5 系统调试 (7)5.1硬件调试 (7)5.2程序调试 (8)5.3联合调试 (10)6项目演练 (10)7项目总结 (10)附录1电路设计原理图(参考) (11)附录2 PCB设计原理图(参考) .............................................................. 错误!未定义书签。
附录3 关键程序(参考) (12)基于单片机的超声波测距仪设计与实现1 项目要求本系统利用MSP430单片机为核心器件,外加超声波接收、发射电路和报警电路,用动态扫描法实现LCD1602数字显示,完成超声波测距及报警功能。
该系统主要实现的功能如下:1. 测量与被测物体之间的距离,采集室内温湿度(用于声速的温湿度补偿);2. 采用液晶动态显示与被测物体之间的距离及温湿度等;3. 设置距离阈值,当超过此值时蜂鸣器会发出报警信号,且距离越近发出的声音的频率越高,当与障碍物之间的距离超过最小距离时,红色LED会发亮,实现报警;2项目分析和系统设计由单片机向Trig管脚输入一个10uS以上的高电平,可触发模块测距。
基于MSP430单片机的超声波测距系统设计
2超 声波测距系统总体设计
本 文 测 距 系 统 采 用 XKC—ME007Y50HV2
渡 越 时 间 法 测 距 的 基 本 思 想 是 利 用 超 声 波在 介质中传播时 间和速度 来确 定距离。本文 以 MSP430单片机作 为处理 器,联同超声波接
Artificial Intelligence· 人工智能
发 、温度测 量及电子显示等单元一起构成 了超 声波测距 系统。系统结构图如图 I所示 。
3 系统 的硬件设计
片机 。当前超 声波测距 方法主要有三种 :相位 检测法 、声波幅值检 测法 和渡越时间法 。相位 检测法测量精度最 高,但 测量范围具有一定局 限 性 且 电路 复 杂 声 波 幅 值 检 测 法 操 作 最 简 单 、 成本相对较低 ,但 易受到反射介质的影响;渡
B8 (RX )
imerior
TX)I
触 笈倍 号 (T>5Oms)
卿波倍号
内 酆 发射 s个50KHZ脉冲 商 (T=450ps)
【关键词 】测距 MSP4 30单 片机 超 声波
冤 I嘲波 T--60ms
图 2:超 声波时序 图
1 引 言
超声 波 测距 作为 一种 典型 的非接 触 测量 方 法 ,其 系 统 核 心 部 分通 常 包 括 测 距 方 法 和 单
、
有 VCC、Trigger、Echo、GND 四个 管脚 ,其
/ 分 别对 应 于:VCC, 电源 输 入 (模块 默认 为 5V供 电);Trigger,触发引脚 ,高 电平触发 ,
超声波测距程序说明书
#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;}。
一种基于MSP430单片机的超声波测距系统的设计与实现
一种基于MSP430单片机的超声波测距系统的设计与实现超声波测距系统是一种广泛应用于自动控制领域中的传感器技术。
它采用超声波传感器可以获得距离测量值,被广泛应用于机器人、智能家居、自动驾驶等众多领域中。
本文主要介绍一种基于MSP430单片机的超声波测距系统的设计与实现。
该系统主要分为超声波发射模块和接收模块两部分。
超声波发射模块主要功能是产生超声波脉冲。
该模块采用MSP430单片机作为主控制器,通过GPIO口控制超声波发射传感器的工作方式。
具体实现中,将MSP430单片机上的GPIO口配置为输出模式,并设置输出脉冲的周期和占空比。
然后使用定时器产生脉冲信号,输出到超声波发射器上。
超声波接收模块主要功能是接收所发出的超声波脉冲,并计算出物体与传感器之间的距离。
该模块采用超声波接收传感器来接收超声波信号,并将信号经过前置放大器进行放大,提高信号的精度和灵敏度。
然后将信号输出到MSP430单片机上进行次数测量和计算距离值。
具体实现中,超声波接收模块的硬件部分包括超声波接收传感器、前置放大器和A/D转换器。
其中,超声波接收传感器通过GPIO口与MSP430单片机连接,前置放大器将信号放大后输出到A/D转换器,MSP430单片机通过A/D转换器采集数据并进行处理。
软件部分分为超声波发射程序和超声波接收程序两部分。
超声波发射程序主要负责控制超声波发射器的工作,超声波接收程序主要用于接收超声波信号,进行次数统计和距离计算,最后通过串口输出距离测量值。
在完成硬件与软件的设计之后,进行系统测试。
测试中需要使用标准距离参照物,通过与标准距离参照物比对,对测量系统进行校准。
测试结果表明,该系统测量范围达到3-400cm,并且测量精度高,稳定性强。
本文介绍的基于MSP430单片机的超声波测距系统,具有简单、灵活、精度高等优点。
将来可以进一步应用于物流领域、智能家居、机器人等领域,发挥更广泛的作用。
MSP430F149超声波测距
//P1.0发出信号,P4.0接收信号,将距离显示到显示屏上#include<msp430x14x.h>#include "12864.h"#define CPU_F ((double)8000000)#define DelayUs(x) __delay_cycles((unsigned long)(CPU_F*(double)x/1000000.0))#define DelayMs(x) __delay_cycles((unsigned long)(CPU_F*(double)x/1000.0))unsigned int width;float float_range;unsigned int_range;unsigned int i=0;unsigned int int_range100,int_range10,int_range1;void StartModule(){P1OUT|=BIT0;DelayUs(100);P1OUT&=~BIT0;DelayMs(70);}void main(){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗P1DIR|=BIT0;P4SEL|=BIT0; //P4.0作为捕获模块功能的输入端输入方波//-------开晶振XT2---------BCSCTL1&=~XT2OFF; //打开XT2振荡器do{IFG1 &= ~OFIFG; // 清除振荡器失效标志for (i=256;i>0;i--); // 延时,等待XT2起振}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振BCSCTL2 =SELM_2+SELS; //选择MCLK=SMCLK为XT2//-----------------------------TBCCTL0&=~(CCIS1+CCIS0); // 捕获源为P4.0,即CCI0A(也是CCI0B) TBCCTL0|=CM_2+SCS+CAP; //下降沿捕获,同步捕获,工作在捕获模式TBCCTL0|=CCIE; //允许捕获比较模块提出中断请求TBCTL|=ID_3;TBCTL|=TBSSEL_2; //选择时钟MCLKTBCTL|=TBCLR; //定时器清零,//定时器开始计数(连续计数模式0~0xFFFF)TBCTL|=MC_2;LcdInit(); //初始化液晶屏LcdDisplayStr(1,0,"测得的距离:");LcdDisplayStr(2,6,"mm");_EINT();for(;;){StartModule();}}//―――――定时器TB的CCR0的中断:用于检测脉冲上升与下降沿――――#pragma vector=TIMERB0_VECTOR__interrupt void TimerB0(void){if(TBCCTL0&CM0) //捕获到上升沿{TBCTL|=TBCLR;TBCCTL0=(TBCCTL0&(~CM0))|CM1; //改为下降沿捕获:CM0置零,CM1置一}else if(TBCCTL0&CM1) //捕获到下降沿{width=TBCCR0; //记录下结束时间TBCCTL0=(TBCCTL0&(~CM1))|CM0; //改为上升沿捕获:CM1置零,float_range=0.2125*width;//计算距离,单位毫米int_range=(int)float_range;int_range1=int_range%10;int_range10=(int_range-int_range1)/10%10;int_range100=(int_range-int_range1-int_range10)/100%10;LcdDisplayStr(2,4,"");//里面什么也不写,相当于给它定位置Send(1,int_range100+0x30);//写入数字,但是只能显示一个数字Send(1,int_range10+0x30);Send(1,int_range1+0x30);}}。
超声波测距程序
//把1602液晶屏加进去就好#include"reg52.h"#include"intrins.h"#include"lcd1602.h"sbit trig=P1^0; //发射sbit echo=P3^2; //接收sbit led=P1^3; //测试灯unsigned int success_flag,time;unsigned int distance;void init();void delay1ms(unsigned int z);void start();////////////////////////////主函数void main(){ unsigned int num,i;init();init_1602();trig=0;while(1){TH0=0;TL0=0;success_flag=0;num=0;start();while(echo==0);TR0=1; //打开定时器for(i=0;i<100;i++) //延时打开int0,防止意外触发{_nop_();}EX0=1; // 打开int0while(success_flag==0&&num<=1000) //防止死循环{num++;}if(success_flag==1){distance=time/58;//((unsigned long)(time*17))/1000; //为啥后者就是错的呢}lcd1602();}}////////////////////////////void init(){TMOD=0X01;TH0=0;TL0=0;ET0=1;TR0=0;EX0=0;IT0=1; //下降沿触发EA=1;}void start(){trig=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();trig=0;}//////////////////////////////////////////////////////////void delay1ms(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void int0() interrupt 0{TR0=0; //关定时器EX0=0; //关int0success_flag=1;time=TH0*256+TL0;}void t0() interrupt 1{TH0=0;TL0=0;}#include"reg52.h"#include"lcd1602.h"extern unsigned int distance;extern delay1ms(unsigned int z);sbit rw=P2^5;sbit rs=P2^6;sbit en=P2^7;unsigned char code table[]={'d','i','s','t','a','n','c','e',':','.','M'};void write(unsigned char date,unsigned char k){rs=k;P0=date;delay1ms(5);en=1;delay1ms(5);en=0;}void init_1602(){en=0;rw=0;write(0x38,0);write(0x0f,0);write(0x06,0);write(0x01,0);}void lcd1602(){unsigned int i,bai,shi,ge;bai=distance/100;shi=(distance/10)%10;ge=distance%10;write((0x80),0);for(i=0;i<9;i++){write(table[i],1);delay1ms(1);}write((0x80+0x09),0); //bai write(0x30+bai,1);delay1ms(1);write((0x80+0x0a),0); //.write(table[9],1);delay1ms(1);write((0x80+0x0b),0); //shi write(0x30+shi,1);delay1ms(1);write((0x80+0x0c),0); //gewrite(0x30+ge,1);delay1ms(1);write((0x80+0x0d),0); //Mwrite(table[10],1);delay1ms(1);}。
一种基于MSP430单片机的超声波测距系统的设计与实现
一种基于MSP430单片机的超声波测距系统的设计与实现作者:董家靖来源:《数字技术与应用》2014年第03期摘要:根据在空气中超声波传播速度固定的特点,通过记录单片机中计数器数值来计算超声波的传播时间,时间与速度相乘得到距离值为原理,设计了一种由MSP430F1101单片机控制的超声波测距系统,系统具有易实现、实时性、可靠性和适应性好等特点。
关键词:超声波测距 MSP430单片机中图分类号:TP274.53 文献标识码:A 文章编号:1007-9416(2014)03-0118-02在人们日常生产生活当中,诸多场合需要自动进行非接触测距,如汽车倒车、水库液位测量等。
与光波相比,超声波的传播速度要小很多,所以即使在传播距离较短的条件下,传播时间也可以被准确的检测出来。
而且超声波的方向性很好,因此人类研究以超声波为“工具”来实现测距。
超声波测距利用了声波的传播特性,结合了光电开关、电子计数等硬件结构实现距离测量的目的,并且是一种非接触式的测量方法。
本文介绍了一种基于MSP430F1101单片机的超声波测距系统[1]。
1 超声波测距原理超声波[2]与光波不同,其本质是可以在空气、液体、固体中进行传播的弹性机械波。
由于超声波的传播速度仅为340m/s,与光波速度相比已经很慢,所以即使在较短的距离范围内准确记录其传播时间也是可以实现的。
以超声波来实现测距目的的方法也有往返时间检测法、相位检测法、声波幅值检测法[3]等很多种。
本文采用往返时间检测法。
其原理是超声波发射器发射出一定频率的、在空气介质中传播的超声波脉冲,当其遇到障碍物时产生反射,由接收装置接收,其所经历的时间就是往返时间,时间长短与超声波传播的路程的有关。
测试传输时间就可以得出距离,即S=340×t/2 (1)当测得的距离S小于某个固定值时,触发报警装置产生报警。
2 系统总体设计方案本系统以MSP430F1101单片机为核心,包括超声波发射、回波信号接收、显示和报警、电源等硬件电路部分以及相应的软件部分构成。
msp430超声波测距
量 Result, 这个值就代表超声波序列从系统到目标然后返回系统这段距离所需 的时间。因为定时器 A 计数间隔为 25 微秒,对应的时间值为 Result从定时器 A 计数值得到的 Result 每 6 个值对应于 1 英寸的距离。
图 1 显示的是本应用的电路原理图。其中 MSP430F413 U1 是系统的核心部分。参考文 献[1]是这个芯片的技术资料。LCD1 是一由 MSP430F413 内部集成的 LCD 驱动器驱动的两 位低压静态液晶显示器。R03 连接到 Vss R13 和 R23, 悬空将 LCD 外围电路设置为静态 LCD 驱动模式。这里方便的选用了一个 40KHz 的低频晶振,与本应用中采用的超声波传 感器的谐振频率相匹配。R12 作为复位线的上拉电阻,内部集成的掉电保护电路可以预防 掉电情况。C9 位于靠近芯片电源线的位置,提供 MSP430 的电源耦合。14 脚的接插件(J1) 提供 JTAG 接口与 MSP430 相连,可使用 MSP430FLASH 仿真工具进行在线调试和编程 LED1 用来指示测量周期。端口引脚 P1.5 被定义为输出超声波发射器所需要的 40KHz 方 波 ACLK 信号。
图 2 显示的是 12 周期的 40KHz 脉冲序列的波形轨迹图。我们注意到 19.2V 的峰峰电压 波动。方波顶部的正弦响铃波是由于传感器内部的谐振。
图 3 显示的是一个完整测量周期的波形轨迹。轨迹 1 显示的是发射传感器输出端的 12 周 期的 40KHz 脉冲序列。轨迹 2 显示的是接收传感器输出经运算放大器放大后在引脚 1 上的 输出。轨迹上的第一个脉冲序列信号,代表直接从发射器上收到的信号被 MSP430 忽略。接 下去的脉冲序列代表目标反射的回声,被 MSP430 用于测量。轨迹 3 显示的是 MSP430 测 得的时间间隔的宽度。这个宽度代表该脉冲序列从系统到达目标再返回所花的时间,显然它 取决于所测量的距离。
超声波测距仪程序
void offmsd();
void main() //主函数
{
EA=1; //开中断
TMOD=0x11; //设定时器0为计数,设定时器1定时
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器1中断,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
}
制作的超声波测距源程序
#include <REG2051.H>
#define k1 P3_4
#define csbout P3_5 //超声波发送
#define csbint P3_7 //超声波接收
P3=~digit&opto; //依次显示各位数
P1=~buffer; //显示数据送P1口
delay(20); //延时处理
P1=0xff; //P1口置高电平(关闭)
}
else timeToBuffer(); //将值转换成LED段码
offmsd();
scanLED(); //显示函数
if(s<sj2)
{
buffer[2]=0x76;
buffer[1]=0x76;
buffer[0]=0x76;
}
else if(s<sj1)
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
超声波测距程序
#include <reg51.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Tx = P3^1; //产生脉冲引脚发射端sbit Rx = P3^2; //回波引脚接收端sbit bep = P0^0; //蜂鸣器sbit up = P0^1; //警报距离控制位加sbit down= P0^2; //减sbit DQ=P3^3;uchar code SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9uint distance[4]; //测距接收缓冲区uint warmdistance=200;float S ;uchar ge,shi,bai,qian,digital; //自定义寄存器显示uchar outcomeH,outcomeL; //定时器数值uchar i; //平均值uint b;float c=1.8;unsigned int temp;bit ok; //测量成功标志//********函数声明void change(uint real);void delay_20us();void beep();void beepfast();void delay(uint time);//软件延时void dispaly(uint e);void TemperatureConver(void);unsigned int ReadTemperature(void);void delayms(unsigned int ms){unsigned char i=10,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}void main(void) // 主程序{uint time,realdistance,a;uchar CONT_1;i=0;digital=0;Tx=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断维持150us低电平就有反应ET0=1; //打开定时器0中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;if(up==0){delay(50);//消抖1msif(up==0){EA=0; //不显示时间,显示规定数值warmdistance=warmdistance+10;dispaly(warmdistance);}}else if(down==0){delay(50);//消抖if(down==0){EA=0; //不显示时间,显示规定数值warmdistance=warmdistance-10;dispaly(warmdistance);}}else if(warmdistance >b){beepfast();}Tx=1;delay_20us();Tx=0; //产生一个20us的脉冲,在Tx引脚while(Rx==0); //等待Rx回波引脚变高电平ok=0; //清测量成功标志EX0=1; //打开外部中断TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //溢出位TR1=1; //启动定时器1EA=1;while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0; //关闭定时器1EX0=0; //关闭外部中断TemperatureConver();delayms(10);temp=ReadTemperature();if(ok==1){temp = temp/10;c=331.45+ 0.61*(float)temp;c=c/200.0;time=outcomeH*256+outcomeL;outcomeH =0;outcomeL =0;realdistance =(time*c)/10; //算出来是MMif(ok==0){realdistance=0; //没有回波则清零}// distance[i]=realdistance; //将测量结果的数据放入缓冲区// i++;// if(i==3)// {//realdistance=(distance[0]+distance[1]+distance[2]+distance[3])/4;a=realdistance;if(b==a)CONT_1=0;if(b!=a)CONT_1++;if(CONT_1>=3){CONT_1=0;b=a;change(b);}/// i=0;}}}//*************************************************************** //**********************************************************//函数名称:DS18B20_delay(unsigned int i)//函数功能:延时函数//形式参数:无//返回参数:无//使用说明:无//**********************************************************void DS18B20_delay(unsigned int i)//延时函数{while(i--);}//**********************************************************//函数名称:Init_DS18B20(void)//函数功能:18b20初始化函数//形式参数:无//返回参数:无//使用说明:无//**********************************************************void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位DS18B20_delay(8); //稍做延时DQ = 0; //单片机将DQ拉低DS18B20_delay(80); //精确延时大于480usDQ = 1; //拉高总线DS18B20_delay(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败DS18B20_delay(5);}//**********************************************************//函数名称:ReadOneChar(void)//函数功能:读一个字节//形式参数:无//返回参数:无//使用说明:无//********************************************************** unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;DS18B20_delay(5);}return(dat);}//**********************************************************//函数名称:WriteOneChar(unsigned char dat)//函数功能:写一个字节//形式参数:无//返回参数:无//使用说明:无//**********************************************************void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;DS18B20_delay(5);DQ = 1;dat>>=1;}DS18B20_delay(5);}//**********************************************************//函数名称:TemperatureConver(void)//函数功能:启动温度转换//形式参数:无//返回参数:无//使用说明:无//**********************************************************void TemperatureConver(void){Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换}//**********************************************************//函数名称:ReadTemperature(void)//函数功能:读取温度//形式参数:无//返回参数:返回的温度值//使用说明:无//**********************************************************unsigned int ReadTemperature(void){unsigned char e=0;unsigned char d=0;int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度e=ReadOneChar();d=ReadOneChar();//d<<=4;// db+=(a&0xf0)>>4;//t=d;t=d;t=t<<8|e;tt=t*0.0625;//tt=tt*10+0.5;t= tt*10+0.5; //放大10倍输出并四舍五入return(t);}//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值ok=1; //至成功测量的标志EX0=0; //关闭外部中断}//**************************************************************** //定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=-8000/256; //写入定时器0初始值TL0=-8000%256;switch(digital){case 0x00:P2=SEG[ge]; P0=0x1f;digital++;break;case 0x01:P2=SEG[shi]&0x7f;P0=0x2f;digital++;break;case 0x02:P2=SEG[bai];P0=0x4f;digital++;break;case 0x03:P2=SEG[qian];P0=0x8f;digital=0;break;}}//显示数据转换程序void change(uint real){ge=real%10;shi=(real/10)%10;bai=(real/100)%10;qian=real/1000;}//****************************************************************** void delay_20us(){uchar bt ;for(bt=0;bt<60;bt++);}void beepfast(){bep=0;delay(430);bep=1;}void delay(uint time) //1us时间{while(time--){uchar a;for(a=0;a<2;a++);}}void dispaly(uint e){uint an;for(an=0;an<80;an++){change(e);P0=0x1f; //P0位选P2=SEG[ge]; //P2段选delay(100);P0=0x2f;P2=SEG[shi]&0x7f;//与上小数点delay(100);P0=0x4f;P2=SEG[bai];delay(100);P0=0x8f;P2=SEG[qian];delay(100);P2=0xff;}an=0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "msp430x14x.h"
#include "1602.c"
#define uint unsigned int
#define uchar unsigned char
void USARTinit();
void timeinit();
long static uint distance=0;
uchar table[]="gu zhuanyuan";
/*void delay(uint y)
{
uint x;
for(;y>0;y--)
for(x=100;x>0;x--);
}*/
uchar i=0,j=0;
void main( )
{
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
// USARTinit();
P1DIR|=BIT0;
P2DIR=0XFF;
timeinit();
lcdinit();
display_string(3,1,table);
P1IE=BIT1;
P1IES&=~BIT1;
while(1)
{
P1OUT|=BIT0;
delay(1);
P1OUT&=~BIT0;
delay(1000);
display_one(1,0,(distance/10000)%10+0x30);
display_one(2,0,(distance/1000)%10+0x30);
display_one(3,0,(distance/100)%10+0x30);
display_one(4,0,(distance/10)%10+0x30);
display_one(5,0,distance%10+0x30);
}
void timeinit()
{
TACTL=TASSEL_2+ID_3+MC_1;//ID_2表示八分频!MC_1表示连续计数模式!
BCSCTL2=0x88;//选择SMCLK的信号源XT2CLK(8MHz)
CCR0=65535;
_EINT(); //打开总中断!
}
#pragma vector=PORT1_VECTOR
__interrupt void port1_int(void)
{
if((P1IN&BIT1)==BIT1)
{
TACTL|=MC_1+TACLR;
P1IES|=BIT1;
}
else
{
TACTL&=~MC_3;
P1IES&=~BIT1;
distance=TAR*5/3;
P2OUT=TAR;
}
P1IFG&=~BIT1;
}
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
void lcdinit();
void writecommand(uchar wdata);
void writedata(uchar wdata);
void delay(uint y);
void display_xy(uchar x,uchar y);
void display_one(uchar x,uchar y,uchar c);
void display_string(uchar x,uchar y,uchar *s);
{
P4DIR=0XFF;
P3DIR=0xff;
delay(1);
writecommand(0x38); //必须要有,显示模式设置,设置为16*2显示,5*7点阵,8位数据接口!
// delay(50);
writecommand(0x08); //关闭显示,要不要都可以
writecommand(0x01); //显示清屏
writecommand(0x0f); //开显示,显示光标,光标闪烁!!
writecommand(0x06); //读/写作用时地址自动加一
}
void writecommand(uchar wdata)
{
P3OUT &=~BIT0; //使RS=0,表示写命令
P3OUT &=~BIT1; //rw=0,表示向1602里面写数据
// P3OUT &=~BIT2; //E=0
delay(1);
P3OUT |=BIT2; //使能E置一
P4OUT=wdata; //送命令
delay(10); //短暂延时,代替检测忙状态,产生方波!
P3OUT &=~BIT2; //使能E=0,下降沿将命令货数据送入1602
}
void writedata(uchar wdata)
{
P3OUT |=BIT0; //使RS=1,表示写数据
P3OUT &=~BIT1; //rw=0,表示向1602里面写数据
// P3OUT &=~BIT2; 可以加,也可以不加!!
delay(1);
P3OUT |=BIT2;
P4OUT=wdata;
delay(10);
P3OUT &=~BIT2;
}
{
uint x;
for(;y>0;y--)
for(x=100;x>0;x--);//用8MHz的总频率!!!
}
void display_xy(uchar x,uchar y) //找字符串的地址!!
{
if(y==0x01)
{
x=x+0x40+0x80; //首地址0X80,,第二行地址0X80+0X40!
}
else
{
x=0x80+x;
}
writecommand(x);
}
void display_string(uchar x,uchar y,uchar *s) //显示字符串
{
display_xy(x,y);
while(*s)
{
writedata(*s);
s++;
}
}
void display_one(uchar x,uchar y,uchar c) //显示一个字符!
{
display_xy(x,y);
writedata(c);
}。