您好!
我想了解该固件、以了解测量频率采集的工作原理。
可以有人帮助我吗?
如何查看 P1.5引脚输入端的测量频率?
此致、
请单击包含源代码的链接:
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我想了解该固件、以了解测量频率采集的工作原理。
可以有人帮助我吗?
如何查看 P1.5引脚输入端的测量频率?
此致、
请单击包含源代码的链接:
你好
我正在使用端口1 p1.0中断引脚来对流脉冲进行计数。
在基本计时器 BT (temp ++;)生成5秒后、我执行流量测量:
Q =脉冲/计时器。
浮点流量=(仪表的底部刻度 x 脉冲 x 3600 x 1000)/温度;
3600 x 1000、单位为 m3/h
例如: 计算得出的10.15 Hz 等于36.353 m3/h。
我的代码:10.15 Hz 等于 25.456 m3/h、精确测量时不会振荡。
我意识到、由于使用 XTAL1 32.768kHz 晶体、它非常缓慢且不准确。
也许 XTAL2由于频率更快,我可以获得更好的结果,但我尝试通过 slac118l.zip 示例进行配置,无法使其正常工作。。。 我想我不知道如何正确配置。
我还在想对74HC590输入端的脉冲进行计数,并使用计时器 A 来精确计时... 我认为毫秒或微秒会得到更好的结果。
同事必须告诉我什么?
您好!
我能够汇编此代码、但我没有得到结果等待! 例如:计算出的频率与示波器上显示的频率不同、其中生成的频率为10Hz、测量频率为20Hz。
生成的频率为16.6Hz、测量频率为513Hz!
我有没有做错了?
我还想知道在捕获模式中是否正确设置了计时器?
是否可以在 LPM3模式下工作?
#include #include #include #include #include volatile unsigned int count、Edge1、period;//全局变量 float freq; unsigned char string_freq[10]; volatile unsigned int i; //定义- tostar flag de TX da USCI 0 e usci1 */ #define tosta_TX_CR () while (!(IFG2 & UTXIFG1))); // // // Definições e Inicialização da Comunicação Serial RS232 DO Data Logger //// ********* // void initRS232 (void) { P4SEL |= 0x03; // P4.1、0 = USART1 TXD/RXD ME2 |= UTXE1 + URXE1; //启用 USART1 TXD/RXD U1CTL |=字符; // 8位字符 U1TCTL |= SSEL0; // UCLK = ACLK U1BR0 = 0x03; // 32k/9600 - 3.41 U1BR1 = 0x00; // U1MCTL = 0x4A; //调制 U1CTL &=~SWRST; //初始化 USART 状态机 IE2 |= URXIE1; //启用 USART1 RX 中断 } //********* // // Rotina para Transmissão Serial DO Data Logger //// ********* // void msg_rs232_cr (unsigned char *字符串) //通过 UCA0通过 RS232通过 UMA 字符串 ,而(*字符串!= 0) { Testa_TX_CR ();// tista 标志 de TX TXBUF1 =*字符串; *string++; }// while string } void main (void) { WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器 FLL_CTL0 |= XCAP14PF; //配置负载电容 //等待 xtal 以稳定 执行 { IFG1 &=~OFIFG; //清除 OSCFault 标志 对于(I = 0x47FF;I > 0;I-); //标志置位 } while ((IFG1 & OFIFG)的时间; // OSCFault 标志仍然置1? P1DIR &=~BIT2;//设置 P1.2 ->输入 P1SEL |= BIT2;//设置 P1.2 -> TA0.1捕获模式 //P1DIR &=~BIT0;//设置 P1.0 ->输入 //P1SEL |= BIT0;//设置 P1.0 -> TA0捕获模式 MSP430FG4618 initrs232(); //初始化 o RS232 TA0CCTL1 = CAP + CM_1 + CCIE + SCS + CCIS_0;//捕获模式、上升沿、中断 //启用、同步、源-> CCI0A //TACTL = tassel_1 + MC_2 + TAIE + TACLR; // ACLK、续 模式、 TA0CTL |= TASSEL_2 + MC_2 + TACLR;//时钟-> SMCLK、续 模式、清除计时 器 while (1) { 计数= 0;//初始化新捕捉的计数 _bis_SR_register (LPM0_bits + GIE);//输入 LPM0、启用中断 //在捕获到2个上升沿后退出 LPM0 如果(Edge2 > Edge1)//发生溢出时忽略计算 { 句点= Edge2 - Edge1;//计算周期 频率= 1000000L/周期; //计算频率 MSG_RS232_CR ("频率:"); //对串频率进行瞬态处理 sprintf (string_freq、"%.2f"、freq); MSG_RS232_CR (string_freq); MSG_RS232_CR ("\r\n"); } __no_operation();//用于在调试器 中插入断点} // Timer_A3中断矢量(TAIV)处理程序 #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__) #pragma vector=TIMERA1_vector __interrupt void Timer_A (void) #Elif Defined (__GNC_systems_icon_)#pragma COMPIENTICTOR (void)(void)(void TI_RA1_)(void)(void)(void)(void)(void TI_timer_A)(void)(void) #endif { switch (TAIV) { 案例2:if (!count)//检查计数值 { Edge1 = TA0CCR1; //存储第一个边沿的定时器值 count++;//递增计数 } 其他 { Edge2 = TA0CCR1; //存储第二个边沿的定时器值 计数= 0;//重置计数 __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//返回 main 时退出 LPM0 } 中断; //使用 TACCR1 案例4:中断; //未使用 TACCR2 案例10:中断; //溢出 } // #pragma vector = TIMER0_A1_vector __interrupt void TIMER0_A1_ISR (void) { switch (__even_in_range (TA0IV、0x0A) ){ case TA0IV_none:break;//向量0:无中断 情况 TA0IV_TACCR1://向量2:TACCR1 CCIFG if (!count)//检查 count 的值 { Edge1 = TA0CCR1;//存储第一个边沿的定时器值 count ++;//递增 count } 其他 { Edge2 = TA0CCR1;//存储第二个边沿的定时器值 计数= 0;//重置计数 __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//返回 main 时退出 LPM0 } break; case TA0IV_TACCR2:break;//向量4:TACCR2 CCIFG case TA0IV_6:break;//向量6:保留 CCIFG 大小写 TA0IV_8:break;//向量8:保留 CCIFG 大小写 TA0IV_TAIFG:break;//向量10:TAIFG 默认值:break; } } */
感谢 Bruce 的支持!
是的、我需要测量刻度为0.001 m3/h 的脉冲式水表的流量
我在互联网上找到了这个代码示例、并选择对其进行测试、发现测得的最低频率为200Hz。
您能否按所说的那样进行配置?
/********* //* 实验4C -频率测量 */ * */ * */ * */ /* MSP430教学 ROM // //*由以下公司生产:MSP430@UBI Group - www.msp430.ubi.pt */ * */ /*练习:使用 MSP-EXP430FG4618开发工具和*/ //* MSP430FG4618器件、执行频率测量 */ * */ /*说明: */ * */ *完成以下代码: */ *-配置基本定时器1 */ *-配置 Timer_A */ *-配置 Timer_B // /*-配置 P1、P2和 P3 */ * */ * */ * */ * 德州仪器2009版权所有 */ ********* /#include #include "lcd_defs.h" //******** //全球数据 //********* unsigned char 标志、捕获、计数器、tick; unsigned int T、 T1、T2、freq; //********* // LCD 中的写入频率(Hz) //******** void lcd_freq (void) { unsigned int freq1、freq2、freq3、freq4; 频率= 7995392/T; freq1 = freq/1000; freq2 = freq % 1000; switch (freq1)//切换到写入频率第一位 { case 1:P4_A1; 中断; 案例2:P4_A2; 中断; 案例3:P4_A3; 中断; 案例4:P4_A4; 中断; 案例5:P4_A5; 中断; 案例6:P4_A6; 中断; 案例7:P4_A7; 中断; 案例8:P4_A8; 中断; 案例9:P4_A9; 中断; 案例0:P4_A0; break; } freq3 = freq2 % 100; freq2 = freq2 / 100; 开关(freq2)//切换到写入秒频率数字 { 案例1:P3_A1; 中断; 案例2:P3_A2; 中断; 案例3:P3_A3; 中断; 案例4:P3_A4; 中断; 案例5:P3_A5; 中断; 案例6:P3_A6; 中断; 案例7:P3_A7; 中断; 案例8:P3_A8; 中断; 案例9:P3_A9; 中断; 情况0:P3_A0; } freq4 = freq3 % 10; freq3 = freq3 / 10; 开关(freq3)//切换到写入秒频率数字 { 案例1:P2_A1; 中断; 案例2:P2_A2; 中断; 案例3:P2_A3; 中断; 案例4:P2_A4; 中断; 案例5:P2_A5; 中断; 案例6:P2_A6; 中断; 案例7:P2_A7; 中断; 案例8:P2_A8; 中断; 案例9:P2_A9; break; case 0:P2_A0; } switch (freq4)//切换到写入秒频率数字 { 案例1:P1_A1; 中断; 案例2:P1_A2; 中断; 案例3:P1_A3; 中断; 案例4:P1_A4; 中断; 案例5:P1_A5; 中断; 案例6:P1_A6; 中断; 案例7:P1_A7; 中断; 案例8:P1_A8; 中断; 案例9:P1_A9; 中断; 案例0:P1_A0; } } //******** //液晶屏清洁例程 //******** void LCD_all_off (void) { LCDM2 = 0x00; LCDM3 = 0x00; LCDM4 = 0x00; LCDM5 = 0x00; LCDM6 = 0x00; LCDM7 = 0x00; LCDM8 = 0x00; LCDM9 = 0x00; LCDM10 = 0x00; LCDM11 = 0x00; LCDM12 = 0x00; LCDM13 = 0x00; } //********* // Timer A 中断服务例程 //********* #pragma vector=TIMERRA1_Vector __INTERRUPT void TimerA1_ISR (void) { switch (TAIV) { case TAIV_TACCR1: if (capture ==0){ T1 = TACCR1; FLAG = 1; 捕捉= 1; } 否则{ 如果(flag = 1){ T2 = TACCR1; 如果(T2 > T1) T = T2-T1; } 否则{ tar = 0; } 捕捉= 0; 标志= 0; } 中断; 案例 TAIV_TACCR2: 中断; 案例 TAIV_TAIFG: tick++; 如果(tick ==60){ lcd_freq(); 节拍= 0; } 如果(flag = 1) flag = 0; 中断; 默认值: 中断; } // ********* //基本定时器中断服务例程。 以1秒的周期运行 //********* #pragma vector=BASICTIMER_VECTOR __INTERRUPT void basic_timer_ISR (void) { unsigned int read_data; //从文件中读取数据,频率以 kHz 为单位 P2OUT^= 0x06;//将 LED1和 LED2 COUNTER++进行齿形操作; if (counter == 5){ 计数器= 0; READ_DATA = 200; TBCCR0 = 7995392/READ_DATA; TBCCR4 = TBCCR0/2; } // //主例程 //********* void main (void) { //停止看门狗 WDTCTL = WDTPW | WDTHOLD; //停止 WDT // FLL+配置// ACLK - 32.768kHz FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set、freq = xtal x D x N+1 SCFI0 |= FN_4; // x2 DCO 频率、8MHz 标称 DCO SCFQCTL = 121; //(121+1) x 32768 x 2 = 7.99MHz //端口 COM0-COM1-COMM2-COM3配置 P5DIR |= 0x1E; //端口 P5.2、P5.3和 P5.4作为输出 P5SEL |= 0x1E; //端口 P5.2、P5.3和 P5.4作为特殊功能(COM1、COM2和 COM3) // S0-S21端口配置 LCDAPCTL0 = LCDS24 | LCDS20 | LCDS16 | LCDS12 | LCDS8 | LCDS4; // LCDA 配置 LCDACTL = LFREQ_192 | LCDMUX | LCD4SON //(ACLK = 32768)/192、4路复用 LCD、LCD_A 打开、 LCDAVCTL0 = LCDCPEN 上的段; //电荷泵使能 LCDAVCTL1 = VLCD_3_44; // VLCD = 3.44V LCD_All_OFF (); //基本定时器1配置 BTCTL = BTDIV | BT_fCLK2_DIV128; //(ACLK/256)/128 IE2 |= BTIE; //启用周期为1秒的 BT 中断 // TimerB 配置 TBCCR0 = 39977;//输出200Hz 信号,50%占空比 TBR = 0;//复位 TBR TBCCTL4 = OUTMOD_3; // CCR4输出模式3 (置位/复位) TBCCR4 = TBCCR0/2; TBCTL = TBSSEL_2 | CNTL_0 | TBCLGRP_0 |MC_1 | ID_0; // SMCLK、连续模式 // TimerA 配置 TACTL = tassel_2 |MC_2 | ID_0 | TAIE;// SMCLK、连续模式高达0xFFFF TACCTL1 = CM1 | CCIS_0 | CAP | CCIE; //上升沿上的捕捉、电容模式、CAP/Com 中断使能 //选择 TACCR1输入信号 // TA1 (TACCR1)配置(端口1) P1SEL = 0x04; // P1.2作为特殊功能(TA1) P1DIR = 0x00; // P1.2作为输入 // LED1和 LED2配置(端口2) P2DIR = 0x06; // P2.2和 P2.1作为数字输出 P2OUT = 0x04; // LED1导通且 LED2关断 // TB4配置(端口3) P3SEL = 0x20; // P3.5作为特殊功能(TB4) P3DIR = 0x20; // P3.5作为输出 //全局数据初始 化计数器= 0; tick = 0; //启用中断 //_BIS_SR (GIE); //所有中断使能 __bis_SR_register (LPM0_bits + GIE);//输入具有中断使能 的低功耗模式0 (;); } //********* // Lab3d_solution .c 结束 //*********
感谢 Bruce 的建议!
这是一个测量1Hz 频率的代码。
现在、我需要更好地评估如何测量小于1Hz 的频率。
感谢大家的耐心!
#include #include #include #include #include #include #include #include "LCD16x2_Data_Logger.c" volatile int Temporizador = 0; unsigned char string_vazao[10]; unsigned char flag、capture、counter、 tick; unsigned int T、t1、t2; float freq = 0.0; float vazao = 0.0; //*************** // // Definições dos Pinos de Entrada e Saída Do MSP430 Do Data Logger //// ********* // void initPORTS (void) { P1OUT = 0; //所有 P1.x 复位 P1DIR = 0xFF; //所有 P1.x 输出 P2OUT = 0; //所有 P2.x 复位 P2DIR = 0xFF; //所有 P2.x 输出 P3OUT = 0; //所有 P3.x 复位 P3DIR = 0xFF; //所有 P3.x 输出 P4OUT = 0; //所有 P4.x 复位 P4DIR = 0xFF; //所有 P4.x 输出 P5OUT = 0; //所有 P5.x 复位 P5DIR = 0xFF; //所有 P5.x 输出 P6OUT = 0; //所有 P6.x 复位 P6DIR = 0xFF; //所有 P6.x 输出 P7OUT = 0; //所有 P7.x 复位 P7DIR = 0xFF; //所有 P7.x 输出 P8OUT = 0; //所有 P8.x 复位 P8DIR = 0xFF; //所有 P8.x 输出 P9OUT = 0; //所有 P9.x 复位 P9DIR = 0xFF; //所有 P9.x 输出 P10OUT = 0; //所有 P10.x 复位 P10DIR = 0xFF; //所有 P10.x 输出 // TA1 (TACCR1)配置(端口1) P1SEL = 0x04; // P1.2作为特殊功能(TA1) P1DIR = 0x00; // P1.2作为输入 // LED1和 LED2配置(Port2) P2DIR = 0x07; // P2.2和 P2.1作为数字输出 P2OUT &=~ 0x04; // LED1导通,LED2关断 P5DIR = 0x02; //定义 P5.1 como Saída P5OUT &=~ 0x02; // Zera o Pino LED4 P5OUT =!(BIT1); // Tensão 降级 a Conversão de 升压// ********* // // Definições e Inicialização da Comunicação Serial RS232 DO Data Logger //// ********* // void initRS232 (void) { P4SEL |= 0x03; // P4.1、0 = USART1 TXD/RXD ME2 |= UTXE1 + URXE1; //启用 USART1 TXD/RXD U1CTL |=字符; // 8位字符 U1TCTL |= SSEL0; // UCLK = ACLK U1BR0 = 0x03; // 32k/9600 - 3.41 U1BR1 = 0x00; // U1MCTL = 0x4A; //调制 U1CTL &=~SWRST; //初始化 USART 状态机 IE2 |= URXIE1; //启用 USART1 RX 中断 } //********* // // Definições e Inicialização do basic timer para Temporizações do Data Logger //// ********* // void initBT (void) { BTTCNT1 = BTTCNT2 = 0; BTTCTL = BTDIV + BT_fCLK2_DIV128;// Configura o Basic Timer IE2 |= BTIE;// Habilita o Basic Timer } //********* // // Rotina para Transmissão Serial DO Data Logger //// ********* // void msg_rs232_cr (unsigned char *字符串) //通过 UCA0通过 RS232通过 UMA 字符串 ,而(*字符串!= 0) { Testa_TX_CR ();// tista 标志 de TX TXBUF1 =*字符串; *STRING++; }// while string } //********* // Rotina de Conversão dos Dados do Canal de Pressão Manom é trica para Apresentação no Display LCD 16X4 do Data Logger // // void Mostra_Vazao (float Vazao) { sprintf (string_vazao、"%.2f"、Vazao); LCDSetPosition (0、1); LCDPrintString ("频率计"); LCDSetPo1、2 (1); LCDPrintString (":"); // Escreve Q: LCDSetPosition (1、6); // Posiciona para escrita do Valor de Vazão 无 LCD16x2 LCDPrintString (string_vazao); // Asesa o Valor da Vazão 无 LCD16x2 LCDSetPosition (1、13); // Posiciona para escria da Unidade de Vazão 无 LCD16x2 LCDPrintString ("Hz"); // Escreve a Unidade de Vazão no LCD16x2 } // // LCD 中的写入频率(Hz) //******** void lcd_freq (void) { freq = 32768L/(float) T; } void main (void) { volatile unsigned int j; WDTCTL = WDTPW + WDTHOLD; //停止 WDT //时钟默认值:MCLK = 32 x ACLK = 1MHz,FLL+操作 FLL_CTL0 |= XCAP14PF; //配置负载电容器 执行 { IFG1 &=~OFIFG; //清除 OSCFault 标志 对于(j = 0x47FF;j > 0;j-); //标志置位 } while ((IFG1 & OFIFG)的时间; // OSCFault 标志仍然置1? initPORTS();//初始化操作系统端口 initBT();//初始化 o BT initRS23();//初始化 o RS232 P5OUT &=~ 0x02;// Habitabila o MAX761CPA para Conversão de Tensão InitLCD (); LCDPrintString ("Testando..."); __delay_cycles (50000); LCDSetPosition (1、0); LCDPrintString ("Display LCD16X2"); __DELAY_CYCLLES (50000); LCDClear (); // TimerA 配置 TACTL = tassel_1 |MC_2 | ID_0 | TAIE;// SMCLK、持续模式高达0xFFFF TACCTL1 = CM1 | CCIS_0 | CAP | CCIE; //上升沿上的捕捉、电容模式、CAP/Com 中断使能 //选择 TACCR1输入信号 执行// Rotina Principal { _bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Mdo de Baixo Consumo) _NO_OPERATION ();// Não FAZ nada } while (1);// Enquantto adjustment for < Que 38、garante o LPM3 __bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Modo de Baixo Consumo) } //--------------- //基本定时器的中断服务例程:在 CCI2B 上开始捕获 //自动清除标志 //--------------- #pragma vector = BASICTIMER_Vector __interrupt void BASICTIMER_ISR (void) { // Temporizador++; if (Temporizador == 5) { Temporizador = 0; // Reseta Temporizador vazao =(freq * 0.001 * 3600); //转换 A Vazão Mostra Vazao (vazao); // Apresa a Vazão } */ Motra_Vazao (freq); // Apresa a Vazão } //******** // Timer A 中断服务例程 //********* #pragma vector=TIMERRA1_Vector __INTERRUPT void TimerA1_ISR (void) { switch (TAIV) { case TAIV_TACCR1: 如果(CAPTURE ==0) { T1 = TACCR1; FLAG = 1; 捕捉= 1; } 其他 { 如果(标志= 1) { T2 = TACCR1; 如果(T2 > T1) T = T2-T1; lcd_freq(); } 其他 { tar = 0; } 捕捉= 0; 标志= 0; } 中断; 案例 TAIV_TACCR2: break; 案例 TAIV_TAIFG: tick++; 如果(节拍== 60) { lcd_freq(); 节拍= 0; } 如果(标志= 1) 标志= 0; 中断; 默认值: 中断; } }
谢谢 Bruce! 您的说明对我的学习非常重要! 代码按我喜欢的方式运行! 此致 、#include #include #include #include #include #include #include #include "LCD16x2_Data_Logger.c" volatile int Temporizador = 0; unsigned char string_freq[10]; unsigned char flag、capture、counter、 tick; unsigned int T、t1、t2; float freq = 0.0; //************* // // Definições dos Pinos de Entrada e Saída Do MSP430 Do Data Logger //// ********* // void initPORTS (void) { P1OUT = 0; //所有 P1.x 复位 P1DIR = 0xFF; //所有 P1.x 输出 P2OUT = 0; //所有 P2.x 复位 P2DIR = 0xFF; //所有 P2.x 输出 P3OUT = 0; //所有 P3.x 复位 P3DIR = 0xFF; //所有 P3.x 输出 P4OUT = 0; //所有 P4.x 复位 P4DIR = 0xFF; //所有 P4.x 输出 P5OUT = 0; //所有 P5.x 复位 P5DIR = 0xFF; //所有 P5.x 输出 P6OUT = 0; //所有 P6.x 复位 P6DIR = 0xFF; //所有 P6.x 输出 P7OUT = 0; //所有 P7.x 复位 P7DIR = 0xFF; //所有 P7.x 输出 P8OUT = 0; //所有 P8.x 复位 P8DIR = 0xFF; //所有 P8.x 输出 P9OUT = 0; //所有 P9.x 复位 P9DIR = 0xFF; //所有 P9.x 输出 P10OUT = 0; //所有 P10.x 复位 P10DIR = 0xFF; //所有 P10.x 输出 // TA1 (TACCR1)配置(端口1) P1SEL = 0x04; // P1.2作为特殊功能(TA1) P1DIR = 0x00; // P1.2作为输入 // LED1和 LED2配置(Port2) P2DIR = 0x07; // P2.2和 P2.1作为数字输出 P2OUT &=~ 0x04; // LED1导通,LED2关断 P5DIR = 0x02; //定义 P5.1 como Saída P5OUT &=~ 0x02; // Zera o Pino LED4 P5OUT =!(BIT1); // Tensão 降级 a Conversão de 升压// ********* // // Definições e Inicialização da Comunicação Serial RS232 DO Data Logger //// ********* // void initRS232 (void) { P4SEL |= 0x03; // P4.1、0 = USART1 TXD/RXD ME2 |= UTXE1 + URXE1; //启用 USART1 TXD/RXD U1CTL |=字符; // 8位字符 U1TCTL |= SSEL0; // UCLK = ACLK U1BR0 = 0x03; // 32k/9600 - 3.41 U1BR1 = 0x00; // U1MCTL = 0x4A; //调制 U1CTL &=~SWRST; //初始化 USART 状态机 IE2 |= URXIE1; //启用 USART1 RX 中断 } //********* // // Definições e Inicialização do basic timer para Temporizações do Data Logger //// ********* // void initBT (void) { BTTCNT1 = BTTCNT2 = 0; BTTCTL = BTDIV + BT_fCLK2_DIV128;// Configura o Basic Timer IE2 |= BTIE;// Habilita o Basic Timer } //********* // // Rotina para Transmissão Serial DO Data Logger //// ********* // void msg_rs232_cr (unsigned char *字符串) //通过 UCA0通过 RS232通过 UMA 字符串 ,而(*字符串!= 0) { Testa_TX_CR ();// tista 标志 de TX TXBUF1 =*字符串; *STRING++; }// while string } //********* // Rotina de Conversão dos Dados do Canal de Pressão Manom é trica para Apresentação no Display LCD 16X4 do Data Logger // // void Mostra_freq (float Freq) { sprintf (string_freq、"%.2f"、Freq); LCDSetPosition (0、2); LCDPrintString ("频率计"); LCDSetPosition (1、2); LCDPrintString (" F:"); LCDSetPosition (1、6); LCDPrintString (string_freq); LCDSetPosition (1、13); LCDPrintString ("Hz"); } // // LCD 中的写入频率(Hz) //******** void lcd_freq (void) { freq = 4096L/(float) T; } void main (void) { volatile unsigned int j; WDTCTL = WDTPW + WDTHOLD; //停止 WDT //时钟默认值:MCLK = 32 x ACLK = 1MHz,FLL+操作 FLL_CTL0 |= XCAP14PF; //配置负载电容器 执行 { IFG1 &=~OFIFG; //清除 OSCFault 标志 对于(j = 0x47FF;j > 0;j-); //标志置位 } while ((IFG1 & OFIFG)的时间; // OSCFault 标志仍然置1? initPORTS();//初始化操作系统端口 initBT();//初始化 o BT initRS23();//初始化 o RS232 P5OUT &=~ 0x02;// Habitabila o MAX761CPA para Conversão de Tensão InitLCD (); LCDPrintString ("Testando..."); __delay_cycles (50000); LCDSetPosition (1、0); LCDPrintString ("Display LCD16X2"); __DELAY_CYCLLES (50000); LCDClear (); // TimerA 配置 TACTL = tassel_1 |MC_2 | ID_3 | TAIE;// SMCLK、持续模式高达0xFFFF TACCTL1 = CM1 | CCIS_0 | CAP | CCIE; //上升沿上的捕捉、电容模式、CAP/Com 中断使能 //选择 TACCR1输入信号 执行// Rotina Principal { _bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Mdo de Baixo Consumo) _NO_OPERATION ();// Não FAZ nada } while (1);// Enquantto adjustment for < Que 38、garante o LPM3 __bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Modo de Baixo Consumo) } //--------------- //基本定时器的中断服务例程:在 CCI2B 上开始捕获 //自动清除标志 //--------------- #pragma vector = BASICTIMER_Vector __interrupt void BASICTIMER_ISR (void) { MOISRA_Freq (freq); // Apresa a Vazão } //******** // Timer A 中断服务例程 //********* #pragma vector=TIMERRA1_Vector __INTERRUPT void TimerA1_ISR (void) { switch (TAIV) { case TAIV_TACCR1: 如果(CAPTURE ==0) { T1 = TACCR1; FLAG = 1; 捕捉= 1; } 其他 { 如果(标志= 1) { T2 = TACCR1; 如果(T2 > T1) T = T2-T1; lcd_freq(); } 其他 { tar = 0; } 捕捉= 0; 标志= 0; } 中断; 案例 TAIV_TACCR2: break; 案例 TAIV_TAIFG: tick++; 如果(节拍== 60) { lcd_freq(); 节拍= 0; } 如果(标志= 1) 标志= 0; 中断; 默认值: 中断; } }