- #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)
2019-11-25 19:06 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|