您的位置:首页 > 其它

51单片机--仿真出租车计价器

2016-01-25 12:11 399 查看
有个出租车计价器的题目,给出了汇编的程序,要求改为 C 语言的程序。

链接:
http://zhidao.baidu.com/question/624216479740708564.html

http://tieba.baidu.com/p/3142583403

这汇编的程序,编写的很复杂,实现的功能却还是很简陋。

在硬件方面,显示金额的位数也不足。

做而论道用 C 重新编写了一个程序,如下:

#include<reg52.h> 

#include<intrins.h>

#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 切换白天/夜间两个价格。

功能还是很简陋,缺少“起步价”、“打印”等等。

原程序的要求,也没有这许多,做而论道也就不添加这些了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: