欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2831|回復: 3
收起左側

msp430單片機車輛閃光燈 流水燈代碼問題

[復制鏈接]
ID:815102 發表于 2020-8-19 06:30 | 顯示全部樓層 |閱讀模式
600黑幣
各位大神你們好,
我是一枚新手,現在遇到一個問題。實在是不好意思,確實是時間不多了不夠我來慢慢看自己做。所以才在論壇上咨詢各位大神。確實很羞愧做一個伸手黨。
問題如下:
總電路是車輛系統上的燈光總電路,SC1是閃光燈(Blinker)的電路。使用的是MSP430G2553IPW20。
需要實現如下要求:閃光燈(Blinker)在給了信號后依次閃爍,如奧迪閃光燈一樣,從車頭中間依次向兩邊亮起。閃過的燈光保持不滅,直到最后一個燈亮起。然后所有燈滅。如此循環。P1.0是閃光燈的信號輸入口,P2.0/2.1/2.2/2.3/2.4/2.5/2.6/2.7則是燈泡串的輸出端。
只需要閃光燈部分的代碼,跪謝各位大佬。
我在網絡上搜到一個代碼但是不知道如何使用。也放在這里了。
#include <msp430g2553.h>


typedef unsigned int  uint;


uint i = 0,j = 0,dir = 0;
uint flag = 0,speed = 0;  //flag--燈光流動方式,speed--燈光流動速度

void main(void)
{

    /*給IO一個初始的狀態*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;

    WDTCTL = WDTPW + WDTHOLD;       //關閉看門狗
    P6DIR |= BIT2;P6OUT |= BIT2;    //關閉電平轉換
    P5OUT &= ~BIT7;

    CCTL0 = CCIE;                   //使能CCR0中斷
    CCR0 = 50000;
    TACTL = TASSEL_2 + ID_3 + MC_1; //定時器A的時鐘源選擇SMCLK,增計數模式
    P2DIR = 0xff;                   //設置P2口方向為輸出
    P2OUT = 0xff;

    _EINT();                        //使能全局中斷
    LPM0;                           //CPU進入LPM0模式
}


#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{  
    if(flag == 0)
    {
        P2OUT = ~(0x80>>(i++));    //燈的點亮順序D8 -> D1
    }
    else if(flag == 1)
    {
        P2OUT = ~(0x01<<(i++));    //燈的點亮順序D1 -> D8
    }
    else
    {
        if(dir)                  //燈的點亮順序D8->D1,D1->D8,循環繞圈                        
        {
            P2OUT = ~(0x80>>(i++));
        }
        else
        {
            P2OUT = ~(0x01<<(i++));
        }
    }

    if(i == 8)
    {
        i = 0;
        dir = ~dir;
    }

    j++;
    if(j == 40) //循環5次就改變flag改變流動方向
    {
        i = 0;
        j = 0;
        flag++;
        if(flag == 4) flag = 0;
        switch(speed)
        {
        case 0:
            TACTL &=~ (ID0 + ID1);
            TACTL |= ID_3;
            break;
        case 1:
            TACTL &=~ (ID0 + ID1);
            TACTL |= ID_2;
            break;
        case 2:
            TACTL &=~ (ID0 + ID1);
            TACTL |= ID_1;
            break;
        case 3:
            TACTL &=~ (ID0 + ID1);
            TACTL |= ID_0;
            break;
        default:
            break;
        }
        if(flag != 3)   speed++;
        if(speed == 4) speed = 0;
    }
}

msp430部分放大圖

msp430部分放大圖

閃光燈放大圖

閃光燈放大圖

總電路

總電路
回復

使用道具 舉報

ID:654028 發表于 2020-8-19 16:32 | 顯示全部樓層
看你的這個代碼,寫的已經很詳細的閃爍過程了,看樣子他是在中斷里面實現的閃爍。如果你需要使用P1.0去控制的話,就把那段代碼從中斷里面弄出來修改一。我也不是很會,我只能這樣做,具體能不能實現不好說,但是思路沒錯。
void led_run (void)
{       char i;
     if(p1out){//就是如果檢測到有信號燈就亮
           for(i=0;i<8;i++){
                P2OUT = ~(0x80>>i);    //燈的點亮順序D8 -> D1,順序不對你就看參考代碼,換一下順序
          }
           if(i == 8)
           {
                i = 0;
                P2OUT=0XFF;//讓所有的燈滅
            }
   }
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:815102 發表于 2020-8-19 23:43 | 顯示全部樓層
這是我寫的代碼
#include "msp430g2553.h"

int i[8] ={0,1,3,7,15,31,63,127};
void main(void)  
{  

WDTCTL = WDTPW + WDTHOLD;         

  if (CALBC1_1MHZ==0xFF) while(1);     
  DCOCTL  = 0;                        
  BCSCTL1 = CALBC1_1MHZ;            
  DCOCTL  = CALDCO_1MHZ;
    P2DIR |= BIT0+BIT7;
    P2OUT |= BIT0;   
    P2OUT &= ~BIT7;  

    CCTL0 = CCIE;                  
    CCR0 = 62500;  
    TACTL = TASSEL_2 + ID_3 + MC_1;
    P2DIR = 0xff;                     
    P2OUT = 0xff;  

    _BIS_SR(LPMO_bits+GIE) ;                       
}  
#pragma vector = TIMER0_A0_VECTOR        
                                    //__interrupt void Timer_A (void)   
int main( void )
{
static int j =0;
  
   P2OUT=i[j];
j++;
if (j>8)
j=0;
  
}
回復

使用道具 舉報

ID:815102 發表于 2020-8-19 23:56 | 顯示全部樓層
我改進了這段代碼
#include "msp430g2553.h"

int i[8] ={0,1,3,7,15,31,63,127};
void main(void)  
{  

WDTCTL = WDTPW + WDTHOLD;         

  if (CALBC1_1MHZ==0xFF) while(1);     
  DCOCTL  = 0;                        
  BCSCTL1 = CALBC1_1MHZ;            
  DCOCTL  = CALDCO_1MHZ;
    P2DIR |= BIT0+BIT7;
    P2OUT |= BIT0;   
    P2OUT &= ~BIT7;  

    CCTL0 = CCIE;                  
    CCR0 = 62500;  
    TACTL = TASSEL_2 + ID_3 + MC_1;
    P2DIR = 0xff;                     
    P2OUT = 0xff;  

    _BIS_SR(LPMO_bits+GIE) ;                       
}  
#pragma vector = TIMER0_A0_VECTOR        
                                    //__interrupt void Timer_A (void)   
int main( void )
{
static int j =0;
  
   P2OUT=i[j];
j++;
if (j>8)
j=0;
  
}
現在有個新問題,如果是同一個板子控制前后左右四個車燈。
車前左右分別有停車燈(Standlicht),閃光燈(Blinker),轉向燈(Rueckwaerts)
車后左右分別有剎車燈(Bremslicht),停車燈(Standlicht),閃光燈(Blinker),轉向燈(Rueckwaerts)
P1.3與P1.4都是msp430內部pull-up。
當R39 open時 車左閃光燈依次亮,當R39為0Ohm 車右依次亮。
當R1 open時  代表車前方閃光燈,當R1為0Ohm時 代表車后閃光燈。
如何補充這個代碼呢?拜謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表