找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4352|回复: 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, 下载次数: 66)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表