第二组_出租车计价器课程设计调试报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“出租车计价器调试报告”。
电子设计与制作课程设计报告
题
目:出租车计价器课程设计
学
年:2011学年
学
期:上学期
专
业:信息电子
班
级:H09-1
组
别姓
名:
曾磊
指导教师:
刘锐老师
小组成员: 曾磊 刘毅 朱亮
时
间:2011年2月21日—2011年3月18日
出租车计价器课程设计
一、设计目的随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。
二、设计要求
(1)设计指标
出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)
(2)设计要求
① 画出电路原理图(或仿真电路图); ② 元器件及参数选择; ③ 电路仿真与调试; ④ 实物图。
(3)制作要求:自行装配和调试,并能发现问题和解决问题。
(4)编写设计报告,写出设计与制作的全过程,附上有关资料和图纸,有心得体会。
三、元器件
1.自制PCB板1块 2.镊子1把 3.剪刀1把
4.共阳四合一八段数码管2个 5.导线若干
6.AT89S52单片机1块
7.A44E霍尔传感器集成块1块 8.AT24C010集成块1块 9.9015三极管7个 10.1KΩ电阻8个 11.4.7KΩ电阻2个
12.11.0592M时钟晶体1个 13.22uF电解电容 1个 14.22P瓷片电容 2个 15.轻触开关5个
A44E霍尔传感器检测单元
A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。
A44E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。
A44E霍尔传感器原理 里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。
传感器测距示意图
AT24C01存储单元
存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01 是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。
存储单元电路连接如图
存储单元电路原理图
四、键盘调整单元
当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。
键盘调整单元接线图
S1:接P1.0口,对上一次的计费进行清零,为下次载客准备
S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。
S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。
S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。
五、显示单元
显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。
数码管显示图
六、软件设计
(1)系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。程序流程如图
(2)里程计数中断程序
每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。
(3)中途等待中断程序
在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。(4)计算程序
计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。(5)显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
(六)键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图
键盘程序流程图
七、电路的组装与调试
首先将数码管安装到事先焊好的插槽上,然后,对照电路图确定好各芯片所在的位置,按照对应的引脚插到插槽上,最后接好合适的电源。
调试时按照以下步骤进行调试: 调试动态显示电路。查看数码管是否显示正常。
首先调试A44E霍尔传感器检测单元。用示波器观察多谐振荡器输出波形,确定是否正常工作。
调试AT24C01存储单元。尝试写入读出指定数据看是否符合要求。 调试键盘控制电路。结合程序调试按键抖动,查看是否符合程序要求。 整体调试。结合实际效果对程序进行优化。
附件 A
八、总结
原理图
经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。
通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
PCB
附件 B 系统源程序
#include #include #define uchar unsigned char #define uint unsigned int #define delayNOP();{_nop_();_nop_();_nop_();_nop_();_nop_();};
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sbit exter=P3^3;
//外部中断 sbit key0=P1^0;
//清零 sbit key1=P1^1;
//切换/+ sbit key2=P1^2;
//-sbit key3=P1^3;
//功能键
sbit P3_0=P3^0;
//数码管各位控制 sbit P3_1=P3^1;sbit P3_2=P3^2;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;
sbit SDA=P2^3;
//IIC引脚 sbit SCL=P2^2;
uint inter,aa,bb,temp,temp1;uint zongjine,licheng,dengdai;uint key3num,qiehuantemp,delaytemp;uchar danjia1,danjia2,danjia3,danjia,qibu;
void delay(unsigned char t){ unsigned char j,i;for(i=0;i
for(j=0;j
void start()
//IIC开始位 {
SDA = 1;
SCL = 1;
delayNOP();
SDA = 0;
delayNOP();
SCL = 0;
} void stop()
// IIC停止位 {
SDA = 0;
delayNOP();
SCL = 1;
delayNOP();
SDA = 1;}
void respons()
//IIC应答位 {
uchar i;
SCL=1;
delayNOP();
while((SDA==1)&&(i
i++;
SCL=0;
delayNOP();}
uchar read_byte()
// 从EEPROM读到MCU {
uchar i,j;
for(i=0;i
{
SCL=1;
j
j|=SDA;
SCL=0;
}
return(j);} void write_byte(uchar date)
// 从MCU写到EEPROM {
uchar i,temp;
temp=date;
for(i=0;i
{
temp=temp
SCL=0;
delayNOP();
SDA=CY;
delayNOP();
SCL=1;
delayNOP();
}
SCL=0;
delayNOP();
SDA=1;
delayNOP();}
void write_data(uchar addr, uchar date)
// 在指定地址addr处写入数据date {
start();
write_byte(0xa0);
respons();
write_byte(addr);
respons();
write_byte(date);
respons();
stop();}
uchar read_data(uchar addr)
// 在指定地址addr读取数据 {
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(addr);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;}
void display(uint zongjine0,uint licheng0,uint danjia0){
uchar z;
uint jbai,jshi,jge,lshi,lge,dshi,dge;
jbai=zongjine0/100;
jshi=zongjine0%100/10;
jge=zongjine0%100%10;
lshi=licheng0/10;
lge=licheng0%10;
dshi=danjia0/10;
dge=danjia0%10;
for(z=0;z
{
P3=0xff;
switch(z)
{
case 0:P3_0=0;P0=table[jbai];break;
case 1:P3_1=0;P0=table[jshi]&0x7f;break;
case 2:P3_2=0;P0=table[jge];break;
case 3:P3_4=0;P0=table[lshi];break;
case 4:P3_5=0;P0=table[lge];break;
case 5:P3_6=0;P0=table[dshi]&0x7f;break;
case 6:P3_7=0;P0=table[dge];break;
}
delay(3);
} }
void keyscan()
//键盘扫描 {
if(key3==0)
//功能键调节
{
delay(5);
if(key3==0)
{
key3num=1;
while(!key3);
delay(5);
while(!key3);
while(key3num)
{
if(key3num==1)
//调白天单价
{
if(key1==0)
{
delay(5);
if(key1==0)
{
danjia1++;
if(danjia1==100)
danjia1=0;
while(!key1);
delay(5);
while(!key1);
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
danjia1--;
if(danjia1==-1)
danjia1=99;
while(!key2);
delay(5);
while(!key2);
}
}
display(1,0,danjia1);
}
if(key3num==2)
//调夜晚单价
{
write_data(1,danjia1);
if(key1==0)
{
delay(5);
if(key1==0)
{
danjia2++;
if(danjia2==100)
danjia2=0;
while(!key1);
delay(5);
while(!key1);
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
danjia2--;
if(danjia2==-1)
danjia2=99;
while(!key2);
delay(5);
while(!key2);
}
}
display(2,0,danjia2);
}
if(key3num==3)
//调等待单价
{
write_data(2,danjia2);
if(key1==0)
{
delay(5);
if(key1==0)
{
danjia3++;
if(danjia3==100)
danjia3=0;
while(!key1);
delay(5);
while(!key1);
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
danjia3--;
if(danjia3==-1)
danjia3=99;
while(!key2);
delay(5);
while(!key2);
}
}
display(3,0,danjia3);
}
if(key3num==4)
//调起步价
{
write_data(3,danjia3);
if(key1==0)
{
delay(5);
if(key1==0)
{
qibu++;
if(qibu==100)
qibu=0;
while(!key1);
delay(5);
while(!key1);
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
qibu--;
if(qibu==-1)
qibu=99;
while(!key2);
delay(5);
while(!key2);
}
}
display(4,0,qibu);
}
if(key3num==5)
//退出功能键
{
write_data(4,qibu);
key3num=0;
}
if(key3==0)
{
delay(5);
if(key3==0)
{
key3num++;
while(!key3);
delay(5);
while(!key3);
}
}
}
}
} } void init(){
SDA=1;
SCL=1;
zongjine=0;
licheng=0;
dengdai=0;
danjia1=read_data(1);
danjia2=read_data(2);
danjia3=read_data(3);
qibu=read_data(4);
aa=0;
//数码管动态扫描的定时器时基个数
bb=0;
//判断是否等待的时基个数
inter=0;
EA=1;
//开总中断
EX1=1;
//开外部中断1
IT1=1;
//触发方式下降沿
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
//开定时器T0中断
TR0=1;
//开定时器T0
P3=0x08;
P0=table[0];}
void jisuan(){
if(licheng>3)
zongjine=qibu+(licheng-3)*danjia+dengdai*danjia3;
//金额计算
else
zongjine=qibu+dengdai*danjia3;
//起步公里内金额计算
}
void qiehuan(){
if(key1==0)
//白天夜晚切换
{
delay(5);
//键盘防抖
if(key1==0)
qiehuantemp=!qiehuantemp;
while(!key1);
delay(5);
while(!key1);
}
if(qiehuantemp==0)
danjia=danjia2;
if(qiehuantemp==1)
danjia=danjia1;} void main(){
init();
qiehuantemp=1;
key3num=0;
while(1)
{
qiehuan();
//切换白天夜晚单价
jisuan();
//计算总金额
display(zongjine,licheng,danjia);
keyscan();
if(key0==0)
//清零键
init();
}
} void inter1()interrupt 2
//脉冲中断 {
delay(5);
//
if(exter==0)
//
{
//
IT1=1;
inter++;
if(inter==5)
{
inter=0;
licheng++;
}
}
//
while(!exter);
//
delay(5);
//
while(!exter);
// }
void timer0()interrupt 1 {
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
aa++;
bb++;
temp1=licheng;
//测试是否进入等待
if(bb==10000)
//10s无反应进入等待计费
{
bb=0;
if(temp=temp&temp1)
dengdai++;
temp=licheng;
} }
出租车计价器调试报告本设计可分为单片机主控模块、键盘、显示器、温度检测、状态指示、时钟日历、语音收录播报、分频器电路、脉冲信号发生器等9部分。仔细分析系统的工作......
出租车计价器课程设计目录前言1、系统工作原理 1.1 功能说明 1.2 基本原理2、硬件设计2.1 单片机最小系统单元 2.2 A44E霍尔传感器检测单元 2.3 AT24C01存储单元 2.4 键盘调......
时序逻辑电路的课程设计题目组员:杨天乐闫帅铮 艾文杰一、题目:出租车计价器 设计内容:1)进行需求分析,确定总体框架;2)画出逻辑图;3)对设计的电路进行仿真;设计要求:1)根据出租......
硬件课程设计报告题目:出租车计价器目录1. 引言 ...........................................................................................................................
第一章 出租车计价系统的设计要求与设计方案1.1 出租车计价器设计要求设计一个出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费三部分,用七段数码管显示总金额,......