找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2484|回复: 5
打印 上一主题 下一主题
收起左侧

89C52单片机出租车计费系统Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
本帖最后由 crow23 于 2021-6-27 08:48 编辑

P32脚接入外部脉冲,运用外部脉冲输入模拟车轮,计算里程,低于10HZ进入等待计费。

使用了DS1302可以设置时间,单价分不同时段,带停车等待计价功能。计算价钱方式以下

在6:00---23:00期间,起步费6元,可运营3公里,超过3公里后每公里3.00元。

在23:00---到次日6:00期间,起步费6元,可运营3公里,超过3公里后每公里4.00元。


出租车平时每等候10秒按0.1元计算。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


原理图:


pcb:


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<type.h>
  3. #include<intrins.h>
  4. #include<lcddisp.h>
  5. #include<ds1302.h>

  6. uchar code univalent[2] = {2,4};                                        //???????,[0]-???????,[1]-???????
  7. uchar code time_pos[7] = {4,-1,7,10,4,7,10};        //????????????
  8. uchar code money_pos[4] = {4,7,4,7};                //????????????????
  9. bit config_ok = 0;                                                      //0-?????,1-????
  10. bit state = 0;                                                                                //?????????,0-??(???),1-??(???)
  11. bit pause = 0;                                                                                //???????,0-????,1-????
  12. uint pulse_count = 0;                                                                   //?????
  13. uint pulse_count_tmp = 0;
  14. uint time_count = -300;                                                                //?????????,????,5???,10s-1km-1.5?
  15. uint mileage_count_new = 0,mileage_count_old = 0;        //???????,??????????,???km,1km-3?,
  16. uchar idata time[7] = {0x12,0x5,0x12,0x22,0x0,0x0,0x0};                //???????
  17. uint money[2]={5,0};                            //???????,[0]-???,[1]-???
  18. uchar first_3_km = 0;
  19. unsigned long money_temp=600;
  20. uint idata DayMoney=180,NightMoney=200,WaitMoney=150;


  21. void INT0_init(void);
  22. void INT1_init(void);
  23. void Delay(uint);
  24. void System_init(void);
  25. void Time_Show(uchar time_data[7]);
  26. void Run_Show_Time(uchar time_data[7]);
  27. void Money_Show(uint money[2]);
  28. void Show_Wait_Time(uint);
  29. void Show_Mileage(void);
  30. void Run_BackGround(void);                                                        //?????,??LCD??????

  31. void Run_BackGround(void)
  32. {
  33.         WriteChar('/', 3,0);
  34.         WriteChar(':',10,0);
  35.         WriteChar(':',13,0);
  36.         WriteChar('.',3,1);
  37.         WriteChar('Y',6,1);
  38. }

  39. void Show_Mileage(void)
  40. {
  41.         WriteDecimal(pulse_count / 200,0,12,1);
  42.         WriteInt(pulse_count % 200 / 10,0,0,13,1);

  43.         WriteChar('.',12,1);
  44.         WriteString("km",14,1);
  45. }

  46. void Show_Wait_Time(uint time_count)
  47. {
  48.         WriteChar('s',15,1);
  49.         WriteChar(' ', 10,1);

  50.         WriteInt(time_count,1,4,11,1);
  51. }

  52. void Money_Show(uint money[2])
  53. {
  54.         WriteDecimal(money[0],0,3,1);
  55.         WriteDecimal(money[1],1,3,1);
  56. }

  57. void Run_Show_Time(uchar time_data[7])
  58. {
  59.         WriteInt(BcdToInt(time_data[2]),1,2, 1,0);
  60.         WriteInt(BcdToInt(time_data[3]),1,2, 4,0);
  61.         WriteInt(BcdToInt(time_data[4]),1,2, 8,0);
  62.         WriteInt(BcdToInt(time_data[5]),1,2,11,0);
  63.         WriteInt(BcdToInt(time_data[6]),1,2,14,0);
  64. }

  65. void Time_Show(uchar time_data[7])
  66. {
  67.         WriteChar('/',6,0);
  68.         WriteChar('/',9,0);
  69.         WriteChar(':',6,1);
  70.         WriteChar(':',9,1);        
  71.         
  72.         WriteInt(BcdToInt(time_data[0]),1,2, 4,0);
  73.         WriteInt(BcdToInt(time_data[2]),1,2, 7,0);
  74.         WriteInt(BcdToInt(time_data[3]),1,2,10,0);
  75.         WriteInt(BcdToInt(time_data[4]),1,2, 4,1);
  76.         WriteInt(BcdToInt(time_data[5]),1,2, 7,1);
  77.         WriteInt(BcdToInt(time_data[6]),1,2,10,1);
  78. }

  79. void System_init(void)
  80. {
  81.         RstLcd();
  82.         ClrLcd();
  83.         P1 = 0x00;
  84.   
  85.         config_ok = 0;
  86.         Time_Show(time);
  87.         LcdPos(5,0);
  88.         SetCur(3);
  89.         INT1_init();
  90.         while(config_ok == 0);                                                        //??????????
  91.         ClrLcd();
  92.         SetCur(1);
  93.         WriteString("Set time OK...",0,0);
  94.         Delay(60000);
  95.         ClrLcd();
  96.         Run_BackGround();
  97.         P1= 0xff;
  98.         //money[0]=6;money[1]=0;
  99.         if((time[4]>6)&&(time[4]<23))        ///////////////////
  100.         {
  101.                 money[0]=5;
  102.                 money[1]=0;
  103.                 money_temp=600;
  104.         }
  105.         else
  106.         {
  107.                 money[0]=5;
  108.                 money[1]=0;
  109.                 money_temp=600;
  110.         }
  111.         Money_Show(money);
  112.         //P2=P2|0x0f;
  113. }

  114. void Delay(uint dtime)
  115. {
  116.         uint temp;
  117.         for(temp=0;temp<dtime;temp++);
  118. }

  119. void INT0_init(void)
  120. {
  121.         EA = 0;
  122.         IT0 = 1;
  123.         EX0 = 1;
  124.         EA = 1;
  125. }
  126. void INT1_init(void)
  127. {
  128.         EA = 0;
  129.         IT1 = 1;
  130.         EX1 = 1;
  131.         EA = 1;
  132. }

  133. void main()
  134. {         
  135.         uchar time_tmp[7],i;        

  136.         System_init();
  137.         DS1302_GetData(time);
  138.         pulse_count_tmp = pulse_count;
  139.         mileage_count_new = mileage_count_old = 0;

  140.         Money_Show(money);
  141.         Run_Show_Time(time);
  142.         Show_Mileage();

  143.         while(1)
  144.         {
  145.                 if(config_ok == 0)                                                        //????????
  146.                         System_init();
  147.                 DS1302_GetData(time_tmp);
  148.                
  149.                 if(!(P1 & 0x04))
  150.                 {
  151.                         P1 &= 0xfe;
  152.                         P1 |= 0x02;
  153.                         pause = 0;
  154.                         if(time[6] != time_tmp[6])
  155.                         {
  156.                                 Run_Show_Time(time_tmp);
  157.                                 for(i = 0;i < 7;i++)
  158.                                         time[i] = time_tmp[i];
  159.                         }
  160.                         first_3_km = 0;
  161.                
  162.                         mileage_count_new = mileage_count_old = 0;
  163.                         WriteString("  ",0,1);
  164.                         WriteString("  ",9,1);
  165.                         //money_temp=600;
  166.                         time_count = 0;
  167.                         //WriteDecimal(6,0,3,1);
  168.                         //money[0]=6;        money[1]=0;
  169.                         if((time[4]>6)&&(time[4]<23))        ///////////////////
  170.                         {
  171.                                 money[0]=5;
  172.                                 money[1]=0;
  173.                                 money_temp=600;
  174.                         }
  175.                         else
  176.                         {
  177.                                 money[0]=5;
  178.                                 money[1]=0;
  179.                                 money_temp=600;
  180.                         }
  181.                         DayMoney=180;NightMoney=200;
  182.                         //WriteDecimal(0,1,3,1);//
  183.                         Money_Show(money);
  184.                         pulse_count = 0;
  185.                         Show_Mileage();
  186.                         time_count = 0;
  187.                 }
  188.                 else if(pause == 0)
  189.                 {
  190.                         INT0_init();
  191.                         if(time[6] != time_tmp[6])
  192.                         {
  193.                                 Run_Show_Time(time_tmp);
  194.                                 for(i = 0;i < 7;i++)
  195.                                         time[i] = time_tmp[i];
  196.                                 
  197.                                 if(pulse_count - pulse_count_tmp < 10)            //?????????(??),????,?????????????10,?????
  198.                                 {
  199.                                         state = 1;
  200.                                         P1 &= 0xfe;
  201.                                         P1 |= 0x02;        
  202.                                         time_count ++;                                                          //?????1
  203.                                         if(        time_count>0)
  204.                                         {
  205.                                         if((time_tmp[4]>6)&&(time_tmp[4]<23))        ///////////////////
  206.                                         {
  207.                                                 WaitMoney=150;
  208.                                         }
  209.                                         else WaitMoney=150;
  210.                                         if(time_count % 10 == 0 && first_3_km > 2)//????,10s???1.5?
  211.                                         {
  212.                                                         money_temp+=WaitMoney;
  213.                                                         money[0]=money_temp/100;
  214.                                                         money[1] = money_temp%100;
  215.                                                 Money_Show(money);
  216.                                         }
  217.                                         else if(time_count % 10 == 0 && first_3_km <= 2)
  218.                                                 first_3_km ++;
  219.                                         else;
  220.                                         }                                
  221.                                         else
  222.                         money[0]=money_temp/100;
  223.                                         money[1] = money_temp%100;
  224.                                         mileage_count_old = mileage_count_new;        
  225.                                         Show_Wait_Time(time_count);
  226.                                 }
  227.                                 else                                                                                   //?????????(???)
  228.                                 {
  229.                                         state = 0;
  230.                                         P1 &= 0xfd;
  231.                                         P1 |= 0x01;        
  232.                                         //time_count = 0;                                                         //?????,??????0
  233.                                 }
  234.                                 pulse_count_tmp = pulse_count;
  235.                         }
  236.                         if(state == 0)
  237.                         {
  238.                                 mileage_count_new = pulse_count / 200;
  239.                                 if(mileage_count_new>10)
  240.                                 {
  241.                                         DayMoney=300;
  242.                                         NightMoney=400;
  243.                                 }
  244.                                 if(mileage_count_new != mileage_count_old && first_3_km > 2)
  245.                                 {
  246.                                         Show_Mileage();
  247.                                         for(i = mileage_count_old;i < mileage_count_new;i++)
  248.                                         {
  249.                                                 
  250.                                                 if((time_tmp[4]>6)&&(time_tmp[4]<23))        ///////////////////
  251.                                                 {
  252.                      money_temp+=DayMoney;
  253.                                                         money[0]=money_temp/100;
  254.                                                         money[1] = money_temp%100;
  255.                                                         Money_Show(money);
  256.                                                 }
  257.                                                 
  258.         {
  259. ……………………

  260. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

仿真工程与hex下载: 仿真.rar (23.33 KB, 下载次数: 45)
源代码(刚刚忘记发了。。。)已补全: 源代码.zip (98.89 KB, 下载次数: 36)
有问题联系我


51hei.png (2.82 KB, 下载次数: 104)

51hei.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:102963 发表于 2021-6-27 08:37 | 只看该作者
源代码不全,得压缩整个工程上传。
回复

使用道具 举报

板凳
ID:927515 发表于 2021-6-28 22:44 | 只看该作者
songxia8013 发表于 2021-6-27 08:37
源代码不全,得压缩整个工程上传。

我重新上传了
回复

使用道具 举报

地板
ID:328014 发表于 2021-6-28 23:22 | 只看该作者
工程可以自己建立,楼主不必这么麻烦,如果连工程都不会建立,估计也不会来这个论坛学习电子技术了
回复

使用道具 举报

5#
ID:946558 发表于 2021-6-29 10:17 | 只看该作者
能用ad实现吗
回复

使用道具 举报

6#
ID:927515 发表于 2021-7-20 09:52 | 只看该作者
51hei团团 发表于 2021-6-28 23:22
工程可以自己建立,楼主不必这么麻烦,如果连工程都不会建立,估计也不会来这个论坛学习电子技术了

还不是为了多回收一点黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表