1、机电信息工程学院单片机系统课程设计报告目 录一、设计任务和性能指标 .31.1 设计任务 31.2 性能指标 3二、设计方案 .42.1 任务分析 42.2 系统设计 5三 系统硬件设计 .73.1 电源电路 73.2 单片机的最小系统 83.3 DS1302 时钟电路 93.4 显示电路的设计 103.5 按键控制的设计 113.7 复位电路 13四、系统软件设计 144.1 主程序设计 .144.2 子程序设计 154.2.1 DS1302 子程序 .154.2.1 DS1302 子程序流程图 154.2.2 显示子程序 .174.2.2 显示子程序流程图 194.3 修改时间子程序 .2
2、0五、调试及性能分析 215.1 调试步骤 .215.1.1 硬件调试 .215.1.2 软件调试: .215.2 性能分析 21六、心得体会 .23七、参考文献 .24八、附录 25附录 1、程序清单 .25附录 2 系统硬件电路图 35一、设计任务和性能指标1.1 设计任务出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。出租车计价器的主要功能是计价显示、时钟显示、根据白天、黑夜、途中等待来调节营运参数、计量数据查询等。要求用 Protel 画出系统的
3、电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2 性能指标1. 不同情况具有不同收费标准:白天、晚上、途中等待(10min 开始收费) ;2. 数据输出:单价输出、路程输出、总金额输出;3. 按键:启动计时开关、数据显示切换、白天/晚上切换、复位;4. 能手动进行修改单价,但单价设定需密码进入。二、设计方案2.1 任务分析出租车计价器基本功能部分是根据里程数来完成总金额的输出。实现方法有两种。方案一:采用数字电路控制。其原理方框图如图 2.1
4、所示。采用传感器件,输出脉冲信号,经过放大整形作为移位寄存器的脉冲,实现计价,但是考虑到这种电路过于简单,性能不够稳定,而且不能调节单价,也不能根据天气调节计费标准,电路不够实用。移 位 寄 存 器电 路里 程 传 感 器金 额 显示单 价 显示电 源 电 路 及保 护 电 路图 2.1 数字电路实现框图方案二:采用单片机控制。利用单片机丰富的 IO 端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。本方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。2.2 系统设计键盘电路掉电保护单片机 显
5、示电路里程输入图 2.1 电路系统构成框图主控芯片使用 51 系列 AT89C52 单片机,采用高性能的静态 80C51 设计,由先进工艺制造,并带有非易失性 Flash 程序存储器。它是一种高性能、低功耗的 8 位 COMS 微处理芯片,市场应用最多。时钟芯片使用美国 DALLAS 公司推出的一种高性能、低功耗、带 RAM 的实时时钟芯片 DS1302。采用 DS1302 作为主要计时芯片、可以做到计时准确。更重要的是,DS1302 可以在很小的电流的后备电源(2.55.5V 电源,在 2.5V时耗电小于 300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电
6、源基本不耗电。采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片 DS12887,将采用并行数据传输,占用更多的硬件资源。因此为节省单片机端口,时钟芯片采用 DS1302。它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。霍尔器件以霍尔效应为其工作基础。霍尔器件具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高(可达 1MHZ),耐振动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。活儿现行器件的精度高、线性度好;霍尔开关器件无触点、无磨损、输出波形清晰、无抖动、无回跳、无知重复精度高(可达 Im 级)。采用了各种步长和保护措施的霍尔器件的工作温度范围宽,
7、可达-55 摄氏度150 摄氏度。数据显示模块采用的是 LED 数码管显示,LCD 虽然也能实现显示功能,但在距屏幕 1 米之外就无法看清数据,不能满足要求,而且在白天其对比度也不能满足要求,因此建议采用 LED 数码管显示。数码管总共用了 12 个,其中第一行显示小时和分钟,第二行第一个显示单价,后面 3 个显示里程数,最后一行显示总价。 按键控制模块使用了 3 个脉冲开关,其中一个开关负责换位,另一个负责改数,第三个按键负责切换至等待时间。三 系统硬件设计3.1 电源电路因为出租车上的电压时 12V,而芯片所需供电电压是 5V,所以选择LM7805 的经典电路电源电路完成 12V 转 5V
8、 的目的。电源电路图如下图 3.1 所示:图 3.1 电源电路图3.2 单片机的最小系统单片机最小系统采用的是 STC89C54 芯片,STC89C54 是一种低功耗、高新能 CMOS 8 为微控制器,具有 8K 在系统可编程 Flash 存储器。使用 Atmel 公司高密度非易失性存储器技术制造,与工业 80C51 铲平指令和引脚完全兼容。偏上 FLASH 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有平桥的 8 为 CPU 何在系统可编程 Flash,使得 STC89C54 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C54 具有以下标准功能:8K 字节
9、 Flash,256 字节 RAM,32 位 I/O口线,看门狗定时器,2 个数据指针,三个 16 为定时器/计数器,一个 6 向量 2级终端结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0HZ 静态逻辑操作,支持 2 中软件可选择节点模式。空闲模式下,CPU 停止工作,允许 RAM、定时器/计数器、串口、终端继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。单片机最小系统电路图如下图 3.2 所示:图 3.2 单片机最小系统电路图3.3 DS1302 时钟电路若采用单片机计时,一方面需要采用计数器,占用阴间资源
10、,另一方面需要设置终端、查询等,同样耗费单片机的资源,并且使用单片机的时钟误差比较大,当长时间使用后会,会出现很大错误,而在系统中采用 DS1302 则能很好的解决这个问题。DS1302 时钟电路图如图 3.3 所示:图 3.3 DS1302 时钟电路图3.4 显示电路的设计在显示模块需要对时间、单价、总价、路程、等待时间进行显示,采用的是数码管,数码管总共用了 12 个,其中第一行显示小时和分钟,第二行第一个显示单价,后面 3 个显示里程数,最后一行显示总价。显示电路图(一个数码管)如下图 3.4 所示:图 3.4 显示电路图3.5 按键控制的设计按键的设置是为了能够手动更改时间和单价,还有
11、就是手动切换到等待时间的地方,按键采用的是脉冲按键。按键设置电路图如图 3.5 所示:图 3.5 按键控制电路图3.6 掉电保护掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。掉电保护的芯片较多,如 AT24C02 是 ATMEL 公司的 2KB 字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到 2.5V,额定电流为1mA,静态电流 10Ua(5.5V),芯片内的资料可以在断电的情况下保存 40 年以上,而且采用 8 脚的 DIP 封装,使用方便。掉电保护电路图如下图 3.6 所示:图 3.6 掉电保护电路图3.7 复位电路复位功能采用的是 MAX813L
12、芯片。MAX813L 是具有监控电路的微处理芯片,它具有 4 个功能:1 具有独立的看门狗计时器,如果看门狗输入在 1.6 秒内无变化,就会产生看门狗输出;2 掉电或电源电压低于 1.25V 时,产生掉电输出;3 上电时能自动产生 200ms 宽的复位脉冲;4 具有人工复位功能,当人工复位端输入低电平时,产生复位信号输出。复位电路如图 3.7 所示:图 3.7 复位电路图四、系统软件设计4.1 主程序设计程序的难度主要就是在数码管的显示和外部脉冲的采集部分,分别采用74LS273 芯片对数码管进行段选,使数码管显示对应的数,另外使用 74LS154对数码管进行位选,选择哪个数码管亮,采用的是动
13、态显示。还有外部脉冲的收集,需要对里程数进行显示,所以必须要先进行脉冲的采集。程序流程图如图 4.1 所示:图 4.1 程序流程图4.2 子程序设计4.2.1 DS1302 子程序4.2.1 DS1302 子程序流程图显示单价、总价、路程、时间等数据,循环扫描进行显示。(如果在一分钟内没有脉冲,开启终端,显示秒分子程序。DS1302 子程序流程图如 4.2.1 所示:开始写入实参数 addrCE=1 SCLK=0I=0取 ADDR 低位Addr 右移一位Sclk 上升沿是否是上升沿Y等待上升沿Ni+;i8 ?结束YN图 4.2.1 DS1302 子程序流程图4.2.2 显示子程序void se
14、tt() /显示等待时间及单价、 总价、路程子程序TAB0=Read1302(0x83)/10;TAB1=Read1302(0x83)%10;TAB7=Read1302(0x81)/10;TAB6=Read1302(0x81)%10;TAB8=3;TAB2=Coo/100;TAB3=Coo/10%10;TAB4=Coo%10;if(TAB4 12 ?结束YN图 4.2.2 显示子程序流程图4.3 修改时间子程序修改 TAB 数组里的前 5 位数据,分别为小时、分钟、单价.五、调试及性能分析5.1 调试步骤5.1.1 硬件调试错误 1:LM7805 封装时 2 脚和 3 脚弄混解决办法:1、将
15、LM78052 脚和 3 脚手工矫正2、利用飞线重新手工焊接错误 2:进行原理图设计时,电源网络标号不一致(74LS14、74HC154 电源网络标号与其他的不一致)解决办法:利用飞线,将错误的网络标号和正确的网络标号进行手工焊接。错误 3:1K*9 排阻焊反解决办法:手工拔出,重新焊接错误四:在焊接时,由于焊接时间过长,造成三极管烧坏解决办法:手工拔出重新焊接错误 5:有些器件焊接次数过于频繁,造成印刷板上焊盘和导线脱落解决办法:利用飞线将对应的网络标号进行连接5.1.2 软件调试:在软件编程时,应充分利用原理图,不然会在编程时导致硬件与软件不能对应起来,使程序无法实现功能,还有在编程时子程
16、序的名称应与其功能对应,否则会使别人在读程序的时候不能及时理解程序含义,而且在软件调试时逻辑一定要清晰,不然在找错时会浪费很多时间,5.2 性能分析通过软件调试后,最终能实现实时时钟显示、里程数的显示、单价的显示、总价的显示、时间的调整、等待时间的显示。时间显示模块使用的是时钟芯片 DS1302,它精确度高,功能强大,使用它能降低单片机的负荷,减小误差。里程数收集模块由于条件限制,所以我们使用一个外部脉冲信号作为里程数的收集,用一个脉冲表示一公里,最大的里程数可达 256 公里。电源模块部分由于经验问题,没有在 PCB 板上加上串口和 USB 口,使得电源不稳,只能用导线在外部加一个 5V 电
17、压,而且由于 7805 的封装引脚分配有错误,导致在最初调试的时候芯片烧坏,所以最终放弃 7805 的电压转换,而直接使用+5V 电压。显示模块使用 LED 数码管,通过软件调试, 12 个数码管能显示时间、总路程、单价、总价及等待时间的自动切换。六、心得体会由于初次进行硬件电路设计,出现了很多简单又致命的错误(见硬件调试)。5 个错误在一块线路密集并且已经焊好器件的电路板上无疑是大海捞针。像器件焊反之类的错误还比较好排除。而器件损坏和网络标号不一致这样的错误就很让人头疼。仅仅只是网络标号不一致这个错误就让我们整整测试了一天才发现。所以下次设计硬件电路的时候一定要找几个人仔细检查电路图,不能再
18、轻易犯这样的错误。像印刷板上导线断裂这样的错误也比较难找。而这种错误往往是焊接时温度过高或者是焊接过于频繁造成的,所以以后焊接的时候一定不会再犯这样的错误了。而且由于当初设计 USB 口和串行口,为软件调试造成了很大的麻烦(每天不停地拔单片机)。再做学生实验的时候不能太过于追求趋近于真实产品。过于追求真实会让你的实验过程变得极其困难。真的是后悔不已。当初想利用以前做的单片机最小系统开发板上的串行口进行程序下载,但是到真正实行的时候在发现并不是那么回事。由于对单片机的要求达不到,虽然理论上天衣无缝,但实际上根本不可能实现。虽然出租车上提供的电源是 12V,即便在实验板上设计了电源电路也应该再加上
19、一个 USB 口提供 5V 电源。因为除了在实验室其他地方是并不太容易找到 12V 电源。由于对 USB 口的省略,对软件调试工作造成了很大的麻烦。七、参考文献1 徐维祥、刘旭敏 . 单片微型机原理及应用. 大连:大连理工大学出版社,1996戴胜华,蒋大明 单片机原理与应用 北京:清华大学出版社 2005李刚 新概念单片机教程 天津:天津大学出版社 2004王宗和 单片机实验与综合训练 北京 高等教育出版社 2000八、附录附录 1、程序清单#include“reg51.h“#include “intrins.h“#define uchar unsigned charuchar tmp;uch
20、ar det;uchar Coo;int m;int f;uchar code DispTab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0; /字形码uchar TAB24;sbit P00=P00;sbit P01=P01;sbit P02=P02;sbit P03=P03;sbit P04=P04;sbit P05=P05;sbit P10=P10;sbit P27=P27;sbit P14=P14;sbit SCLK =P13; /*DS1302 的 SCLK 脚脉冲*/sbit DIO=P12; /*DS1302 的 I
21、O 脚数据*/sbit CE=P11; /*DS1302 的 RST 脚片选*/sbit P15=P15;sbit P23=P23;sbit P21=P21;sbit P16=P16;sbit P35=P35;sbit P22=P22;sbit P17=P17;sbit P20=P20;sbit P26=P26;sbit P24=P24;sbit ACC7=ACC7;sbit ACC0=ACC0;void time() interrupt 1 /等待计时中断int i,j;TH0=0x15;TL0=0xa0;i+;if(i=100)i=0;j+;if(j=10)j=0;f=Coo;void m
22、Delay(unsigned int Delay) /延时子程序 unsigned int I;for(;Delay0;Delay-) for(I=0;I0; i- ) /循环 8 次移位 temp = addr;DIO = (bit)(temp /每次传输低字节addr = 1;SCLK = 0; /右移一位SCLK = 1;/发送数据for ( i=8; i0; i- ) temp = dat;DIO = (bit)(temp dat = 1;SCLK = 0; SCLK = 1;CE = 0; unsigned char Read1302 ( unsigned char addr ) /
23、数据读取子程序unsigned char i,temp,dat1,dat2;CE=0; SCLK=0; CE = 1; /发送地址for ( i=8; i0; i- ) /循环 8 次移位 temp = addr;DIO = (bit)(temp /每次传输低字节addr = 1;SCLK = 0;SCLK = 1; /右移一位/读取数据for ( i=8; i0; i- ) ACC7=DIO;ACC=1; SCLK = 1;SCLK = 0; CE=0;dat1=ACC;dat2=dat1/16; /数据进制转换dat1=dat1%16; /十六进制转十进制dat1=dat1+dat2*10
24、;return (ACC);void Initial() /初始化 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); /允许写保护void set() /修改时间 Write1302 (0x8E,0x00); /禁止写保护Wr
25、ite1302 (0x82,TAB7*16+TAB6); /分钟初始化Write1302 (0x84,TAB0*16+TAB1);Write1302 (0x8E,0x80);void ss()/显示子程序int i;uchar *p;p=TAB;for(i=0;i1;i+)det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=0;P16=0;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=1;P15=0;P16=0;P17=0;p+;det=*p;tmp=DispTabdet;P0=tmp;P20=0;P20=1;P14=0;P15=1;P16=0;P17=0;p+;