- #include <msp430.h>
- #include <stdint.h>
- #include "uart.h"
- #include "Flash.h"
- #include "ad.h"
- #include "stdio.h"
- #include "string.h"
- #define CPU_F ((double)1000000)
- #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 ledon P8OUT &= ~BIT0
- #define ledoff P8OUT |= BIT0
- uint8_t led_flag=0;
- uint8_t sendstr[]={"hello\r\n"};
- uint8_t cstr[]={"\r\n"};
- uint8_t FlashSetBuf[FLASH_LEN]={"123456"};
- uint8_t RxBuf1[FLASH_LEN];
- uint16_t Cap_num;
- uint16_t num_start=0,num_end=0;
- void p1_isr_init(void);
- void timerA0_init(void);
- void initClock(void);
- void Init_Rtc(void);
- void TA0_PWM(uint16_t per,uint16_t duty);
- void TA1_CAP(void);
- void main(void)
- {
- uint16_t len;
- uint16_t value;
- WDTCTL = WDTPW + WDTHOLD; //关闭看门狗定时器
- uint8_t sec,min,hour;
- uint8_t sstr[30];
- uint8_t adstr[30];
- uint8_t capstr[30];
- float v;
- // initClock();
- P8DIR |= BIT0; //设置P8.0口为输出模式
- ledoff;
- p1_isr_init();
- // timerA0_init();
- UART_Init();
- Init_Rtc();
- AD_Init();
- FlashErase(FLASH_ADR,WORD,FLASH_LEN); //擦除写入Flash中的数据
- FlashWriteWord(FLASH_ADR,FlashSetBuf,FLASH_LEN); //双字节写入函数
- FlashRead(FLASH_ADR,RxBuf1,WORD,FLASH_LEN); //Flash读取函数
- bcUartSend(RxBuf1,FLASH_LEN);
- bcUartSend(cstr,2);
- TA0_PWM(1049-1,500-1);
- TA1_CAP();
- while (1)
- {
- if(USART_RX_STA&0x8000)
- {
- len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- bcUartSend(USART_RX_BUF,len);
- bcUartSend(cstr,2);
- USART_RX_STA=0;
- }
- ADC12CTL0 |= ADC12SC; //开始采样转换
- value = ADC12MEM0; //把结果赋给变量
- v=value*3.0/4096;
- sec = RTCSEC;
- min = RTCMIN;
- hour= RTCHOUR;
- sprintf(sstr,"Time: %02x:%02x:%02x \r\n",hour,min,sec);
- sprintf(adstr,"AD: %d V:%.2fV \r\n",value,v);
- if(Cap_num)
- {
- sprintf(capstr,"Cap: %d \r\n",Cap_num);
- bcUartSend(capstr,strlen(capstr));
- TA1CCTL1 |=CCIE;
- Cap_num=0;
- }
- bcUartSend(adstr,strlen(adstr));
- bcUartSend(sstr,strlen(sstr));
- delay_ms(1000);
- }
- }
- void timerA0_init(void)
- {
- TA0CTL |= MC_1 + TASSEL_2 + TACLR; //时钟为SMCLK,比较模式,开始时清零计数器 smclk 12MHZ aclk
- TA0CCTL0 = CCIE; //比较器中断使能
- TA0CCR0 = 1000; //比较值设为1000,相当于1ms的时间间隔
- __enable_interrupt();
- }
- void p1_isr_init(void)
- {
- P1REN |= BIT2; // 使能P1.2上拉电阻
- P1OUT |= BIT2; // P1.2口置高电平
- P1IES &= ~BIT2; // 中断沿设置(下降沿触发)
- P1IFG &= ~BIT2; // 清P1.2中断标志
- P1IE |= BIT2; // 使能P1.2口中断
- __bis_SR_register(GIE); // 进入低功耗模式4 开中断
- }
- // P1中断函数
- #pragma vector=PORT1_VECTOR
- __interrupt void Port_1(void)
- {
- delay_ms(10);
- if((P1IN & BIT2)==0)
- {
- if(!led_flag)ledon; //改变LED1灯状态
- else ledoff;
- led_flag=~led_flag;
- }
- P1IFG &= ~BIT2; //清P1.2中断标志位
- }
- uint16_t t=0;
- /************************定时器中断函数********************************/
- #pragma vector = TIMER0_A0_VECTOR
- __interrupt void Timer_A (void)
- {
- t++;
- if(t>1000)
- {
- t=0;
- P8OUT ^= BIT0; //形成闪灯效果
- }
- //P8OUT ^= BIT0; //形成闪灯效果
- }
- void initClock(void)
- {
- UCSCTL6 &= ~XT1OFF; //启动XT1
- P5SEL |= BIT2 + BIT3; //XT2引脚功能选择
- UCSCTL6 &= ~XT2OFF; //打开XT2
- PMMCTL0_H = 0xA5; //开PMM电源管理
- SVSMLCTL |= SVSMLRRL_1 + SVMLE; //配置SVML电压
- PMMCTL0 = PMMPW + PMMCOREV_2; //配置内核电压
- while((PMMIFG & SVSMLDLYIFG ) == 0); //等待设置完成
- PMMIFG &= ~(SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);
- if((PMMIFG & SVMLIFG) == 1) //判断内核电压是否上升到VSVML
- while((PMMIFG & SVMLVLRIFG) == 0); //如果没有等待
- SVSMLCTL &= ~SVMLE; //关掉SVML模块
- PMMCTL0_H = 0X00; //锁存配置
- __bis_SR_register(SCG0);
- UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
- UCSCTL1 = DCORSEL_4; //DCO频率范围在28.2MHZ以下
- UCSCTL2 = FLLD_4 + 1; //D=16,N=1
- UCSCTL3 = SELREF_5 + FLLREFDIV_3; //n=8,FLLREFCLK时钟源为XT2CLK;DCOCLK=D*(N+1)*(FLLREFCLK/n);DCOCLKDIV=(N+1)*(FLLREFCLK/n);
- UCSCTL4 = SELA_4 + SELS_3 +SELM_3; //ACLK的时钟源为DCOCLKDIV,MCLK\SMCLK的时钟源为DCOCLK
- UCSCTL5 = DIVA_5 +DIVS_4; //ACLK由DCOCLKDIV的32分频得到,SMCLK由DCOCLK的2分频得到
- //最终MCLK:16MHZ,SMCLK:1MHZ,ACLK:32KHZ
- __bic_SR_register(SCG0); //Enable the FLL control loop
- }
- void Init_Rtc(void)
- {
- // BCD码日历格式输出
- RTCCTL01 = RTCBCD + RTCHOLD + RTCMODE + RTCTEV_0;
- RTCSEC = 0x54; //初始化秒
- RTCMIN = 0x59 ; //初始化分钟
- RTCHOUR =0x21; //初始化小时
- RTCDOW = 0x02 ;
- RTCDAY = 0x24; //日期初始化
- RTCMON = 0x11 ; //初始化月份
- RTCYEAR = 0x2005; //初始化年份
- RTCCTL01 &= ~RTCHOLD; //打开RTC模块
- }
- void TA0_PWM(uint16_t per,uint16_t duty)
- {
- //Initialize
- P1SEL |= BIT2+BIT3+BIT4+BIT5; //从P1.2输出
- P1DIR |= BIT2+BIT3+BIT4+BIT5;
- //初始化定时器
- TA0CTL |= TASSEL_2 + MC_1 ;
- TA0CCTL0 = OUTMOD_7 + CCIE;
- TA0CCTL1 = OUTMOD_7;
- TA0CCTL2 = OUTMOD_7;
- TA0CCTL3 = OUTMOD_7;
- TA0CCTL4 = OUTMOD_7;
- TA0CCR0 = per/*Period*/; //Change me
- TA0CCR1 = duty/*Duty*/; //Change me
- TA0CCR2 = duty/*Duty*/; //Change me
- TA0CCR3 = duty/*Duty*/; //Change me
- TA0CCR4 = duty/*Duty*/; //Change me
- __enable_interrupt();
- }
- void TA1_CAP(void)
- {
- P2DIR&=~BIT0; //捕捉P2.0口 cc1
- P2SEL |= BIT0;
- P2REN |= BIT0; //启用P2.0内部下拉电阻
- TA1CCTL1 |= CAP + CM_1 + CCIS_0 + SCS + CCIE;//捕获模式,上升都捕获,选择CCI2A,同步,捕获中断开
- TA1CTL |= TASSEL_2 + MC_2 + ID_0 + TACLR; //SMCLK=1M,连续计数模式
- }
- /************************定时器中断函数********************************/
- #pragma vector = TIMER1_A1_VECTOR
- __interrupt void Timer_A1 (void)
- {
- if(TA1CCTL1&CM_1) //捕获到下降沿
- {
- TA1CTL|=TACLR;
- TA1CCTL1=(TA1CCTL1&(~CM_1))|CM_2; //改为上升沿捕获:CM1置零,CM0置一
- }
- else if(TA1CCTL1&CM_2) //捕获到上升沿
- {
- Cap_num=TA1CCR1; //记录下结束时间
- TA1CCTL1 &=~CCIE; //改为下降沿捕获:CM0置零,CM1置一
- TA1CTL|=TACLR;
- }
- }
复制代码 全部资料51hei下载地址:
myproj0.zip
(235.38 KB, 下载次数: 71)
|