找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1841|回复: 0
打印 上一主题 下一主题
收起左侧

12年北京市电子设计大赛的考题,最近重做了一下 msp430源码分享

[复制链接]
跳转到指定楼层
楼主
ID:327733 发表于 2018-5-11 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
12年北京市电子设计大赛的考题,最近重做了一下

单片机源程序如下:
  1. /*5月9日
  2. *
  3. *
  4. * */

  5. #include <msp430.h>
  6. #include "DAC7811.h"
  7. #include "TA_PWM.h"
  8. #include "oled.h"
  9. #include <stdio.h>

  10. void CSL_init(void);
  11. void GPIO_graceInit(void);
  12. void BCSplus_graceInit(void);
  13. void USCI_B0_graceInit(void);
  14. void ADC10_graceInit();
  15. /*
  16. * main.c
  17. */
  18. int main(void)
  19. {
  20.         unsigned int max = 0, min = 8192;
  21.         long Vpp=0;
  22.         int gain;

  23.     WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer


  24.     _disable_interrupts();
  25.     CSL_init();
  26.     ADC10_graceInit();

  27.     TA0_PWM_Init('A',1,'F',0);
  28.     TA0_PWM_SetPeriod(30);

  29.     _enable_interrupts();

  30.              int j,i;
  31.               long temp;

  32.                    char s[16];
  33.                ADC10CTL0 |= ADC10SC;
  34.                    OLED_Init();
  35.                    OLED_Clear();
  36.                    OLED_ShowString(0,0,"Gain:");
  37.                    OLED_ShowString(0,2,"Vpp :");



  38.     while(1)
  39.     {
  40.              TA0_PWM_SetPermill(1,500);     //PWM波输出,vpp不能超过100mv


  41.               sprintf(s,"%d  ",max);
  42.                         OLED_ShowString(0,6,s);

  43.             for(j=0;j<500;j++)
  44.                             {

  45.                             ADC10CTL0 |= ADC10SC+ENC;
  46.                             while ((ADC10CTL0 & ADC10IFG) == 0);
  47.                             temp=ADC10MEM;

  48.                             if(temp > max)
  49.                             max = temp;
  50.                             if(temp < min)
  51.                             min = temp;

  52.                             }
  53.             Vpp=(max-min);

  54.             for(i=0;i<4;i++)       OLED_ShowString(40,i*2,"          ");

  55.             sprintf(s,"%dV",Vpp);
  56.         OLED_ShowString(40,2,s);

  57.         Vpp=Vpp*3550/1023;   //  测量电压
  58.         sprintf(s,"%dV",Vpp);
  59.          OLED_ShowString(0,4,s);


  60.          Vpp=Vpp/20;
  61.          sprintf(s,"%dV",Vpp);
  62.            OLED_ShowString(70,4,s);

  63.          TA0_PWM_SetPermill(1,Vpp*10);     //PWM波输出,vpp不能超过100mv


  64.         if (Vpp<40)
  65.         {
  66.                 spiwrite(41,1);
  67.                 gain=100;

  68.         }
  69.         else if (Vpp<70)
  70.         {
  71.                 spiwrite(129,1);
  72.                 gain = 35;
  73.         }
  74.         else if (Vpp<100)
  75.         {
  76.                 spiwrite(73,1);
  77.                 gain=30;
  78.         }


  79.         sprintf(s,"%d  ",max);
  80.          OLED_ShowString(0,6,s);

  81.          sprintf(s,"%d  ",min);
  82.          OLED_ShowString(80,6,s);

  83.          sprintf(s,"%d dB",gain);
  84.          OLED_ShowString(40,0,s);

  85.                      max=0;
  86.                      min=8192;
  87.                     __delay_cycles(30000000);
  88.     }
  89. }

  90. /*
  91. * 系统初始化集中调用函数
  92. */

  93. void CSL_init(void)
  94. {
  95.         GPIO_graceInit();                                        //IO口初始化
  96.         BCSplus_graceInit();                                //时钟源初始化
  97.         USCI_B0_graceInit();                        //USCI_B初始化-3线SPI
  98.                      //ADC初始化  P1.3输入
  99. }
  100.         /*
  101.          * IO口初始化
  102.          */

  103.         void GPIO_graceInit(void)
  104.         {
  105.                 //-----设定P1.0和P1.6的输出初始值-----
  106.                 P1DIR |= BIT0;                                                        //设定P1.0为输出
  107.                 P1OUT |= BIT0;                                                //设定P1.0初值(初始化完成后两灯均亮)
  108.                 //-----配合机械按键,启用内部上拉电阻-----
  109.                 P1REN |= BIT3;                                                                        //启用P1.3内部上下拉电阻
  110.                 P1OUT |= BIT3;                                                                    //将电阻设置为上拉
  111.                 //-----配置P1.3中断参数-----
  112.                 P1DIR &= ~BIT3;                                            // P1.3设为输入(可省略)
  113.                 P1IES |= BIT3;                                                  // P1.3设为下降沿中断
  114.                 P1IE  |= BIT3 ;                                                  // 允许P1.3中断
  115.                 /* Port 1 Port Select 2 Register */
  116.                 P1SEL2 = BIT5 | BIT7;
  117.                 /* Port 1 Port Select Register */
  118.                 P1SEL = BIT5 | BIT7;
  119.                 /* Port 2 Output Register */
  120.                 P2OUT = BIT0 | BIT1 | BIT2| BIT3 | BIT4 | BIT5;
  121.                 /* Port 2 Direction Register */
  122.                 P2DIR = BIT0 | BIT1 | BIT2| BIT3 | BIT4 | BIT5;
  123.         }
  124.         /*
  125.          * 设定主时钟为16MHz,低速时钟为外部手表晶振
  126.          */

  127.         void BCSplus_graceInit(void)
  128.         {
  129.                 BCSCTL2 = SELM_0 | DIVM_0 | DIVS_0;
  130.                 if (CALBC1_16MHZ != 0xFF) {
  131.                         /* Adjust this accordingly to your VCC rise time */
  132.                         __delay_cycles(10000);
  133.                         DCOCTL = 0x00;
  134.                         BCSCTL1 = CALBC1_16MHZ;     /* Set DCO to 16MHz */
  135.                         DCOCTL = CALDCO_16MHZ;
  136.                 }
  137.                 BCSCTL1 |= XT2OFF | DIVA_0;
  138.                 BCSCTL3 = XT2S_0 | LFXT1S_0 | XCAP_1;
  139.         }
  140.         /*
  141.          * 通用串行通信口设置为3线SPI模式,P1.5-SCL/P1.7-SDL
  142.          */
  143.         void USCI_B0_graceInit(void)
  144.         {
  145.                 /* Disable USCI */
  146.                 UCB0CTL1 |= UCSWRST;
  147.                 UCB0CTL0 = UCCKPL |UCMSB | UCMST | UCMODE_0 | UCSYNC;
  148.                 UCB0CTL1 = UCSSEL_2 | UCSWRST;
  149.                 /* Bit Rate Control Register 0 */
  150.                 UCB0BR0 = 32;
  151.                 /* Enable USCI */
  152.                 UCB0CTL1 &= ~UCSWRST;
  153.         }

  154.         void ADC10_graceInit(void)
  155.         {         //p1.2输入,基准电压为3.55v
  156.         //        ADC10CTL0 &= ~ENC;
  157.         //            ADC10CTL0 = ADC10IE | ADC10ON | ADC10SHT_3 | SREF_0;
  158.         //            ADC10CTL1 = CONSEQ_0 | ADC10SSEL_0 | ADC10DIV_0 | SHS_0 | INCH_2;
  159.         //            __delay_cycles(30000);
  160.         //            ADC10CTL0 |= ENC;


  161.                     ADC10CTL0 &= ~ENC;
  162.                                     ADC10CTL0 =ADC10ON + REFON + ADC10SHT_3 + SREF_0;
  163.                                 ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_3;
  164.                                 ADC10AE0 = 0x8;
  165.                                 __delay_cycles(30000);
  166.                                 ADC10CTL0 |= ENC;


  167.         }
复制代码

所有资料51hei提供下载:
lian5.9.zip (103.88 KB, 下载次数: 8)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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