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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_33836580/article/details/50579148


有个出租车计价器的题目,给出了汇编的程序,要求改为 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

    }

}

//---------------------------------------


仿真后的截图如下:

51单片机--仿真出租车计价器 - 非著名博主 - 电子信息角落


功能说明:


出租车在白天、晚上,每公里的价格是不同的,都要在程序的开始处进行定义。


同时还定义了停车等人的价格,每当等待 30s,即要总金额中,加上“等人价”。


用一个按键 QD 切换等人/行驶/清零三个状态。


用一个按键 RY 切换白天/夜间两个价格。


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


原程序的要求,也没有这许多,做而论道也就不添加这些了。



展开阅读全文

没有更多推荐了,返回首页