基于51单片机的出租车计价器(程序+仿真+论文)

1、主要功能

设计要求 :
①、不同情况具有不同的收费标准。 白天,晚上,途中等待(>10min 开始收费);
②、能进行手动修改单价 ;
③、具有数据的复位功能;
④、具有启动计时开关、白天/晚上收费标准的转换开关、数据的清零开关、单价的调整(最好使用+和-按键);
⑤、数据输出:单价输出 2 位(要能输入小数),路程输出 2 位,总金额输出 3 位(有 1 位小数)。

2、仿真图

基于51单片机的出租车计价器(程序+仿真+论文)_第1张图片

3、实验验证

基于51单片机的出租车计价器

4、程序源码

基于51单片机的出租车计价器(程序+仿真+论文)_第2张图片

/**
  ************************************* Copyright ****************************** 
  File name: // 51出租车计价器
  Author:Kevin
  Version: //1.0
  Description: // 实现出租车计价功能,可以分白天和晚上设置不同价格。
  Others: // 其它内容的说明
  Log: // 公众号:Kevin的学习站
  ******************************************************************************
 */
#include
#include

#define uchar unsigned char
#define uint  unsigned int


sbit key_start =P1^0;	 //开始/结束计价
sbit key_wait  =P1^1;	 //等待
sbit key_set   =P1^2;	 //设置
sbit key_jia   =P1^3;	 //加值
sbit key_jian  =P1^4;	 //减值
sbit key_dn    =P1^5;   //控制白天晚上
sbit key_fuwei =P1^6;  //复位
sbit mod=P1^7;          //电机控制


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

uint mil2;                

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

void delay(uchar ms)        //延时函数
{
   uchar j;
	 while(ms--)
	 {
	  for(j=0;j<130;j++);
	 }
}

void key()        //按键函数
{  
			if(key_dn==0)
				 {
           delay(5);   //延时去抖
					 if(key_dn==0)
					  {
             while(!key_dn);
						 dnc=~dnc;						
            }
         }
        if(key_start==0)
				 {
           delay(5);
					 if(key_start==0)
					  {
             while(!key_start);   //检测按键是否松开
						 qiting=~qiting;      //起 停 转换
						 if(qiting==0)         
						   { 
                moshi=0;
               }
              mod=~qiting;         //电机打开/关闭
							TR0=qiting;          //定时器0打开/关闭
              set_f=0;							 
            }
         }
				 if(key_fuwei==0)          //复位
				 {
           delay(5);
					 if(key_fuwei==0)
					  {
             while(!key_fuwei);
						 miao=0;fen=0;shi=0;
						 price1=0;price2=0;	mil=0;moshi=0; 
            }
         } 
				if(key_wait==0)
				{
				 delay(5);
				 if(key_wait==0)
				 {
				  while(!key_wait);
					miao=0;fen=0;shi=0;
					moshi=2;
				 }
				}	
					 
				if(qiting==0)         //结束计价后才能设置
				{					
				if(key_set==0)
				 {
           delay(5);
					 if(key_set==0)
					  {
             while(!key_set);
						 set_f++;
						 moshi=1;
             if(set_f==5){moshi=0;set_f=0;}							
            }
         }
        if(set_f!=0)
				 {
         if(key_jia==0)
				 {
           delay(5);
					 if(key_jia==0)
					  {
             while(!key_jia);
				     if(set_f==1){if(start_price<999)start_price++;}
						 if(set_f==2){if(Wait_price<999)Wait_price++;}
						 if(set_f==3){if(black_price<999)black_price++;}
						 if(set_f==4){if(white_price<999)white_price++;}
            }
         } 
				 if(key_jian==0)
				 {
           delay(5);
					 if(key_jian==0)
					  {
             while(!key_jian);
				     if(set_f==1){if(start_price>0)start_price--;}
						 if(set_f==2){if(Wait_price>0)Wait_price--;}
						 if(set_f==3){if(black_price>0)black_price--;}
						 if(set_f==4){if(white_price>0)white_price--;}
            }
         }
         }
			 } 
      }

void xianshi()
     {
			 if(moshi!=moshi2)    
			  {
          lcd_wcmd(0x01);       //清显示屏	
					moshi2=moshi;
        }				 
			 if(moshi==0)
			 {	
         lcd_wcmd(0x80);
			 lcd_data('N');
       lcd_data('J');	
			 lcd_data(':'); 
			 lcd_data(ASCII[black_price%1000/100]);
			 lcd_data(ASCII[black_price%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[black_price%10]);

				 
//       lcd_wcmd(0x80);
//			 lcd_data('D');
//       lcd_data('J');	
//			 lcd_data(':'); 
//			 lcd_data(ASCII[white_price%1000/100]);
//			 lcd_data(ASCII[white_price%100/10]);
//			 lcd_data('.');
//			 lcd_data(ASCII[white_price%10]);
//			 lcd_data('Y');
			 lcd_data('G');
			 lcd_data(':');  
			 lcd_data(ASCII[mil%1000/100]);
			 lcd_data(ASCII[mil%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[mil%10]);
			 lcd_data('K');
			 lcd_data('M');	 
			 lcd_wcmd(0x80+0x40);
			 lcd_data('D');
       lcd_data('J');	
			 lcd_data(':'); 
			 lcd_data(ASCII[white_price%1000/100]);
			 lcd_data(ASCII[white_price%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[white_price%10]);
			 lcd_data('Y');
			 lcd_data('Y');
       lcd_data('Q');	
			 lcd_data(':');
			 lcd_data(ASCII[price1%1000/100]);
			 lcd_data(ASCII[price1%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[price1%10]);
			 lcd_data('O');
			 lcd_data('Y');
			 }
			if(moshi==1)       //改价页面
			 {				 
       lcd_wcmd(0x80);
			 lcd_data('S');
       lcd_data('J');	
			 lcd_data(ASCII[start_price%1000/100]);
			 lcd_data(ASCII[start_price%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[start_price%10]);
			 lcd_data('Y');
			 lcd_data(' ');  
			 lcd_data('P');
			 lcd_data('T'); 
 
			 lcd_data(ASCII[Wait_price%1000/100]);
			 lcd_data(ASCII[Wait_price%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[Wait_price%10]);
			 lcd_data('Y');
			  
			 lcd_wcmd(0x80+0x40);
			 lcd_data('N');
       lcd_data('J');	
			 lcd_data(ASCII[black_price%1000/100]);
			 lcd_data(ASCII[black_price%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[black_price%10]);
			 lcd_data('Y');
       lcd_data(' ');	
	     lcd_data('D');
       lcd_data('J');	
			 lcd_data(ASCII[white_price%1000/100]);
			 lcd_data(ASCII[white_price%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[white_price%10]);
			 lcd_data('Y');
			 }
			 if(moshi==2)       //等待页面
			  {
				
        lcd_wcmd(0x80);
			 lcd_data('W');
       lcd_data('a');	
			 lcd_data('i'); 
			 lcd_data('t');	
			 lcd_data(':');
			 lcd_data(' ');
			 lcd_data(' ');
	
			 lcd_data(ASCII[shi%100/10]);
			 lcd_data(ASCII[shi%10]);
			 lcd_data(':');
			 lcd_data(ASCII[fen%100/10]);
			 lcd_data(ASCII[fen%10]);
			 lcd_data(':');
			 lcd_data(ASCII[miao%100/10]);
			 lcd_data(ASCII[miao%10]); 
		
	 
			 lcd_wcmd(0x80+0x40);
			 lcd_data('D');
       lcd_data('D');	
			 lcd_data('M');
			 lcd_data(':');
//			 lcd_data(ASCII[(white_price/2)%1000/100]);
//			 lcd_data(ASCII[(white_price/2)%100/10]);
			 lcd_data(ASCII[price2%1000/100]);
			 lcd_data(ASCII[price2%100/10]);
			 lcd_data('.');
			 lcd_data(ASCII[price2%10]);
			 //lcd_data(ASCII[(white_price/2)%10]);
			 lcd_data(' ');
			 lcd_data('Y'); 
        }  
     }
		 
void jiaqianjisuan()         //计算价钱
      {
				if(dnc==0)   //白天价钱
				{	
				if(mil>30) 
				 {	
          price1=(white_price*((mil-30)/10));
				  price1=price1+start_price+price2;	
				 }
				else
				 price1=start_price+price2;	
			 }	
       else         //晚上价钱
			 {
         if(mil>30) 
				 {	
          price1=(black_price*((mil-30)/10));
				  price1=price1+start_price+price2;	
				 }
				else
				 price1=start_price+price2;	
       }	
			
	     }		 

void T0_init()                   //定时器0初始化
		  {
        	EA=1;                  //开总中断
	        ET0=1;                 //定时器T0中断允许         
	        TMOD=0x01;             //使用定时器T0的模式1
					TH0=(65536-50000)/256; //定时器T0的高8位赋初值
					TL0=(65536-50000)%256; //定时器T0的低8位赋初值
					TR0=0;				         //关闭定时器0
				  EX0=1;                 //外部中断0允许位
				  IT0=1;                 //下降沿触发外部中断
      }
		 
void main()
{
	lcd_init();           //LCD1602初始化

	T0_init();           //定时器0初始化
while(1)							 //死循环
	{
	
		  jiaqianjisuan();
		   key();			//按键检测处理
	    xianshi();
		 
  }
} 

void timer0() interrupt 1                  //定时器0中断函数
   {
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;                //定50ms
     ms++;
     if(ms>=20)
	   { 
	    ms=0;
	    miao++;
		  if(moshi==0)
		  { 
	    if(miao>=3)
		   { 
        moshi=2;
				miao=0;
	     }
		   } 
	    if(moshi==2)
			 {
         if(miao>=60)
				  {
           miao=0;
						fen++;
						if(fen>=60)
						{
              fen=0;
							shi++;
            }
						if(moshi==2){if(fen>=1)price2=price2+(white_price/2); }
           }
       }
	   } 
   }


void inn0() interrupt 0         //外部中断0中断子函数           
   {
		if(qiting==1)
    {			
		mil2++;
		if(moshi==2) moshi=0; 
		if(moshi==0) miao=0;
    if(mil2==10)	
    {
     mil2=0;			
     mil++; 
		}
	  }
   } 

5、资源获取

在这里插入图片描述
其它毕设/课设资源
基于51单片机的智能温控风扇
基于51单片机的智能水箱控制系统
基于51单片机的智能家居安防系统
基于51单片机的计算器设计
基于单片机的声光电子琴
自动浇花系统的设计
基于51单片机数字电压表的设计
基于51单片机的CO浓度报警器设计
基于51单片机的温度报警器设计
51单片机+PM2.5+温湿度
基于51单片机的智能小车
基于51单片机+超声波模块的避障小车
基于51单片机的四通道交通灯设计
项目的仿真和程序工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“出租车计价器”,就可以获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
在这里插入图片描述

你可能感兴趣的:(#,单片机设计,51单片机,单片机,嵌入式硬件)