找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机出租车计价器程序

[复制链接]
跳转到指定楼层
楼主
ID:1013951 发表于 2023-11-13 12:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在本次设计中电路键盘用到了P1口,其中P1.0口到P1.3口作为键盘的输入,显示电路用到了P0口和P2口,P2口为液晶的数据口,P3.7口作为AD的输入端。

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <LCD1602.h>
  3. #include "XPT2046.h"
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. unsigned char Command,Speed;

  7. sbit key_start =P3^1;         //开始/结束计价
  8. sbit key_wait  =P3^0;         //等待
  9. sbit key_set   =P1^2;         //设置

  10. sbit key_dn    =P3^2;   //控制白天晚上
  11. sbit key_fuwei =P3^3;  //复位

  12. /************************——变量定义***********************/
  13. uint start_price=70;                //起步价88
  14. uint white_price=18;         //白天的单价   超过3公里每公里6元66
  15. uint black_price=20;        //夜晚的单价   超过3公里每公里8元88
  16. uint Wait_price=100;                //等待价钱100
  17. bit dnc=0;                   //白天晚上的转换标志
  18. bit qiting;                 //起 停标志位   
  19. uint price1,price2;                           //总价钱、等待价钱
  20. uint   mil;                //里程数

  21. uint mil2;               

  22. uchar shi,fen,miao;
  23. uchar  moshi,moshi2,ms,set_f;                                //模式mos=0初始界面,=1改价页面,=2等待页面           
  24.                                 //set_f设置标志=1设置初始,=2设置等待价,=3设置晚上单价,=4设置白天单价


  25. void delay(uchar ms)        //延时函数
  26. {
  27.    uchar j;
  28.          while(ms--)
  29.          {
  30.           for(j=0;j<130;j++);
  31.          }
  32. }


  33. void key()        //按键函数
  34. {  
  35.                         if(key_dn==0)
  36.                                  {
  37.            delay(5);   //延时去抖
  38.                                          if(key_dn==0)
  39.                                           {
  40.              while(!key_dn);
  41.                                                  dnc=~dnc;                                                
  42.             }
  43.          }
  44.         if(key_start==0)
  45.                                  {
  46.            delay(5);
  47.                                          if(key_start==0)
  48.                                           {
  49.              while(!key_start);   //检测按键是否松开
  50.                                                  qiting=~qiting;      //起 停 转换
  51.                                                  if(qiting==0)         
  52.                                                    {
  53.                 moshi=0;
  54.                }
  55.          
  56.                                                         TR0=qiting;          //定时器0打开/关闭
  57.               set_f=0;                                                         
  58.             }
  59.          }
  60.                                  if(key_fuwei==0)          //复位
  61.                                  {
  62.            delay(5);
  63.                                          if(key_fuwei==0)
  64.                                           {
  65.              while(!key_fuwei);
  66.                                                  miao=0;fen=0;shi=0;
  67.                                                  price1=0;price2=0;        mil=0;moshi=0;
  68.             }
  69.          }
  70.                                 if(key_wait==0)
  71.                                 {
  72.                                  delay(5);
  73.                                  if(key_wait==0)
  74.                                  {
  75.                                   while(!key_wait);
  76.                                         miao=0;fen=0;shi=0;
  77.                                         moshi=2;
  78.                                  }
  79.                                 }        
  80.                                          
  81.                                 if(qiting==0)         //结束计价后才能设置
  82.                                 {                                       
  83.                                 if(key_set==0)
  84.                                  {
  85.            delay(5);
  86.                                          if(key_set==0)
  87.                                           {
  88.              while(!key_set);
  89.                                                  set_f++;
  90.                                                  moshi=1;
  91.              if(set_f==5){moshi=0;set_f=0;}                                                        
  92.             }
  93.          }
  94.         
  95.          
  96.          }
  97.                                }

  98. void xianshi()
  99.      {
  100.                          if(moshi!=moshi2)   
  101.                           {
  102.           lcd_wcmd(0x01);       //清显示屏        
  103.                                         moshi2=moshi;
  104.         }                                 
  105.                          if(moshi==0)
  106.                          {        
  107.          lcd_wcmd(0x80);
  108.                          lcd_data('N');
  109.        lcd_data('J');        
  110.                          lcd_data(':');
  111.                          lcd_data(ASCII[black_price%1000/100]);
  112.                          lcd_data(ASCII[black_price%100/10]);
  113.                          lcd_data('.');
  114.                          lcd_data(ASCII[black_price%10]);

  115.                                  
  116. //       lcd_wcmd(0x80);
  117. //                         lcd_data('D');
  118. //       lcd_data('J');        
  119. //                         lcd_data(':');
  120. //                         lcd_data(ASCII[white_price%1000/100]);
  121. //                         lcd_data(ASCII[white_price%100/10]);
  122. //                         lcd_data('.');
  123. //                         lcd_data(ASCII[white_price%10]);
  124. //                         lcd_data('Y');
  125.                                  mil=XPT2046_ReadAD(XPT2046_XP);
  126.                          lcd_data('G');
  127.                          lcd_data(':');  
  128.                          lcd_data(ASCII[mil%1000/100]);
  129.                          lcd_data(ASCII[mil%100/10]);
  130.                          lcd_data('.');
  131.                          lcd_data(ASCII[mil%10]);
  132.                          lcd_data('K');
  133.                          lcd_data('M');         
  134.                          lcd_wcmd(0x80+0x40);
  135.                          lcd_data('D');
  136.        lcd_data('J');        
  137.                          lcd_data(':');
  138.                          lcd_data(ASCII[white_price%1000/100]);
  139.                          lcd_data(ASCII[white_price%100/10]);
  140.                          lcd_data('.');
  141.                          lcd_data(ASCII[white_price%10]);
  142.                          lcd_data('Y');
  143.                          lcd_data('Y');
  144.        lcd_data('Q');        
  145.                          lcd_data(':');
  146.                          lcd_data(ASCII[price1%1000/100]);
  147.                          lcd_data(ASCII[price1%100/10]);
  148.                          lcd_data('.');
  149.                          lcd_data(ASCII[price1%10]);
  150.                          lcd_data('O');
  151.                          lcd_data('Y');
  152.                          }
  153.                         if(moshi==1)       //改价页面
  154.                          {                                 
  155.        lcd_wcmd(0x80);
  156.                          lcd_data('S');
  157.        lcd_data('J');        
  158.                          lcd_data(ASCII[start_price%1000/100]);
  159.                          lcd_data(ASCII[start_price%100/10]);
  160.                          lcd_data('.');
  161.                          lcd_data(ASCII[start_price%10]);
  162.                          lcd_data('Y');
  163.                          lcd_data(' ');  
  164.                          lcd_data('P');
  165.                          lcd_data('T');

  166.                          lcd_data(ASCII[Wait_price%1000/100]);
  167.                          lcd_data(ASCII[Wait_price%100/10]);
  168.                          lcd_data('.');
  169.                          lcd_data(ASCII[Wait_price%10]);
  170.                          lcd_data('Y');
  171.                           
  172.                          lcd_wcmd(0x80+0x40);
  173.                          lcd_data('N');
  174.        lcd_data('J');        
  175.                          lcd_data(ASCII[black_price%1000/100]);
  176.                          lcd_data(ASCII[black_price%100/10]);
  177.                          lcd_data('.');
  178.                          lcd_data(ASCII[black_price%10]);
  179.                          lcd_data('Y');
  180.        lcd_data(' ');        
  181.              lcd_data('D');
  182.        lcd_data('J');        
  183.                          lcd_data(ASCII[white_price%1000/100]);
  184.                          lcd_data(ASCII[white_price%100/10]);
  185.                          lcd_data('.');
  186.                          lcd_data(ASCII[white_price%10]);
  187.                          lcd_data('Y');
  188.                          }
  189.                          if(moshi==2)       //等待页面
  190.                           {
  191.                                 
  192.         lcd_wcmd(0x80);
  193.                          lcd_data('W');
  194.        lcd_data('a');        
  195.                          lcd_data('i');
  196.                          lcd_data('t');        
  197.                          lcd_data(':');
  198.                          lcd_data(' ');
  199.                          lcd_data(' ');
  200.         
  201.                          lcd_data(ASCII[shi%100/10]);
  202.                          lcd_data(ASCII[shi%10]);
  203.                          lcd_data(':');
  204.                          lcd_data(ASCII[fen%100/10]);
  205.                          lcd_data(ASCII[fen%10]);
  206.                          lcd_data(':');
  207.                          lcd_data(ASCII[miao%100/10]);
  208.                          lcd_data(ASCII[miao%10]);
  209.                
  210.          
  211.                          lcd_wcmd(0x80+0x40);
  212.                          lcd_data('D');
  213.        lcd_data('D');        
  214.                          lcd_data('M');
  215.                          lcd_data(':');
  216. //                         lcd_data(ASCII[(white_price/2)%100/10]);
  217.                          lcd_data(ASCII[price2%1000/100]);
  218.                          lcd_data(ASCII[price2%100/10]);
  219.                          lcd_data('.');
  220.                          lcd_data(ASCII[price2%10]);
  221.                          //lcd_data(ASCII[(white_price/2)%10]);
  222.                          lcd_data(' ');
  223.                          lcd_data('Y');
  224.         }  
  225.      }
  226.                  
  227. void jiaqianjisuan()         //计算价钱
  228.       {
  229.                                 if(dnc==0)   //白天价钱
  230.                                 {        
  231.                                 if(mil>25)
  232.                                  {        
  233.           price1=(white_price*(((mil-25)/10)+1));
  234.                                   price1=price1+start_price+price2;        
  235.                                  }
  236.                                 else
  237.                                  price1=start_price+price2;        
  238.                          }        
  239.        else         //晚上价钱
  240.                          {
  241.          if(mil>25)
  242.                                  {        
  243.           price1=(black_price*(((mil-25)/10)+1));
  244.                                   price1=price1+start_price+price2;        
  245.                                  }
  246.                                 else
  247.                                  price1=start_price+price2;        
  248.        }        
  249.                         
  250.              }                 

  251. void T0_init()                   //定时器0初始化
  252.                   {
  253.                 EA=1;                  //开总中断
  254.                 ET0=1;                 //定时器T0中断允许         
  255.                 TMOD=0x01;             //使用定时器T0的模式1
  256.                                         TH0=(65536-50000)/256; //定时器T0的高8位赋初值
  257.                                         TL0=(65536-50000)%256; //定时器T0的低8位赋初值
  258.                                         TR0=0;                                         //关闭定时器0
  259.                                   EX0=1;                 //外部中断0允许位
  260.                                   IT0=1;                 //下降沿触发外部中断
  261.       }
  262.                  
  263. void main()
  264. {
  265.         
  266.         lcd_init();           //LCD1602初始化
  267.         T0_init();           //定时器0初始化
  268. while(1)                                                         //死循环
  269.         {
  270.         
  271.                   jiaqianjisuan();
  272.                    key();                        //按键检测处理
  273.             xianshi();
  274.                  
  275.   }
  276. }

  277. void timer0() interrupt 1                  //定时器0中断函数
  278.    {
  279.      TH0=(65536-50000)/256;
  280.      TL0=(65536-50000)%256;                //定50ms
  281.      ms++;
  282.      if(ms>=20)
  283.            {
  284.             ms=0;
  285.             miao++;
  286.                   if(moshi==0)
  287.                   {
  288.             if(miao>=3)
  289.                    {
  290.         moshi=2;
  291.                                 miao=0;
  292.              }
  293.                    }
  294.             if(moshi==2)
  295.                          {
  296.          if(miao>=60)
  297.                                   {
  298.            miao=0;
  299.                                                 fen++;
  300.                                                 if(fen>=60)
  301.                                                 {
  302.               fen=0;
  303.                                                         shi++;
  304.             }
  305.                                                 if(moshi==2){if(fen>=1)price2=fen*50; }
  306.            }
  307.        }
  308.            }
  309.    }


  310. void inn0() interrupt 0         //外部中断0中断子函数           
  311.    {
  312.                 if(qiting==1)
  313.     {                        
  314.                 mil2++;
  315.                 if(moshi==2) moshi=0;
  316.                 if(moshi==0) miao=0;
  317.     if(mil2==10)        
  318.     {
  319.      mil2=0;                        
  320.      mil++;
  321.                 }
  322.           }
  323.    }
复制代码

原理图: 无
仿真: 无
代码: 程序.7z (728.2 KB, 下载次数: 3)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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