毕业实践调研报告(出租车计价器)

时间:2019-05-15 08:09:08下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《毕业实践调研报告(出租车计价器)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《毕业实践调研报告(出租车计价器)》。

第一篇:毕业实践调研报告(出租车计价器)

无锡职业技术学院

调研报告

1.选题的原因

随着我国经济的发展,城市化进程逐步加快,生活水平逐步提高,人们也不再满足于衣食住的享受,出行的舒适已受到越来越多人的关注。于是,在日常出行上,出租车以高质低价赢得越来越多人的青睐。伴随着出租车也在各个城市越来越多,随之带来的关于出租车的买卖纠纷也时有发生,比如:出租车起步价有时在全市不统一、个别出租车乱收费。而与这两个问题息息相关的是出租车计价器,只有在全市的出租车上使用统一规范的出租车计价器,才能从根源上解决问题。使用改良的出租车计价器为市民带来优质低价的服务,而且,具有良好性能的计价器对出租车司机是很有必有的。

从另一方面来考虑,出租车计价器还是有着不错的市场潜力。各大中小城市出租车的数量每年都在增加,购买出租车计价器对于出租车公司来说是一笔较大的投资,质优价廉的计价器一定能快速的占据市场。

2.选用单片机设计的原因

*用单片机做出租车计价器简洁明了,灵活性强,功能易实现;

*软硬件的配合让计价器的功能会相对强大;

*比起传统的数字电路的模拟电路,按键能少,能有效的减少损耗,使计价器的使用寿命更长;

*软件编程带来更多的附加功能;

*对于企业来说,单片机等硬件相对低廉,用较少的材料去换取比较可观的利益,符合企业的价值。3.出租车计价器的构成*LED数码管:由多个发光二极管组的“8”字型器件,引线已在内部完成。用驱动电路驱动数码管的各个段码,从而显示出我们需要的数字。价格便宜,在电器特别是家用电器方面应用极为广泛。

*里程传感器:采集车速信号(霍尔效应),车速信号为脉冲信号,采集脉冲信号的频率就可以得到车速,可以用芯片的定时器来捕获。如果车速大于一定的值,采用公里计算价格;如果车速小于这个值,可以用时间来计算。用芯片计算公里数,用定时器确定时间。用数码管显示公里数、时间以及价格。

*空车牌:提供计价的信号。

*单片机:MCS-51系列单片机的由中央处理器(CPU)、内部数据存储器RAM、内部程序存储器ROM、并行I/O端口、串行口、定时/计数器、中断系统、时钟电路。

*打印机:打印机打印乘客所需要的票据,通过排线连接计价器的主机。上述五部分通过电路连接组成出租车计价器。

4.我国的出租车计价器生产批发厂商

出租车计价器在我国生产厂家众多,竞争激烈,主要有:广州市阿佩斯电子科技有限公司、北京聚丽科技有限公司、江苏省徐州市华统电脑设备有限公司、上海天峰电子有限公司、福州诚市交通设备有限公司、杭州萧山集英电子器材厂、无锡拥成商贸公司、广州中澳电子科技有限公司、南京通用电器材研发部、南京通用电气有限公司、广州华泽科技有限公司、余姚市家用电器有限公司、上海良标智能终端股份有限公司,等等。

众多公司的各种出租车计价器功能有强有弱,自然价格不一。

5.出租车计价器的发展历史

第14页 / 共66页

无 锡 职 业 技 术 学 院

毕业实践调研报告

我国的第一家生产计价器企业是重庆市起重机厂,最早的计价器全部采用机械齿轮结构,只能完成简单的计程功能,可以说早期的计价器就是一个里程表。

随着科学技术的发展,产生了第二代计价器。它采用了手摇计算机与机械结构相结合的方式,实现了半机械半电子化。此时它在计程的同时还可以完成计价的工作。

大规模集成电路的发展又产生了第三代计价器,也就是全电子化的计价器。它的功能也在不断完善.当单片机出现并应用于计价器后,现代出租车计价器的模型也就基本具备了,它可以完成计程,计价,显示等基本工作。单片机以及外围芯片的不断发展促进了计价器的发展。

6.出租车计价器的重要性

计价器是出租汽车的经营者和乘坐出租汽车的消费者之间用于公平贸易结算的工具,因而计价器计价准确与否,直接关系到经营者和消费者的经济利益。依据国家有关法律、法规,出租汽车计价器是列入国家首批强制检定的工作计量器具之一,也是近年来国家质量技术监督部门强化管理的六类重点计量器具之

一。在出租车是城市交通的重要组成部分,行业健康和发展也获得越来越多的关注。汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。

7.出租车计价器的功能

五屏显示:同时显示 金额、单价、计时、里程和时钟;

状态显示:低速、夜间、空贴、往返、暂停;

语音报价:播放服务用语、车费等;

自动打印:按规定的格式打印路单发票;

税控功能:按税务部门规定日期用 IC卡交税

存储功能:可储存 100次营运路单供查询统计,存储数据掉电保存十年。IC 卡:强大的加密功能,数据安全可靠

司机卡:路单存储、数据管理、一机一卡;

管理卡:设置参数、周期检定、逾期停机;

税控卡:确保税收、限期纳税、逾期停机;

时距分离、时距并行、等候收费等方式任选;

永久时钟:不掉电永久实时时钟,自动转换日夜收费;

通用程序:具有25项可设置参数,方便设置;

公司管理:营运数据用 IC卡传递到计算机中,便于管理。

第15页/共66页

第二篇:出租车计价器调试报告

出租车计价器调试报告

本设计可分为单片机主控模块、键盘、显示器、温度检测、状态指示、时钟日历、语音收录播报、分频器电路、脉冲信号发生器等9部分。仔细分析系统的工作原理,分别按照模块在系统中的作用,对各个模块分别单独调试,最后形成该系统的用户程序,实现功能要求。

一、接通电源

调试要求:1.首先仔细检查该系统板的电源和地是否有短路问题,在未接入电源轻快下,使用万用表检验电源和地检查是否短路,如果没有短路,再仔细核查电源极性后予以通电,观察电源指示灯D1是否点亮。如果电源指示的灯不亮应立即关闭电源,并用手触摸各个芯片,检查是否用某芯片发热。如果没有发热的器件,很可能是电源指示二极管极性安装错误,或者是该发光二极管的串联电阻阻值偏大。

2.黑板上调试要求:(1)焊接好电路板加电前,用万用表测量板上Vcc 和

GND之间的电阻,应大于1KΩ

(2)加电后测量电路板上各电压,应大于4.2V 调试结果:1.经万用表检验,电路板无短路问题。

2.通电后,D1指示灯点亮。

3.测量Vcc 与 地之间的电阻,1.14KΩ > 1KΩ

4.测量Vcc与 地之间的电压:4.28V > 4.20V

二、测试状态指示

本系统中状态指示二极管共有3个,它们分别是D1、D2、D3。D1是指示电源的,可以在电源接通时直接看到,D2用于指示语音芯片的工作状态,留作语音模块调试时观察。D3是可以由单片机的引脚控制的。

编写测试D3的程序: #include #include

sbit a_c=P1^0;extern serial_initial();

main(){ serial_initial();a_c=0;while(1);}

测试结果: 1.2.三、脉冲信号发生器测试

测试要求:该模块由5G555芯片构成一个多谐振荡器,使用示波器观察该芯片的第3引脚的波形,并调节电位器W1,观察输出波形及频率变化。

测试结果:

调整W1前,f=147.1Hz

调整W1后,f=130.5Hz

四、分频电路测试

测试要求:该模块由一个4位二进制计数器74HC161和一个多路选择器74HC153构成。调试时可以利用由5G555芯片构成一个多谐振荡器的输出,或信号发生器作为计数器74HC161的计数输入信号。值得注意的是控制多路选择器74HC153的S0、S1与单片机调试时所使用的引脚复用,要采取特殊措施才能正确试验检测。

测试结果:利用函数信号发生器生成一个方波,周期/频率如图:

其在输出端输出的波形为:

f1=3.881kHz

f2 =1.235kHz 分频功能无误。

五、键盘测试

测试要求:本系统相对比较简单,仅有5个按键,其中4个为系统功能键,它们分别是S1、S2、S3、S4,另一个是系统复位按键S6。对于系统复位按键S6可以在上电之后,使用万用表予以检查,按下该按键,单片机的第9脚应该为高电平,释放后应该为点电平。

对于系统功能键,编写如下程序予以测试检查:

#include #include #include #include #define SEGMENT XBYTE[0x0c000]

#define BIT_LED XBYTE[0x0a000] void display();sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;unsigned char a;unsigned

char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x63,0x39,};void delay(unsigned int i);main(){ while(1){ if(k1==0)a=0x06;if(k2==0)a=0x5b;if(k3==0)a=0x4f;if(k4==0)a=0x66;display();} } 测试结果:对于复位键S6,按下前应为低电平,按下后应为高电平

按下前

按下后

对于S1—S4,按下前为高电平,按下后为低电平。其测试结果均符合预期。

六、动态数码管测试

测试要求:本系统中的数码管的原理采用的是动态扫描方式,即某一时刻只用一个数码管在显示,利用人的视觉暂留特性,让数码管高速轮流显示,达到完整显示的目的。

编写如下程序进行测试: #include #include #include #include #define SEGMENT XBYTE[0x0c000]

#define BIT_LED XBYTE[0x0a000] void displayhello();sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;unsigned char a;unsigned char table[]={0x06,0x06,0x3f,0x3e,0x79,0x6e,0x3f,0x3e,0x7f,0x67,0x40,0x00,0x63,0x39,};void delayms(unsigned int i);main(){ while(1){ displayhello();} }

void displayhello(){

unsigned char BIT=1;

unsigned int i;

BIT_LED=1;

for(i=0;i<=7;i++)

{

SEGMENT=table[i];

BIT_LED=BIT;

BIT=BIT<<1;

delayms(1);

}

} void delayms(unsigned int i){ unsigned int n;while(i--){

for(n=0;n<125;n++);

} }

测试结果:显示“I love you”

由于是动态显示,所以按下复位键后,只有一个数码管点亮

七、温度传感器测试

测试要求:本系统使用的是一款单线温度传感器(DS18B20),可将温度穿换成12的数字量,以表示温度。

编写如下程序予以测试检查: #include #include #include #include #define SEGMENT XBYTE[0x0c000]

//段码寄存器地址 #define BIT_LED XBYTE[0x0a000]

//位码寄存器地址 #define fosc 11.0592

unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x63,0x39,};//分别显示0 1 2 3 4 5 6 7 8 9-o C

unsigned char table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//分别显示0.1.2.3.4.5.6.7.8.9.unsigned char table2[]={0x76,0x79,0x38,0x38,0x3f};sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;unsigned char data display_buffer[13];unsigned char bdata data_ds1302;

unsigned char disbuf[]={0,0,0,0};sbit k4=P1^3;

sbit TMDAT=P3^4;

//温度入口

void dmsec(unsigned int count);void tmreset(void);

//ds18b20 reset void tmstart(void);

// void tmrtemp(void);void Disbuf(unsigned int temper);void displaytemper();void delay(unsigned int);main(){ display_buffer[0]=0x01;

display_buffer[1]=0x00;

display_buffer[2]=0x00;display_buffer[3]=0x08;

display_buffer[4]=0x05;

display_buffer[5]=0x00;display_buffer[6]=0x01;

display_buffer[7]=0x04;

display_buffer[8]=0x00;display_buffer[9]=0x05;

display_buffer[10]=0x00;

display_buffer[11]=0x01;

display_buffer[12]=0x04;while(1){ tmstart();

tmrtemp();

displaytemper();} }

void tmreset(void){

unsigned int i;

TMDAT = 0;

i = 103;while(i>0)i--;

TMDAT = 1;

i = 4;while(i>0)i--;}

void tmpre(void){

unsigned int i;

while(TMDAT);

while(~TMDAT);

i = 4;while(i>0)i--;}

bit tmrbit(void){

// ds1820

// Reset TX

unsigned int i;

bit dat;

TMDAT = 0;i++;

TMDAT = 1;i++;i++;

dat = TMDAT;

i = 8;while(i>0)i--;

return(dat);}

unsigned char tmrbyte(void){

unsigned char i,j,dat;

dat = 0;

for(i=1;i<=8;i++){

j = tmrbit();

dat =(j << 7)|(dat >> 1);

}

return(dat);}

void tmwbyte(unsigned char dat){

unsigned int i;

unsigned char j;

bit testb;

for(j=1;j<=8;j++){

testb = dat & 0x01;

dat = dat >> 1;

if(testb){

TMDAT = 0;

i++;i++;

TMDAT = 1;

i = 8;while(i>0)i--;

}

else {

TMDAT = 0;

i = 8;while(i>0)i--;

TMDAT = 1;

i++;i++;

}

} }

void tmstart(void){

tmreset();

tmpre();

// ds1820

displaytemper();//delay(100);

tmwbyte(0xcc);

tmwbyte(0x44);

}

void tmrtemp(void){

unsigned char a,xiao,b,y1,y2,y3;

tmreset();

tmpre();

delay(1);

tmwbyte(0xcc);

tmwbyte(0xbe);

a = tmrbyte();

b = tmrbyte();

xiao=a&0x0f;//小数部分

y1=a>>4;

y2=b<<4;

y3=y1|y2;if((b&0x0f8)==0x0f8)

{y3=~y3+1;

disbuf[0]=10;//显示符号

disbuf[1]=y3/10;

disbuf[2]=y3%10;

disbuf[3]=xiao*10*0.0625;} else

disbuf[0]=11;//不显示

disbuf[1]=y3/10;

disbuf[2]=y3%10;

disbuf[3]=xiao*10*0.0625;}

void displaytemper()

//温度显示函数

{ unsigned int i;unsigned char e=0x01;//<<1;for(i=1;i<6;i++)

{ switch(i)

{

case 1:{SEGMENT=table[disbuf[1]];BIT_LED=e;break;}

case 2:{SEGMENT=table1[disbuf[2]];BIT_LED=e;break;}

case 3:{SEGMENT=table[disbuf[3]];BIT_LED=e;break;}

case 4:{SEGMENT=table[12];BIT_LED=e;break;}

case 5:{SEGMENT=table[13];BIT_LED=e;break;}

}

e=e<<1;

delay(80);

}

BIT_LED=0;

}

void delay(unsigned int i)

//delay函数 {

while(i--);}

测试结果:

经传感器及数码管延时,温度重新显示

八、时钟日历测试

测试要求:本系统使用了时钟日历专用芯片,该芯片是以串行方式实现控制和数据传输的。

编写如下程序进行测试: #include #include #include #include #define SEGMENT XBYTE[0x0c000]

//段码寄存器地址 #define BIT_LED XBYTE[0x0a000]

//位码寄存器地址 #define fosc 11.0592

unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x63,0x39,};unsigned char table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};unsigned char table2[]={0x76,0x79,0x38,0x38,0x3f};sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;//利用开关量实现切换

//频率变量及子函数预定义 void displayfreq();void read_freq();unsigned char tcount=0,timecount=0;unsigned long freq=0.0;bit freqflag=0;unsigned char fr[6];unsigned int i=0,x=0;

//日期变量及子函数预定义 sbit SCL_ds1302=P2^0;sbit IO_ds1302=P2^1;sbit RST_ds1302=P2^2;

unsigned char data display_buffer[13];unsigned char bdata data_ds1302;

//传输符

unsigned char disbuf[]={0,0,0,0};void open_write_bit();void initial_ds1302();unsigned char read_ds1302(char command);void close_write_bit();void read_time();void set_time();void delay(unsigned int i);void delayms(unsigned int i);void displaytime();void displaydate();main(){ initial_ds1302();

//上电走时

read_time();

//读取当前时间,放到数组中

display_buffer[0]=0x01;

display_buffer[1]=0x05;

display_buffer[2]=0x01;display_buffer[3]=0x07;

display_buffer[4]=0x04;

display_buffer[5]=0x00;display_buffer[6]=0x01;

display_buffer[7]=0x06;

display_buffer[8]=0x00;display_buffer[9]=0x05;

display_buffer[10]=0x00;

display_buffer[11]=0x01;

display_buffer[12]=0x04;

set_time();

//设置时间

while(1){

if(k1==0)

{

while(1){

read_time();

displaytime();

if(k2==0)break;

}

}

read_time();

displaydate();} }

void close_write_bit()//close write { unsigned int i;

SCL_ds1302=0;

_nop_();

RST_ds1302=1;_nop_();_nop_();data_ds1302=0x8e;

for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=(data_ds1302&0x01);

_nop_();

SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} data_ds1302=0x80;

IO_ds1302=0;for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=(data_ds1302&0x01);

_nop_();

SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} }

void open_write_bit()//open write { unsigned int i;SCL_ds1302=0;_nop_();

//打开写保护//关闭写保护

RST_ds1302=1;_nop_();_nop_();data_ds1302=0x8e;for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=data_ds1302&0x01;

_nop_();SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} data_ds1302=0x00;

//0x00,书上为0x80 IO_ds1302=0;for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=data_ds1302&0x01;

_nop_();SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} }

void initial_ds1302()

//初始化函数 { unsigned int i;SCL_ds1302=0;_nop_();RST_ds1302=1;_nop_();_nop_();data_ds1302=0x8e;

for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=data_ds1302&0x01;

_nop_();SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} IO_ds1302=0;data_ds1302=0x00;

for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=data_ds1302&0x01;

_nop_();SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} RST_ds1302=0;SCL_ds1302=0;_nop_();RST_ds1302=1;_nop_();_nop_();data_ds1302=0x90;

for(i=1;i<=8;i++){ SCL_ds1302=0;IO_ds1302=data_ds1302&0x01;_nop_();SCL_ds1302=1;data_ds1302=data_ds1302>>1;}

data_ds1302=0x0a4;

for(i=1;i<=8;i++){ SCL_ds1302=0;IO_ds1302=data_ds1302&0x01;_nop_();SCL_ds1302=1;data_ds1302=data_ds1302>>1;} RST_ds1302=0;_nop_();SCL_ds1302=0;_nop_();RST_ds1302=1;

data_ds1302=0x8e;

for(i=1;i<=8;i++){ SCL_ds1302=0;IO_ds1302=data_ds1302&0x01;_nop_();SCL_ds1302=1;data_ds1302=data_ds1302>>1;}

data_ds1302=0x80;

for(i=1;i<=8;i++){ SCL_ds1302=0;IO_ds1302=data_ds1302&0x01;_nop_();SCL_ds1302=1;data_ds1302=data_ds1302>>1;} RST_ds1302=0;_nop_();SCL_ds1302=0;}

unsigned char read_ds1302(char command)

//read函数 { unsigned int i;data_ds1302=command;SCL_ds1302=0;_nop_();RST_ds1302=1;for(i=1;i<=8;i++){

SCL_ds1302=0;IO_ds1302=data_ds1302&0x01;_nop_();SCL_ds1302=1;data_ds1302=data_ds1302>>1;}

SCL_ds1302=1;for(i=1;i<=8;i++){

SCL_ds1302=0;

if(IO_ds1302)data_ds1302=(data_ds1302>>1)|0x80;

//送入到data_ds1302中,准备送出

else data_ds1302>>=1;SCL_ds1302=1;} RST_ds1302=0;_nop_();SCL_ds1302=0;return(data_ds1302);}

void write_ds1302(unsigned char address,unsigned char numb){

unsigned int i;

SCL_ds1302=0;

RST_ds1302=0;

RST_ds1302=1;

data_ds1302=address;for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=data_ds1302&0x01;

//送入写地址

_nop_();SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} data_ds1302=numb;for(i=1;i<=8;i++){

SCL_ds1302=0;

IO_ds1302=data_ds1302&0x01;

_nop_();SCL_ds1302=1;

data_ds1302=data_ds1302>>1;} } void read_time(){ unsigned char second,minte,hour,d,date,month,year,zhou;second=0x81;

//读秒

d=read_ds1302(second);display_buffer[5]=d&0x0f;display_buffer[4]=d>>4;minte=0x83;

//读分

d=read_ds1302(minte);display_buffer[3]=d&0x0f;display_buffer[2]=d>>4;hour=0x85;

//读时

d=read_ds1302(hour);display_buffer[1]=d&0x0f;display_buffer[0]=d>>4;year=0x8d;

//读年

d=read_ds1302(year);display_buffer[7]=d&0x0f;display_buffer[6]=d>>4;month=0x89;

//读月

d=read_ds1302(month);display_buffer[9]=d&0x0f;display_buffer[8]=d>>4;

//送入写的内容

zhou=0x8b;

//读周d=read_ds1302(zhou);display_buffer[12]=d;date=0x87;

//读日期

d=read_ds1302(date);display_buffer[11]=d&0x0f;display_buffer[10]=d>>4;}

void set_time(){ unsigned char data temp;unsigned char data hour_address=0x84,minte_address=0x82,second_address=0x80,date_address=0x86,month_address=0x88,zhou_address=0x8a,year_address=0x8c;//各个时间量的地址

open_write_bit();

temp=(display_buffer[0]<<4)|display_buffer[1];write_ds1302(hour_address,temp);

//写小时

temp=(display_buffer[2]<<4)|display_buffer[3];write_ds1302(minte_address,temp);

//写分钟

temp=(display_buffer[4]<<4)|display_buffer[5];write_ds1302(second_address,temp);

//写秒

temp=(display_buffer[6]<<4)|display_buffer[7];write_ds1302(year_address,temp);

//写年

temp=(display_buffer[8]<<4)|display_buffer[9];write_ds1302(month_address,temp);

//写月

temp=display_buffer[12];write_ds1302(zhou_address,temp);

//写周temp=(display_buffer[10]<<4)|display_buffer[11];write_ds1302(date_address,temp);

//写日期

close_write_bit();

}

void delay(unsigned int i)

//delay函数 {

while(i--);}

void delayms(unsigned int i){ unsigned int n;while(i--){

for(n=0;n<125;n++);

} }

void displaytime(){ unsigned char e=0x01;unsigned int i;BIT_LED=0;

for(i=0;i<=5;i++){

if(i==5||i%2==0||i==11)

SEGMENT=table[display_buffer[i]];

else

SEGMENT=table1[display_buffer[i]];

BIT_LED=e;

e<<=1;

delayms(1);

}

}

void displaydate(){ unsigned char e=0x01;unsigned int i;BIT_LED=0;

for(i=6;i<=13;i++){

if(i==7||i==9)

SEGMENT=table1[display_buffer[i]];

else if(i==12)

SEGMENT=table[10];

else if(i==13)

SEGMENT=table[display_buffer[i-1]];

else

SEGMENT=table[display_buffer[i]];

BIT_LED=e;

e<<=1;delayms(1);

}

}

测试结果:

S1,S2实现年月日周与时分秒的切换

九、语音收录播报测试:

测试要求:本系统中使用的是语音专用芯片IDS1760芯片,该芯片是以串行方式实现控制和数据传输的。

编写如下程序进行测试: #include #include #include #define uchar unsigned char #define uint unsigned int

unsigned char bdata SR0_L;unsigned char bdata SR0_H;unsigned char bdata SR1;unsigned char APCL=0,APCH=0;unsigned char PlayAddL=0,PlayAddH=0;unsigned char RecAddL=0,RecAddH=0;

sbit CMD=SR0_L^0;sbit FULL=SR0_L^1;sbit PU=SR0_L^2;sbit EOM=SR0_L^3;sbit INTT=SR0_L^4;sbit RDY=SR1^0;sbit ERASE=SR1^1;sbit PLAY=SR1^2;sbit REC=SR1^3;

unsigned char ISD_SendData(unsigned char dat);void ISD_PU(void);void ISD_Rd_Status(void);void ISD_WR_APC2(unsigned char apcdatl,apcdath);void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eaddh);void ISD_SET_Rec(unsigned char Saddl,Saddh,Eaddl,Eaddh);void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eaddh);

sbit SS=P1^4;sbit SCK=P1^7;sbit MOSI=P1^5;sbit MISO=P1^6;

void Cpu_Init(void);void ISD_Init(void);void delay(unsigned int t);

void main(){ Cpu_Init();ISD_Init();

while(1){ ISD_SET_Erase(0,0,9,0);ISD_SET_Rec(0,0,9,0);ISD_SET_PLAY(0,0,9,0);} }

void Cpu_init(void){ P0=P1=P2=P3=0xff;TMOD=0x01;EA=0;} void ISD_Init(void){ uchar i=2;SS=1;SCK=1;MOSI=0;do { ISD_PU();//上电 delay(50);ISD_Rd_Status();//读取状态

}while(CMD||(!PU));

//if(CMD_Err==1||(PU!+1))则再次发送上电指令 ISD_WR_APC2(0x40,0x04);//将0x0440写入APC寄存器

do { ISD_Rd_Status();}while(RDY==0);do { delay(300);delay(300);i--;}while(i>0);}

//向cpu读回或发送数据

unsigned char ISD_SendData(unsigned char dat){ unsigned char i,j,BUF_ISD=dat;SCK=1;SS=0;for(j=4;j>0;j--){;}

for(i=0;i<8;i++){ SCK=0;for(j=2;j>0;j--){;} if(BUF_ISD&0x01)

{MOSI=1;} else

{MOSI=0;} BUF_ISD>>=1;if(MISO)

{BUF_ISD|=0x80;} SCK=1;for(j=6;j>0;j--){;} } MOSI=0;return(BUF_ISD);} void ISD_PU(void){

ISD_SendData(0x01);

ISD_SendData(0x00);

SS=1;} void ISD_Rd_Status(void){ unsigned char i;ISD_SendData(0x05);ISD_SendData(0x00);ISD_SendData(0x00);SS=1;for(i=2;i>0;i--){;} SR0_L=ISD_SendData(0x05);SR0_H=ISD_SendData(0x00);SR1=ISD_SendData(0x00);SS=1;}

void ISD_WR_APC2(unsigned char apcdatl,apcdath){ ISD_SendData(0x65);ISD_SendData(apcdatl);ISD_SendData(apcdath);SS=1;}

void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eaddh){ ISD_SendData(0x80);ISD_SendData(0x00);ISD_SendData(Saddl);ISD_SendData(Saddh);ISD_SendData(Eaddl);ISD_SendData(Eaddh);ISD_SendData(0x00);SS=1;}

void ISD_SET_Rec(unsigned char Saddl,Saddh,Eaddl,Eaddh){

ISD_SendData(0x81);ISD_SendData(0x00);ISD_SendData(Saddl);ISD_SendData(Saddh);ISD_SendData(Eaddl);ISD_SendData(Eaddh);ISD_SendData(0x00);SS=1;}

void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eaddh){ ISD_SendData(0x82);ISD_SendData(0x00);ISD_SendData(Saddl);ISD_SendData(Saddh);ISD_SendData(Eaddl);ISD_SendData(Eaddh);ISD_SendData(0x00);SS=1;} void delay(unsigned int t){ for(;t>0;t--){ TH0=0xfc;TL0=0x18;TR0=1;while(TF0!=1){;} TF0=0;TR0=0;} }

测试结果:需要在程序中设置断点,完成录音,放音再录音放音的循环操作。

测试功能正常。

十、单片机模块调试

测试要求:该模块的调试很复杂,牵扯面也很多。其实通过前面各个模块的调试,已经大部分得到了间接地验证。例如在“动态数码管测试”和“串行通讯测试”中就是用到了定时器。

如有必要可以再编写一些测试程序。例如检测单片机的某一口线的功能是否正常、测试某段程序运行时间,等等。

测试结论:因单片机大部分功能在前调试方案中大部分已使用过,此处不再进行其余调试。

第三篇:出租车计价器

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

摘要

出租车计价器的数字系统的设计正是基于一些专用的芯片,才发挥其有效特性,从而实现出租车的计价功能。此数字系统主要分为三个单元,即里程计数及显示单元、价格计数及显示单元、脉冲产生。本设计是一个基于单片机AT89C51的出租车自动计费设计,附有复位电路,时钟电路等。关键词:出租车计费器;单片机;控制

Abstract Taximeter design digital system is based on some special chip, to play their effective characteristics, thus realizing the taxi valuation function.This system is mainly divided into there modules, namely the mileage counting and display unit, and display unit price counting, pulsing.The design is based on a single chip AT89C51taxis design, a reset circuit, clock circuit.Keywords:taximeter,a single-chip microcomputer,control

1引言

1.1 设计目的

近几年来,出租汽车行业在各地得以蓬勃发展,但采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强。

1.2 功能要求

(1)用前4位数码管实时显示里程数,单位为千米,最后一位为小数位;用后4位数码管时时显示金额数,单位为元,最后一位为小数位。

(2)规定出租车里程小于2千米收费5元,超过2千米收费为8*(way-20)/5。

1.3 设计方法

本设计采用AT89C51单片机为主控器,并用频率信号发生器模拟车速,利用AT89C51的定时器工作在方式1下定时实现对出租车的计价设计,输出采用共阴极的集成8位7段数码显示管。设计方案及原理

2.1 设计方案

采用AT89C51单片机为主控器,并用频率信号发生器模拟车速,利用AT89C51的定时器/定时器T1工作在方式1下定时实现对出租车的计价设计,输出采用共阴极的集成8位7段数码显示管。本电路设计的计价器不但能实现基本的计价,而且

单片机原理及系统课程设计报告

还能根据里程来调节单价。

2.2 设计原理

出租车计价是根据车所行驶的路程以及乘客乘车的里程综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。通过计数接收到的脉冲个数,计算出当前所行驶的路程。同时,通过数码管显示当前的行驶里程和需支付的车费。出租车计价器用于记录里程、起步公里数与价格的关系。模拟出租车计价器能根据总里程数、起步公里数的情况作出相应报价等。这个系统以AT89C51单片机为主控器,单片机的计数器/定时器T1工作在方式1下来对外部脉冲计数,最后通过集成的8位7段LED数码管显示里程数和价钱。总体模块框图如图1所示。

总金额显示单价显示AT89C51脉冲产生动态扫描数码管显示

图1 总体框图 硬件设计

对于AT89C51的计数器/定时器T1,通过对寄存器TCON的设置,即使它的M1M0=01,计数器/定时器T1工作在方式1下,构成16位计数器/定时器。此时TH0、TL0都是8位加法计数器。此设计中,T1为计数工作方式,计数范围为1~2^16=1~65536(个外部脉冲)。当计数溢出时则置位并申请中断,进入中断服务 执行中断程序。

通过74HC138接P20、P21、P22输出来对8位7段的智能扫描LED进行段选,并且通过P1口对LED进行位选,最后将结果显示在LED上。硬件设计图如图2所示。

74HC138是三八译码器,在工作之前,使74HC138的使能端有效,再使74HC138的A、B、C接P20、P21、P22的输出达到对LED位选线的控制,使相应的位显示相应的结果。硬件总设计图如图2所示。

第四篇:单片机出租车计价器源程序

出租车计价器设计与制作

设计并制作一台出租车计价器。调试时采用10Hz方波信号模拟,每个方波代表10m。基本要求:

(1)不同情况具有不同的收费标准

白天 1元/公里 晚上 2元/ 公里 途中等待(30s)1元/30s

(2)数据输出(6位LED数码管显示)

单价输出2位 路途输出2位 总金额输出2位

(3)按键(3个)

启动计价开关 数据复位(清零)白天/晚上转换

3.4.1模块1:系统设计

(1)分析任务要求,写出系统整体设计思路

通过分析,需要实现四个主要的功能模块,分别为脉冲计数模块、定时器计时模块、按键的处理以及

数码管动态扫描等功能。

定时器计时模块主要完成途中等待(即没有脉冲来时)30秒的计时。在启动键按下后,定时器就不停的计时,只要有脉冲来就将计时的值清除为零。如果没有脉冲来,当计时超过30秒时,相应的总金额要

按照收费标准计价。

中断的管理:尽管中断有嵌套以及优先级的功能,但是由于定时器已经使用一个了中断资源,脉冲检测不宜再采用中断方式,而是采用查询方式。由于需要不停的要清除30秒的计时,因此,脉冲的计数不

采用定时器的计数方式。

启动键触发定时器开始工作,而定时器的运行可以作为脉冲计数的标志,只要定时器计时在运行,每来一个中断都应该计数。

主程序完成键盘的扫描和按键的处理,查询脉冲产生的中断,并完成脉冲的计数。每个脉冲代表10米,则当计数到100时表示1千米的距离,相应的总金额要按照收费标准计价

(2)选择单片机型号和所需外围器件型号,设计单片机硬件电路原理图

采用MCS51系列单片机At89S51作为主控制器,外围电路器件包括数码管驱动、独立式键盘、复位电

路等。硬件电路原理图如图3-9所示。

图3-11 出租车计价器的硬件电路原理图

数码管驱动采用2个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244作为数码管的驱动。在74HC244的7段码输出线上串联100欧姆电阻起限流作用。

独立式按键使用上提拉电路连接,在没有键按下时,输出高电平。P0口用于输出7段LED共阴极显示代码,P2口用于输出低电平有效的位选码。0~9的7段LED共阴极显示代码:3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。

(3)分析软件任务要求,写出程序设计思路,分配单片机内部资源,画出程序流程图

软件的任务要求包括定时器的设置、按键的扫描、按键的功能处理、脉冲的计数、路途等待超30秒的计

时以及总金额的计算等。

程序设计的思路:使用中断方式对定时器的溢出进行计数实现30秒的计时。主程序采用查询外部中断标志实现脉冲的计数,由于每个脉冲代表10m,因此,当脉冲计数超过100时,计价器按照收费标准计价。主程序在初始化变量和定时器参数设置之后,进入一个循环结构,循环扫描键盘、查询脉冲的中断、数码管的动态扫描等功能,当脉冲的中断标志被查询到,若路途等待时间未超30秒时,要及时将路途等待时间的值清除为零。主程序的流程图如图3-12所示。

图3-12 出租车计价器的主程序流程图

中断服务程序主要实现计时功能,当启动键按下之后,定时器开始工作,用一个变量对定时器溢出中断的次数进行计数,达到计时功能,该变量在每次脉冲到来时被清零(在主程序中清零),当脉冲长时间没有来,则当该变量计数超过30秒时,总金额按照途中等待计费标准进行计价。中断程序的流程图如图

3-13所示。

图3-13 出租车计价器的中断服务程序流程图

(4)设计系统软件调试方案、硬件调试方案及软硬件联合调试方案

软件调试方案:伟福软件中,在“文件新建文件”中,新建C语言源程序文件,编写相应的程序。在“文件新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。

在 “项目编译”菜单中将C源文件编译,检查语法错误及逻辑错误。在编译成功后,产生以 “*.hex”和“*.bin” 后缀的目标文件。

硬件调试方案:在设计平台中,将单片机的P1.0-P1.2分别与3个独立式键盘通过插线连接起来,将P3.2与脉冲信号源连接起来。

在伟福中将程序文件编译成目标文件后,将下载线安装在实验平台上,运行“MCU下载程序”,选择相应的flash 数据文件,点击“编程”按钮,将程序文件下载到单片机的Flash中。

然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内容。3.4.2 程序设计

/*晶振:11.0592M T1-250微秒溢出中断一次;P3.2(int0)-中断100次,查询IE0置位,P1^0为启动键;P1^1为清除键;P1^2为白天/晚上的切换键 变量的定义: key_val: 返回按键的值 255-无键

T1_cnt: 定时器溢出数计数

cnt_30: 30秒钟的计时

cnt_distance: 计算路程

cnt_cost: 总金额

state_val: 状态:0-白天 1 夜晚

cost_val[3]: 收费标准:白天单价cost_val[0]=1元/公里;晚上单价cost_val[1]=2元/公里; 等待单价cost_val[2]=1元/30s

led_seg_code:数码管7段码 */ //-------------------#include “reg51.h” unsigned char data cnt_30,cnt_distance,cnt_cost;unsigned int data T1_cnt,D_cnt;unsigned char data key_val,key_val_old;unsigned char data state_val;char code cost_val[3]={1,2,1};char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//led_seg_code[0-9]代表0-9 //-------延时-----------------void delay(unsigned int i)//延时 { while(--i);} //-------初始化变量------------------void init_variant()//初始化一些变量的内容 {unsigned char i;cnt_30=0;//30秒的计时 D_cnt=0;//脉冲的个数 cnt_distance=0;//距离的计数

cnt_cost=0;//保存总价格 } //-------扫描键盘-----------------unsigned char scan_key(){ unsigned char i,k;i=P1;if(i==0xff){ k=255;} //无键按下

else //有键按下

{ delay(10);//延时去抖动

if(i!=P1){k=255;} else { switch(i){ case 0xfe: k=0;break;//P1.0按下,启动键

case 0xfd: k=1;break;//P1.1按下,清除键

case 0xfb: k=2;break;//P1.2按下,切换键

} } } return k;} //-------数码管动态扫描-------------void led_show(){unsigned char i,k;

//-----显示单价----k=cost_val[state_val];i=k%10;//暂存个位 P0=led_seg_code[i];P2=0xbf;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0x7f;delay(10);//-----显示距离------k=cnt_distance;i=k%10;//暂存个位 P0=led_seg_code[i];P2=0xf7;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0xef;delay(10);//-----显示总价格-----------k=cnt_cost;i=k%10;//暂存个位 P0=led_seg_code[i];P2=0xfe;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0xfd;delay(10);} //-------计时----------------void timer1()interrupt 3 //T1中断 { T1_cnt++;if(T1_cnt>3999)//如果计数>3999, 计时1s { T1_cnt=0;if(cnt_30<30)//没有超过30秒,继续计时

{cnt_30++;} else //超过30秒,途中等待计价

{cnt_30=0;cnt_cost=cnt_cost+cost_val[2];} } } //---------主程序----------------

main(){//初始化各变量 T1_cnt=0;state_val=0;key_val_old=255;init_variant();//初始化51的寄存器

TMOD=0x20;//用T1计时 8位自动装载定时模式,不用T0 TH1=0x19;//250微秒溢出一次;250=(256-x)*12/11.0592-> x= 230.4 TL1=0x19;EA=1;//开中断 ET1=1;

TR1=0;//定时器T0 TCON=0x01;//Int0中断取边沿触发模式 while(1){ key_val=scan_key();// 255;// if(key_val!=key_val_old){ key_val_old=key_val;if(key_val!=255){ switch(key_val){ case 0: //启动键

TR1=1;//启动计时,TR1=1为启动了的标志

break;case 1: //清除键

init_variant();//清除变量

TR1=0;//关闭定时器

break;case 2: //白天/黑夜的切换

if(state_val==0){state_val=1;} else {state_val=0;} break;} } } if(IE0==1&& TR1==1)//每来1个脉冲,中断一次

{ IE0=0;cnt_30=0;//30秒的计时清零

if(D_cnt<100)

{D_cnt++;} else //计数100次,每次10米,表示一公里

{D_cnt=0;cnt_distance=cnt_distance+1;

cnt_cost=cnt_cost+cost_val[state_val];} } led_show();} } //-----出租车计价器程序结束------------

第五篇:出租车计价器 硬件课程设计

硬件课程设计报告

题目:出租车计价器

目录

1. 引言....................................................................................................................................错误!未定义书签。

1.1设计目的................................................................................................................错误!未定义书签。1.2设计任务................................................................................................................错误!未定义书签。1.3设计思路................................................................................................................错误!未定义书签。

2.需求分析.............................................................................................................................错误!未定义书签。

2.1芯片原理................................................................................................................错误!未定义书签。2.1.1可编程计数器/定时器8253/8254原理.............................................................错误!未定义书签。2.1.2可编程外围接口芯片8255原理.......................................................................错误!未定义书签。2.1.3 12864液晶显示器ST7920原理........................................................................错误!未定义书签。2.2硬件设计................................................................................................................错误!未定义书签。2.3软件设计................................................................................................................错误!未定义书签。2.3.1功能模块图.........................................................................................................错误!未定义书签。2.3.2程序流程图.........................................................................................................错误!未定义书签。2.3.3模块流程图.........................................................................................................错误!未定义书签。

3.详细设计.............................................................................................................................错误!未定义书签。

3.1程序模块分析........................................................................................................错误!未定义书签。3.1.1初始化模块程序分析.........................................................................................错误!未定义书签。3.1.2判断开关程序模块分析.....................................................................................错误!未定义书签。3.1.3圈数统计模块程序分析.....................................................................................错误!未定义书签。3.1.4计算里程模块程序分析.....................................................................................错误!未定义书签。3.1.5显示模块程序分析.............................................................................................错误!未定义书签。3.1.6结束模块程序分析.............................................................................................错误!未定义书签。3.2程序代码................................................................................................................错误!未定义书签。

4.5.6.程序结果.............................................................................................................................错误!未定义书签。分析与测试.........................................................................................................................错误!未定义书签。体会.....................................................................................................................................错误!未定义书签。

附录A:参考文献.....................................................................................................................错误!未定义书签。

一、引言

1.1设计目的

现在各大城市出租车已经成为了一种重要的交通工具,当然出租车的收费问题也成了人们关注的焦点,那么怎么样才能实现一种合理的收费方式让大家都认可呢?在这种要求下,出租车自动计价器就走进了人们的生活,当然这就要求有一种合理公正的计价器收费方式。这不仅关系到出租车计价器的市场,也影响这出租车的市场,这就要求我们设计出更好的计价器来满足人们的需求。

本设计是关于出租车计价器的设计。在本次设计中,我以计价器的基本功能作为设计的重点。为了完成上述设计,我们采用了8254、8255等芯片,用计算机汇编语言进行软件功能的实现。

1.2设计任务

1.实现一个出租车计价器,可以显示起步价。2.一个键来控制是否到达终点,是否计价要清零。3.基于路程的出租车计价方式。

1.3设计思路

利用直流电机来模仿出租车轮子的转动来计算出租车行进的路程。将直流电机的直流端与滑动变阻器相连,通过人工控制滑动变阻器来模拟出租车的行进;并将计数端与8253CLK0端相连,GATE0接高电平,工作方式为方式二。直流电机每转1000圈,8253输出一个高电平,假设出租车已经走了1公里。同时将8253OUT0接入8255方便CPU读取。再将8255与ST7920显示器相连,CPU通过控制8255来控制显示,一旦8255从8253读入一个高电平,则公里数加一,同时价格相应增加。另有一个开关连入8255,用以判断出租车计价器是否启动。

二、需求分析

2.1芯片原理

本节主要在介绍本次设计所用到的芯片的原理,共有可编程计数器/定时器8253/8254、可编程外围接口芯片8255和12864液晶显示器ST7920原理三种芯片。

2.1.1可编程计数器/定时器8253/8254原理

图2-1 8254内部结构图

从图2-1可见,8254内部包含数据总线缓冲器、读/写控制逻辑、控制字寄存器和3个结构完全相同的计数器,这3个计数器分别称为计数器0、计数器1和计数器2。

图2-2 8254管脚图

A1、A0:地址输入线,用来控制8253内部的4个端口,即3个计数器和1个控制字寄存器与CPU系统地址线相连。

CLK0-2:时钟脉冲输入端,用于输入定时脉冲或计数脉冲信号。CLK可以是系统的时钟脉冲,也可以由系统时钟分频或者其他脉冲源提供。当用于定时时,这个脉冲必须是均匀的、连续的、周期精确的,而用于计数时,这个脉冲可以是不均匀的、断续的、周期不定的。

GATE0-2:门控输入端,用于外部控制计数器的启动计数和停止计数的操

作。两个或两个以上计数器连用时,可用此信号同步,也可用于与外部某信号的同步。

OUT0-2:计数输出,当计数器从初值开始完成计数操作进,OUT引脚输出相应的信号。

8253的方式控制字

图2-3 8254控制字图

本设计中8254的功能

只是用通道1,采用方式三。采用二进制计数,输入0FFFH。先输入低字节,再输入高字节。当8254从0FFFFH递减到159FH时(即转了60000圈时),8254向总线发信号使程序向下进行。

2.1.2可编程外围接口芯片8255原理

内部结构如图所示,由以下4个部分组成:

图2-4 8255内部结构图

(1)输入/输出端口A、B、C。这三个端口均可看作是I/O端口,但它们的结构和功能也稍有不同。A口和B口是一个独立的8位I/O口。C口:可以看作是一个独立的8位I/O口;也可以看作是两个独立的4位I/O口。

(2)A组和B组控制电路。这是两组根据CPU命令控制8255A工作方式的电路,这些控制电路内部设有控制寄存器,可以根据CPU送来的编程命令来控制8255A的工作方式,也可以根据编程命令来对C口的指定位进行置/复位的操作。A组控制电路用来控制A口及C口的高4位;B组控制电路用来控制B口及C口的低4位

(3)读/写控制逻辑。(同上:它负责管理8255A的数据传输过程。它接收CS*及RD*、WR*、RESET,还有来自系统地址总线的口地址选择信号A0和A1。将这些信号组合后,得到对A组控制部件和B组控制部件的控制命令,并将命令发给这两个部件,以完成对数据、状态信息和控制信息的传输。)

(4)数据总缓冲器。(同上:它是8位的双向的三态缓冲器。作为8255A与系统总线连接的界面,输入/输出的数据,CPU的编程命令以及外设通过8255A传送的工作状态等信息,都是通过它来传输的。)

如图所示8255A的芯片引脚信号。除了电源和地以外,其他信号可以分为两组:

图2-5 8255管脚图

1.和外设一边相连的: PA7-PA0:A组数据信号

PB7-PB0:B组数据信号 PC7-PC0:C组数据信号 2.和CPU一边相连的:

RESET:复位信号,低电平有效。当RESET信号来到时,所有内部寄存器就被清除,同时,3个数据端口被自动设为输入端口。

D7-D0:它们是8255A的数据线,和系统数据总线相连。

CS*:芯片选择信号,低电平有效。在一个系统中,一般根据全部接口芯片来分配若干较低位地址(比如A5、A4、A3)来组成各种芯片选择码,当这几位地址组成某一个代码时,译码器便往8255A的CS*端输出一个低电平,于是8255A被选中。只有当 CS*有效时,读信号RD*和写信号WR*才对8255A有效。

RD*:芯片读出信号低电平有效。WR*:芯片写入信号低电平有效。8255的方式控制字格式

图2-6 8255控制字图

本设计中8255的功能

8255PA0-PA7和PC0-PC2与ST7920相连,控制输出。PB0与8253的OUT1相连,读入8253OUT1 的数据。PB1与开关K0相连,读入K0的数值用于确定是否开启计价器。

2.1.3可编程外围接口芯片8255原理

ST7920控制器系列中文图形液晶模块的软件特性主要由ST7920控制驱动器决定。ST7920同时作为控制器和驱动器,它可提供33路com输出和64路seg输出。在驱动器ST7921的配合下,最多可以驱动256×32点阵液晶。

ST7920是台湾矽创电子公司生产的中文图形控制芯片,它是一种内置12864汉字图形点阵的液晶显示控制模块,用于显示汉字及图形。该芯片共内置8192

个中文汉字(16×16点阵)、128个字符的ASCII字符库(8×16点阵)及64×2256点阵显示RAM(GDRAM)。

为了能够简单、有效地显示汉字和图形,该模块内部设计有2MB的中文字型CGROM和64×256点阵的GDRAM绘图区域;同时,该模块还提供有4组可编程控制的16×16点阵造字空间;除此之外,为了适应多种微处理器和单片机接口的需要,该模块还提供了4位并行、8位并行、2线串行以及3线串行等多种接口方式。利用上述功能可方便地实现汉字、ASCII码、点阵图形、自造字体的同屏显示,所有这些功能(包括显示RAM、字符产生器以及液晶驱动电路和控制器)都包含在集成电路芯片里,因此,只要一个最基本的微处理系统就可以通过ST7920芯片来控制其它的芯片

图2-7 ST7920外观尺寸图

本设计中ST7920的功能

用于显示出租车行驶路程与应收费用。

2.2硬件设计

其中,8253GATE1连+5V高电平,直流电机连0~+5V,8253连280h~287h,8255连288h~28fh。8255PA0-PA7连ST7920显示器D0-D7,PC0连DI,PC1连RW,PC2连E。开关K0连8255PB0。8253CLK1连直流电机计数端。

0~+5V直流电机D0-D7计数ST7920显示屏DIRWE+5VGATE1CLK1PA0-PA7+5VPC0PC1PC2开关K0PB0+5V8253CS8255CS280H-288H289H-28FH总线图2-8硬件连接图

实际连接图如下图所示

图2-9硬件实际连接图

2.3软件设计 2.3.1功能模块图

本节先给出一个程序的功能模块图。

出租车计价器系统计价器开关功能模块读入直流电机转圈数模块ST7920显示功能模块根据里程计算价格模块

图2-10软件功能模块图

2.3.2程序流程图

本节先给出一个程序的整体流程图。

开始结束8253初始化液晶显示屏初始化8255初始化是计价器是否开始工作通过8255读入b0否是否有键盘输入否液晶显示屏初始化是液晶显示屏调用显示价格功能从直流电机读入输入圈数将更改过的路程在显示器中显示出来读到一定圈数走的路程加一比较路程是否大于3公里是价格为(路程-3)*2+7 元将储存的显示字符串内路程价格改为目前路程价格否价格为7元

图2-11软件程序流程图

2.3.3模块流程图

如果对整个程序进行细分则可以分为初始化模块,判断开关模块,圈数统计模块,计算里程模块、结束模块和显示模块。其中初始化模块是8253芯片、8255芯片和显示屏的初始化。判断开关模块是对8255的b0端是否有高电平进行判断。

圈数统计模块是对直流电机传入8253中高电平的数量进行圈数统计。计算里程模块是对里程及价格进行计算的模块。结束模块是程序结束的操作与方法。显示模块是控制显示屏显示计算模块的结果。

初始化模块显示模块调用关判断开关模块开结束模块圈数统计模块计算里程模块调用显示模块图2-12软件模块流程图

三、详细设计

3.1程序模块分析

我们将按模块分析程序的功能并给出模块内的功能流程图。

3.1.1初始化模块分析

在初始化模块中,我们定义了需要使用的8255和8254的接口,需要使用的变量如JSS,要输出的字符串等,初始化了DS,完成了8255的初始化以及显示屏的初始化。其流程图为

开始图3-1初始化模块流程图

3.1.2判断开关模块分析

以上为判断开关模块,在判断开关模块中,系统读入8255PB0的电平,如果是高电平则程序继续进行,如果是低电平则程序调用chushi函数,用屏幕显示“空车欢迎乘坐”,并继续度8255PB0直到有高电平为止。其流程图如下所示:

8255PB0是否为高电平是圈数统计模块否Chushi函数计数变量和对应的字符串置零显示 空车 欢迎乘坐 调用显示模块

图3-2判断开关模块流程图

3.1.3圈数统计模块分析

在圈数统计模块中,我们将直流电机计数端连入8254CLK1中(8253采用方式三),在CLK1中读所记的数,从0FFFFH向下计,一直计到159FH,即转了6000圈后,进入程序的下一段。其流程图如下所示:

读8254计数值否是否到159FH以下是重新将8254计数初值设为0FFFFH计算里程模块

图3-3圈数统计模块流程图

3.1.4计算里程模块分析

我们用地址JSS里表示已经走过的公里,即8254传过来的高电平,同时我们采用价格公式来计算价格,将其里程和价格对应的中文字码表存入要显示的字符串中。我们用地址JSS里表示已经走过的公里,即8254传过来的高电平,同时我们采用价格公式来计算价格,将其里程和价格对应的中文字码表存入要显示的字符串中。

计算公式为: 价格=(里程-3)* 2……(里程>3)

价格= 7…………………..(里程<=3)并调用显示模块来显示这些字码其流程图如下所示:

圈数统计模块计数值JSS加一并十进制化里程数加一里程数是否是大于3是价格为(里程-3)*2调用显示模块否价格为7

图3-4计算里程模块流程图

3.1.5显示模块分析

在显示模块中,我们使用ST7920显示我们要显示的两行字符串。我们采取先显示第一行,再显示第二行的方法,只是用ST7920的中间两行。

调整显示屏指针指向第二行调整显示屏指针指向第三行调整字符串指针指向第一个字调整字符串指针指向第九个字输出输出延时延时

图3-5显示模块流程图

3.1.6结束模块分析

结束模块在程序的尾部在结束模块中,我们规定只要在键盘上按任意一个键就会结束整个程序。如果无键按下,则程序自动跳转到程序头部。其程序流程图如下图所示:

调用DOS中断是否有键按下是结束否判断开关模块

图3-6结束模块流程图

3.2程序代码

IO8253A

EQU 280H IO8253B

EQU 281H IO8253C

EQU 283H

DATA

SEGMENT HZ DW 0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH

DW BCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH;存放原始输出 HZ_TAB DW 0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH

DW 0BCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH;存放要输出的值 HZ_BG DW 0BFD5H,0B3B5H,0A2A0H,0A2A0H,0BBB6H,0D3ADH,0B3CBH,0D7F8H

DW 0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H;存放“空车欢迎乘坐”

HZ_ADR DB ?

;存放显示行起始端口地址 JSS

DW 0000H DII

DW 0000H GAO

DW 0000H ZHE

DW 0000H NUMBER

DW 0A3B0H,0A3B1H,0A3B2H,0A3B3H,0A3B4H,0A3B5H,0A3B6H,0A3B7H,0A3B8H,0A3B9H DATA

ENDS IO_ADDRESS

EQU 288H

CODE SEGMENT ASSUME CS:CODE,DS:DATA START:

MOV AX,DATA MOV DS,AX

MOV DX,IO_ADDRESS ADD DX,3 MOV AL,82H OUT DX,AL

;8255初始化 MOV AL,0FFH MOV DX,300H OUT DX, AL CALL CLEAR

;LCD 清除

LLL:

MOV DX,IO_ADDRESS ADD DX,1 IN AL,DX

;判断开关是否打开 AND AL,01H CMP AL,01H JZ F0 CALL CHUSHI JMP LLL F0: MOV AL,01110110B MOV DX,IO8253C OUT DX,AL

;8254初始化 MOV AL,0FFH MOV DX,IO8253B OUT DX,AL MOV AL,0FFH

;设置计数初值0FFFFH OUT DX,AL F1: MOV AL,01000000B

MOV DX,IO8253C OUT DX,AL MOV DX,IO8253B

IN AL,DX MOV AH,AL IN AL,DX XCHG AH,AL CMP AX,159FH

;查看是否下降到159FH JA F1

;不满足条件继续读值

MOV AL,01110110B

;重置8253 MOV DX,IO8253C OUT DX,AL MOV AL,0FFH MOV DX,IO8253B OUT DX,AL MOV AL,0FFH OUT DX,AL

CALL DISP

;调显示子程序

CALL DDSP

CALL DELAY PUSH DX

MOV AH,06H MOV DL,0FFH INT 21H POP DX

JZ LLL

MOV AH,4CH

;退出

INT 21H L1:

JMP

START;L1

CHUSHI PROC NEAR

LEA SI, HZ_TAB LEA DI,HZ MOV CX,0FH F3: ADD SI,2 ADD DI,2 MOV AX,[DI] MOV [SI],AX LOOP F3

;重置HZ_TAB

MOV AX,0000H LEA BX,JSS MOV [BX],AX LEA BX, HZ_BG MOV CH,2

CALL LCD_DISP LEA BX, HZ_BG MOV CH,3

;显示“空车欢迎乘坐” CALL LCD_DISP RET CHUSHI ENDP

DDSP

PROC NEAR

LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX]

MOV BP,AX AND BP,00FFH ADD BP,BP

MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+6],DX

;将JSS中低八位传入HZ_TAB MOV BP,AX AND BP,0FF00H ROR BP,8 ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+4],DX

LEA BX, HZ_TAB

MOV CH,2

CALL LCD_DISP LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX] CMP AX,0003H

JBE L3 CALL BJ LEA BX,JSS JMP L4

L3:MOV BP,0007H

ADD BP,BP MOV DX,WORD PTR[BP+SI ] MOV WORD PTR[DI+24],DX JMP L4 L4:

LEA BX, HZ_TAB

MOV CH,3

CALL LCD_DISP RET DDSP

ENDP

BJ

PROC NEAR

LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX] CMP AL,03H

;将JSS中高八位传入HZ_TAB

;显示第2行信;比较路程与3的大小;路程比3小的情况

;显示第3行信息

JAE BJ1 SUB AH,01H ADD AL,0AH SUB AL,03H AAS

;路程减三并十进制化 JMP BJ2 BJ1:

SUB AX,0003H BJ2: MOV CX,AX AND AX,00FFH ADD AL,AL AAA ADD AX,07H AAA

LEA BX,DII MOV [BX],AX;DII MOV BP,AX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+24],DX

MOV AX,CX SHR AX,8 AND AX,00FFH ADD AL,AL

AAA LEA BX,GAO MOV [BX],AX;GAO LEA BX,DII MOV DX,[BX];DII AND AX,00FFH AND DX,0FF00H SHR DX,8 AND DX,00FFH ADD AL,DL

AAA LEA BX,ZHE MOV [BX],AX;ZHE MOV BP,AX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI]

;路程加七并十进制化;先计算个位

;十位相加

;再加进位

MOV WORD PTR[DI+22],DX

;再计算十位 LEA BX,ZHE MOV DX,[BX] LEA BX,GAO MOV AX,[BX] AND DX,0FF00H AND AX,0FF00H SHR AX,8 SHR DX,8 ADD DL,AL

;百位加进位 AAA MOV BP,DX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+20],DX

;最后计算百位 RET BJ ENDP

DISP

PROC NEAR

;显示子程序

PUSH DX

LEA BX, JSS

MOV AX,WORD PTR[BX]

ADD AL,01H

CMP AL,09H

;判断是否<=9

JLE NUM

;若是则为'0'-'9',ASCII码加30H

MOV AL,00H

ADD AH,01H

CMP AH,0AH

JZ L2 NUM:

MOV WORD PTR[BX],AX

ADD AL,30H

ADD AH,30H

MOV DL,AH

MOV DH,AL

MOV AH,02H

;屏幕显示

INT 21H

MOV DL,DH

MOV AH,02H

;屏幕显示

INT 21H

MOV DL,0DH

;加回车符

INT 21H

MOV DL,0AH

;加换行符

INT 21H

POP DX

RET

;子程序返回 DISP ENDP L2: MOV AH,4CH

;退出

INT 21H

CLEAR

PROC

MOV AL,0CH

CLEAR

FUNCUP

;

;

;

FUNCUP

LCD_DISP

;

DISP_SEC:

NEXT:

CONTINUE:

MOV DX, IO_ADDRESS OUT DX,AL

;设置CLEAR命令 CALL CMD_SETUP

;启动LCD执行命令 RET

ENDP

PROC MOV AL, 0FH

;LCD功能设置命令 OUT DX, AL CALL CMD_SETUP MOV AL, 34H

;LCD显示状态命令 OUT DX, AL CALL CMD_SETUP RET

ENDP PROC LEA BX, HZ_TAB CMP CH, 2 JZ DISP_SEC MOV BYTE PTR HZ_ADR, 88H

;第三行起始端口地ADD BX,16

;指向第二行信息 JMP NEXT MOV BYTE PTR HZ_ADR,90H MOV CL,8

PUSH CX MOV AL,HZ_ADR MOV DX, IO_ADDRESS OUT DX, AL CALL CMD_SETUP

;设定DDRAM地址命令 MOV AX,[BX] PUSH AX MOV AL,AH

;先送汉字编码高位 MOV DX,IO_ADDRESS OUT DX,AL CALL DATA_SETUP

;输出汉字编码高字节

CALL DELAY

;延迟

POP AX

MOV DX,IO_ADDRESS

OUT DX, AL

CALL DATA_SETUP

;输出汉字编码低字节

CALL DELAY

INC BX

INC BX

;修改显示内码缓冲区指针

INC BYTE PTR HZ_ADR

;修改LCD显示端口地址

POP CX

DEC CL

JNZ CONTINUE

RET LCD_DISP

ENDP CMD_SETUP

PROC

MOV DX,IO_ADDRESS

制端口

ADD DX,2

NOP

MOV AL,00000000B

(LCD I端=0,W端=0)

OUT DX, AL

CALL DELAY

NOP

MOV AL,00000100B

=1)

OUT DX, AL

NOP

CALL DELAY

MOV AL, 00000000B

0)

OUT DX, AL

CALL DELAY

RET CMD_SETUP

ENDP DATA_SETUP

PROC

MOV DX,IO_ADDRESS

ADD DX,2

MOV AL,00000001B

(LCD I端=1)

OUT DX, AL

NOP

CALL DELAY

;指向8255端口控

;PC1置0,PC0置0

;PC2置1(LCD E端

;PC2置0,(LCD E端置

;指向8255控制端

;PC1置0,PC0=1

MOV AL,00000101B

;PC2置1(LCD E端=1)

OUT DX, AL

NOP

CALL DELAY

MOV AL, 00000001B

;PC2置0,(LCD E端=0)

OUT DX, AL

NOP

CALL DELAY

RET DATA_SETUP

ENDP DELAY

PROC

PUSH CX

PUSH DX

MOV CX, 0FFFH X1:

LOOP

X1

POP DX

POP CX

RET DELAY

ENDP

CODE ENDS

END START

四、程序结果

我们利用8254、8255、ST7920显示屏、直流电机等制作出了一个出租车计价器有专用键可以表示是否空车,同时利用直流电机模拟车轮运动,通过路程计算价格,成果如下图所示:

图4-1程序结果图

五、分析与测试

程序中,我遇到的最大的难题就是如何完成正确的十进制计算,因为所有的计算指令都是十六进制的,虽然有的计算里有类似AAA这样的调整指令,但是很多时候就不一定记得起来加上。同时由于需要根据数字来查表对应相应的字符码,而且我是建立一个从零到九的数组,而由于计算错误导致经常出现乱码,而且比较难找到相应的错误。而且有些计算没有十进制转换指令,需要自己编写。

同时我认为我利用提前存储变量来表示走过的路程比利用堆栈要好,因为堆栈容易记混,而变量有独特的名字,利于记忆与调用。而且易于清零、增减。

六、心得体会

这次课程设计中,令我印象最为深刻的就是我们应该有一种坚持的精神,有时候几个小时都没有成果,找不到BUG。显示的就是有问题,这时候我们应该有一种坚持下去的毅力,积极询问老师同学,问题的解决就很快了。

同时我发现编程习惯非常重要,应该有一个提前的规划,不能想到哪写到哪,这样的话,后期的DEBUG会非常麻烦,因为自己也看不懂自己的代码,我们都应该有规范化的代码意识,这样的编程能力才能上升。

参考文献

[1]周荷琴,吴秀清,《微型计算机原理与接口技术》,合肥:中国科学技术大学出版社 2008。[2] 曹国清,《数字电路与逻辑设计》,徐州:中国矿业大学出版社 2003。[3] 8255芯片原理:http://baike.baidu.com/link?url=KHojvZzBGmo26_6iYGTdrdqH6PxQbM1Hnnc8hWQNPIp60L7TWG5LZu_ppSkXo5maU5M4APs4qCGSudiqZ0bdl_ [4]ST7920芯片原理:http://wenku.baidu.com/view/0dafd9232f60ddccda38a0fa.html访问时间2013/10/15 [5]ST7920中文字码表:http://wenku.baidu.com/view/d4abe628647d27284b735127.html访问时间:2013/10/15

下载毕业实践调研报告(出租车计价器)word格式文档
下载毕业实践调研报告(出租车计价器).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    出租车计价器课程设计2

    出租车计价器课程设计 目录 前言 1、 系统工作原理 1.1 功能说明 1.2 基本原理 2、 硬件设计 2.1 单片机最小系统单元 2.2 A44E霍尔传感器检测单元 2.3 AT24C01存储单元 2.......

    出租车计价器毕业论文附录

    北京信息科技大学 毕业设计(论文)附录 题 目:学 院: 专 业:学生姓名: 班级/学号 指导老师/督导老师:起止时间:2012 年 月 日 至 2012 年 月 日 目录 附件1 原理图·······......

    出租车计价器设计范文

    平顶山工业职业技术学院 目录 目录 .....................................................................................................................................

    基于单片机的出租车计价器设计报告(★)

    河南理工大学 《单片机应用与仿真训练》设计报告 出租车计价器设计 姓名学号: 专业班级: 指导老师: 所在学院: 2012年6月25日 摘要 本设计用直流电机转动模拟出租车车轮转动,实现......

    第二组_出租车计价器课程设计调试报告

    电子设计与制作课程设计报告 题目:出租车计价器课程设计 学年:2011学年 学期:上学期 专业:信息电子班级:H09-1 组别2 姓名: 曾磊 指导教师: 刘锐老师 小组成员: 曾磊 刘毅 朱亮......

    毕业设计开题报告(出租车计价器).(精选5篇)

    毕业设计开题报告 题 目 新型出租车计价器控制电路设计 姓 名 牛敏 学 号 120433322 专 业 班 级 电气 123 指 导 老 师 黄俊梅 电子工程系电气自动化教研室 2014年 12月 2......

    出租车计价器设计方案(5篇范例)

    1 系统硬件组成 总体结构如图一所示。硬件上主要由HT46RU24单片机,霍尔传感器,空载开关,键盘电路,数据存储电路,时钟电路,显示电路,蜂鸣器,IC卡电路以及串口电路组成。1.1 HT46RU24......

    出租车计价器毕业设计外文资料

    ABSTRACT In this paper, a multi-channel taximeter that is able to deal with more than one passenger simultaneously is proposed. In order to demonstrate the theo......