#单片机课程设计出租车计价器.docx
《#单片机课程设计出租车计价器.docx》由会员分享,可在线阅读,更多相关《#单片机课程设计出租车计价器.docx(16页珍藏版)》请在冰豆网上搜索。
#单片机课程设计出租车计价器
计算机和信息工程学院
《单片机》课程设计
课程设计题目
出租车计价器
专业:
计算机控制
班级:
控制09--3
姓名:
费翔
学号:
20
指导教师:
范爱华
2012年3月2日
设计题目:
出租车计价器
设计目的:
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。
设计目标:
1.数据输出:
单价输出、路程输出、总金额输出
2.按键:
启动计时开关、数据显示切换、白天/晚上切换、复位
3.能手动进行修改单价
任务下达时间:
2012年2月27日
任务完成时间:
2012年3月1日
指导教师评语:
年月日
设计成绩:
摘要:
近些年来,随着单片机的发展,产品相当的繁多,单片微型机又称嵌入式控制器,是20世纪70年代中期发展起来的一种大规模的集成电路器件。
当单片机的使用不断地深入,新技术的发展也是层出不穷的。
这是一项新型的工程技术,其内涵也是随着单片机的发展而发展。
MCS-51系列的单片机是属于结构相当简单,但也是单片机中的典型,使用也相当的灵活。
51系列的单片机产品发展迅速,在国内外占有重要的地位。
出租车计价器从最初的只能进行简单的价格计算,发展到价格、距离独立计量并显示,可根据特殊情况设定相应的收费标准,能打印营运发票,可使用IC卡结算等的功能。
目前市场上的计价器越来越趋向于集成有多种功能。
关键词:
51单片机,价格计算,独立显示,手动输入
正文:
1.出租车计价器是乘客和司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
我们采用了单片机进行设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
针对计费模式的切换,通过软件编程就可以轻易而举的实现。
避免了机械开关带来的不稳定因素。
方案论证
最终方案选择出租车计价器基本功能部分是根据里程数来完成总金额的输出。
实现方法有两种。
方案一:
采用数字电路控制。
其原理方框图如图2.1所示。
采用传感器件,输出脉冲信号,经过放大整形作为移位寄存器的脉冲,实现计价,但是考虑到这种电路过于简单,性能不够稳定,而且不能调节单价,也不能根据天气调节计费标准,电路不够实用。
方案二:
采用单片机控制。
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。
本方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。
2.硬件详细设计
本系统的硬件设计主要包括单片机AT89S51、数据显示部件、A44E霍尔传感器电路、AT24C02掉电存储单元的设计、里程计算及计价单元的设计。
在硬件设计过程中,充分利用各部件的功能,实现多功能的出租车计价器设计。
2.1总体硬件原理图
主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场使用最多。
。
3.软件设计
在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。
另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
4.1主程序
#include"reg51.h"
#include"intrins.h"
#defineucharunsignedchar
uchartmp;
uchardet;
ucharCoo;
intm;
intf;
ucharDispTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};//字形码
ucharTAB[24];
sbitP00=P0^0;
sbitP01=P0^1;
sbitP02=P0^2;
sbitP03=P0^3;
sbitP04=P0^4;
sbitP05=P0^5;
sbitP10=P1^0;
sbitP27=P2^7;
sbitP14=P1^4;
sbitSCLK=P1^3;/*DS1302的SCLK脚脉冲*/
sbitDIO=P1^2;/*DS1302的IO脚数据*/
sbitCE=P1^1;/*DS1302的RST脚片选*/
sbitP15=P1^5;
sbitP23=P2^3;
sbitP21=P2^1;
sbitP16=P1^6;
sbitP35=P3^5;
sbitP22=P2^2;
sbitP17=P1^7;
sbitP20=P2^0;
sbitP26=P2^6;
sbitP24=P2^4;
sbitACC7=ACC^7;
sbitACC0=ACC^0;
voidtime()interrupt1//等待计时中断
{inti,j;TH0=0x15;
TL0=0xa0;i++;
if(i==100){i=0;j++;};
if(j==10){j=0;f=Coo;}}
voidmDelay(unsignedintDelay)//延时子程序
{unsignedintI;
for(;Delay>0;Delay--)
{for(I=0;I<124;I++)
{;}}}
voidWrite1302(unsignedcharaddr,dat)//DS1302写程序
{unsignedchari,temp;
CE=0;//CE引脚为低,数据传送中止
SCLK=0;//清零时钟总线
CE=1;//CE引脚为高,逻辑控制有效
for(i=8;i>0;i--)//循环8次移位
{temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1;
SCLK=0;//右移一位
SCLK=1;}//发送数据
for(i=8;i>0;i--)
{temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
SCLK=0;
SCLK=1;}
CE=0;}
unsignedcharRead1302(unsignedcharaddr)//数据读取子程序
{unsignedchari,temp,dat1,dat2;
CE=0;
SCLK=0;
CE=1;//发送地址
for(i=8;i>0;i--)//循环8次移位
{temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1;
SCLK=0;
SCLK=1;}//右移一位
for(i=8;i>0;i--)
{ACC7=DIO;
ACC>>=1;
SCLK=1;
SCLK=0;}
CE=0;
dat1=ACC;
dat2=dat1/16;//数据进制转换
dat1=dat1%16;//十六进制转十进制
dat1=dat1+dat2*10;
return(ACC);
}
voidInitial()//初始化DS1302
{Write1302(0x8E,0x00);//禁止写保护
Write1302(0x80,0x00);//秒位初始化
Write1302(0x82,0x20);//分钟初始化
Write1302(0x84,0x10);
Write1302(0x86,0x23);
Write1302(0x88,0x05);
Write1302(0x8c,0x10);//小时初始化
Write1302(0x8E,0x80);}//允许写保护
voidset()//修改时间
{Write1302(0x8E,0x00);//禁止写保护
Write1302(0x82,TAB[7]*16+TAB[6]);//分钟初始化
Write1302(0x84,TAB[0]*16+TAB[1]);
Write1302(0x8E,0x80);}
voidss()//显示子程序
{inti;uchar*p;p=TAB;
for(i=0;i<1;i++){
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;
P14=0;P15=0;P16=0;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;
P20=0;P20=1;P14=1;P15=0;P16=0;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=0;P15=1;P16=0;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=1;P15=1;P16=0;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;
P20=0;P20=1;P14=0;P15=0;P16=1;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=1;P15=0;P16=1;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=0;P15=1;P16=1;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=1;P15=1;P16=1;P17=0;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=0;P15=0;P16=0;P17=1;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=1;P15=0;P16=0;P17=1;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=0;P15=1;P16=0;P17=1;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=1;P15=1;P16=0;P17=1;p++;
det=*p;
tmp=DispTab[det];
P0=tmp;P20=0;P20=1;P14=0;P15=0;P16=1;P17=1;p++;
}}
voidsett()//显示等待时间及单价、总价、路程子程序
{TAB[0]=Read1302(0x83)/10;
TAB[1]=Read1302(0x83)%10;
TAB[7]=Read1302(0x81)/10;
TAB[6]=Read1302(0x81)%10;TAB[8]=3;
TAB[2]=Coo/100;TAB[3]=Coo/10%10;
TAB[4]=Coo%10;
if(TAB[4]<=3&&TAB[2]==0&&TAB[3]==0)
{TAB[11]=8;}
else{
TAB[11]=(8+(Coo-3)*TAB[8])%10;}
TAB[5]=TAB[2]*TAB[8]/10;
TAB[9]=Coo/100*TAB[8]+Coo%100*TAB[8]/100;
TAB[10]=(Coo/10*TAB[8]+Coo%10*TAB[8]/10)%10;}
voidmmm()//显示时间子程序
{TAB[0]=Read1302(0x85)/10;
TAB[1]=Read1302(0x85)%10;
TAB[7]=Read1302(0x83)/10;
TAB[6]=Read1302(0x83)%10;TAB[8]=3;}
voidqie(intj)//修改时间、单价子程序
{uchari;switch(j)
{case4:
ss();
if(P22==0)
{for(i=0;i!
=1;)
{i=P22;ss();};
TAB[8]++;
if(TAB[8]==10)
{TAB[8]=0;}}break;
case3:
ss();
if(P22==0)
{for(i=0;i!
=1;)
{i=P22;ss();};
TAB[6]++;
if(TAB[6]==10)
{TAB[6]=0;}}break;
case2:
ss();
if(P22==0)
{for(i=0;i!
=1;)
{i=P22;ss();};
TAB[7]++;
if(TAB[7]==6)
{TAB[7]=0;}}break;
case1:
ss();
if(P22==0)
{for(i=0;i!
=1;)
{i=P22;ss();};
TAB[1]++;
if((TAB[0]==2&&TAB[1]==4)||TAB[1]==10)
{TAB[1]=0;}}break;
case0:
ss();
if(P22==0)
{for(i=0;i!
=1;)
{i=P22;ss();};
TAB[0]++;
if(TAB[0]==3)
{TAB[0]=0;}}break;default:
break;}}
Voiddie()//修改单价位、时间位子程序
{intx;for(m=0;m<5;)
{ss();qie(m);
if(P21==0)
{for(x=0;x<1;)
{ss();x=P21;};m++;}}set();}
voidmm()//非计价时的显示时间
{
TAB[0]=Read1302(0x85)/10;
TAB[1]=Read1302(0x85)%10;
TAB[7]=Read1302(0x83)/10;
TAB[6]=Read1302(0x83)%10;TAB[8]=3;
TAB[2]=Coo/100;TAB[3]=Coo/10%10;
TAB[4]=Coo%10;
if(TAB[4]<=3&&TAB[2]==0&&TAB[3]==0)
{TAB[11]=8;}
else{
TAB[11]=(8+(Coo-3)*TAB[8])%10;}
TAB[5]=TAB[2]*TAB[8]/10;
TAB[9]=Coo/100*TAB[8]+Coo%100*TAB[8]/100;
TAB[10]=(Coo/10*TAB[8]+Coo%10*TAB[8]/10)%10;}
voidcount()//计价子程序
{intx;EA=1;
if(f==Coo)
{sett();ss();}
else{mm();}
if(P35==0)
{for(x=0;x<1;)
{ss();x=P35;}Coo++;}}
voidmain()
{inti,j;TMOD=0x01;
TH0=0x15;TL0=0xa0;TR0=1;ET0=1;Initial();P27=0;
for(;;)
{if(P23==0)
{for(i=0;i<1;)
{ss();i=P23;}
for(j=0;j<1;)
{count();ss();
if(P23==0)
{for(i=0;i<1;)
{ss();i=P23;EA=0;}j++;
TAB[2]=TAB[3]=TAB[11]=TAB[5]=TAB[9]=TAB[10]=TAB[4]=0;}}}
elsemmm();ss();
if(P21==0)
{for(i=0;i<1;)
{ss();i=P21;}
die();}}}
4.2子程序显示子程序
voidsett()//显示等待时间及单价、总价、路程子程序
{TAB[0]=Read1302(0x83)/10;
TAB[1]=Read1302(0x83)%10;
TAB[7]=Read1302(0x81)/10;
TAB[6]=Read1302(0x81)%10;TAB[8]=3;
TAB[2]=Coo/100;TAB[3]=Coo/10%10;
TAB[4]=Coo%10;
if(TAB[4]<=3&&TAB[2]==0&&TAB[3]==0)
{TAB[11]=8;}
else{
TAB[11]=(8+(Coo-3)*TAB[8])%10;}
TAB[5]=TAB[2]*TAB[8]/10;
TAB[9]=Coo/100*TAB[8]+Coo%100*TAB[8]/100;
TAB[10]=(Coo/10*TAB[8]+Coo%10*TAB[8]/10)%10;}
voidmmm()//显示时间子程序
{TAB[0]=Read1302(0x85)/10;
TAB[1]=Read1302(0x85)%10;
TAB[7]=Read1302(0x83)/10;
TAB[6]=Read1302(0x83)%10;TAB[8]=3;}
TAB[11]=(8+(Coo-3)*TAB[8])%10;}
TAB[5]=TAB[2]*TAB[8]/10;
TAB[9]=Coo/100*TAB[8]+Coo%100*TAB[8]/100;
TAB[10]=(Coo/10*TAB[8]+Coo%10*TAB[8]/10)%10;}
voidmm()//非计价时的显示时间
{
TAB[0]=Read1302(0x85)/10;
TAB[1]=Read1302(0x85)%10;
TAB[7]=Read1302(0x83)/10;
TAB[6]=Read1302(0x83)%10;TAB[8]=3;
TAB[2]=Coo/100;TAB[3]=Coo/10%10;
TAB[4]=Coo%10;
if(TAB[4]<=3&&TAB[2]==0&&TAB[3]==0)
{TAB[11]=8;}
else{
TAB[11]=(8+(Coo-3)*TAB[8])%10;}
TAB[5]=TAB[2]*TAB[8]/10;
TAB[9]=Coo/100*TAB[8]+Coo%100*TAB[8]/100;
TAB[10]=(Coo/10*TAB[8]+Coo%10*TAB[8]/10)%10;}
4.3显示子程序流程图
结论:
和一般计算系统一样,单片机的使用系统由硬件和软件所组成。
硬件主要指单片机扩展的存储器,输入/输出设备等硬件部件的机器,而软件是各种工作程序的总称。
只有硬件和软件紧密配合,协调一致,才能组成高性能的单片机使用系统。
。
课程设计体会:
从这次课设中明显体现了主程序,子程序、中断程序的功能。
在调试中也相当的简化。
本次专业课程设计通过自己的努力,加上指导老师的悉心指导,圆满完成了任务,从而学习到很多东西,实践和理论的得到很好的结合。
参考文献:
1.于海生.微型计算机控制技术.清华大学出版社.1999.6
2.陈杰黄鸿.传感器和检测技术.高等教育出版社.2002.8
3.孙涵芳.MCS-51系列单片机原理及使用.北京航空航天大学出版社.1996.4
4.黄正瑾.电子设计竞赛赛题分析.东南大学出版社.2003.5
5.李顺增.微机原理和接口技术,机械工业出版社.2005
6.顾德英.计算机控制技术.北京邮电大学出版社.2007