### 出租车计价器程序知识点解析
#### 一、程序背景与目标
该程序是为计算机控制课程设计的一个项目,旨在实现一个简单的出租车计价器功能。通过编写嵌入式系统程序,模拟出租车计价的过程,包括里程计算、时间记录以及费用计算等功能。
#### 二、核心代码解析
##### 1. 基础库文件引入
程序首先引入了几个基础库文件:
- `<reg52.h>`:包含了51单片机的寄存器定义。
- `<string.h>`:字符串处理函数。
- `<absacc.h>`:绝对地址访问库。
- `<intrins.h>`:内部函数库。
这些库文件为程序提供了必要的硬件访问接口和基本功能支持。
##### 2. 定义数据类型
- `#define uchar unsigned char`:定义`uchar`为无符号字符型。
- `#define uint unsigned int`:定义`uint`为无符号整型。
- `#define ulong unsigned long`:定义`ulong`为无符号长整型。
这些定义有助于提高代码的可读性和移植性。
##### 3. I/O端口定义
- `sbit P1_0 = P1^0;`:定义P1口第0位作为输出指示灯。
- `sbit LCD_RW = P2^1;`
- `sbit LCD_RS = P2^0;`
- `sbit LCD_E = P2^2;`:定义LCD的相关控制端口。
- `sbit key_c = P1^1;`:定义按键C(取消键)。
- `sbit key_on = P1^2;`:定义按键ON(启动键)。
这些端口用于控制LED显示状态以及与用户交互。
##### 4. 定义宏
- `#define LCD_DATA P0`:定义LCD数据端口为P0。
- `#define LCD_BUSY 0x80`:定义LCD忙碌标志。
这些宏简化了代码,并提高了可读性。
##### 5. 显示缓冲区定义
定义了四个显示缓冲区,分别用于显示时间、单价、里程以及总价:
- `unsigned char code LcdBuf1[] = {"TIME:"};`
- `unsigned char code LcdBuf2[] = {"DJ:Yuan/Km"};`
- `unsigned char code LcdBuf3[] = {"LC:Km"};`
- `unsigned char code LcdBuf4[] = {"ZJ:Yuan"};`
这些缓冲区将用于在LCD上显示相应信息。
##### 6. 全局变量定义
- `uint T0count;`:定时器T0的计数值。
- `uchar timecount;`:时间计数。
- `bit flag;`:标志位。
- `uchar WD[6];`:工作日数组。
- `uchar time[6];`:时间数组。
- `uchar zj[6];`:总金额数组。
- `uint Xdat;`:行驶距离数据。
- `uint zjdat;`:总金额。
- `uchar hour = 0, minute = 0, second = 0;`:小时、分钟、秒。
这些全局变量用于存储程序运行过程中的关键数据。
##### 7. 功能函数
- `void lcd_init(void);`:初始化LCD。
- `void display_string(unsigned char x, unsigned char y, unsigned char *s);`:在LCD指定位置显示字符串。
- `void display_char(unsigned char x, unsigned char y, unsigned char dat);`:在LCD指定位置显示字符。
- `void sys_init();`:系统初始化。
- `void key_san();`:按键处理函数。
这些函数实现了LCD初始化、显示文本以及按键响应等功能。
#### 三、主函数逻辑分析
- **初始化阶段**:调用`sys_init()`进行系统初始化,调用`lcd_init()`初始化LCD显示模块。
- **循环阶段**:
- 调用`key_san()`处理按键事件,包括取消键和启动键的操作。
- 计算行驶距离`Xdat`,并根据行驶距离和时间更新费用。
- 更新LCD上的显示信息。
#### 四、费用计算逻辑
费用计算部分涉及到了多种情况的判断,包括起步价、里程费等。主要逻辑如下:
- 当行驶距离小于等于3公里时,费用固定为10元。
- 当行驶距离大于3公里且小于10公里时,超出部分每公里加收2元,并加上分钟数和小时数的费用。
- 当行驶距离超过10公里时,超出部分每公里加收3元,并加上分钟数和小时数的费用。
通过这种方式,程序能够根据行驶距离和时间动态地计算出费用。
#### 五、总结
本程序通过使用51单片机及相关库文件,实现了出租车计价器的基本功能。它不仅能够显示时间和费用,还能通过按键来控制计费的开始和结束。此外,还具有一定的扩展性,例如可以增加更多的功能或优化现有的计算逻辑。这对于学习嵌入式系统的编程和理解计费系统的实现原理非常有帮助。