欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MSP430停车位感应装置设计(能记录停车时间)

程序员文章站 2022-03-13 19:25:41
...

硬件:MSP430f5529,光电传感器,数码管(共阴极)

#include <msp430f5529.h>
/***********************************************************************
    红外光电传感器输入信号到P2.0,模拟车的信号,当用手遮挡时输入高电平,
系统检测到上升沿,进入寄存器中断,P1.0灯亮,接着在寄存器中断中使能定时器的
捕获/比较寄存器(TA0CCTL0),定时器开始计时,数码管开始滚动数字,当把手挪开后,
传感器输入低电平,系统检测到下降沿,再次进入寄存器中断,P1.0取反,灯灭,接着
禁止定时器的捕获/比较寄存器(TA0CCTL0),定时器停止计时,数码管停止滚动,直到
下次上升沿到来
************************************************************************/
unsigned char i=0,j=0,k=0,key=0;
const unsigned char num[10]={0xfc,0x90,0x7a,0xda,0x96,0xce,0xee,0x9c,0xfe,0xde};
//数码管管脚:DP,g,f,a,b,e,d,c 分别对应 P3.0,P3.1,P3.2,P3.3,...,P3.7
void delay(int ms)
{
    while(ms--)
        for(i=0;i<120;i++);
}
void main( void )
{
    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
    P1DIR |= BIT0;                  //定义P1.0为输出,默认为输出高电平
    P1OUT ^= BIT0;                  //初始化的时让P1.0输出低电平
    P2IE  |= BIT0;                  //中断使能P2.0
    P2IES |= BIT0;                  //选择中断标志为P2.0
    _BIS_SR(LPM0_bits+GIE);         //开启中断,并让CPU休眠
}
#pragma vector = TIMER0_A0_VECTOR   //CCR0中断程序
__interrupt void Timer0_A(void)
{
        j++;
        if(j>9)
          j=0;
        P3OUT = num[j];         //数码管开始计数输出
}
#pragma vector = PORT2_VECTOR       //寄存器中断程序
__interrupt void PORT2_ISR(void)
{
    key = P2IFG&BIT0;               //按键防抖
    delay(10);                      //自定义的延时函数
    if((P2IFG&BIT0)==key)
       P1OUT ^= 0x01;           //上升沿输出高电平,下降沿输出低电平
    P2IFG=0;                    //退出中断前必须手动清除IO口中断标志
    k = j;                    
    j = 0;                      //让数码管每次都从0开始计数
    TA0CTL |= TASSEL_1+MC_1+TAIE+ID_0+TACLR;
    //选择ACLK时钟信号,增计数模式,中断使能,一分频,自动复位
    TA0CCTL0 ^= CCIE;   //捕获/比较寄存器使能与禁止
    TA0CCR0 = 32768;    //ACLK计数32768次为一秒
    P3DIR = 0XFF;       //定义P3为输出,默认为输出高电平,整个P3都接的是数码管
    P3OUT = num[k];     //初始化时让P3保持输出停止计数前的最后一个数
}

红外光电传感器如图:
MSP430停车位感应装置设计(能记录停车时间)