找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3371|回复: 3
收起左侧

急救

[复制链接]
ID:64538 发表于 2014-7-29 16:37 | 显示全部楼层 |阅读模式
有哪位大虾帮我这个新手编一下面的程序,小弟感觉不尽。
要求:1用msp430g2553.h实现。
           2实现如下功能,每十秒钟灯光闪烁一次,每2秒灯光亮度变化一次,按键按一次延时时间增加5秒灯光亮度变化相反。
回复

使用道具 举报

ID:66032 发表于 2014-9-16 15:46 | 显示全部楼层
我用我的MSP430F5438A写了个程序, 运行了下完全OK, 用示波器可以看到占空比的连续变化
//this is source code using MSP430F5438A, the Aclock is using XT1=32.768K, the will help to get second counts

#include <msp430.h>
#include <stdlib.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

uchar num1, num2, num3, num4;
uint count,count1,temp=0;
uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar const table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

void Init_Port(void)
{

  P7DIR  |= Ox01  ; // set the P7.0 as output;
//  P7OUT  &= ~0x01   ;// turn on the LED;
  //INTERNAL_PULL_UP       ;
// ROW_IN_COL_OUT         ;
  P1OUT   = 0xF0           ;
  P1DIR   = 0xF0          ;
  P6DIR &=~0x01;
  P6REN |= 0x01;
  P6OUT = 0x01;
  P9OUT   = 0x0F         ;
  P9DIR   = 0x0F     ;
  P8DIR = 0xFF;
  P8OUT = 0xFF;

}

void Display(num1,num2,num3,num4)
{
  
    P8OUT = table[num1];     
    P9OUT &= ~BIT0;
    __delay_cycles(100);
    P9OUT |= BIT0;
   
    P8OUT = table[num2];
    P9OUT &= ~BIT1;
    __delay_cycles(100);
    P9OUT |= BIT1;
   
    P8OUT = table[num3];
    P9OUT &= ~BIT2;
    __delay_cycles(100);
    P9OUT |= BIT2;
   
    P8OUT = table[num4];
    P9OUT &= ~BIT3;
    __delay_cycles(100);
    P9OUT |= BIT3;
   

}                           
int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  Init_Port();
  P1DIR |= 0x30;       // just to check waveform P2.2&P2.3 O/P using scope
  P1SEL |= 0x30;       // P2.2 and P2.3 options select
  TA0CCR0 = 512-1;                          // PWM Period
  TA0CCTL3 = OUTMOD_7;                      // CCR1 reset/set
  TA0CCR3 = 384;                            // CCR1 PWM duty cycle
  TA0CCTL4 = OUTMOD_7;                      // CCR2 reset/set
  TA0CCR4 = 128;                            // CCR2 PWM duty cycle
  TA0CTL = TASSEL_1 + MC_1 + TACLR;         // SMCLK, up mode, clear TAR


  TA1CCTL0 = CCIE;                          // CCR0 interrupt enabled
  TA1CCR0 = 32768-1;
  TA1CTL = TASSEL_1 + MC_1 + TACLR;         // ACLK, upmode, clear TAR
  
  //TBCCTL0 = CCIE;                           // TBCCR0 interrupt enabled
  //TBCCR0 = 30;
  //TBCTL = TBSSEL_1 + MC_1 + TBCLR;          // ACLK, upmode, clear TBR

  __bis_SR_register(GIE);       // Enter LPM0, enable interrupts
  
    while(1)
  {
     TA0CCR4=temp;
     Display(num1,num2,num3,num4);// if LPM0 is enable, the routine will not be preformed;
     if (!(P6IN&0x01))
     {
        __delay_cycles(10);
       if (!(P6IN&0x01))
       {
           temp+=5;
           if (temp==512)
           temp=128;
           while(!(P6IN&0x01));
       }
     }
  }
  
}

// Timer1 A0 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
        count++;
        if(count==2)  //the light intensity increase 1every other 2sec
        {
          count=0;
          temp++;  
          num1=temp/1000;    //°ÑÕa¸ö±äá¿ÏÔê¾3öà′
          num2=temp%1000/100;
          num3=temp%100/10;
          num4=temp%10;
          if (temp==512)
          temp=0;
        }
        count1++;
        if (count1==10)
        {
          count1=0;
          P7OUT^=0x01; //Output LED flahes every other 10 sec;
        }  
}

回复

使用道具 举报

ID:66032 发表于 2014-9-16 15:48 | 显示全部楼层
下面是按照你的要求改写的程序, 我看了USER GUIDE 和 Datasheet 应该没有问题
//this is source code using MSP430G2553, the Aclock is using XT=32.768K, the will help to get second counts ------- MSP430G2553, 28-Pin Devices, TSSOP

#include <msp430.h>
#include <stdlib.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

uint count,count1,temp=0;

void Init_Port(void)
{
  P1OUT   = 0x01   ; // O/P to high level and connect switch to ground
  P1DIR  &=~0x01 ;// set input DIR;
  P1REN  |= 0x01;  //Enable P1.0 pull-up
  P3DIR |= 0x20;       // set the O/P as well as check waveform P3.5using scope
  P3SEL |= 0x20;       // P3.5 options select and connect LED to ground;
}

                        
int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  Init_Port();

  TA0CCR0 = 512-1;                          // PWM Period
  TA0CCTL1 = OUTMOD_7;                      // CCR1 reset/set
  TA0CCR1 = 0;                            // CCR1 PWM duty cycle
  TA0CTL = TASSEL_1 + MC_1 + TACLR;         // SMCLK, up mode, clear TAR
  TA1CCTL0 = CCIE;                          // CCR0 interrupt enabled
  TA1CCR0 = 32768-1;
  TA1CTL = TASSEL_1 + MC_1 + TACLR;         // ACLK, upmode, clear TAR
  __bis_SR_register(GIE);       // Enter LPM0, enable interrupts
  
    while(1)
  {
     TA0CCR1=temp;
   
     if (!(P1IN&0x01))
     {
        __delay_cycles(10);
       if (!(P1IN&0x01))
       {
           temp+=5; //push the switch everytime, the intensity value add 5;
           if (temp==512)
           temp=0;
           while(!(P1IN&0x01));
       }
     }
  }
  
}

// Timer1 A0 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
        count++;
        if(count==2)  //the light intensity increase 1every other 2sec
        {
          count=0;
          temp++;  
          if (temp==512)
          temp=0;
        }
        count1++;
        if (count1==10)
        {
          count1=0;
          P3OUT^=0x20; //Output LED flahes every other 10 sec;
        }  
}

回复

使用道具 举报

ID:66032 发表于 2014-9-16 15:52 | 显示全部楼层
任何code 都是根据硬件电路来编写的, 脱离了硬件,一切都是浮云。一定要下功夫读英文的文件, 只有这样才能以不变应万变。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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