完整版基于单片机的出租车计费器的毕业设计论文.docx
《完整版基于单片机的出租车计费器的毕业设计论文.docx》由会员分享,可在线阅读,更多相关《完整版基于单片机的出租车计费器的毕业设计论文.docx(9页珍藏版)》请在冰豆网上搜索。
完整版基于单片机的出租车计费器的毕业设计论文
优秀论文审核通过
未经允许切勿外传
基于单片机出租车计费器的设计
目录
摘要2
ABSTRACT3
1课程设计任务书4
1.1课程设计任务4
1.2课程设计方案4
2硬件电路设计6
2.1振荡电路6
2.2复位电路设计6
2.3键盘接口电路7
2.4显示电路7
2.4.11602LCD的基本参数及引脚功能7
2.4.2显示模块采用1602液晶显示接口电路9
2.5单片机各引脚功能说明9
3软件设计11
3.1单片机资源使用11
3.2单片机软件模块设计12
3.2.1中断子函数12
3.2.2判键子函数12
3.2.3显示子程序13
3.3总程序流程框图14
总结15
参考文献16
致谢17
附录1元件件清单18
附录2原理图19
附录3程序清单20
摘要
本设计的是一个基于单片机STC89C52的出租车自动计费设计,附有复位电路,时钟电路,键盘电路等。
复位电路是单片机的初始化操作,除了正常的初始化外,为摆脱困境,通过复位电路可以重新开始。
时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。
在上电时字符型液晶1602显示最初的起步价,里程收费,等待时间收费三种收费,通过按键可以调整起步价,里程收费,等待时间收费。
通过按键模拟出租车的运行,暂停,停止。
在1602液晶上可以显示运行的时间,运行时暂停的时间,通过计算可以得出总共的费用和总的路程。
在这里主要是以STC89C52单片机为核心控制器,P1口接1602液晶显示模块。
关键字STC89C52;1602液晶;出租车计费器
ABSTRACT
ThedesignisbasedonamonolithicintegratedcircuitSTC89C52taxibillingdesign,withresetcircuit,clockingcircuit,keyboardcircuit.Resetcircuitisinitialized,besidesthenormaloperationoftheinitialdilemma,asaforeigner,throughtheresetcircuitcanstartagain.12MHzadoptstheclockcircuit,asasystemofcrystaloscillator,thecrystalthattheinitial1602,charges,feesmileagewaitingtime,threebuttonscanbeadjustedbychargingfees,justwaitingtime,mileage.Throughthesimulationofthetaxi,buttons,stop.SuspensionIntheliquidcrystaldisplaycanrun1602,operationtime,whensuspensioncanbeobtainedbythecomputationofthetotalcost.=0,shi;
ucharflag_bai__3l_price=70;晚上3千米内的单价千米7元
uintwan_3w_price=22;晚上3千米外的单价千米2.2元
uintwan_wait_price=10;晚上等待时的单价分钟1元
uintdistance=0;行使的距离
uintzong_jia;总的价
bitflag_300ms=0;
bitflag_1s;
bitflag_time_en=0;
#include"lcd1602._3l_price%256);保存数据
write_24c02(8,wan_3l_price256);保存数据
write_24c02(9,wan_3w_price%256);保存数据
write_24c02(10,wan_3w_price256);保存数据
write_24c02(11,wan_wait_price%256);保存数据
write_24c02(12,wan_wait_price256);保存数据
}
****************自动初始化保存的数据*******************
voidzidong_chushifa_iic()
{
value=read_24c02(200);
value=read_24c02(200);
if(value!
=0x91)新的单片机初始单片机内问EEPOM
{
value=0x91;
write_iic_data();
write_24c02(200,value);保存数据
}
delay_1ms(300);
}
****************读出来保存的数据**********************
voidread_iic_data()
{
flag_bai__3l_price=read_24c02(8);
wan_3l_price=wan_3l_price*256+read_24c02(7);
wan_3w_price=read_24c02(10);
wan_3w_price=wan_3w_price*256+read_24c02(9);
wan_wait_price=read_24c02(12);
wan_wait_price=wan_wait_price*256+read_24c02(11);
}
****************独立按键处理函数************************
#definekey_ioP2
ucharkey_can;
voidkey()
{
staticucharkey_new=0,key_old=0,key_value=0;
key_io|=0x3f;
if(key_new==0)按键松开
{
if((key_io&0x3f)==0x3f)
key_value++;
else
key_value=0;
if(key_value>=5)按键松开松手检测
{
key_value=0;
key_new=1;按键松开后进入等待按键状态
}
}
else
{
if((key_io&0x3f)!
=0x3f)按键按下
key_value++;
else
key_value=0;
if(key_value>=5)按键按下消抖
{
key_value=0;
key_new=0;按键松开后进入等待松开按键状态
}
}
key_can=20;
if((key_new==0)&&(key_old==1))
{
switch(key_io&0x3f)
{
case0x3e:
key_can=1;break;得到按键值
case0x3d:
key_can=2;break;得到按键值
case0x3b:
key_can=3;break;得到按键值
case0x37:
key_can=4;break;得到按键值
case0x1f:
key_can=5;break;得到按键值
case0x2f:
key_can=6;break;得到按键值
}
write_sfm2(2,0,key_can);按键按下显示按键值
}
key_old=key_new;
}
#include"menu.==6)
{
distance++;
write_sfm4(1,0,distance);
}
if(key_can==5)清零从新计价
{
flag_time_en=0;
shi=0;
fen=0;
miao=0;
zong_jia=0;
distance=0;
}
if(key_can==2)
{
flag_time_en=~flag_time_en;
}
if(flag_300ms==1)
{
flag_300ms=0;
if(distance<=30)3公里内的价格
{
if(flag_bai_<=3)
zong_jia=bai_3l_price;
else
zong_jia=bai_3l_price+(shi*60+fen-3)*bai_wait_price;
}
else
{
if(fen<=3)
zong_jia=wan_3l_price;
else
zong_jia=wan_3l_price+(shi*60+fen-3)*bai_wait_price;
}
}else3公里外的价格
{
if(flag_bai_<=3)
zong_jia=bai_3l_price+bai_3w_price*(distance-30)10;
else
zong_jia=bai_3l_price+bai_3w_price*(distance-30)10+(shi*60+fen-3)*bai_wait_price;
}
else
{
if(fen<=3)
zong_jia=wan_3l_price+wan_3w_price*(distance-30)10;
else
zong_jia=wan_3l_price+wan_3w_price*(distance-30)10+(shi*60+fen-3)*wan_wait_price;
}
}
if(flag_bai_(2,9,bai_3w_price);
else
write_sfm2_dian(2,9,wan_3w_price);
write_sfm2(2,0,shi);
write_sfm2(2,3,fen);
write_sfm2(2,6,miao);
write_sfm4(1,10,zong_jia);
write_sfm4(1,0,distance);
write_zifu(1,15,0x5c);¥
write_zifu(2,12,0x5c);¥
}
}
}
*********************显示函数******************
voidjishu_chashu()
{
if((flag_1s==1)&&(flag_time_en==1))
{
flag_1s=0;
miao++;
if(miao>=60)
{
miao=0;
fen++;
if(fen>=60)
{
fen=0;
shi++;
if(shi>=24)
{
shi=0;
}
}
}
}
}
*************定时器0初始化程序***************
voidtime_init()
{
EA=1;开总中断
TMOD=0X01;定时器0、工作方式1
ET0=1;开定时器0中断
TR0=1;允许定时器0定时
}
voidmain()
{
init_1602();
init_1602_dis_csf();
zidong_chushifa_iic();
read_iic_data();
time_init();
init_menu();
while
(1)
{
key();
if(key_can<20)
key_with();
menu_dis();
jishu_chashu();
}
}
*************定时器0中断服务程序***************
voidtime0_int()interrupt1
{
staticucharvalue;
TH0=0x3c;
TL0=0xb0;50ms
value++;
if(value%6==0)
flag_300ms=1;
if(value>=20)
{
flag_1s=1;
value=0;
}
}