這匯編的程序,編寫的很復雜,實現(xiàn)的功能卻還是很簡陋。
在硬件方面,顯示金額的位數(shù)也不足。
做而論道用 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時關(guān)閉顯示
{
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; //等客狀態(tài)
for(;;) {
while (mode == 0) {display(mode); key();}//等客
//開始行駛, 各項初始值皆設(shè)為零
n_50ms = 0; n_X0 = 0; //時間, 外部中斷次數(shù)
jvli = 0; jinee = 0; //距離, 金額
EX0 = 1; TR0 = 1; //開始統(tǒng)計里程, 計算等車時間
while (mode == 1) {display(mode); key();}//等待下車
EX0 = 0; TR0 = 0; //停止統(tǒng)計
//數(shù)據(jù)停止變化, 停車結(jié)算
while (mode == 2) {display(mode); key();}//等待清零
}
}
//---------------------------------------
void X0_INT() interrupt 0
{
n_50ms = 0;
n_X0++;
if(n_X0 == 6) { //中斷6次, 假設(shè)就是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
}
}
//---------------------------------------
仿真后的截圖如下:
功能說明:
出租車在白天、晚上,每公里的價格是不同的,都要在程序的開始處進行定義。
同時還定義了停車等人的價格,每當?shù)却?30s,即要總金額中,加上“等人價”。
用一個按鍵 QD 切換等人/行駛/清零三個狀態(tài)。
用一個按鍵 RY 切換白天/夜間兩個價格。
功能還是很簡陋,缺少“起步價”、“打印”等等。
原程序的要求,也沒有這許多,做而論道也就不添加這些了。