用MSP430单片机模拟出租车计费系统设计与开发: (1) 用一个按键控制汽车前进档位编号,根据不同档位体现汽车行驶速度,该档位可以在数码管显示; (2) 根据档位值、以及运行时间,实时显示里程值变化; (3) 有暂停功能,当暂停之后,电机运转期间,里程停止累积; (4) 具有里程清零操作的CCS代码
时间: 2024-03-01 21:54:24 浏览: 175
基于单片机的出租车计价器设计(原理图+PCB+代码)
5星 · 资源好评率100%
下面是一个可能的MSP430单片机模拟出租车计费系统设计与开发的CCS代码,实现了以上要求(1)到(4):
```
#include <msp430.h>
#define MOTOR BIT0
#define PAUSE BIT1
#define GEAR1 BIT2
#define GEAR2 BIT3
#define GEAR3 BIT4
#define GEAR4 BIT5
#define GEAR5 BIT6
#define GEAR6 BIT7
unsigned int time = 0; // 运行时间计数器
unsigned int distance = 0; // 行驶距离计数器
unsigned int gear = 0; // 当前档位编号
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器
P1DIR |= MOTOR + PAUSE; // 电机输出和暂停输出
P1OUT &= ~(MOTOR + PAUSE); // 关闭电机和暂停
P1DIR &= ~(GEAR1 + GEAR2 + GEAR3 + GEAR4 + GEAR5 + GEAR6); // 档位输入
P1REN |= GEAR1 + GEAR2 + GEAR3 + GEAR4 + GEAR5 + GEAR6; // 上拉电阻使能
P1OUT |= GEAR1 + GEAR2 + GEAR3 + GEAR4 + GEAR5 + GEAR6;
P2DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7; // 数码管输出
P2OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7); // 数码管显示0
TA0CCTL0 = CCIE; // CCR0中断使能
TA0CCR0 = 5000; // 1ms计时
TA0CTL = TASSEL_2 + MC_1 + ID_3; // SMCLK, up mode, 分频器8分频
__bis_SR_register(LPM0_bits + GIE); // 进入低功耗模式
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR(void)
{
time++; // 运行时间增加1毫秒
if ((P1IN & (GEAR1 + GEAR2 + GEAR3 + GEAR4 + GEAR5 + GEAR6)) == 0) // 检测到档位按键按下
{
if ((P1IN & GEAR1) == 0) // 档位1
{
gear = 1;
P2OUT = 0x3F; // 数码管显示1
}
else if ((P1IN & GEAR2) == 0) // 档位2
{
gear = 2;
P2OUT = 0x06; // 数码管显示2
}
else if ((P1IN & GEAR3) == 0) // 档位3
{
gear = 3;
P2OUT = 0x5B; // 数码管显示3
}
else if ((P1IN & GEAR4) == 0) // 档位4
{
gear = 4;
P2OUT = 0x4F; // 数码管显示4
}
else if ((P1IN & GEAR5) == 0) // 档位5
{
gear = 5;
P2OUT = 0x66; // 数码管显示5
}
else if ((P1IN & GEAR6) == 0) // 档位6
{
gear = 6;
P2OUT = 0x7D; // 数码管显示6
}
}
if ((P1IN & PAUSE) == 0) // 检测到暂停按键按下
{
P1OUT |= PAUSE; // 打开暂停开关
}
else if ((P1OUT & PAUSE) == PAUSE) // 暂停开关打开
{
P1OUT &= ~PAUSE; // 关闭暂停开关
}
if ((P1OUT & PAUSE) == 0) // 电机运转期间
{
distance += gear; // 行驶距离增加
}
if ((time % 500) == 0) // 500毫秒更新一次数码管显示
{
P2OUT = 0; // 关闭数码管
if (distance >= 10000) // 超过9999公里,显示9999
{
P2OUT |= 0x6D; // 数码管显示9
P2OUT |= (0x6D << 8); // 数码管显示9
P2OUT |= (0x6D << 16); // 数码管显示9
P2OUT |= (0x7F << 24); // 数码管显示-
}
else // 显示里程值
{
unsigned int d = distance;
unsigned char digits[4];
digits[0] = d % 10;
d /= 10;
digits[1] = d % 10;
d /= 10;
digits[2] = d % 10;
d /= 10;
digits[3] = d % 10;
if (digits[3] > 0)
{
P2OUT |= (0x3F << 24) | (digits[3] << 16);
}
if (digits[2] > 0 || digits[3] > 0)
{
P2OUT |= (0x3F << 16) | (digits[2] << 8);
}
if (digits[1] > 0 || digits[2] > 0 || digits[3] > 0)
{
P2OUT |= (0x3F << 8) | digits[1];
}
P2OUT |= (0x3F << 24) | digits[0];
}
}
}
```
该代码实现了一个较为完整的出租车计费系统,通过按键控制档位编号来模拟不同的行驶速度和计算行驶距离,具有暂停和里程清零功能,并实时在数码管上显示里程值。该代码仅供参考,具体实现可能需要根据实际情况进行修改和优化。
阅读全文