找回密码
 立即注册

QQ登录

只需一步,快速开始

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

msp430单片机车辆闪光灯 流水灯代码问题

[复制链接]
跳转到指定楼层
楼主
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.png (39.04 KB, 下载次数: 89)

msp430部分放大图

msp430部分放大图

闪光灯.png (25.69 KB, 下载次数: 98)

闪光灯放大图

闪光灯放大图

总电路.png (92.92 KB, 下载次数: 84)

总电路

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

使用道具 举报

沙发
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 单片机教程网

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