51单片机--仿真出租车计价器
扫描二维码
随时随地手机看文章
这汇编的程序,编写的很复杂,实现的功能却还是很简陋。
在硬件方面,显示金额的位数也不足。
做而论道用 C 重新编写了一个程序,如下:
#include
#include
#define BAITIAN 10 //白天价格/km
#define YEJIAN 14 //夜间价格/km
#define DENGREN 1 //停车等人价格/30s
sbit QD = P3^4;
sbit RY = P3^7;
unsigned char danjia, jvli, n_X0, mode;
unsigned int jinee, n_50ms;
bit ye; //1夜间/0白天
//---------------------------------------
void delay(unsigned int time)
{
unsigned int i, j;
for(i = 0; i < time; i++) for (j = 0; j < 50; j++);
}
//---------------------------------------
void display(char k) //k=0时关闭显示
{
unsigned char code DIG_SEG[] = {
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, //01234567
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//89ABCDEF
unsigned char i, j = 0xfe;
unsigned char buff[8] = 0;
buff[0] = DIG_SEG[danjia / 10];
buff[1] = DIG_SEG[danjia % 10];
buff[2] = DIG_SEG[jvli / 10];
buff[3] = DIG_SEG[jvli % 10];
buff[4] = DIG_SEG[jinee / 1000];
buff[5] = DIG_SEG[jinee % 1000 / 100];
buff[6] = DIG_SEG[jinee % 100 / 10];
buff[7] = DIG_SEG[jinee % 10];
for(i = 0; i < 8; i++) {
P2 = 255;
if (k > 0) { P0 = buff[i]; P2 = j;}
delay(1); j = _crol_(j, 1);
}
}
//---------------------------------------
void key(void)
{
if (!QD) {
display(mode);
if (!QD) {
while(!QD) display(mode);
mode++;
if (mode > 2) mode = 0; //mode=0,1,2
} }
if (!RY) {
display(mode);
if (!RY) {
while(!RY) display(mode);
ye = ~ye;
if (ye) danjia = YEJIAN;
else danjia = BAITIAN;
} }
}
//---------------------------------------
main()
{
TMOD = 0x01;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
ET0 = 1;
EX0 = 1;
IT0 = 1;
EA = 1;
TR0 = 0; //先不启动
ye = 1; //此时是夜间
if (ye) danjia = YEJIAN;
else danjia = BAITIAN;
mode = 0; //等客状态
for(;;) {
while (mode == 0) {display(mode); key();}//等客
//开始行驶, 各项初始值皆设为零
n_50ms = 0; n_X0 = 0; //时间, 外部中断次数
jvli = 0; jinee = 0; //距离, 金额
EX0 = 1; TR0 = 1; //开始统计里程, 计算等车时间
while (mode == 1) {display(mode); key();}//等待下车
EX0 = 0; TR0 = 0; //停止统计
//数据停止变化, 停车结算
while (mode == 2) {display(mode); key();}//等待清零
}
}
//---------------------------------------
void X0_INT() interrupt 0
{
n_50ms = 0;
n_X0++;
if(n_X0 == 6) { //中断6次, 假设就是1km
n_X0 = 0;
jvli++; //里程加一
jinee += danjia; //加上单价/km
}
}
//---------------------------------------
void T0_INT() interrupt 1
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
n_50ms++;
if(n_50ms == 600) { //到了30s
n_50ms = 0;
jinee += DENGREN; //加上停车等人的价格/30s
}
}
//---------------------------------------
仿真后的截图如下:
功能说明:
出租车在白天、晚上,每公里的价格是不同的,都要在程序的开始处进行定义。
同时还定义了停车等人的价格,每当等待 30s,即要总金额中,加上“等人价”。
用一个按键 QD 切换等人/行驶/清零三个状态。
用一个按键 RY 切换白天/夜间两个价格。
功能还是很简陋,缺少“起步价”、“打印”等等。
原程序的要求,也没有这许多,做而论道也就不添加这些了。