msp430f149多路超声波测距程序
课程设计-超声波测距+实际 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 单片机的概述及特点,以及课题研究的主要内容。
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);}。
msp430F149实验报告

微控制器应用及系统设计课程设计报告南京理工大学20012 年 4 月目录1 引言 (2)2 系统总体设计 (2)2.1系统组成结构和工作原理 (2)2.2系统工作流程 (3)3 系统硬件设计 (5)3.14位独立式按键电路设计 (5)3.2七段共阴极LED数码管电路设计 (6)3.31602LCD电路设计 (7)3.4ADC转换电路设计 (7)3.58位流水灯电路设计 (8)4 系统软件设计 (8)4.1ADC转换实现从题库中随机选题程序设计 (8)4.2LCD显示程序设计 (10)4.3按键实现确认键值程序设计 (13)4.4七段共阴极LED数码管实现显示题号、分数程序设计 (13)4.58位流水灯实现状态指示和流水灯效果程序设计 (13)4.6P1端口中断实现选难度、选答案程序设计 (14)4.7T IMER_A中断实现游戏结束画面程序设计 (14)5 调试过程中遇到的问题及解决方法 (14)6 结论与心得体会 (15)7 参考文献 (16)8 代码1 引言从上世纪80年代开始,随着MCU技术的成熟与大众生活的娱乐化,家庭游戏机开始风靡全球。
市场上最开始出现的是任天堂公司的8位游戏机FC(FamilyComputer),随着MCU技术更加蓬勃的发展,功能越来越强大的MCU投入到游戏机的生产中,到目前为止,功能最强大的游戏机例如PS3(PlayStation3)已经是采用”Cell”处理器的256位游戏机了。
此次我们将设计一个迷你游戏机,设计采用TI公司的MSP430F149超低功耗单片机,面向人群为刚接触算术运算的小学生,其实现的功能为:让玩家依据题目选择选项,如“1+1 A=1 B=2”,此时我们选择B=2。
根据不同的对象选择不同的题库,如十以内的加减法、一百以内的加减法、九九乘法表、一千以内的乘除法等等。
此游戏机结合学习、游戏为一体,让玩家可以在玩游戏的同时巩固最基本的算术运算。
由于条件和时间的限制,我们此次只做了一个比较精简的版本。
基于MSP430F149的多参数测量仪设计

2.1 主程序设计
本系统的主程序流程图。本系统的主程序主要完成对时序的初始化及对显示界面的初始化,其中初始化包括对单片机的初始化和对接口芯片的初始化。首先是对单片机进行初始化,以设置时钟和必要的标志位以及变量初值;接着对显示器初始化,设置数据、地址传输端口;然后将按键选择程序开启,主要设置按键任务;最后对时钟A、B以及A/D转换进行初始化,设置必要的控制字和开中断。
在电感测量时,根据量程的不同可分为5个档。将被测电感Lx接入电路中后,通过输入电压大小的判断,可由单片机向模拟开关发送控制信号以选择档位。
频率测量可利用单片机的捕获功能,外部输入的信号经过整形放大滤波分频等处理后,可将输出的方波信号送入单片机,图4所示是其频率测量电路。事实上,当一定频率的信号从IN端输入电路中时,经二极管限幅,再经RC滤波,然后送入到由LM358运放构成的比较器中,即可输出方波信号。该方波信号经74HC14整形,再经74HC393分频,最后可输入到单片机中。该测量电路中利用74HC393分频的目的在于,如果输入信号的频率过高,则单片机无法准确快速地捕获到该信号,因此,可通过分频减少高频信号的测量误差,同时提高测量的实际可行性。
基于MSP430F149的多参数测量仪设计
本文给出了一种由单片机MSP430F149和部分外围电路来构成多参数测量仪的设计方案。详细介绍了测量RLC、频率及相位差的具体方法,同时给出了硬件电路和软件程序框图。
引言
现在常用的仪表一般还是传统的模拟式仪表,漂移大,程控性能不好,而有些仪表功能过于单一,不能满足实际需求。为此,本文考虑到实际的科研实验需要,给出了一种可同时测量RLC、频率及相位差的测量仪的设计方法。
1.2 MSP430F149芯片简介
基于MSP430F149的多功能电力监测仪的设计

摘 要: 介 绍了一种基于超低功耗单 片机 M S P 4 3 0 F 1 4 9 的多功能 电网参 数综合监测仪 , 系统采用电能计量 专用芯片 A T r 7 0 2 2 B 测 量三相 电网的各参数 , 并设计 了外围硬件 电路 , 包 括采 样调理 电路 、 人 机界面 、 实 时时钟 、 串行通信及 电源模块 等。本 设计 校表采用与触摸屏相结合 的软件校 表 , 不需与上位机 通信 , 在很 大程度上简化 了校表程序 , 校 表精度 也有 较大提高。 经实验测试 , 该监测仪具有高精度 、 低功耗 、 多功能和
C L C n u mb e r : T P 2 1 6 . 1
智能化等优点 。 关键词 : 电能质量监测 ; M S P 4 3 0 F 1 4 9 ; A T I ' 7 0 2 2 B ; 触摸屏 ; 软件校表 中图分类号 : T P 2 1 6 + . 1 文献标 识码 : B 文章编号 : 1 0 0 3 — 0 1 0 7 ( 2 0 1 3 ) 0 9 - 0 0 6 3 一 o 4
基于 M S P 4 3 0 F 1 4 9的多功能电力监测仪的设计
电子质量 ( 2 0 1 3 第0 9 期)
基 于 MS P 4 3 0 F 1 4 9的 多 功 能 电 力 监 测 仪 的 设 计
De s i g n o f M ul t i f u nc t i o n Po we r Mo n i t o r Ba s e d o n MS P43 0F 1 4 9
t h r e e—p h as e gr i d a n d d e s i gn s p er i p h e r a l h a r d wa r e c i r c u i t , i n cl u di n g: s a mpl i n g c o n di t i on i n g c i r c u i t s , HM I , r e -
基于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,触发引脚 ,高 电平触发 ,
超声波测距正确程序

/*-----------------------------------------------内容:通过标准程序静态显示字符引脚定义如下: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为方式1 TH0=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;}}}}。
基于MSP430F149的频率计的设计

基于MSP430F149的频率计的设计/***本例程是利用定时器A的捕获功能,从P1.2引脚捕获被测量信号的上升沿,从而计算出其频率值,并显示在1602液晶屏上。
测量的频率范围为1Hz~100kHz,若频率在1KHz 以下,以Hz为单位显示整数部分,若频率大于1KHz,显示2位小数***/#include "msp430x14x.h"#include "LCD1602.c"unsigned int old_cap=0;//捕获的旧值unsigned long int period=0;//信号周期unsigned char TA_ov_num=0;//定时器计数溢出次数/*****系统时钟配置****/void init_MCLK(){ uchar i;WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗BCSCTL1&=~ XT2OFF; //msp430f149 选择XT2频率,一般为8MHz do//do这个循环不能删除,否则下载到硬件电路上没法实现测温功能{IFG1 &= ~OFIFG; //清除晶振失败标志for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振}while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0); // SMCK=MCLK=8MHz}/*********//****捕获方式设置****/void cap_init(){P1SEL|=BIT2; // 设置P1.2为第二功能引脚TA1P1DIR&=~BIT2; // 设置P1.2为输入引脚TACTL = TASSEL_2 + MC_2+ID_3+TAIE; //计数时钟为1MHz,计数方式为连续计数CCTL1 |= CAP+CM_1 + SCS + CCIS_0+ CCIE;// 上升沿捕获,同步,CCI0A(P1.2信号源),捕获功能,中断允许TACCR1=0;}/****频率计算及显示****/void display_freq(){uchar lcdbuf[8];unsigned long temp;temp=period;if(temp>1000)//表示频率小于1KHz{temp=1000000/temp;//定时器的计数时钟为1MHz,且以Hz为单位只显示整数部分lcdbuf[0]=temp/100+0x30;lcdbuf[1]=(temp%100)/10+0x30;lcdbuf[2]=temp%10+0x30;lcdbuf[3]='H';lcdbuf[4]='z';lcdbuf[5]=' ';lcdbuf[6]=' ';lcdbuf[7]=' ';if(lcdbuf[0]==0x30){if(lcdbuf[1]==0x30)LCD_Write_String(5,2,&lcdbuf[2]);elseLCD_Write_String(5,2,&lcdbuf[1]);}elseLCD_Write_String(5,2,&lcdbuf[0]);}else//表示频率大于1KHz{temp=10000/temp;//定时器的计数时钟为1MHz,以KHz为单位显示,且显示2位小数//1000/period再扩大10倍以显示小数lcdbuf[0]=temp/1000+0x30;lcdbuf[1]=(temp%1000)/100+0x30;lcdbuf[2]=(temp%1000)%100/10+0x30;lcdbuf[3]='.';lcdbuf[4]=(temp%1000)%10+0x30;;lcdbuf[5]='K';lcdbuf[6]='H';lcdbuf[7]='z';if(lcdbuf[0]==0x30){if(lcdbuf[1]==0x30){LCD_Write_String(5,2,&lcdbuf[2]);LCD_Write_String(11,2," ");}else{LCD_Write_String(5,2,&lcdbuf[1]);LCD_Write_String(12,2," ");}}elseLCD_Write_String(5,2,&lcdbuf[0]);}}/****主程序*******/void main(void){volatile unsigned int i;init_MCLK();//初始化系统时钟for (i=0; i<20000; i++); // 延时等待晶振稳定cap_init();//捕获初始化_EINT(); // 开总中断LCD_Init();//液晶初始化LCD_Write_String(0,1,"freq:");//从第一行第0列开始显示while(1){display_freq();//脉宽计算及显示}}#pragma vector=TIMERA1_VECTOR//捕获中断子程序__interrupt void TimerA1(void){switch(TAIV){case 2://比较/捕获模块1中断period=TA_ov_num*65536+TACCR1-old_cap;old_cap=TACCR1;TA_ov_num=0;break;case 4:break;//比较/捕获模块2中断未用case 10:TA_ov_num++;break;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/////////////csb.c文件#include "csb.h"#include "USART0.h"char table[30];long unsigned int channel[3];//存放时间uint channel_count[6]={0};//存放计数值uchar channel_flag[3]={0};uchar yichu_flag=0;//溢出标志float distance1=0;float distance2=0;float distance3=0;/**************变量定义****************/ unsigned char flag=0;long time;/******************************************* 函数名称:void InitSys()函数功能:时钟初始化入口参数:无返回值:无*******************************************/void InitSys(){unsigned int iq0;_DINT();BCSCTL1 &=~XT2OFF;do{IFG1 &= ~OFIFG; // 清除振荡器失效标志for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振BCSCTL2 =SELM1+SELS; //MCLK,SMCLK时钟为XT2 }/*******************************************函数名称:void init_dvice(void)函数功能:超声波模块初始化入口参数:无返回值:无*******************************************/void init_dvice(void){P2DIR|=BIT0+BIT1+BIT2; //输出方向(用来产生大于10us的脉冲)P4DIR&=~(BIT1+BIT2+BIT3); //P1的管脚为输入P4SEL|=(BIT1+BIT2+BIT3); //CCI0A输入TBCTL=TBSSEL_2+TBCLR+ID_3+MC_2; //MCLK,清除TAR,八分频,连续计数模式//CCTL0=CM_1+CCIS_0+CAP+CCIE; //上升沿捕捉模式,选择CCIxA作为捕捉事件的输入信号,//工作在捕捉模式,捕获/比较中断使能TBCCTL3 |= CM_1 + SCS + CAP + CCIE;//捕获模式,同步捕获,中断打开,上降沿捕获TBCCTL1 |= CM_1 + SCS + CAP + CCIE;//捕获模式,同步捕获,中断打开,上降沿捕获TBCCTL2 |= CM_1 + SCS + CAP + CCIE;//捕获模式,同步捕获,中断打开,上降沿捕获//TBCCTL4 |= CM_1 + SCS + CAP + CCIE;//捕获模式,同步捕获,中断打开,上降沿捕获// TBCTL|=TASSEL_1+TACLR+ID_1+MC_1; //TIMER_B工作于增计数方式// TBCCTL0|=CCIE;// TBCCR0 =4096;_EINT(); //使能GIE}/*******************************************函数名称:void start(void)函数功能:超声波开始信号,产生10us的脉冲入口参数:无返回值:无*******************************************/ void start1(void){Trig_L1;delay_us(10);Trig_H1;delay_us(10);Trig_L1;}void start2(void){Trig_L2;delay_us(10);Trig_H2;delay_us(10);Trig_L2;}void start3(void){Trig_L3;delay_us(10);Trig_H3;delay_us(10);Trig_L3;}/******************************************* 函数名称:void count_distance(void)函数功能:计算距离入口参数:无返回值:无*******************************************/ float count_distance(long unsigned int ti1){float dista;dista = ti1*0.000173;return dista;// sprintf(table,"%f\r\n",distance);// PutString0(table);// Send_Num0(distance);// Disp_Float(24,100,100,distance,1);}void CSB_scan(void){if(channel_flag[0]==1)//通道1捕获完成channel_flag[0]=0;if(channel_count[1]>channel_count[0])channel[0]=channel_count[1]-channel_count[0];else{channel[0]=65535-channel_count[0]+channel_count[1];yichu_flag=0;}distance1=count_distance(channel[0]);sprintf(table,"%f\r",distance1);PutString1(table);}if(channel_flag[1]==1)//通道2捕获完成{channel_flag[1]=0;if(channel_count[3]>channel_count[2])channel[1]=channel_count[3]-channel_count[2];else{channel[1]=65535-channel_count[2]+channel_count[3]; yichu_flag=0;distance2=count_distance(channel[1]);sprintf(table,"%f\r",distance2);PutString1(table);}if(channel_flag[2]==1)//通道3捕获完成{channel_flag[2]=0;if(channel_count[5]>channel_count[4])channel[2]=channel_count[5]-channel_count[4];else{yichu_flag=0;channel[2]=65535-channel_count[4]+channel_count[5];}distance3=count_distance(channel[2]);sprintf(table,"%f\r\n",distance3);PutString1(table);}}#pragma vector = TIMERB1_VECTOR__interrupt void timera1_vec(){switch(TBIV){case 2: if(TBCCTL1 & CM_1)//上升沿{TBCCTL1 = (TBCCTL1 & (~CM_1) | CM_2);//改成下降沿channel_count[2]=TBCCR1;TBCCTL1 &= ~CCIFG;//清除中断标志}else //下降沿{TBCCTL1 = (TBCCTL1 &(~CM_2) | CM_1);//改成下降沿channel_count[3]=TBCCR1;channel_flag[1]=1;TBCCTL1 &= ~CCIFG;//清除中断标志}break;case 4: if(TBCCTL2 & CM_1)//上升沿{TBCCTL2 = (TBCCTL2 & (~CM_1) | CM_2);//改成下降沿channel_count[2]=TBCCR2;TBCCTL2 &= ~CCIFG;//清除中断标志}else //下降沿{TBCCTL2 = (TBCCTL2 &(~CM_2) | CM_1);//改成下降沿channel_count[3]=TBCCR2;channel_flag[1]=1;TBCCTL2 &= ~CCIFG;//清除中断标志}break;case 6: if(TBCCTL3 & CM_1)//上升沿{TBCCTL3 = (TBCCTL3 & (~CM_1) | CM_2);//改成下降沿channel_count[4]=TBCCR3;TBCCTL3 &= ~CCIFG;//清除中断标志}else //下降沿{TBCCTL3 = (TBCCTL3 &(~CM_2) | CM_1);//改成下降沿channel_count[5]=TBCCR3;channel_flag[2]=1;TBCCTL3 &= ~CCIFG;//清除中断标志}break;case 10: yichu_flag++;break;}}////////////////scb.h 头文件#ifndef __CSB_H#define __CSB_H#include <msp430x16x.h>#include "stdio.h"#define uchar unsigned char#define uint unsigned int#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))#define Trig_H1 P2OUT|=BIT0 //端口P2.0输出高电平#define Trig_L1 P2OUT&=~BIT0 //端口P2.0输出低电平#define Trig_H2 P2OUT|=BIT1 //端口P2.0输出高电平#define Trig_L2 P2OUT&=~BIT1 //端口P2.0输出低电平#define Trig_H3 P2OUT|=BIT2 //端口P2.0输出高电平#define Trig_L3 P2OUT&=~BIT2 //端口P2.0输出低电平extern void InitSys();extern void init_dvice(void);extern void start1(void);extern void start2(void);extern void start3(void);extern float count_distance(long unsigned int ti1);extern void CSB_scan(void);#endif。