写一个出租车计价的51程序
时间: 2023-09-24 20:09:23 浏览: 93
出租车计费程序(c语言).txt
好的,以下是一个简单的出租车计价的51程序,基于以下假设:
1. 起步价为10元,包含2公里以内的里程费和3分钟以内的时间费;
2. 超过2公里的里程费为每公里2元;
3. 超过3分钟的时间费为每分钟1元;
4. 无夜间加价、空驶费等特殊条件。
该程序使用51单片机和LCD1602液晶屏幕,以及4个按键实现计价器的功能。代码如下:
```c
#include <reg52.h>
#include <stdio.h>
#define LCD_DB P0 // 数据总线
sbit RS = P2^0; // 命令/数据选择位
sbit EN = P2^1; // 使能信号
unsigned int distance = 0; // 当前里程数(单位:米)
unsigned int time = 0; // 当前时间数(单位:秒)
unsigned int fee = 0; // 当前费用(单位:分)
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 125; j++);
}
void write_lcd_command(unsigned char command) // 写命令函数
{
RS = 0; // 选择命令
LCD_DB = command; // 发送命令
EN = 1; // 使能
delay(1); // 延时
EN = 0; // 取消使能
}
void write_lcd_data(unsigned char data) // 写数据函数
{
RS = 1; // 选择数据
LCD_DB = data; // 发送数据
EN = 1; // 使能
delay(1); // 延时
EN = 0; // 取消使能
}
void init_lcd() // 初始化LCD函数
{
write_lcd_command(0x38); // 初始化LCD
write_lcd_command(0x0c); // 关闭光标
write_lcd_command(0x06); // 设置输入方式
write_lcd_command(0x01); // 清屏
}
void display_info() // 显示信息函数
{
unsigned char buf[16];
sprintf(buf, "Distance: %dkm", distance / 1000); // 将里程数转换为字符
write_lcd_command(0x80); // 设置光标位置
for(int i = 0; i < 16; i++)
{
if(buf[i] == '\0') break; // 如果字符为空则退出
write_lcd_data(buf[i]); // 发送字符
}
sprintf(buf, "Time: %dmin", time / 60); // 将时间数转换为字符
write_lcd_command(0xc0); // 设置光标位置
for(int i = 0; i < 16; i++)
{
if(buf[i] == '\0') break; // 如果字符为空则退出
write_lcd_data(buf[i]); // 发送字符
}
sprintf(buf, "Fee: %d.%d", fee / 100, fee % 100); // 将费用转换为字符
write_lcd_command(0x94); // 设置光标位置
for(int i = 0; i < 16; i++)
{
if(buf[i] == '\0') break; // 如果字符为空则退出
write_lcd_data(buf[i]); // 发送字符
}
}
void main()
{
init_lcd(); // 初始化LCD
while(1)
{
display_info(); // 显示信息
if(P3^0 == 0) // 如果按下"计价"键
{
if(distance <= 2000 && time <= 180) // 如果未超过起步价的里程和时间
{
fee = 1000; // 设置费用为10元
}
else // 如果已经超过起步价的里程和时间
{
fee = 1000 + (distance - 2000) / 1000 * 200 + (time - 180) / 60 * 100; // 根据计费规则计算费用
}
delay(50); // 延时去除抖动
}
if(P3^1 == 0) // 如果按下"清零"键
{
distance = 0; // 里程数清零
time = 0; // 时间数清零
fee = 0; // 费用清零
delay(50); // 延时去除抖动
}
if(P3^2 == 0) // 如果按下"里程+"键
{
distance += 50; // 里程数加50米
delay(50); // 延时去除抖动
}
if(P3^3 == 0) // 如果按下"时间+"键
{
time += 10; // 时间数加10秒
delay(50); // 延时去除抖动
}
delay(1000); // 延时1秒,更新时间数
time++; // 时间数加1秒
}
}
```
该程序使用P3口的四个按键来实现计价、清零、里程加50米、时间加10秒等基本功能。在按下按键时,需要进行一定的延时以去除按键抖动。同时,为了方便观察计价器的信息,程序通过LCD屏幕来显示里程数、时间数和费用。在每次计价器的信息发生变化时,都需要重新显示一遍信息。
注意:以上代码仅供参考,具体实现方式可能因硬件、编译器等不同而有所差异。同时,为了确保程序的正确性和可靠性,建议在实际使用前进行充分的测试和调试。
阅读全文