专业方向课程设计报告格式.docx
- 文档编号:28706761
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:20
- 大小:191.95KB
专业方向课程设计报告格式.docx
《专业方向课程设计报告格式.docx》由会员分享,可在线阅读,更多相关《专业方向课程设计报告格式.docx(20页珍藏版)》请在冰豆网上搜索。
专业方向课程设计报告格式
重庆交通大学计算机与信息学院
专业方向课程设计报告
班级:
电子信息工程三班
姓名:
张春秋
学号:
09200309
设计项目名称:
出租车计价器
实验所属课程:
专业方向课程设计
实验室(中心):
现代电子实验中心
指导教师:
蓝章礼
设计完成时间:
2012.9.10至2012.12.20
一、设计的目的
通过课程设计了解和掌握单片机应用技术;了解和掌握C语言的程序设计同硬件电路的结合;熟练运用proteus,keilC等软件的操作;了解和掌握单片机硬件电路的焊接和调试;了解和掌握掉电存储芯片AT24C02、霍尔传感器A44E、数码管、驱动芯片74LS245等外部接口芯片器件的应用。
二、设计内容简介
利用AT89S51单片机,设计简单的出租车计价器。
在出租车计价器的总体设计中,我主要负责出租车计价器硬件设计。
其中主要的外围功能电路有:
驱动电路,按键控制电路,掉电保护电路,时钟部分,数码管显示电路等。
通过对以上各功能的设计,制作出的出租车计价器应具有以下功能:
上电时显示全为零,通过按下启动按键来开始计价,数码管开始显示起步价和起步金额;按下模拟开关按键来产生一个脉冲信号,模拟行驶的里程;数码管开始显示所走里程和所应付的金额,并逐渐增加;按下停止按键,停止计价,数码管显示所走总里程和用户所需付总金额,按下清零按键,数码管全显示零,以备下次计价
三、系统结构
采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
设计采用AT89S51单片机为主控器,以A44E霍尔传感器测距(按键替代),实现对出租车的基本的计价设计,并采用AT24C02实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。
利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的计价功能。
系统结构图如下:
四、硬件设计
硬件组成主要包括:
驱动电路、显示电路、复位电路、掉电保护电路、时钟电路、按键电路。
4.1.1驱动电路
74LS245是我们常用的芯片,用来驱动led或者其他的设备。
总线驱动器74LS244和74LS245经常用作三态数据缓冲器,74LS244为单向三态数据缓冲器,而74LS245为双向
三态数据缓冲器。
本设计用74LS245作为驱动芯片,双向总线发送器/接收器(3S)。
图2.4驱动芯片管脚图
74LS245主要电器特性的典型值如下:
引出端符号:
AA总线端
BB总线端
/G三态允许端(低电平有效)
DIR方向控制端
功能表:
表2.5功能表
利用74LS245来驱动数码管显示,单片机的P2.0到P2.5分别接A0到A5管脚,进行数据的传送,其中AB/BA接高电平,控制数据从A到B进行传送,B0到B5分别接数码管的位选端,驱动数码管依次显示。
P2.0到P2.5的数据通过A传送到B中的数据送到数码管,以达到显示数据信息的目的。
4.1.2显示电路
多数的应用系统,都要配输入和输出外设,LED显示器和LCD显示器,虽然LCD显示效果比较好,已经成为了一种发展趋势,但为了节约成本,我们选用了LED显示器(图2.6)。
在显示方面,我们选用了动态显示。
静态显示虽然亮度较高,接口编程容易,但是每位的段码线分别与一个8位的锁存器输出相连。
占用的I/O口线比较多,在显示位数较多的情况下,一般都采用动态显示方式。
利用动态显示的方法,由于LED显示器的余辉和人眼的视觉暂留现象,只要每位显示的时间间隔足够短,就仍能感觉到所有的数码管都在显示。
为了简化硬件,通常将所有位的段码线相应段并联在一起,由一个8位I/O口控制,在同一时刻,只让一位选通,如此循环,就可以使各位显示出将要显示的字符。
图2.6LED数码管图2.7集成数码管
LED数码有共阳和共阴两种,把这些LED发光二极管的正极接到一块(一般是拼成一个8字加一个小数点)而作为一个引脚,就叫共阳的,相反的,就叫共阴的,那么应用时这个脚就分别的接VCC和GND。
再把多个这样的8字装在一起就成了多位的数码管了。
在本设计仿真中使用的是6个一组的共阴8段数码管(图2.7)。
找公共共阴和公共共阳的方法:
首先我们找个电源|稳压器(3到5伏)和1个1K(几百欧的也行)的电阻,VCC串接个电阻后和GND接在任意2个脚上,组合有很多,但总有一个LED会发光的,找到一个就够了,然后用GND不动,VCC(串电阻)逐个碰剩下的脚,如果有多个LED(一般是8个),那它就是共阴的了。
共阴极数码管,阴极接地,当某个发光二极管的阳极为高电平时,发光二极管点亮,对应的段就显示。
4.1.3复位电路
单片机的复位是由外部的复位电路实现的,复位电路通常采用上电自动复位和按钮复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的。
除了上电复位外还需要按键手动复位(图2.8)。
按键手动复位有电平方式和脉冲方式两种。
其中电平复位是通过RST端经电阻与电源VCC接通而实现的。
单片机的复位速度比外围I/O接口电路快为
能够保证系统可靠的复位,在初始化程序中应安排一定的复位延迟时间。
图2.8复位电路
4.1.4掉电保护电路
掉电保护电路中采用了存储芯片AT24C02。
AT24C02是一个CMOS标准的EEPROM存储器,是AT24CXX系列(AT24C01/02/04/08/16)成员之一,这些EEPROM存储器的特点是功耗小、成本低、电源范围宽,静态电源电流约30uA~110uA,具有标准的I2C总线接口,是应用广泛的小容量存储器之一。
图2.9AT24C02引脚图
上图是AT24C02的引脚图,这个芯片是一个8脚芯片,内部存储器有256字节。
引脚功能介绍如下:
A0(引脚1):
器件地址的A0位,是器件地址的最低位,器件地址排列是A6A5A4A3A2A1A0R/W。
A1(引脚2):
器件地址的A1位。
A2(引脚3):
器件地址的A2位。
GND(引脚4):
地线。
SDA(引脚5):
数据总线引脚。
SCL(引脚6):
时钟总线引脚。
TEST(引脚7):
测试引脚。
Vcc(引脚8):
电源线引脚。
本设计采用掉电存储电路图如下:
图2.10掉电存储电路
4.1.5时钟电路
MCS-51单片机的各功能部件都是以时钟控制信号为基准,内部电路在时钟信号的控制下,严格地按时序执行指令进行工作,单片机本身如同一个复杂的同步时序电路,为了保证其各个部分同步工作,电路要在唯一的时钟信号控制下,严格地按照时序进行工作。
其实只需在时钟引脚连接上外围的定时控制元件,就可以构成一个稳定的自激振荡器。
为更好地保证振荡器稳定可靠地工作,谐振器和电容应尽可能安装得与单片机芯片靠近。
本设计中使用的振荡电路,由12MHZ晶体振荡器和两个约30PF的电容组成,在XTAL1和XTAL2两端跨接晶体,电容的大小不会影响振荡频率的高低。
在整个系统中为系统各个部分提供基准频率,以防因其工作频率不稳定而造成相关设备的工作频率不稳定,晶振可以在电路中产生振荡电流,发出时钟信号。
如图2.11所示。
图2.11时钟电路
4.1.6按键电路
按键控制电路中,单片机的P1.0管脚接启动/停止按键,通过软件编程,当按下按键计数器开始工作,开始计价;当弹起按键时,计数器停止工作,停止计价,启动/停止按键带自锁功能。
按下启动按键,开关处于导通状态,这时给P1.0送低电平信号,这时TR0=1,计数器开始工作,调用计价子程序开始计价。
清零按键接单片机的P1.3管脚,按下清零按键,P1.3为低电平,调用清零子程序,用于将显示数据清零,在程序中给各位赋0代码(0x3f),以达到清零的目的,方便下次计价。
另外为功能键,控制价格调整,这个按键是在没有按下启动/停止按键时有作用,计价过程中无效。
图2.12按键电路
4.2.1硬件电路设计
按下计价按键时,显示起步价和起步里程范围,这些在程序中设置;当等于或超过两公里后,按计算总价的公式为:
总价=起步价+单价*(总里程-起步里程)+1进行计价。
本设计中,起步价为4元,起步里程为2公里,当然这些数据可以在程序中改写,以满足不同时期价格调整的需要。
下图是通过在KeilC中编译通过,并生成Hex文件,在PROTEUS中仿真通过的整体硬件原理图:
五、软件设计
整个程序的流程图如下:
程序源代码
#include
//#include
#include
#defineucharunsignedchar
#defineuintunsignedint
intxscode[6]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};//显示存储区
intzxscode[6]={0x1f,0x2f,0x37,0x3b,0x3d,0x3e};//共阴显示片选码
intcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码
inti,j,flag;
ucharsec;
intkk=0;//路程标志位
intjkk=0;//费用
intjflag=0;//费用标志位
intkflag=0;//路程标志位
intzdflag=0;//中断标志位
intkilo=0;//路程
intdj=1;//路程单价
intdjflag=0;//路程单价biaozhiwei
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P3^4;
sbitSDA=P3^0;//IIC引脚
sbitSCL=P3^1;
voiddelay()
{;;}
voiddelay1(xms)//延时程序子程序
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidstart()//IIC开始位
{SDA=1;
SCL=1;
delay();
SDA=0;
delay();
}
voidstop()//IIC停止位
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
}
voidrespons()//IIC应答位
{
uchari;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}
voidinit()
{
SDA=1;
delay();
SCL=1;
delay();
}
ucharread_byte()//从EEPROM读到MCU
{
uchari,j;
for(i=0;i<8;i++)
{
SCL=1;
j<<=1;
j|=SDA;
SCL=0;
}
return(j);
}
voidwrite_byte(uchardate)//从MCU写到EEPROM
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
voidwrite_data(ucharaddr,uchardate)//在指定地址addr处写入数据date
{
start();
write_byte(0xa0);
respons();
write_byte(addr);
respons();
write_byte(date);
respons();
stop();
}
ucharread_data(ucharaddr)//在指定地址addr读取数据
{
uchardate;
start();
write_byte(0xa0);
respons();
write_byte(addr);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
returndate;
}
voidxianshi()//显示程序子程序
{
for(flag=0;flag<6;flag++)
{
P0=xscode[flag];//送显示码
P2=zxscode[flag];//送片选码
delay1
(2);
P0=0;
}
}
voidjijia()//计费子程序
{
if(kk<=2)//计价方案
{jkk=4;//起步价4元
kk=2;
}
elseif(kk>2&&kk<=35)
{
jkk=4+dj*(kk-2)+1;
}
elseif(kk>35&&kk<900)
{
jkk=4+2*dj*(kk-2)+1;
}
kflag=kk/100;//路程百位
jflag=jkk/100;//路费百位
xscode[2]=codetab[kflag];
xscode[5]=codetab[jflag];
kflag=kk/10;//路程十位
jflag=jkk/10;//路费十位
xscode[1]=codetab[kflag];
xscode[4]=codetab[jflag];
kflag=kk%10;//路程个位
jflag=jkk%10;//路费个位
if(kflag==0){kflag=2;}//不足两公里时,显示两公里
xscode[0]=codetab[kflag];
xscode[3]=codetab[jflag];
}
voidqingling()
{
for(i=0;i<=5;i++)//显示码清零
{xscode[i]=0x3f;}
}
voidmain()//主程序
{init();
sec=read_data
(2);
if(sec>100)
sec=0;
TL0=(65536-2)%256;//计数值设置,记满两次产生中断
TH0=(65536-2)/256;
TMOD=0x06;
EA=1;
ET0=1;
TR0=0;//关定时器
kilo=0;
qingling();
aa:
if(key1==0)//当键按下去,开始计费
{TR0=1;//开计数器0
kk=kilo;
jijia();}
if(key1==1)//当键松开,停止计费
{
TR0=0;//停计数器1
if(key2==0)//功能调整键
{delay1(10);//延时判断键是否松开
if(key2==1)
{xscode[2]=codetab[djflag++];}//当p1.2口的按键按下时功能标志位加一
}
if(key3==0&&djflag==2)//当功能键标志位等1时,改变每公里的价钱
{
delay1(10);
if(key3==1)
{dj++;}
xscode[1]=codetab[dj/10];//把价钱十位送显示区,单价不能超100
xscode[0]=codetab[dj%10];
}
if(key4==0)//有键按下,清显示,单价会初始值,单价标志位清零
{
qingling();
dj=1;
djflag=0;
}
}
xianshi();//调显示子程序
gotoaa;
}
voidTimer0_Int()interrupt1using2//计数器0中断服务
{
zdflag=zdflag+1;//中断标志位加一
if(zdflag==2)//当中断产生二次后,路程加一公里并清中断标志位
{
zdflag=0;
kilo=kilo+1;
}
}
六、测试及结论
6.1.1单片机仿真软件在线调试—PROTEUS
1.打开Proteus软件。
2.选择file菜单下的opendesign选项,找到所需的元器件,元器件上单击右键选中,再单击左键对其进行命名和赋值,接着在编辑器左边的一栏中,找出并绘制设计所要的各种元器件,按照电路图连接后并保存。
3.将用keil编译产生的hex文件下载到单片机中:
双击51单片机,在对话框中把保存过的hex文件打开,再单击确定。
4.单击左下角运行按钮,进行软件仿真调试,直到出现正确的结果。
下图为软件的仿真窗口图:
图4.2软件仿真窗口图
6.2.1总结
在本次设计中,我们采用AT89S51芯片为核心器件,设计出了简单的出租车计价器,能够实现显示总金额和总里程,按键控制清零,调价。
选题后,我便开始复习单片机方面的知识,也查阅、搜索了很多相关资料,进行总体设计与具体设计,同时也学习仿真软件Protues和编程软件KeiC。
由于以前都采用汇编语言实现编程,对用C语言来实现单片机的编程不太习惯,花费了一些时间来熟悉C语言的编程。
在设计开始,要形成流程图,它可以使设计有一定的逻辑性与严密性,使得设计思路明确。
采用模块化的设计思想很重要,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。
这次设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习新的知识,吸取经验,达到进步的目的。
通过自身的努力以及相关图书资料的帮助,逐渐熟悉了KEIL、PROTEUS和C语言等软件的使用以及硬件焊接与检测过程中的一些小技巧。
本次设计我学习到不少单片机的知识,但由于自己的理论知识水平有限,实践知识和设计经验不足,在设计过程中难免存在一些问题。
所焊实物尚有许多不足,个别预期功能还不能很好的实现,主要原因是考虑问题不周全,电路设计经验少,实际动手能力不足。
恳请老师批评指正,以使我在以后的学习和实践中加以改进和提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专业 方向 课程设计 报告 格式