资讯详情

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

1、主要功能

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

2、仿真图

在这里插入图片描述

3、实验验证

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

4、程序源码

/** ************************************* Copyright ****************************** File name: // 51出租车计价器 Author:Kevin Version: //1.0 Description: // 实现出租车计价功能,白天和晚上可以设定不同的价格。 Others: // 其它内容的说明 Log: // 公众号:Kevin的学习站 ****************************************************************************** */ #include<reg51.h> #include<LCD1602.h>  #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;         ///白天单价 每公里6元超过3公里 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== 

标签: 台肯压力继电器dnc

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台