程序1
#include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容 P1DIR |= BIT3; // 设置P1.3为输出脚 TACCTL0 |= CCIE; // 允许比较/捕获模块0的中断 TACCR0 = 3277-1; //100ms约3277个ACLK周期 TACTL = TASSEL_1 + MC_1; //TA设为增计数模式,时钟=ACLK _EINT(); LPM3; } #pragma vector=TIMERA0_VECTOR __interrupt void TACCR0_ISR (void) // 计至TACCR0中断 { P1OUT ^= BIT3; // P1.3取反 } 程序2 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容 P1DIR |= BIT3+BIT1+BIT4; // 设置P1.3、P1.1、P1.4为输出脚 TACCR0 = 32768-1; // 1秒=32768个ACLK周期 TACCR1 = 6554-1; // 0.2秒=6554个ACLK周期 TACCR2 = 29938-1; // 0.7秒=29938个ACLK周期 TACTL = TASSEL_1 + MC_1; // TA设为增计数模式,时钟=ACLK TACTL |= TAIE; // 允许TA溢出中断 TACCTL1 |= CCIE; // 允许比较/捕获模块1的中断 TACCTL2 |= CCIE; // 允许比较/捕获模块2的中断 _EINT(); while(1) { // CPU可以执行其他任务 } } #pragma vector=TIMERA1_VECTOR __interrupt void TA_ISR(void) { switch( TAIV ) { case 2: P1OUT &=~( BIT3+BIT1+BIT4); P1OUT |= BIT1; //TACCR1~TACCR2阶段只亮绿灯 break; case 4: P1OUT &=~( BIT3+BIT1+BIT4); P1OUT |= BIT4; //TACCR2~0阶段只亮蓝灯 break; case 10: P1OUT &=~( BIT3+BIT1+BIT4); P1OUT |= BIT3; //0~TACCR1阶段只亮红灯 break; } } 程序3 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容 P1DIR |= BIT3 + BIT4; // 设置P1.3、P1.4为输出脚 TACTL |= MC_1 + TASSEL_1 + ID_0; //定时器TA设为增量计数模式,ACLK TACCR0=328-1; //PWM总周期 =328个ACLK周期约等于100Hz TACCR1=246; //TA1占空比 = 246/328= 75% TACCR2=164; //TA2占空比 = 164/328= 50% TACTL |= TAIE; // 允许TA溢出中断 TACCTL1 |= CCIE; // 允许比较/捕获模块1的中断 TACCTL2 |= CCIE; // 允许比较/捕获模块2的中断 _EINT(); while(1) { //... ... // CPU可以执行其他任务 } } #pragma vector=TIMERA1_VECTOR __interrupt void TA_ISR(void) { switch( TAIV ) { case 2: P1OUT &=~ BIT3; //计至TACCR1,P1.3置低 break; case 4: P1OUT &=~ BIT4; //计至TACCR2,P1.4置低 break; case 10: P1OUT |=( BIT3 + BIT4); //计至TACCR0,置高 break; } } 程序4 #include int Result; int TA_OverflowCnt; //TA溢出次数存放变量 unsigned long int ExeTime; //执行时间存放变量 /**************************************************************** 运行时间待测函数1:求两个浮点数之和 ****************************************************************/ float FloatSum(float x ,float y) /*226个指令周期*/ { return(x+y); } /**************************************************************** 运行时间待测函数2:求两个定点数之和 ****************************************************************/ int IntSum(int x ,int y) /*17个指令周期*/ { return(x+y); } /**************************************************************** 运行时间待测函数3: 软件延时 ****************************************************************/ void Delay() /*774030个指令周期*/ { int i,j; for(i=0;i<1234;i++) { for(j=0;j<123;j++); } } void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容 _EINT(); // 总中断允许 while(1) { //-------------------------测量定时器的固有延迟------------------------- TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA清零并开始计时 TACTL = TASSEL_2 + MC_0; // TA停止计时 ExeTime=TAR; // 读取TA计数值,就是固有延迟时间 _NOP(); // 在这一行设断点观察 //-----------------------测量浮点求和函数的执行时间---------------------- TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA清零并开始计时 Result=FloatSum(12345 ,12456); // 执行待测函数1 TACTL = TASSEL_2 + MC_0; // TA停止计时 ExeTime=TAR; // 读取TA计数值,就是执行时间 _NOP(); // 在这一行设断点观察 //-----------------------测量定点求和函数的执行时间------------------- TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA清零并开始计时 Result= IntSum(12345 ,12456); // 执行待测函数2 TACTL = TASSEL_2 + MC_0; // TA停止计时 ExeTime=TAR; // 读取TA计数值,就是执行时间 _NOP(); // 在这一行设断点观察 //----------------------测量延迟和函数的执行时间-------------------- TA_OverflowCnt=0; // 长执行时间函数TA会溢出,用一变量计数溢出次数 TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA清零并开始计时 Delay(); // 执行待测函数3 TACTL = TASSEL_2 + MC_0; // TA停止计时 ExeTime=TA_OverflowCnt*65536+TAR; // 读取TA计数值及溢出次数,计算执行时间
设计资源 培训 开发板 精华推荐
- LM2902VDTBR2G 函数发生器运算放大器的典型应用
- 黄淮学院创客空间立创杯电子设计大赛-马帅阳-1002306A
- 2.9寸墨水屏驱动板(已验证)
- DC2437A,使用 LT3066 低噪声线性稳压器的演示板,有源输出放电,1.8V = VIN = 45V,Vout = 1.2/1.5/1.8/2.0/2.5/3.3/5V @ 500mA
- 用于手机的 4-LED 白光 LED 驱动器
- 验证CS5434 ADC芯片
- 基于SCLT3-8BQ7的高速数字输入限流器评估板
- DC261A-A,用于 LT1795CSW 高速调制解调器、差分线路驱动器/接收器的演示板
- LT1021BCN8-10 由电流源驱动的负分流基准的典型应用
- 采用双层 TO-220 封装的 5V 1A、低 EMI、效率达 94% 的直流/直流模块参考设计