msp430g2553测频率以及测峰值

合集下载

基于MSP430G2553便携式脉搏测试仪的设计

基于MSP430G2553便携式脉搏测试仪的设计

·97·
图1
三、系统软件设计 ( 一) 程序流程图。( 见图 2) ( 二) 软件系统设计图。本源代码是基于 TI 的 16 超低 功耗 位 单 片 机 MSP430G2553 而 开 发 的,采 用 片 内 时 钟 1MHZ,显 示 部 分 采 用 市 面 上 常 见 的 液 晶 QC12864, MSP430G2553 与 QC12864 通过串口通讯,我们采用锂电池供 电,程序上电后,立即进入系统初始化,初始化代码主要包含 端口初始化,有 些 口 线 用 着 输 入,有 的 用 着 输 出。 有 些 输 出 高电平,有些输 入 低 电 平。 然 后 是 定 时 器 初 始 化,因 为 在 脉 搏测试仪工作的时候,我们总是测试一分钟后才给出测试结 果,而且在测试开 始 后 的 第 十 秒,我 们 会 对 初 步 的 测 试 结 果 做一个判断,如果这 10 秒内的测试结果是合理的,我们则继
图2ቤተ መጻሕፍቲ ባይዱ
·98·
四、评测与结论 ( 一) 系统测量原理。随着心脏的跳动手指尖的微 血 管 发 生 相 应 的 脉 搏 的 容 积 变 化 ,光 发 射 电 路 发 出 的 特 定 波 长 的 光 透 过 手 指 到 光 电 器 件 ,此 过 程 被 检 测 生 理 量 ( 人 体 的 脉 搏 ) 转 换 成 光 信 号 ,通 过 光 电 器 件 转 换 为 电 信 号 ,送 入 前 级 放 大 电 路 将 信 号 适 当 放 大 ,经 过 滤 波 电 路 除 去 其 中 的 噪 声 得 到 需 要 频 率 范 围 内 的 信 号 ,再 将 脉 搏 信 号 进 行 放 大 和 后 级 的 处 理 ,通 过 示 波 器 显 示 出 来 ,进 一步进行观测。 ( 二) 测试方案及条件。 1. 测试仪器。数字万用表、数字示波器、秒表。 2. 测试主要方案。目前脉搏波检测系统有以下几种检 测方法: 光电容积脉搏波法、液体耦合腔脉搏传感器、压阻式 脉搏传感器以及应变式脉搏传感器。近年来,光电检测技术 在临床医学应用中发展很快,这主要是由于光能避开强烈的 电磁干扰,具有很高的绝缘性,且可非侵入地检测病人各种 症状信息。用光电法提取指尖脉搏光信息受到了从事生物 医学仪器工作的专家和学者的重视。本系统设计了指套式 的透射型光电传感器,实现了光电隔离,减少了对后级模拟 电路的干扰,结构如图 3 所示。

msp430g2553测频率以及测峰值

msp430g2553测频率以及测峰值

msp430g2553测频率以及测峰值电子设计综合实验项目报告项目名称:MCU交流电压参数测量小组成员:林伊、武正浩学号:20111112、20111201项目要求题目:交流电压参数的测量 要求:用给定的MCU:msp430g2553,制作交流电压参数测试设备图表 1基本要求:一、 用给定运放LM324制作一放大器 a) 增益大于:20dBb) 带宽大于:100KHz二、 用指定MCU 和已制作的放大器制作频率计a) 测量范围:10Hz~100KHzb) 显示:3位以上信号放大 A/D比较器 指定MCUMSP430发挥部分:一、用A/D测量已给电压的幅度,信号由已制作的放大器输入a)测量范围:输入信号越小越好实现思路放大:首先分析题目要求,要实现放大20dB,频率1~100KHz的信号,通过公式20lg(Ad)得出Ad=10,即放大10倍必须使用运放lm324实现,则需要知道该芯片的器件参数,即增益带宽积。

通过数据手册得知其增益带宽积为6.4MHz,除去放大倍数得知能够实现该信号的放大,通过设计放大电路并焊接即可,放大电路为反向比例放大电路,见Figure 1Figure 1频率:实现频率的测量,这一块需使用到MCU,测量频率的方法有很多种,通过捕捉上升沿下降沿产生中断,也可以不产生中断,还可通过时钟计数。

其中通过捕捉上升沿下降沿的思路又分两种,1、检测上升沿后再检测下一个上升沿(检测下降沿后再检测下一个下降沿)2、检测上升沿后再检测下降沿(检测下降沿后再检测上升沿)。

这些思路对应不同的采集方法又可以细分,其中方案1对于测量高频信号有着较好的效果,方案2对于测低频的信号较好,前提是占空比为50%,若不为则变为测脉宽。

这次的题目我采用的是用时钟计数的方式,msp430g2553中含有2个时钟,timer0和timer1,每个时钟都有如下功能,选择时钟来源:1、外部时钟(即外部输入的方波信号)2、ACLK 3、smclk等。

基于MSP430G2553的数字频率计设计

基于MSP430G2553的数字频率计设计

基于MSP430G2553的数字频率计设计这是经过改进后的程序源码,较上次的设计相比,测频范围提高到3MHz,是因为将上次采用的IO口中断计数,改为两人TIMERB计数,通过TIMERA定时,TIMERB捕获计数,最终实现测频。

相关经验总结1、测频有两种方法:侧频法和测周法;本次设计是采用的timerA定时1S,P1.0口作为被测信号输入口,上升沿捕捉,每来一个上升沿进入IO中断,在中断服务函数里变量i 计数一次,当定时1S到时,读取变量i的值,则为被测频率;然后将数据传送到LCD和PC机显示;G2553有两个定时模块timerA和timerB,要特别注意它的寄存器的区别格式,默认的是TIMER A的。

中断向量也有两个,有优先级之分,timer0_A0 (应用于CCR0 优先级最高)timer0_A1(用于CCR1,CCR2和其他寄存器)。

2、串口通信有UART的异步通信与SPI的同步通信,也有两个通信模块,接收中断和发送中断,对应口位P1.1和P1.2。

3、MAX232在焊接时,外围的电容可以在0.1UF到10UF,没有影响,9阵的串口接线时也需要特别注意(见单片机书上179页)4、在最后的串口通信中会出现串口调试窗口中不仅显示需要的频率还会有其他的数据,这就需要传进BUFF(8位)中的数据长度不能有其他的,因此比如传一个字符串型的DA TA 进入BUFF,用到stringlen(),包含头文件sring.h。

5、重点是波特率的配置,特别是当分频系数为小数时:/***msp430g2553_LCD1602_Frequency_Detect*****grade:2010*date:2012.7.16*函数功能:测频率*管脚:P1.0作为外部频率的入口*LCD显示:P1.3 P1.5 --> RS EN P2.0--> RW P2.4->2.7 数据端口*/#include <msp430g2553.h>#include "lcd1602_4.h"unsigned long data;int i,j,h,m=0,n=0;char a[15]=" ";char *pa=a;double Freq=0; //频率测量结果存放变量double TA_OverflowCnt=0;//TA溢出次数存放变量void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT//端口设置P1SEL |=BIT0; //允许其第二功能,作为TACLK输入,即待测输入<<----设为1外围模块接口P2SEL=0x00; //设置P2为通用I/OP1DIR &=~BIT0; //P1.0(TACLK)作为输入引脚P2DIR |= 0xf1; // Set P2 to output direction 1111 0001P1DIR |= 0x28; //0111 1000 p1.3 1.5 作为LCD使能复位控制端0010 1000//initial_lcd(); //LCD初始化initLCD();TA1CCR0=65535; //A1定时1sTA1CTL = TASSEL_2 + ID_3 + TACLR + MC_1 + TAIE; // TA1信号作为基准时钟选择SMCLK作为时钟选ACLK会不会稳定点?TA0CTL = TASSEL_0 + TACLR + TAIE + MC_2; //外部信号作为A0时钟,捕获模式TACCTL0 = CCIE; //打开A0中断捕获(该句和下一句为中断必要语句)TA1CCTL0 = CCIE; //打开A1中断捕获_EINT(); //打开全局中断for (;;){_enable_interrupts();data=(int)data;a[0]=data/100000+0x30;a[1]=data/10000%10+0x30;a[2]=data/1000%10+0x30;a[3]=data/100%10+0x30;a[4]=data/10%10+0x30;a[5]=data%10+0x30;a[6]='H';a[7]='z';a[8]='\0';for(h=5000;h>0;h--){//LCD_Disp(0,0,"f=");onLcd(0,0,"f=");//delay(100);//LCD_Disp(1,0,pa);onLcd(1,0,pa);}_disable_interrupts();}}// TA interrupt service routine计数器A0溢出中断#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_R0(void){_disable_interrupts();TA_OverflowCnt++; //TA每次溢出,溢出次数变量+1TA0CTL = TASSEL_0 + TACLR + TAIE + MC_2;//连续计数模式,选择外部时钟_enable_interrupts();}//定时器A1中断#pragma vector=TIMER1_A0_VECTOR__interrupt void Timer_R1(void){_disable_interrupts();data = (TA_OverflowCnt*65535 + TAR)*2.30012328;//读取上次TA计数值及溢出次数,计算频率TA_OverflowCnt=0; //将溢出次数置零TA1CTL = TASSEL_2 + ID_3 + TACLR + MC_1 + TAIE; //选择子系统时钟SMCLK 四分频增计数模式TA0CTL = TASSEL_0 + TACLR + TAIE + MC_2; //选用外部时钟连续计数模式_enable_interrupts();}。

基本时钟模块_MSP430G2553

基本时钟模块_MSP430G2553

基本时钟模块_MSP430G2553G2xxx系列DCO校准数据(校正寄存器)1MHz:CALBC1_1MHZCALDCO_1MHZ8MHz:CALBC1_8MHZCALDCO_8MHZ12MHz:CALBC1_12MHZCALDCO_12MHZ16MHz:CALBC1_16MHZCALDCO_16MHZ例:设置DCO频率为1MHzif(CALBC1_1MHZ==0xFF || CALDCO_1MHZ==0xFF)while(1);//校准数据是否被擦除,若是则CPU挂起。

BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;基本时钟模块寄存器寄存器缩写形式类型初始状态DCO控制寄存器DCOCTL 读/写0x60(PUC)基本时钟系统控制器1 BCSCTL1 读/写0x87(POR)基本时钟系统控制器2 BCSCTL2 读/写由PUC复位基本时钟系统控制器3 BCSCTL3 读/写0x05(PUC)中断使能寄存器(特殊功能寄存器)IE1 读/写由PUC复位中断标致寄存器(特殊功能寄存器)IFG1 读/写由PUC复位说明:DCO的频率可以通过软件设定DCOx、MODx、RSELx相应位来调整,DCO频率是通过将f DCO和f DCO+1混频得到。

1、DCOCTL:DCO控制寄存器7 6 5 4 3 2 1 0DCOx MODxrw-0 rw-1 rw-1 rw-0 rw-0 rw-0 rw-0 rw-0 DCOx:DCO频率范围选择位,这些位可以用来在由RESLx设置决定的8个离散的频率范围中选择哪一个。

MODx:调制系数选择位,这些位用来决定在32个DCO时钟周期中f DCO+1占多少个,f DCO 占多少个。

注意:当MODx=0时调制器关闭,DCOx=7时,由于此时没有下一个更高的频率范围f DCO+1可用,因此MODx无效不可用。

2、BCSCTL1:基本时钟系统控制寄存器17 6 5 4 3 2 1 0 XT2OFF XTS(1)(2)DIVAx RSELxrw-(1) rw-(0) rw-(0) rw-(0) rw-0 rw-1 rw-1 rw-1 XT2OFF:第二晶振XT2(可选高频晶振)关闭控制位。

MSP430G2553中比较器测电阻的程序

MSP430G2553中比较器测电阻的程序
//BCSCTL1=CALBC1_12MHZ;//设置DCO为12M
DCOCTL =CALDCO_12MHZ;//具体代码没看到
IFG1=0x00; //清除中断标志 中断标志寄存器1 主要控制系统的中断
while(IFG1&OFIFG!=0)//OFIG在头文件中定义为0X20
//比较器设置
CACTL1 = CAEX + CAREF0 +CAON + CAIES + CAIE; //打开比较器 比较器中断 下降沿触发中断
CACTL2 = P2CA3 + CAF; // 一个选择CA1 P1.1 正输入端 一个选择CA2 P1.2 负输入端
else
start_data=0xfa;//写数据
Hdata=data&0xf0;//取高四位
Ldata=(data<<4)&0xf0;//取第四位
Send_Data(start_data);
Delay(1);
Send_Data(Hdata);
Delay(1);
// P1OUT ^= BIT6;
_BIC_SR_IRQ(LPM0_bits+GIE);
}
for(i=0;i<=15;i++)
{
Write_data(1,*P); P++;
Delay(move_timer);
num++;
}
}
if(hang==2)
{
Write_data(0,0x90+num);
}
}
void u32tostr(uint dat,char *str) //将一个32位的变量dat转为字符串

MSP430G2553寄存器资料讲解

MSP430G2553寄存器资料讲解

MSP430G2553学习笔记常用赋值运算符:清除:&=~ ,置位:|= ,测试:&= ,取反:^= ,看门狗模块:WDT(看门狗)WDTCTL 看门狗定时器控制寄存器15--8 7 6 5 4 3 2 1 0口令HOLD NMIES NMI TMSEL CNTCL SSEL IS1 IS0IS1,IS0 选择看门狗定时器的定时输出,T是WDTCNT的输入时钟源周期0 T x 2(15)1 T x 2(13)2 T x 2(9)3 T x 2(6)SSEL 选择WDTCNT的时钟源0 SMCLK1 ACLKIS0、IS1、SSEL可确定WDT定时时间,WDT只能定时8种和时钟源相关的时间WDT可选的定时时间(晶体为32768HZ,SMCLK=1MHZ)SSEL IS1 IS0 定时时间/ms0 1 1 0.056 Tsmclk x 2(6)0 1 0 0.5 Tsmclk x 2(9)1 1 1 1.9 Taclk x 2(6)0 0 1 8 Tsmclk x 2(13)1 1 0 16 Taclk x 2(9)0 0 0 32 Tsmclk x 2(15)(PUC复位后的值)1 0 1 250 Taclk x 2(13)1 0 0 1000 Taclk x 2(15)CNTCL当该位为1时,清除WDTCNTTMSEL 工作模式选择0 看门狗模式1 定时器模式NMI 选择RST/NMI引脚功能,在PUC后被复位0 RST/NMI引脚为复位端1 RST/NMI引脚为边沿触发的非屏蔽中断输入NMIES 选择中断的边沿触发方式0 上升沿触发NMI中断1 下降沿触发NMI中断HOLD 停止看门狗定时器工作,降低功耗0 WDT功能激活1 时钟禁止输入,计数停止WDT(看门狗)配置语句WDTCTL=WDTPW+WDTHOLD;//将WDTPW+WDTHOLD赋值给WDTCTL,关闭看门狗定时器控制寄存器(Stop watchdogtimer)IE1 |= WDTIE;//使能WDT中断WDTCTL = WDT_ADL Y_1000;//WDT 1 s / 4间隔计时器WDTCTL = WDTPW + WDTHOLD + WDTNMI + WDTNMIES;//WDTCTL 由高8位口令和低8位控制命令组成,要写入操作WDT的控制命令,出于安全原因必须先正确写入高字节看门狗口令。

mps430G2553中文资料

mps430G2553中文资料

时钟
I/O 封装类型
16
512 2x TA3
8
8
512 2x TA3
8
4
256 2x TA3
8
2
256 2x TA3
8
1
256 2x TA3
8
24
32 引脚 QFN 封装
28 引脚
24 TSSOP 封
LF,

-
1
DCO,
VLO
20 引脚
16 TSSOP 封

16
20 引脚 PDIP 封装
24
32 引脚 QFN 封装
引导加 载器 (BSL)
嵌入式 仿真模
块 (EEM)
1
1
1
1
1
1
1
1
1
1
表 1. 提供的选项(1)(2) (接下页)
ZHCS178E – APRIL 2011 – REVISED JANUARY 2012
闪存 (KB)
RAM (B)
Timer_A
COMP_A+ 通道
10 通道 ADC
USCI A0/B0
典型应用包括低成本传感器系统,此类系统负责捕获模拟信号、将之转换为数字值、随后对数据进行处理以进行显 示或传送至主机系统。
1
Please be aware that an important notice concerning availability, standard warranty, and use in critical applications of Texas Instruments semiconductor products and disclaimers thereto appears at the end of this data sheet.

电设工作小结之——MSP430G2553学习笔记—3

电设工作小结之——MSP430G2553学习笔记—3

电设工作小结之——MSP430G2553学习笔记——3接上一篇继续:二,MSP430G2553的应用设计(一),频率计的设计1,频率计的实现方法有:测频法,测周法,等精度测频。

一般是低频用测周法较准,高频用测频法较准。

等精度测频是比较准的。

2,测周法:(1)可以使用定时器的输入捕获功能,捕获上升沿或下降沿,然后就可以计算出信号的周期,从而得出频率。

(2)也可以把待测信号接到IO上,然后用无限循环不停的查询电平的高低,从而得出信号的周期。

丁老师建议:以丁老师的经验,这种方法测量的精度比用捕获中断的精度要高,因为中断的进入和退出都要占用时间。

(3)但这种侧周法适用于低频信号频率的测量,对于高频信号精度不好。

3,测频法:(1)可以定时一定的时间,然后计算捕获脉冲的个数,从而得出周期。

(2)把待测信号接到IO脚上,然后用IO的中断功能在一定时间内记录脉冲数。

(3)设置Timer0_A的时钟为外接时钟TACLK,然后把待测信号接到该时钟上,把Timer0用作计数器,在一定时间内读取TAR寄存器,得出脉冲个数,从而得出频率。

(4)测频法,使用与测高频信号,对于低频信号误差较大。

4,等精度测频:(1)把Timer0_A工作于计数器模式,计数待测信号。

然后把Timer1_A的时钟设为ACLK,32768Hz的标准晶振,作为标准信号。

然后再外部输入一个控制闸门信号PWM(我觉得也可以用看门狗定时器工作在间隔定时器模式来控制),和待测信号一起通过D触发器控制计数的开始和结束。

这个外接的闸门信号可以用555振荡器产生一个周期可调的PWM,这个PWM 的周期不需要精确的控制,只有知道大概的范围就可,保证计数器不溢出即可,最终测的精度和它的周期没有绝对的关系。

(也可以在计数器溢出时,在溢出中断中记录溢出的次数,这样的话也可以,但是这样中断的进入和退出会对测量精度产生影响)(2) 如果Timer0_A用于其他用途的话,也可以接一个计数器,然后把计数值在输入给单片机(如小车上测速所采用的方法)。

基于MSP430G2553的温度检测系统设计

基于MSP430G2553的温度检测系统设计
单片机技术 ・ S C M T e c h n o l o g y
基于 MS P 4 3 0 G 2 5 5 3的温度检测 系统设计
文/ 耿 浩 然
目 前 , 在 自 动 控 制 领 域 利 用 温 度 作 为 一 种 控 制 量 对 系统 进
行 自动 控制 已经越 来越 普 遍 ,在 人们 的生产 生 活 中对 温度 的测 量
( 2 )温度 传感 器采集温度 数据 ,实时 在
OL E D 更新 显 示 ; 【 关 键 词 】M S P 4 3 0 G 2 5 5 3 温 度检 测 0 L E D显 示
… …
( 3 )L E D 高 温报 警 循 环 闪烁 。
3 硬 件 设 计
本 系 统 以 MS P 4 3 0 G 2 5 5 3单 片机 为 核 心 ,
和 监 控 已 不 可 缺 少 。 针 对 这 种 实
U 挪 P O 强 W E & R 叠 h D 鳓 D o c 卜 — — 一 誊 匡 蘸≯
一 | 。
| …
际 情 况,本 文设 计并 实现 了基 于 M S P 4 3 0 G 2 5 5 3 单 片机 的温度检测 显 示 系 统 , 重 点 介 绍 了 电 源 稳 压 电
( AD) 转 换 芯 片 或 带 AD 功 能 的 单 片 机 。 综
合考虑 ,本文设计的测温系统最终选用 带有模
数功能的 1 6位 通 用 单 片 机 M S P 4 3 0 G2 5 5 3作
温 度 检 测 模 块 选 用 的 是 DS 1 8 B 2 0数
字 温 度 芯 片 进 行 温 度 的检 测 和 采 集。 所 使
路,D S 1 8 B 2 0温 度 检 测 电路 ,0 L E D 显 示 电路 以 及 核 心 单 片机 的 硬 件

MSP430G2553寄存器资料分析

MSP430G2553寄存器资料分析

MSP430G2553学习笔记常用赋值运算符:清除:&=~ ,置位:|= ,测试:&= ,取反:^= ,看门狗模块:WDT(看门狗)WDTCTL 看门狗定时器控制寄存器15--8 7 6 5 4 3 2 1 0口令HOLD NMIES NMI TMSEL CNTCL SSEL IS1 IS0IS1,IS0 选择看门狗定时器的定时输出,T是WDTCNT的输入时钟源周期0 T x 2(15)1 T x 2(13)2 T x 2(9)3 T x 2(6)SSEL 选择WDTCNT的时钟源0 SMCLK1 ACLKIS0、IS1、SSEL可确定WDT定时时间,WDT只能定时8种和时钟源相关的时间WDT可选的定时时间(晶体为32768HZ,SMCLK=1MHZ)SSEL IS1 IS0 定时时间/ms0 1 1 0.056 Tsmclk x 2(6)0 1 0 0.5 Tsmclk x 2(9)1 1 1 1.9 Taclk x 2(6)0 0 1 8 Tsmclk x 2(13)1 1 0 16 Taclk x 2(9)0 0 0 32 Tsmclk x 2(15)(PUC复位后的值)1 0 1 250 Taclk x 2(13)1 0 0 1000 Taclk x 2(15)CNTCL当该位为1时,清除WDTCNTTMSEL 工作模式选择0 看门狗模式1 定时器模式NMI 选择RST/NMI引脚功能,在PUC后被复位0 RST/NMI引脚为复位端1 RST/NMI引脚为边沿触发的非屏蔽中断输入NMIES 选择中断的边沿触发方式0 上升沿触发NMI中断1 下降沿触发NMI中断HOLD 停止看门狗定时器工作,降低功耗0 WDT功能激活1 时钟禁止输入,计数停止WDT(看门狗)配置语句WDTCTL=WDTPW+WDTHOLD;//将WDTPW+WDTHOLD赋值给WDTCTL,关闭看门狗定时器控制寄存器(Stop watchdogtimer)IE1 |= WDTIE;//使能WDT中断WDTCTL = WDT_ADL Y_1000;//WDT 1 s / 4间隔计时器WDTCTL = WDTPW + WDTHOLD + WDTNMI + WDTNMIES;//WDTCTL 由高8位口令和低8位控制命令组成,要写入操作WDT的控制命令,出于安全原因必须先正确写入高字节看门狗口令。

我们所用的MSP430G2553...

我们所用的MSP430G2553...

电设工作小结之——MSP430G2553学习笔记——1一,MSP430G2553单片机的各个功能模块(一),IO口模块,1,我们所用的MSP430G2553有两组IO口,P1和P2。

2,IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN,IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。

3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。

所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。

4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。

注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。

程序如下:void IO_interrupt_init() //IO中断初始化函数{P1REN |= BIT4+BIT5+BIT6+BIT7; // pull up 内部上拉电阻使能//使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断P1OUT = BIT4+BIT5+BIT6+BIT7; // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来//0:下拉,1:上拉P1IE |= BIT4+BIT5+BIT6+BIT7; // interrupt enabled P13中断使能P1IES |= BIT4+BIT5+BIT6+BIT7; // Hi/lo edge 下降沿中断//P1IES &= ~BIT3; //上升沿触发中断P1IFG &= ~(BIT4+BIT5+BIT6+BIT7); //中断标志位清零}5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。

基于MSP430G2553的光纤传感高温测量系统

基于MSP430G2553的光纤传感高温测量系统
201 3拄
仪 表 技 术 与 传 感 器
I n s t r u me nt Te c h ni qu e a n d S e ns o r
201 3 No . 9
第 9期
基 于 MS P 4 3 0 G 2 5 5 3的光 纤 传 感 高温 测 量 系统
张晓 颖 , 段 中华 , 李向昭, 孟 兆坤 , 孙元 平
实 时 测 量 曲 线 。 加 入 了无 线 通 信 模 块 N R F 2 4 L 0 1 , 实现 了非 接 触远 程 测 量 , 测 量 精 度 为 ±0 . 5  ̄ C, 测 量 范 围为 4 0 0~ 1 2 0 0  ̄ C. 测量次数为 5 0次 / s , 满 足 各 高温 测 量 应 用场 合 。
关键 词 : 光 纤传 感器 ; 高温测量 ; MS P 4 3 0 G 2 5 5 3 ; 非接触远程测 量; N R F 2 4 L 0 1 中图分类号 : T H 8 1 1 文献标识码 : A 文章编号 1 0 0 2—1 8 4 1 ( 2 0 1 3 ) 0 9— 0 0 5 2— 0 3
Ab s t r a c t : I n o r d e r t o a c h i e v e h i g h t e mp e r a t u r e me a s u r e me n t o f t h e o p t i c a l f i b e r s e n s i n g, a l o w— p o we r mi e r o c o n t r o l l e r MS P 4 3 0 G 2 5 5 3 w a s u s e d a s t h e ma s t e r c h i p . T h e s i g n l a c o n d i t i o n i n g c i r c u i t w a s d e s i g n e d wh i c h u s e d a r a i l — t o — r a i l o p e r a t i o n a l a m— p l i i f e r a s a s i g n a l p r o c e s s i n g u n i t a n d t h e mi c r o c o n t ol r l e r p mg r a m nd a h o s t c o mp u t e r p r o g r a m we r e c o mp i l e d . T a k i n g t h e c h a n g i n g p r o c e s s e s o f me a s u i r n g t h e t e mp e r a t u r e o f t h e h e a t i n g w i r e s a e x a mp l e , t h e s y s t e m’ S r e l— a t i me me a s u r e me n t c u r v e wa s p r o v i d e d . T h e wi r e l e s S c o mmu n i c a t i o n mo d u 1 e NRF 2 4 L 01 wa s a d d e d t o a c h i e v e n 0 n — c o n t a c t r e n 1 o t e n 1 e a s u I l e me n t s . T h e me a s u I l e me n t a c c u mc v i s

MSP430G2553时钟,MSP430G2553时钟配置

MSP430G2553时钟,MSP430G2553时钟配置

MSP430G2553 时钟,MSP430G2553 时钟配置MSP430G2553 系统时钟和振荡器时钟系统由基本时钟模块提供支持,此时钟模块支持一个32768Hz 手表晶体振荡器、一个内部超低功耗低频振荡器和一个内部数字控制振荡器(DCO)。

基本时钟模块专为同时满足低系统成本及低功耗要求而设计。

内部DCO 提供了一个快速接通时钟源并可在不到1&micro;s 的时间里实现稳定。

基本时钟模块提供了以下时钟信号:&bull;辅助时钟(ACLK),此时钟由一个32768Hz 手表晶振或内部LF 振荡器提供信号源。

&bull;主时钟(MCLK),CPU 所采用的系统时钟。

&bull;系统子时钟(SMCLK),外设模块所采用的子系统时钟。

用于校准DCO 输出频率的DCO 设定值存储于信息内存的A 段中。

主DCO 特性MSP430G2553 时钟1,MSP430G2553 能做到超低功耗,合理的时钟模块是功不可没的。

但是功能强大的时钟模块设置起来也相对复杂一些。

2,MSP430G2553 的时钟源有:(1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz~8MHz;(2),外接高速晶振XT2CLK:8MHz;(3),内部数字控制振荡器DCO:是一个可控的RC 振荡器,频率在0~16MHz;(4),超低功耗低频振荡器VLO:不可控,4~20KHz 典型值为12KHz;3,时钟模块:430 的时钟模块有MCLK SMCLK ACLK :(1),主系统时钟MCLK:提供给MSP430 的CPU 时钟。

可以来自LFXT1CLK XT2CLK DCO VLO 可选,默认为DCO。

(2),子系统时钟SMCLK:提供给高速外设。

可以来自LFXT1CLK XT2CLK DCO VLO 可选,默认为DCO。

(3),辅助系统时钟ACLK:提供给低速外设。

MSP430G2553数据手册

MSP430G2553数据手册

8
512 2x TA3
8
8
256 2x TA3
8
8
256 2x TA3
8
8
256 2x TA3
8
8
512 2x TA3
8
-

USCI A0/B0
时钟
I/O 封装类型
24 32-QFN
28 引脚
24 TSSOP 封
LF,DC

1
O,VL
20 引脚
O
16 TSSOP 封

16
20 引脚 PDIP 封装
LF,DC

1
O,VL
20 引脚
O
16 TSSOP 封

16
20 引脚 PDIP 封装
24 32-QFN
28 引脚
24 TSSOP 封
LF,DC

1
O,VL
20 引脚
O
16 TSSOP 封

16
20 引脚 PDIP 封装
24 32-QFN
28 引脚
24 TSSOP 封
LF,DC

1
O,VL
20 引脚
3
MSP430G2x53 MSP430G2x13
ZHCS178D – APRIL 2011 – REVISED NOVEMBER 2011

器件引出脚配置、MSP430G2x13 和 MSP430G2x53、20 引脚器件、 TSSOP 和 PDIP 封装
DVCC 1 P1.0/TA0CLK/ACLK/A0/CA0 2 P1.1/TA0.0/UCA0RXD/UCA0SOMI/A1/CA1 3 P1.2/TA0.1/UCA0TXD/PUCA0SIMO/A2/CA2 4 P1.3/ADC10CLK/CAOUT/VREF-/VEREF-/A3/CA3 5 P1.4/SMCLK/UCB0STE/UCA0CLK/VREF+/VEREF+/A4/CA4/TCK 6 P1.5/TA0.0/UCB0CLK/UCA0STE/A5/CA5/TMS 7

MSP430G2553定时器,MSP430G2553有几个定时器

MSP430G2553定时器,MSP430G2553有几个定时器

MSP430G2553 定时器,MSP430G2553 有几个定时器
MSP430G2553 有几个定时器
MSP430G2553 具有两个16 位的定时器:TImer0_A TImer1_A。

分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。

可以产生定时中断,也可以产生PWM。

分别有对应的寄存器控制。

定时器有三种工作模
式:1.连续计数模式2.增计数模式3. 增减计数模式。

配置定时器时候,首先要选择相应的时钟源。

在TACTL 寄存器的TASSELx 标志位控制,我们寻则SMCLK 作为源(2MHz),然后进行一个2 分频,最终震荡频率1MHz。

定时器a 图解
3.连续计数模式(产生一个中断标志)
计数器将直接计数到计数器所能计数的最大值0FFFFH 之后重新返回零,再次计数。

返回零的同时产生一个TAIFG 中断标志。

如图
4 增减计数模式(产生两个中断标志)
当计数器计数到跟TACCR0 一样的之后,然后从TACCR0 开始又减少,直到为零,然后又开始增。

当计数跟TACCR0 一样的时候产生一个中断标志CCIFG,当减到为零的时候又产生一个中断标志TAIFG。

如图:
两个定时器接线信号说明:。

MSP430G2553制作的自行车测度系统

MSP430G2553制作的自行车测度系统

MSP430G2553制作的自行车测度系统一,功能介绍:本系统主要用于安装在自行车上测量自行车的运行速度和行驶距离。

然后将速度和距离信息显示在显示在LCD显示屏上。

(1) 处理器选用的是TI的MSP430G2553 单片机(2)测速装置选用的是霍尔器件,在车圈上固定一个磁铁,然后430连接霍尔器件,通过输入捕获功能测量车轮的转动输出的脉冲的周期在加上事先计算出车轮的直径就可计算出车子的运行速度和行驶距离(3)显示屏选用的是NOKIA5110 LCD的显示屏,此显示屏的成本比较低,可以满足我的显示要求。

(4)整个系统有两个按键,一个是距离清零按键,按下该按键可以将显示的距离清零,这样方便测量起始地和目的地的距离,另外一个按键是用于打开LCD的背光的,用于夜晚使用。

当夜晚光线比较暗时,按下该按键LCD的背光打开,方便看清楚显示的东西。

在按一下背光熄灭。

(5)整个系统的供电的用到2节7号电池供电,当平常车子没有运行的时候,430处于低功耗状态。

耗电比较少,现在测速系统已将安装在我车子上正常工作3个月了二,系统框图图1是整个系统的框图. LCD显示屏和MSP430G2553的连接采用的SPI接口,霍尔传感器和按键和430之间是IO口连接。

三,系统原理图图2是整个系统的原理图四,程序代码//******************************************************************* ***********#include#include#include#includeunsigned char Count, First_Time;unsigned int REdge1, REdge2, FEdge;unsigned char MST_Data, SLV_Data;#define DC P2OUT = P2OUT|(1<<5)#define SCE P2OUT = P2OUT|(1<<4)#define CLK_H P1OUT=P1OUT|(1<<5)#define CLK_L P1OUT=P1OUT&(~(1<<5))#define Data_H P1OUT=P1OUT|((1<<7))#define Data_L P1OUT=P1OUT&(~(1<<7))#define u8 unsigned char#define u16 unsigned inttypedef struct{u8 x;u8 y;}point;/*------5110屏幕尺寸和功能宏定义------*/#define DATA 1 //数据#define CMD 0 //命令#define LCD_X 84 //液晶屏横坐标宽度#define LCD_ROW LCD_X //液晶屏列宽度void LCD_write_byte(unsigned char dat, unsigned char command); void LCD_init(void);void LCD_init(void);void LCD_set_XY(unsigned char X, unsigned char Y);void LCD_clear(void);void LCD_write_char(unsigned char c);void LCD_write_String(unsigned char X,unsigned char Y,unsigned char *s); void LCD_write_byte(unsigned char dat, unsigned char command){unsigned int i;// LCD_SCE = 0; //5110片选有效,允许输入数据P2OUT &=~BIT4;if (command == 0) //写命令// LCD_DC = 0;P2OUT &=~BIT5;else // LCD_DC = 1;P2OUT |=BIT5;//写数据for (i=0;i<8;i++){CLK_L;//spi_clk=0;if((dat & 0x80)==0x80){Data_H;}else{Data_L;}CLK_H; // spi_clk=1;dat=(dat<<1);}P2OUT |=BIT4;}void LCD_init(void){P2OUT &=~BIT4;P1OUT &= ~BIT4;P1OUT |= BIT4;LCD_write_byte(0x21, 0); // LCD模式设置:芯片活动,水平寻址,使用扩展指令LCD_write_byte(0xc8, 0); // 设置液晶偏置电压LCD_write_byte(0x06, 0); // 温度校正LCD_write_byte(0x13, 0); // 1:48LCD_write_byte(0x20, 0); // 使用基本命令,V=0,水平寻址LCD_clear(); // 清屏LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示P2OUT |=BIT4;}void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x80 | X, 0); // X 行(横坐标)LCD_write_byte(0x40 | Y, 0); // column 列(纵坐标)}/*------------------------------------------//LCD_clear: LCD清屏函数--------------------------------------------*/void LCD_clear(void){unsigned char t;unsigned char k;LCD_set_XY(0,0);for(t=0;t<6;t++){for(k=0;k<84;k++){LCD_write_byte(0x00,1);}}}void LCD_write_char(unsigned char c){unsigned char i;c-=0x20; //ASCII码减去 0x20for (i=0; i<6; i++)LCD_write_byte(ASCII_6_8[c], 1);}void LCD_write_String(unsigned char X,unsigned char Y,unsigned char *s){LCD_set_XY(X,Y);while (*s) //等效*s!='\0'{LCD_write_char(*s);s++;}}static float speed;static unsigned char display[10];static unsigned char display2[10];static unsigned int temp ;static unsigned int distance=0;static float Period;static float Distance_km;int main(void){volatile unsigned int i;unsigned char lcd_buf[6][84];WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP1DIR |= BIT0; // P1.0/LED OutputP1OUT &= ~BIT0; // LED offif (CALBC1_8MHZ==0xFF) // If calibration constant erased {while(1); // do not load, trap CPU!!}DCOCTL = 0; // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_8MHZ; // Set DCO to 8MHzDCOCTL = CALDCO_8MHZ;P1DIR &= ~BIT2;P1SEL |= BIT2;P2DIR &= ~BIT2;P2DIR &= ~BIT1;P2IES |=BIT2+BIT1;P2IE |=BIT2+BIT1;P1DIR |= BIT0;P1DIR|=BIT4|BIT5|BIT7;TA0CCTL1 = CAP + CM_3 + CCIE + SCS + CCIS_0;TA0CTL |= TASSEL_1 + MC_2 + TACLR; // ACLK, Cont Mode; start timer Count = 0x0;First_Time = 0x01;P2OUT = 0x00;P2DIR |=BIT5+BIT4 ;P1DIR |=BIT4 ;_EINT();P1OUT &= ~BIT4; // Now with SPI signals initialized,P1OUT |= BIT4; // reset slaveLCD_init(); //初始化LCD模块LCD_clear(); //清屏幕LCD_write_String(0,1,"Speed:");LCD_write_String(60,1,"km/h");LCD_write_String(0,3,"Dista:");while(1){__bis_SR_register(LPM0_bits+GIE); // Enter LPM0 Period = REdge2 - REdge1; // Calculate Period speed = 1.0362*(32768/Period)*3.6;memset(display,0,sizeof(display));sprintf((char*)display,"%4.1f",speed);LCD_write_String(36,1," ");LCD_write_String(36,1,display);LCD_write_String(60,1,"km/h");LCD_write_String(50,3," ");Distance_km=(float)distance*2.073656/1000.0;if(Distance_km<1){LCD_write_String(34,3," ");Distance_km=Distance_km*1000;sprintf((char*)display2,"%d",(int)Distance_km); LCD_write_String(44,3,display2);}else{LCD_write_String(36,3," ");sprintf((char*)display2,"%6.3f",Distance_km); LCD_write_String(34,3,display2);LCD_write_String(72,3,"km");}}}// TA0_A1 Interrupt vector#pragma vector = TIMER0_A1_VECTOR__interrupt void TIMER0_A1_ISR (void){switch(__even_in_range(TA0IV,0x0A)){case TA0IV_NONE: break; // Vector 0: No interrupt case TA0IV_TACCR1: // Vector 2: TACCR1 CCIFG// distance++;if (TA0CCTL1 & CCI) // Capture Input Pin Status {distance++;if (!Count){REdge1 = TA0CCR1;Count++;}else{REdge2 = TA0CCR1;Count=0x0;__bic_SR_register_on_exit(LPM0_bits +GIE); // Exit LPM0 on return to main }if (First_Time)First_Time = 0x0;}else{if(!First_Time){FEdge = TA0CCR1;}}break;default: break;}}#pragma vector=PORT2_VECTOR__interrupt void PORT2 (void){unsigned int i;for(i=0;i<20000;i++);if(P2IFG&BIT1){distance=0;while(!(P2IN&BIT1));}if(P2IFG&BIT2){P1OUT=P1OUT^BIT0;while(!(P2IN&BIT2));}P2IFG=0x00;__bic_SR_register_on_exit(LPM0_bits +GIE); // Exit LPM0 on return to main }#define LCD_X 84 //液晶屏横坐标宽度#define LCD_ROW LCD_X //液晶屏列宽度。

MSP430正弦波峰峰值检测 12864显示

MSP430正弦波峰峰值检测 12864显示
_delay_cycles(100);
}
/***********************************************************
*名 称:LCD_pos()
*功 能:设置液晶的显示位置
*入口参数:x:第几行,1~4对应第1行~第4行
* y:第几列,0~15对应第1列~第16列
write_dat(zifu[dis%10]);
write_dat('V');
maxr=0;
i_data<<=1;
}
i_data=cmd;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID_0;
if(i_data&0x80)
}
i_data=cmd;
i_data<<=4;
for(i=0;i<8;i++)
{
SID_0;
if(i_data&0x80)
SID_1 ;
write_dat(zifu[dis/10000]);
write_dat('.');
write_dat(zifu[dis/1000%10]);
write_dat(zifu[dis/100%10]);
write_dat(zifu[dis/10%10]);
i_data=0xfa;
SCLK_0;
for(i=0;i<8;i++)
{
SID_0;
if(i_data&0x80)

基于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的基本指标的障碍物距离测试,能够实现障碍物距离的实时显示,精确到厘米。

当被测距离小于预设报警值是,红灯亮起,提示距离过近。

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

电子设计综合实验项目报告项目名称: MCU交流电压参数测量小组成员:林伊、武正浩学号:20111112、20111201目录项目要求 (3)题目 (3)要求 (3)基本要求 (3)发挥部分 (3)实现思路 (4)放大 (4)频率 (4)A/D: (6)显示: (6)代码 (7)主程序: (7)lcd头文件 (10)项目要求题目:交流电压参数的测量要求:用给定的MCU:msp430g2553,制作交流电压参数测试设备图表 1基本要求:一、 用给定运放LM324制作一放大器a) 增益大于:20dBb) 带宽大于:100KHz二、 用指定MCU 和已制作的放大器制作频率计a) 测量范围:10Hz~100KHzb) 显示:3位以上发挥部分:一、 用A/D 测量已给电压的幅度,信号由已制作的放大器输入a) 测量范围:输入信号越小越好信号发生器实现思路放大:首先分析题目要求,要实现放大20dB,频率1~100KHz的信号,通过公式20lg(Ad)得出Ad=10,即放大10倍必须使用运放lm324实现,则需要知道该芯片的器件参数,即增益带宽积。

通过数据手册得知其增益带宽积为 6.4MHz,除去放大倍数得知能够实现该信号的放大,通过设计放大电路并焊接即可,放大电路为反向比例放大电路,见Figure 1Figure 1频率:实现频率的测量,这一块需使用到MCU,测量频率的方法有很多种,通过捕捉上升沿下降沿产生中断,也可以不产生中断,还可通过时钟计数。

其中通过捕捉上升沿下降沿的思路又分两种,1、检测上升沿后再检测下一个上升沿(检测下降沿后再检测下一个下降沿)2、检测上升沿后再检测下降沿(检测下降沿后再检测上升沿)。

这些思路对应不同的采集方法又可以细分,其中方案1对于测量高频信号有着较好的效果,方案2对于测低频的信号较好,前提是占空比为50%,若不为则变为测脉宽。

这次的题目我采用的是用时钟计数的方式,msp430g2553中含有2个时钟,timer0和timer1,每个时钟都有如下功能,选择时钟来源:1、外部时钟(即外部输入的方波信号)2、ACLK 3、smclk等。

其中ACLK为外部所焊晶振,频率为32768Hz。

由上述条件我使用timer0和timer1同时工作来进行频率的测量,首先外部晶振属于手表晶振,极易产生1s中断,我首先用timer1产生1s中断,再用timer0选择使用外部时钟源计数,也就是需要被我们计数的信号输入,这样每一次上升沿,timer0计数器就会加一。

这样每秒中断读取timer0中寄存器的值就可以得出精确度极高的频率,甚至都不需要换算。

此种方案简便易于实现,故选用。

流程图:Figure 2方案选择完毕,考虑如何把正弦信号转换成方波信号输入MCU,此部分在考虑信号发生器只输出正电的时候,即正弦信号在0电位之上,我们可以完全不用设计任何外部电路,因为MCU内部有施密特触发器,可以将正弦输入变成方波,但是如果有负电压输入则会损坏MCU。

实际中由于LM324我们只允许单电源供电,且放大电路为反向比例放大电路,所以只放大了输入信号的负半周,并且将其搬到正半轴,所以输入到单片机的是只有正的电压,如图:Figure 3所以不需要外部焊接电路实现波形转换,但是由于本课程是为北京电设做准备,本着此原则我组成员决定还是设计并焊接一个外部电路来实现波形转换。

波形转换有两种方法:1、使用过零比较器2、使用施密特触发器。

由于本题目对输入信号的频率有要求,过零比较器涉及到运放,所以在频率上有限制,为保证频率不影响实现,我们选用数字的电路即施密特触发器,数字电路一般频率可以达到几十兆,所以肯定能够符合要求,见下图:Figure 4A/D:本题发挥部分要求采集正弦信号的峰值,所以涉及A/D转换部分,由于输入信号频率在10Hz~100KHz,由于采样定理,采样频率必须为被采样信号的两倍,虽然实际中最好为十倍,我们最后还是采用了两倍。

Msp430g2553此款芯片A/D采集过程若要稳定起码需要30个时钟,我的A/D模块选用时钟源smclk,其频率为8MHz,则8MHz除去30约为267KHz,其大于100KHz的两倍,基本满足要求,在之前采集频率的过程中我们有产生一个1s中断,A/D平常每采集一次便把采集的值与最大值比较,把最大值留下,1s选取一次最大值显示,并把之前最大值清除。

显示:显示我们采用LCD1602,采用四条数据线,三条控制线,在保证MCU引脚够用的前提下进行显示。

代码主程序:#include <msp430g2553.h>#include "LCD1602_Driver.h"#include <math.h>unsigned int FRE=0;unsigned char flag1=0;unsigned char flag2=0;unsigned int adc_sample=0;unsigned int adc_max=0;unsigned int temp=0;uchar LCDBuf1[6];//uchar LCDBuf2[5];uchar LCDBuf2[]={"HZ"};uchar LCDBuf3[]={"MV"};void main(){WDTCTL = WDTPW + WDTHOLD;DCOCTL |= ( DCO0 + DCO1 );DCOCTL |= ( MOD4 + MOD3 + MOD2 + MOD1 + MOD0);//微调DCOCLK BCSCTL1 |= ( RSEL0 + RSEL2 + RSEL3);//14.8M SMCLKIO_Init();LCD_Init();//测频初始TA0CTL |= TASSEL_0 + MC_1;TA0CCR0 = 0xffff;TA1CTL |= TASSEL_1 + MC_1 + TAIE;TA1CCR0 = 32767;TA1CCTL0 |= CCIE;P1DIR &= ~BIT0;P1SEL |= BIT0;__bis_SR_register(GIE);while(1){if(0==flag1){;}else{flag1=0;TA0CTL |= TACLR;TA0CTL = TASSEL_0 + MC_1;TA1CTL = TASSEL_1 + MC_1 + TAIE;}while(0==flag1);flag1=0;//显示频率for(int i=0;i<5;i++){temp = FRE/(10000/(unsigned int)(pow(10,i)));LCDBuf1[i] = temp + '0';FRE = FRE%(10000/(unsigned int)(pow(10,i)));}LCDBuf1[5] = 0;LCD_Disp_string(0,0,LCDBuf1);LCD_Disp_string(5,0,LCDBuf2);//测幅初始flag2=1;TA1CTL = TASSEL_1 + MC_1 + TAIE;TA1CCR0 = 32767;//打开时钟//ADC10CTL0 = SREF_0 + ADC10SHT_2 + MSC + ADC10ON + ADC10IE;//ADC10CTL1 = INCH_1 + ADC10SSEL_3 + CONSEQ_2;//ADC10AE0 = 0x02;//ADC10DTC0 = ADC10B1;//ADC10DTC1 = 0xC8;//ADC10CTL0 &= ~ENC; // 先关闭adc,待到BUSY位清零,每次都必须等待//while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active //ADC10SA = (unsigned int)adc_sample; // Data buffer start//ADC10CTL0 |= ENC + ADC10SC;ADC10CTL0 = SREF_0 + ADC10SHT_2 + MSC + ADC10ON;ADC10CTL1 = INCH_1 + ADC10SSEL_3 + CONSEQ_0;ADC10AE0 = 0x02;ADC10CTL0 |= ADC10ON;do{ADC10CTL0 |= ENC+ADC10SC;while((ADC10CTL0 &ADC10IFG)==0);adc_sample = ADC10MEM;if(adc_max<adc_sample){adc_max = adc_sample;}}while(0==flag1);adc_max = adc_max*(3300/1023);//while(0==flag1);flag2=0;/*//筛选for(int i=0;i<200;i++){if(adc_sample[i]>adc_max){adc_max=adc_sample[i];}}*///显示幅值for(int i=0;i<5;i++){temp = adc_max/(10000/(unsigned int)(pow(10,i)));LCDBuf1[i] = temp + '0';adc_max = adc_max%(10000/(unsigned int)(pow(10,i))); }LCDBuf1[5] = 0;LCD_Disp_string(0,1,LCDBuf1);LCD_Disp_string(5,1,LCDBuf3);adc_max = 0;}}// Timer A1 interrupt service routine#pragma vector=TIMER1_A0_VECTOR__interrupt void Timer1_A (void){if(0==flag2){TA0CTL = 0;TA1CTL = 0;TA1CTL |= TACLR;FRE=TA0R;flag1=1;TA0CTL = TASSEL_0 + MC_0;TA1CTL = TASSEL_1 + MC_0;//TA0CTL |= TACLR;//TA0CTL = TASSEL_0 + MC_1;//TA1CTL = TASSEL_1 + MC_1 + TAIE;//测了一次还没开}else{TA1CTL = TASSEL_1 + MC_0;flag1=1;}}// ADC10 interrupt service routine#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR (void){flag1=1;ADC10CTL0 &= ~ENC;}lcd头文件//#include "msp430g2553.h"#define SET_LCD_1602_E P2OUT |= 0x04 //P2.2 #define CLR_LCD_1602_E P2OUT &= ~0x04#define SET_LCD_1602_RS P2OUT |= 0x01 //P2.0 #define CLR_LCD_1602_RS P2OUT &= ~0x01#define SET_LCD_1602_RW P2OUT |= 0x02 //P2.1 #define CLR_LCD_1602_RW P2OUT &= ~0x02#define LCD_IO_OUT P1OUT#define LCD_IO_DIR P1DIR#define LCD_IO_IN P1IN#define LCD_IO_SEL P1SEL#define uchar unsigned char#define uint unsigned intvoid IO_Init(void);void LCD_Init(void);void LCD_Check_busy(void); //检测LCD是否在忙,即能否接收数据和指令void LCD_Write_Command(uchar command);void LCD_Write_Data(uchar dat);void LCD_Set_xy( uchar x, uchar y );uchar LCD_Read_Sta(void);uchar LCD_Read_Data(uchar x,uchar y);void User_def_char(uchar n,uchar *s); //输入用户自定义字符(5*8点阵字符),0~7共8个字符void LCD_Disp_char(uchar x,uchar y,uchar dat);void LCD_Disp_string(uchar x,uchar y,uchar *s);uchar large=0; //当large为1时,为5*8点阵;为0时,为5*10点阵void IO_Init(void){LCD_IO_SEL &=~ 0xF0;//LCD_IO_DIR |= 0x07 ;P2DIR |= 0x07;P2SEL &=~ 0x07;}void LCD_Init(void){LCD_Write_Command(0x28);LCD_Write_Command(0x0F);LCD_Write_Command(0x06);LCD_Write_Command(0x01);}void LCD_Check_busy(void){uchar flag=0x80;flag &= LCD_Read_Sta();while(flag == 0x80){__delay_cycles(100);flag &= LCD_Read_Sta();}void LCD_Write_Command(uchar command){LCD_Check_busy();CLR_LCD_1602_RS;CLR_LCD_1602_RW;CLR_LCD_1602_E;uchar temp;temp = command & (0x3C);if((temp==(0x26))||(temp==(0x2C))||(temp==(0x36))||(temp==(0x3C))) large = 0; //为5*10点阵elselarge = 1;LCD_IO_DIR |= 0xF0;LCD_IO_OUT = (command&(0XF0))+(LCD_IO_OUT&(0x0F));SET_LCD_1602_E;CLR_LCD_1602_E;command <<= 4;LCD_IO_OUT = (command&(0XF0))+(LCD_IO_OUT&(0x0F));SET_LCD_1602_E;CLR_LCD_1602_E;}void LCD_Write_Data(uchar dat){LCD_Check_busy();SET_LCD_1602_RS;CLR_LCD_1602_RW;CLR_LCD_1602_E;LCD_IO_DIR |= 0xF0;LCD_IO_OUT = (dat&(0XF0))+(LCD_IO_OUT&(0x0F));SET_LCD_1602_E;CLR_LCD_1602_E;dat <<= 4;LCD_IO_OUT = (dat&(0XF0))+(LCD_IO_OUT&(0x0F));SET_LCD_1602_E;CLR_LCD_1602_E;}void LCD_Set_xy(uchar x,uchar y){uchar address;if (y == 0)address = 0x80 + x;elseaddress = 0xC0 + x;LCD_Write_Command(address);}uchar LCD_Read_Sta(void){uchar sta;CLR_LCD_1602_RS; //读入状态信息高四位数据SET_LCD_1602_RW;CLR_LCD_1602_E;LCD_IO_DIR &=~ 0xF0;SET_LCD_1602_E;__delay_cycles(10);sta = LCD_IO_IN;CLR_LCD_1602_E;SET_LCD_1602_E; //读入状态信息低四位数据__delay_cycles(10);uchar temp;temp = LCD_IO_IN;CLR_LCD_1602_E;sta &= 0xF0;temp >>= 4;temp &= 0x0F;sta = sta + temp;return(sta);}uchar LCD_Read_Data(uchar x,uchar y){uchar dat;LCD_Set_xy(x,y); //确定读取数据坐标SET_LCD_1602_RS; //读取数据高四位SET_LCD_1602_RW;CLR_LCD_1602_E;LCD_IO_DIR &=~ 0xF0;SET_LCD_1602_E;__delay_cycles(10);dat = LCD_IO_IN;CLR_LCD_1602_E;SET_LCD_1602_E; //读取数据低四位__delay_cycles(10);uchar temp;temp = LCD_IO_IN;CLR_LCD_1602_E;dat &= 0xF0;temp >>= 4;temp &= 0x0F;dat = dat + temp;return(dat);}void User_def_char(uchar n,uchar *s){int i;char addr = 0x40;n <<= 3;addr += n;for(i=0;i<8;i++,addr++){LCD_Write_Command(addr);LCD_Write_Data( *s );s++;}}void LCD_Disp_char(uchar x,uchar y,uchar dat) {LCD_Set_xy(x,y);LCD_Write_Data(dat);}void LCD_Disp_string(uchar x,uchar y,uchar *s) {LCD_Set_xy(x,y);while (*s){LCD_Write_Data( *s );s++;}}。

相关文档
最新文档