久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5029|回復: 0
打印 上一主題 下一主題
收起左側

MSP430F5529單片機程序整理(串口、AD、定時器等)

[復制鏈接]
跳轉到指定樓層
樓主
ID:185006 發表于 2019-11-25 19:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <msp430.h>
  2. #include <stdint.h>
  3. #include "uart.h"
  4. #include "Flash.h"
  5. #include "ad.h"
  6. #include "stdio.h"
  7. #include "string.h"

  8. #define CPU_F                            ((double)1000000)
  9. #define delay_us(x)                      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  10. #define delay_ms(x)                      __delay_cycles((long)(CPU_F*(double)x/1000.0))
  11. #define ledon                              P8OUT &= ~BIT0
  12. #define ledoff                             P8OUT |= BIT0

  13. uint8_t led_flag=0;
  14. uint8_t sendstr[]={"hello\r\n"};
  15. uint8_t cstr[]={"\r\n"};

  16. uint8_t FlashSetBuf[FLASH_LEN]={"123456"};
  17. uint8_t RxBuf1[FLASH_LEN];
  18. uint16_t Cap_num;
  19. uint16_t num_start=0,num_end=0;

  20. void p1_isr_init(void);
  21. void timerA0_init(void);
  22. void initClock(void);
  23. void Init_Rtc(void);
  24. void TA0_PWM(uint16_t per,uint16_t duty);
  25. void TA1_CAP(void);

  26. void main(void)
  27. {
  28.   uint16_t len;
  29.   uint16_t value;
  30.   WDTCTL = WDTPW + WDTHOLD;      //關閉看門狗定時器
  31.   uint8_t sec,min,hour;
  32.   uint8_t sstr[30];
  33.   uint8_t adstr[30];
  34.   uint8_t capstr[30];
  35.   float v;
  36. //  initClock();
  37.   P8DIR |= BIT0;                //設置P8.0口為輸出模式
  38.   ledoff;
  39.   p1_isr_init();
  40. //  timerA0_init();
  41.   UART_Init();
  42.   Init_Rtc();
  43.   AD_Init();

  44.   FlashErase(FLASH_ADR,WORD,FLASH_LEN);                                                                //擦除寫入Flash中的數據
  45.   FlashWriteWord(FLASH_ADR,FlashSetBuf,FLASH_LEN);                                        //雙字節寫入函數
  46.   FlashRead(FLASH_ADR,RxBuf1,WORD,FLASH_LEN);                                                        //Flash讀取函數
  47.   bcUartSend(RxBuf1,FLASH_LEN);
  48.   bcUartSend(cstr,2);
  49.   TA0_PWM(1049-1,500-1);
  50.   TA1_CAP();

  51.   while (1)
  52.   {

  53.         if(USART_RX_STA&0x8000)
  54.         {
  55.                 len=USART_RX_STA&0x3fff;//得到此次接收到的數據長度
  56.                 bcUartSend(USART_RX_BUF,len);
  57.                 bcUartSend(cstr,2);
  58.                 USART_RX_STA=0;
  59.         }

  60.         ADC12CTL0 |= ADC12SC;                                                                                                                //開始采樣轉換
  61.         value = ADC12MEM0;                                                                                                                        //把結果賦給變量
  62.         v=value*3.0/4096;
  63.         sec = RTCSEC;
  64.         min = RTCMIN;
  65.         hour= RTCHOUR;

  66.         sprintf(sstr,"Time: %02x:%02x:%02x \r\n",hour,min,sec);
  67.         sprintf(adstr,"AD: %d V:%.2fV \r\n",value,v);
  68.     if(Cap_num)
  69.     {
  70.                 sprintf(capstr,"Cap: %d \r\n",Cap_num);
  71.                 bcUartSend(capstr,strlen(capstr));
  72.                 TA1CCTL1 |=CCIE;
  73.                 Cap_num=0;
  74.     }

  75.         bcUartSend(adstr,strlen(adstr));
  76.         bcUartSend(sstr,strlen(sstr));
  77.         delay_ms(1000);
  78.   }
  79. }
  80. void timerA0_init(void)
  81. {
  82.     TA0CTL |= MC_1 + TASSEL_2 + TACLR;             //時鐘為SMCLK,比較模式,開始時清零計數器   smclk 12MHZ aclk
  83.     TA0CCTL0 = CCIE;                                                //比較器中斷使能
  84.     TA0CCR0  = 1000;                                                //比較值設為1000,相當于1ms的時間間隔
  85.     __enable_interrupt();
  86. }
  87. void p1_isr_init(void)
  88. {
  89.          P1REN |=  BIT2;                           // 使能P1.2上拉電阻
  90.          P1OUT |=  BIT2;                           // P1.2口置高電平
  91.          P1IES &= ~BIT2;                           // 中斷沿設置(下降沿觸發)
  92.          P1IFG &= ~BIT2;                           // 清P1.2中斷標志
  93.          P1IE  |=  BIT2;                           // 使能P1.2口中斷
  94.          __bis_SR_register(GIE);                   // 進入低功耗模式4 開中斷
  95. }
  96. // P1中斷函數
  97. #pragma vector=PORT1_VECTOR
  98. __interrupt void Port_1(void)
  99. {
  100.         delay_ms(10);
  101.         if((P1IN & BIT2)==0)
  102.         {
  103.                 if(!led_flag)ledon;                                  //改變LED1燈狀態
  104.                 else ledoff;
  105.                 led_flag=~led_flag;
  106.         }
  107.         P1IFG &= ~BIT2;                         //清P1.2中斷標志位
  108. }
  109. uint16_t t=0;
  110. /************************定時器中斷函數********************************/
  111. #pragma vector = TIMER0_A0_VECTOR
  112. __interrupt void Timer_A (void)
  113. {
  114.         t++;
  115.         if(t>1000)
  116.         {
  117.                 t=0;
  118.                 P8OUT ^= BIT0;                                                        //形成閃燈效果
  119.         }
  120.         //P8OUT ^= BIT0;                                                        //形成閃燈效果
  121. }

  122. void initClock(void)
  123. {
  124.     UCSCTL6 &= ~XT1OFF; //啟動XT1
  125.     P5SEL |= BIT2 + BIT3; //XT2引腳功能選擇
  126.     UCSCTL6 &= ~XT2OFF;          //打開XT2
  127.     PMMCTL0_H = 0xA5;                                         //開PMM電源管理
  128.      SVSMLCTL |= SVSMLRRL_1 + SVMLE;                            //配置SVML電壓
  129.      PMMCTL0 =  PMMPW + PMMCOREV_2;                             //配置內核電壓
  130.      while((PMMIFG & SVSMLDLYIFG ) == 0);                       //等待設置完成
  131.      PMMIFG &= ~(SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);
  132.      if((PMMIFG & SVMLIFG) == 1)                                //判斷內核電壓是否上升到VSVML
  133.            while((PMMIFG & SVMLVLRIFG) == 0);                   //如果沒有等待
  134.      SVSMLCTL &= ~SVMLE;                                        //關掉SVML模塊
  135.      PMMCTL0_H = 0X00;                                          //鎖存配置
  136.     __bis_SR_register(SCG0);
  137.     UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
  138.     UCSCTL1 = DCORSEL_4;       //DCO頻率范圍在28.2MHZ以下
  139.     UCSCTL2 = FLLD_4 + 1;       //D=16,N=1
  140.     UCSCTL3 = SELREF_5 + FLLREFDIV_3;    //n=8,FLLREFCLK時鐘源為XT2CLK;DCOCLK=D*(N+1)*(FLLREFCLK/n);DCOCLKDIV=(N+1)*(FLLREFCLK/n);
  141.     UCSCTL4 = SELA_4 + SELS_3 +SELM_3;    //ACLK的時鐘源為DCOCLKDIV,MCLK\SMCLK的時鐘源為DCOCLK
  142.     UCSCTL5 = DIVA_5 +DIVS_4;      //ACLK由DCOCLKDIV的32分頻得到,SMCLK由DCOCLK的2分頻得到
  143.                 //最終MCLK:16MHZ,SMCLK:1MHZ,ACLK:32KHZ

  144.     __bic_SR_register(SCG0);                   //Enable the FLL control loop


  145. }

  146. void Init_Rtc(void)
  147. {
  148.         // BCD碼日歷格式輸出
  149.         RTCCTL01 = RTCBCD + RTCHOLD + RTCMODE + RTCTEV_0;
  150.         RTCSEC = 0x54; //初始化秒
  151.         RTCMIN = 0x59 ; //初始化分鐘
  152.         RTCHOUR =0x21; //初始化小時
  153.         RTCDOW = 0x02 ;
  154.         RTCDAY = 0x24; //日期初始化
  155.         RTCMON = 0x11 ; //初始化月份
  156.         RTCYEAR = 0x2005; //初始化年份
  157.         RTCCTL01 &= ~RTCHOLD; //打開RTC模塊
  158. }

  159. void TA0_PWM(uint16_t per,uint16_t duty)
  160. {
  161.         //Initialize
  162.         P1SEL |= BIT2+BIT3+BIT4+BIT5;                                                                                         //從P1.2輸出
  163.         P1DIR |= BIT2+BIT3+BIT4+BIT5;

  164.         //初始化定時器
  165.         TA0CTL |= TASSEL_2 + MC_1 ;
  166.         TA0CCTL0 = OUTMOD_7 + CCIE;
  167.         TA0CCTL1 = OUTMOD_7;
  168.         TA0CCTL2 = OUTMOD_7;
  169.         TA0CCTL3 = OUTMOD_7;
  170.         TA0CCTL4 = OUTMOD_7;
  171.         TA0CCR0 = per/*Period*/; //Change me
  172.         TA0CCR1 = duty/*Duty*/;   //Change me
  173.         TA0CCR2 = duty/*Duty*/;   //Change me
  174.         TA0CCR3 = duty/*Duty*/;   //Change me
  175.         TA0CCR4 = duty/*Duty*/;   //Change me

  176.         __enable_interrupt();
  177. }

  178. void TA1_CAP(void)
  179. {
  180.         P2DIR&=~BIT0;  //捕捉P2.0口    cc1
  181.         P2SEL |= BIT0;
  182.         P2REN |= BIT0;          //啟用P2.0內部下拉電阻

  183.         TA1CCTL1 |= CAP + CM_1 + CCIS_0 + SCS + CCIE;//捕獲模式,上升都捕獲,選擇CCI2A,同步,捕獲中斷開
  184.         TA1CTL |= TASSEL_2 + MC_2 + ID_0 + TACLR; //SMCLK=1M,連續計數模式

  185. }

  186. /************************定時器中斷函數********************************/
  187. #pragma vector = TIMER1_A1_VECTOR
  188. __interrupt void Timer_A1 (void)
  189. {
  190.            if(TA1CCTL1&CM_1)                        //捕獲到下降沿
  191.              {
  192.                TA1CTL|=TACLR;
  193.                TA1CCTL1=(TA1CCTL1&(~CM_1))|CM_2;    //改為上升沿捕獲:CM1置零,CM0置一

  194.              }
  195.            else if(TA1CCTL1&CM_2)                    //捕獲到上升沿
  196.              {

  197.                    Cap_num=TA1CCR1;                  //記錄下結束時間
  198.                TA1CCTL1 &=~CCIE;   //改為下降沿捕獲:CM0置零,CM1置一
  199.                TA1CTL|=TACLR;

  200.              }

  201. }
復制代碼
全部資料51hei下載地址:
myproj0.zip (235.38 KB, 下載次數: 71)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区免费在线观看 | 亚洲一区二区视频 | 国产午夜av片| 精品成人一区二区 | 亚洲国产精品suv | 日韩福利视频 | 成人免费视频一区二区 | 草草草草视频 | 亚洲第一成人av | 91视频在线 | 在线观看久草 | 日韩免费视频 | 在线不卡一区 | 日本三级视频 | 欧美在线国产精品 | 中文字幕第二十页 | 国产亚洲人成a在线v网站 | 久久精品网 | www亚洲免费国内精品 | 中文字幕电影在线观看 | 成人在线播放网站 | 亚洲综合无码一区二区 | 欧美一a| 国产精品美女久久久久久免费 | 欧美精品欧美精品系列 | 天天色天天射天天干 | 久久国产精品久久久久久 | 一级aaaaaa毛片免费同男同女 | 二区视频 | 国产精品综合久久 | 日韩在线观看精品 | 极品国产视频 | 久久久久久久久久久久久九 | 久久久高清 | 欧美日韩黄 | 国产精品成人av | 日韩精品久久久久久 | 国产在线视频一区 | av在线一区二区三区 | 欧美性受xxx| 视频在线一区二区 |