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 单片机串口通信仿真

课题名称超声波测距+实际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语言源程序代码

超声波测距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的超声波测距系统。

主要是利用超声波的特点,将超声波测距系统与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超声波测距程序

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的超声波测距讲解

基于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.ME007Y50H V2 超 声波传 感器模 块的测距主要包含 以下 3个过
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;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);
}。

相关文档
最新文档