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==