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;}}。
基于单片机MSP430F149的数字频率计设计
基于单片机MS P 4 3 0 F 1 4 9 的数字频率计设计
陈蓉 林凡强 毛若鹰 唐道波 成都 理工大学信息科学与技术学院 四川成都
6 1 0 0 5 9
【 擒 叠 】在电子技 术中, 频率是 最基 本的参数之一, 频率 的测 量就 捉 事 件 , 若 是 则 计 显得 十分重要, 本设计是 基于M S P 4 ¥ O 单片机的 智能频率测量 系统 。 实现 算 两 次 捕 捉 时 间差
的P 1 2 作为捕捉 信号 的输 入端 , 测 量该信
莱统初 始化 中断^口
l 开 断 总 中 断I < ; 件 中 断 :
\ —
1 , 前盲 在电子 技术 中, 频率是最 基本的 参数之一, 并且与许多电参量 的测 量方案 , 测 量结果都 有密切的 关系, 因此频率 测量在 科技领域 和实际应 用中的作用 一 日 益重要 , 在 广播、 电视 、 电讯 、 微 电子技 术等现代科 学领 域中有广泛 的应 用。 传统 的频率计采用组合电路和时序 电路 等大量硬件 电路构成, 产品不但体积大, 运行速 度慢, 而且在测低 频信号不宜采用。 本系统基 于MS P 4 3 0 F 1 4 9 单片机 的智能频率 测量 系统, 具 有精度 高、 使 用方便、 测量迅 速, 以及便于实现测量过 程 自 动化等优 点。 2 . 芯片 介绍 MS P 4 3 0 F 1 4 9 是 美国德仪 公司推 出的 系列 超低 功耗 控制 器中的一 种, 基 于真 正的 l 6 位R I S C C P U内核 , 1 6 位 总线结 构 , MS P 4 3 0 F 1 4 9 的 电源 电压 工作范 围1 . 8 3 . 3 V, 在1 MHz 时 钟条 件下 , 最大 工作 电流 仅有 3 5 0 u A, 具 有五种 低功 耗模 式 , 在 不同的工作模 式下, 工作 电流可 下降 到7 0 0 . 1 u A, 具有超低 功耗 。 Ms P 4 3 O F 1 4 9 MC U 片内包括6 O KB 闪存、 2 KB R AM、 1 2 位AD C 、 2 U S AR T 、 硬件乘法 器等多个高性能数 据转 换 器接 口, 既能作为带有 比较器的简便低 功耗 控制器, 又能作 为完整的
一种基于MSP430单片机的超声波测距系统的设计与实现
一种基于MSP430单片机的超声波测距系统的设计与实现超声波测距系统是一种广泛应用于自动控制领域中的传感器技术。
它采用超声波传感器可以获得距离测量值,被广泛应用于机器人、智能家居、自动驾驶等众多领域中。
本文主要介绍一种基于MSP430单片机的超声波测距系统的设计与实现。
该系统主要分为超声波发射模块和接收模块两部分。
超声波发射模块主要功能是产生超声波脉冲。
该模块采用MSP430单片机作为主控制器,通过GPIO口控制超声波发射传感器的工作方式。
具体实现中,将MSP430单片机上的GPIO口配置为输出模式,并设置输出脉冲的周期和占空比。
然后使用定时器产生脉冲信号,输出到超声波发射器上。
超声波接收模块主要功能是接收所发出的超声波脉冲,并计算出物体与传感器之间的距离。
该模块采用超声波接收传感器来接收超声波信号,并将信号经过前置放大器进行放大,提高信号的精度和灵敏度。
然后将信号输出到MSP430单片机上进行次数测量和计算距离值。
具体实现中,超声波接收模块的硬件部分包括超声波接收传感器、前置放大器和A/D转换器。
其中,超声波接收传感器通过GPIO口与MSP430单片机连接,前置放大器将信号放大后输出到A/D转换器,MSP430单片机通过A/D转换器采集数据并进行处理。
软件部分分为超声波发射程序和超声波接收程序两部分。
超声波发射程序主要负责控制超声波发射器的工作,超声波接收程序主要用于接收超声波信号,进行次数统计和距离计算,最后通过串口输出距离测量值。
在完成硬件与软件的设计之后,进行系统测试。
测试中需要使用标准距离参照物,通过与标准距离参照物比对,对测量系统进行校准。
测试结果表明,该系统测量范围达到3-400cm,并且测量精度高,稳定性强。
本文介绍的基于MSP430单片机的超声波测距系统,具有简单、灵活、精度高等优点。
将来可以进一步应用于物流领域、智能家居、机器人等领域,发挥更广泛的作用。
MSP430F149中文资料.pdf
MSP430单片机的开发及应用设计人:陈小忠西安邮电学院电子信息工程系电子0002班西安邮电学院63# 7100612003年7月目录第一章概述第二章MSP430 F149语言介绍第一节开发环境及程序下载第二节语言介绍第三章MSP430F149 资源的应用介绍及开发第一节中断介绍及存储器段介绍第二节硬件乘法器第三节P口第四节定时器及数模转换第五节时钟模块第六节USART通信模块第七节比较器第八节模数转换第四章MSP430F149开发板的介绍及测试第一节模数转换模块第二节传感器模块第三节外存和实时时钟模块第四节485和232模块第五节电源管理模块及晶振模块第六节PWM波形滤波第一章概述MSP430是德州公司新开发的一类具有16位总线的带FLASH 的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器.具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART 通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M 的时钟.由于为FLASH 型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化 ,MSP430系列将会得到越来越多人的喜爱.通过两过多月的毕业设计,我对MSP430有了初步了解,对内部的硬件资源和自身的汇编语法进行了实验,并开发了一个应用板,并进行了调试.鉴于时间和能力有限,没能对所有的应用一一实验.第二章 MSP430 F149语言介绍MSP430是德州公司的新产品,有独特的开发环境和自身语言,下面是我在毕业设计中对F149的开发环境熟悉中遇到的一些问题的处理和汇编语言的用法及程序中遇到的问题的体会.第一节开发环境及程序下载1.开发环境:在EW23环境下进行编程,汇编,连接,在C—SPY环境下进行调试,下载是在连接之后,调试之前,通过计算机的串口下载的.关于环境的操作,可以参考有关资料,其中可能遇到的问题及解决方法有:(1) .汇编是对源程序而言的,因此必须打开一个源文件才能汇编,而连接是对一个工程文件而言的,连接是对工程文件的所有源代码(包括多个源文件)和数据的定位,因此连接必须打开一个工程文件才能连接.(2) 连接中必须将库文件的路径改正确,且必须选定C—SPY的驱动方式,即在project中的options的xlink的include下修改(先选中)xcl的库路径为$TOOLKIT_DIR$\icc430\msp430F149A.xcl ,选择C—SPY 的驱动drive为simulator或FLASH EMULATION TOOL ,当没连接430片子时可以选simulator,当连接430片子时,选 FLASH EMULATION TOOL进行在线下载调试.(3) 由于430支持汇编语言和C语言两种语言,因此可以在一个工程文件中同时用两种语言,但建议用汇编语言,因为便于在调试时寻找逻辑和指令的联系及地址的定位正确与否.(4) 在在线的C—SPY 的调试中,单步需要将Control的Reatime前的勾取消才能进行单步测试.(5) 在线调试时,不能将58 管脚(复位/非屏蔽中断)外部变高,否则,会强制退出调试环境.2.程序下载原理及脱机工作原理:程序的在线调试是通过JATG口和F149片子的 RST、TCK、TDI、TDO、TMS引脚按一定的时序串行的传递程序代码和数据的,调试指令的命令传递都是通过这些数据线和控制线传递的,下载时序可参见资料1,其中的地址0FFFEH为复位向量的地址,它是程序遇到非屏蔽中断和程序启动的首要地址,地址中存放的是程序段开始的首地址,因此必须把程序段的首地址标号表示在中断向量中或程序伪指令的开头位置,否则,连接时将会出错,具体的表示方法在下一节中表示.程序的下载和在线调试的电源是通过计算机在JATG提供的,不须另外给加电源.脱机工作时,是将F149的电源线上电,此时的复位时序同下载后在线复位的时序一样,只是时钟是通过F149内部时钟DCO提供的,上电后,程序将复位向量0FFFE中的地址装入PC,PC开始从程序段的首地址开始执行.脱机工作启动不需要任何操作,只需上电即可,电压要大于1.8v,一般取3v左右,另外,在脱机工作时,可以给RST端口加一个低电平脉冲以复位从程序开始重新执行.第二节指令介绍MSP430有自身语言,汇编语言也不同于其他类型的单片机,伪指令也是变幻魔测,但又很重要,下面是我毕业设计的一些尝试、出问题的地方.也可参见资料。
MSP430F149串口测试程序
UMCTL0 = 0x4a; // Modulation
UCTL0 &= ~SWRST; // 初始化UART0状态机,一般要设置好串口之后才复位
for(i=0;i<=20;i++)
{
TXBUF0=DA TA[i];
while((UTCTL0&0X01)==0);//等待数据发送完毕
uchar i,j;
WDTCTL = WDTPW + WDTHOLD;
//使用外部高频晶体振荡器
BCSCTL1&=~XT2OFF;
do{
IFG1&=~OFIFG;
for(j=0XFF;j>0;j--);
}while((IFG1&OFIFG));
BCSCTL2|=SELM_2;
P3DIR|=BIT4+BIT7;
}
while(1);
}
msp430f149串口测试程序 #include "msp430x14x.h" #define uchar unsigned char uchar da ta[]="hello world my name!"; void main() { // stop watchdog timer to prevent time out reset uchar i,j; //使用外部高频晶体振荡器 bcsctl1&=~xt2off; do{ ifg1&=~ofifg; for(j=0xff;j>0;j--); }while((ifg1&ofifg)); bcsctl2|=selm_2; p3dir|=bit4+bit7; p3sel|=bit4+bit7; me1 |= utxe0 + urxe0; //使能usart0收发 uctl0 |= char; // 8-bit数据,一位停止位 utctl0 |= ssel0; //选择时钟,uclk = aclk,32768 ubr00 = 0x03; // 32k/9600 ubr10 = 0x00; // umctl0 = 0x4a; // modulation uctl0 &= ~swrst; //初始化uart0状态机,一般要设置好串口之后才复位 for(i=0;i<=20;i++) { txbuf0=da ta[i]; while((utctl0&0x01)==0);//等待数据发送完毕 } while(1); } 下载文档原格式( word原格式 ,共1页)
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);}}。
采用MSP430F149单片机的导波雷达液位计设计
图1 导波雷达液位计信号处理流程图电源电路设计根据导波雷达液位计使用工况的要求,系统使用+24V 直流来供电,系统电源电路如图3所示。
系统电源电路使用AD421芯片,AD421是一种可以产生4~20mA 电流输出的DAC [5]。
导波雷达液位计使用它实现回路供电,还为整个系统和其他电路的芯片等提供工作电源和相应的参考电源。
系统把AD421芯片的几个引脚的输出作为电源,使用它输出+5V 作为电源电压输出及产生+1.25V 和+2.5V 同时,单片机稳定工作还需+1.8V 到+3.6V 的电源电压,所以要把上述得到的+5V 电源转换到这个范围内(通常为+3.3V )。
本文采用HT7133芯片进行电源转换。
HT7133是一种功耗很低的输出电压为3.3V 的电压调节器,它只有3个端口,在其输入端之前采用二极管进行过流保护。
信号变换电路设计导波雷达液位计的单片机发出的控制信号必须通过信号变换变成相应据。
信号变换的计数器电路如图4所示。
所选芯片是74HC4040M ,它是一种12位的二进制纹波计数器。
作为时钟的输入端口,MR 则是它的实现异步主复位功能的输入端口和Q0~Q11为计数器的12个并行的输出端口。
在此选用了两个计数器,第一个计数器是把PWM0信号(460k 信号)进行8分频,第二个计数器再对8分频后的信号依次进行2分频后再分12位进行输出。
对于图中的每一路输出,如果图4 计数器电路图图5 DAC电路图图3 系统电源电路图图2 导波雷达液位计结构组成图PWM0和PWM1信号是单片机产生的周期性脉宽调制信号,分别为460k信号和周期100ms占空比30%的信号。
第一个计数器首先把PWM0信号进行8分频产生一个输出送到第2个计数器作为CP,再把这个分频后的信号再进行分频计数,进而得到12路并行的周期性计数信号(A0~A11),再送给12位DAC转换为模拟信号。
将PWM1作为第2个计数器的MR,可以来控制各路只有在高电平的30ms内有输出,得到的信号送至DAC进行转换。
msp430F149简易教程
各模块简要介绍—12、USCI
各模块简要介绍—6、digital I/O
配置没有使用到的I/O引脚: 应被配置为I/O功能、输出方 向、上拉/下拉电阻使能。这样可 以减少系统的功耗。
各模块简要介绍—6、digital I/O
控制I/O口的实例: P1OUT |=BIT0 ; //置P1.0为1 P1OUT |=BIT0+BIT1+BIT7 ; //置P1.0、 P1.1 、 P1.7为1 P1OUT&=~BIT0 ; //置P1.0为0
捕捉比较 模块的7 种输出模 式 (以CCR2为 例)
各模块简要介绍—11、Timer_B
Timer_B有7个捕捉比较模块,其 功能与Timer_A功能类似,主要在以下 方面不同: (1)计数长度可以为8bits 、10bits、 12bits、16bits (2)捕捉比较寄存器具有双缓冲结构, 不同捕捉比较寄存器TBCCRx能够进行 组合,实现严格同步的比较输出。
Msp430的引脚图
引脚具体说 明见terminal functions表 格
各模块简要介绍— 1、CPU
• 16-BIT RISC architecture 源操作数7种寻址模式,目标 操作数4种寻址模式 • 16个寄存器(见右图),寄 存器间传送数据在1个CPU clock内完成 • R0~R3是专用寄存器PC、 SP、SR、CG,其余为通用 寄存器
该模块是430单片机的特色, 乘法器完全用硬件实现,其工作 与CPU完全独立,能够通过CPU 指令对其进行读和写。 可完成16x16bits 、 16x8bits、 8x16bits、 8x8bits
各模块简要介绍—10、Timer_A
概述: Timer_A是一个具有3个捕捉/比 较模块的16bit定时/计数器,不仅能完 成定时的基本功能,还能完成对计数值 的捕捉功能,而且可以方便地输出多路 PWM波形;其中断功能也很完善,支 持定时器溢出中断、捕捉比较中断等多 种类型,可方便实现定时、测频、输出 PWM波形等多种功能。
- 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。