第十二章单片机应用系统的设计与开发11·1在单片机应用系统总体设计中,应考虑哪几方面的问题?简述硬件设计和软件设计的主要过程。答:在单片机应用系统总体设计中,主要应考虑硬件设计和软件设计两方面的问题。硬件设计的任务是根据总体设计要求,在所选择机型的基础上,确定系统扩展所要用的存器、I/O电路、A/D电路以及有关外围电路等,然后设计出系统的电路原理图。下面介绍硬件设计的各个环节。(1)程序存储器当单片机内部程序存储器容量不够时,需外扩存储器。可作为程序存储器的芯片有多种非易失性存储器力口EPROM和E2PROM等,一般应选用速度高、容量较大的芯片,这样使译码电路简单,且使软件扩展留有一定余地。(2)数据存储器对于数据存储器的容量要求,各个系统之间差别比较大。有的测量仪器和仪表只需少量的RAM即可,此时应尽量选用片内RAM容量能符合要求的单片机;对于要求较大容量RAM的系统,RAM芯片的选择原则是尽可能减少RAM芯片的数量。例如,一片6264(8KB)比4.片6116(2KB)价格低得多。(3)输入/输出接口较大的应用系统一般都要扩展I/O接口,在选择I/O电路时应从体积、价格、功能、负载等几方面考虑。应根据系统总的输入/输出要求来选择接口电路。A/D和D/A电路芯片的选择原则是应根据系统对它们的速度、精度和价格的要求而确定。(4)地址译码电路80C51系统有充分的存储器空间,包括64KB程序存储器和64KB数据存储器,在应用系统中一般不需要这么大容量。为能简化硬件逻辑,同时还要便所用到的存储器空间地址连续,通常采用译码器法和线选法相结合的办法。(5)外围电路在测量和控制系统中,经常需要对一些现场物理量进行测量或者将其采集下来进行信号处理之后再反过来去控制被测对象或相关设备。在这种情况下,应用系统的硬件设计就应包括与此有关的外围电路,如信号调节放大电路、驱动电路等。在单片机应用系统研制中,软件设计一般是工作量最大、最重要的任务。下面介绍软件设计的一般方法与步骤。(1)系统定义系统定义是指在软件设计前,首先要进一步明确软件所要完成的任务,然后结合硬件结构,进一步弄清软件承担的任务细节。①定义和说明各输入/输出口的功能,是模拟信号还是数字信号、电平范围、与系统接口方式、占有口地址、读取和输人方式等。②在程序存储器区域中,合理分配存储空间,包括系统主程序、常数表格、功能子程序块的划分、人口地址表等。③在数据存储器区域中,考虑是否有断电保护措施、定义数据暂存区标志单元等。④面板开关、按键等控制输人量的定义与软件编制密切相关,系统运行过程的显示、运算结果的显示、正常运行和出错显示等也是由软件编制,所以事先也必须给以定义,作为编程的依据。(2)软件结构设计合理的软件结构是设计出一个性能优良的单片机应用系统软件的基础,必须予以充分重视。由系统的定义,可以把整个工作分解为几个相对独立的操作;根据这些操作的相互联系及时间关系,设计出一个合理的软件结构。在程序设计方法上,模块程序设计是单片机应用中最常用的程序设计技术。这种方法的优点是:单个程序模块的设计和调试比较方便且容易完成,一个模块可以为多个程序所共享;缺点是:各个模块的连接有时有一定难度。(3)程序设计在软件结构设计确定之后就可以进行程序设计。一般程序设计过程如下:根据问题的定义,描述出各个输人变量和各个输出变量之间的数学关系,即建立数学模型。然后根据系统功能及操作过程,先列出程序的简单功能流程框图(粗框图),再对粗框图进行扩充和具体化,即对存储器、寄存器、标志位等工作单元作具体的分配和说明。把功能流程图中每一个粗框转变为具体的存储单元、寄存器和I/O口的操作,从而绘制出详细的程序流程图(细框图)。在完成流程图设计以后,便可编写程序。单片机应用程序可以采用汇编语言,也可以采用某些高级语言。编写完后均须汇编成80C5l的机器码,经调试正常运行后,再固化到非易失性存储器中去,完成系统的设计。11·2如何技高应用系统的抗干扰性?可采取哪些措施?答:单片机应用系统在实际工作中,可能会受到各种外部和内部的干扰,使系统工作产生错误或故障。为减少这种错误和故障,就要采取各种提高可靠性的措施。常用措施如下:①提高元器件的可靠性:●在系统硬件设计和加工时应注意选用质量好的电子元器件和接插件,并进行严格的测试、筛选和老化。●设计时技术参数(如负载)应留有余量。②提高印刷电路板和组装的质量,设计电路板时布线及接地方法要符合要求。③对供电电源采取抗干扰措施:●用带屏蔽层的电源变压器。●加电源低通滤波器。●电源变压器的容量应留有余地。④输人/输出通道的抗干扰措施:●采用光电隔离电路。光电隔离器作为数字量、开关量的输人/输出,这种隔离电路效果很好。●采用正确的接地技术。●采用双绞线。双绞线抗共模干扰的能力较强,可以作为接口连接线。11·3请自行设计一个节日彩灯循环闪烁的应用系统。答:该题可以有多种循环方式,延时时间及左右移不同会有不同的循环效果。以下只是其中的一种形式,其余可自行编程实验。本例电路见题图11-1,由P1口的8位控制8路电灯电路,在每一路中都通过一个可控硅SCR控制N路并联电灯的开关。单片机工作频率12MHz,该程序延时选为200ms,用定时器T0作为定时器,初值为50mS。编程如下:题图11-1EX11_3:MOVPl,#0FEH;初始化为第0位的一组灯亮EX11_3A:ACALLDELAY;调延时子程序MOVA,PlRLA;顺序左移一位MOVPl,AAJMPEXll_3ADELAYMOVTMOD,#0lHMOVRl,#04HDELAY_1:MOVTH0,#3CHMOVTL0,#0B0HSETBTR0JNBTF0,$CLRTF0DJNZR1,DELAY_1RET11·4请自行设计一个交通灯控制系统,此系统还要求显示秒倒计教时间,每当还差10s该换指示打时(例如红灯挨绿打),该指示灯变为闪烁点亮。答:设计电路如题图11-2所示,单片机工作频率12MHz,在本题中只考虑马路一边的交通灯控制系统。分别用Pl.0和Pl.1控制红灯和绿灯,用两个数码管显示秒的变化。定时器T0用于显示定时,定时器Tl用于灯闪定时。DM_ADDREQU0DFFFH;数码管断码地址WM_ADDREQU0BFFFH;数码管位码地址POSITIONEQU30H;位寄存器COUNTEREQU31H;定位时间寄存器LAMP1EQUP1.0;红灯LAMP2EQUP1.1;绿灯;----------------------------------------ORG0000HLJMPEX4ORG000BHLJMPTIMER0ORG0030HEX4:MOVSP,#50H;设堆栈指针MOVPOSITION,#0FEH;初始化位码寄存器MOVTMOD,#11H;设置定时器工作方式MOVTH0,#0F6H;定时器0初值MOVTL0,#03CHSETBTR0;启动定时器。SETBET0;允许定时器0中断SETBEA;开中断SETBLAMP1;关红灯CLRLAMP2;开绿灯EX4_START:MOVCOUNTER,#60H;置用BCD码表示的定时初值EX4A:LCALLDLY_1S;延时1sMOVA,COUNTER;时间减1(十进制)ADDA,#99HDAAMOVCOUNTER,ACJNEA,#l0H,EX4A;剩余时间大于10s,继续LCALLGLARE;剩余时间为10s,调闪烁子程序CPLLAMPl;红灯取反CPLLAMP2;绿灯取反LJMPEX4_STARTGLARE:MOVRl,#04HGLARE_LP:CPLLAMP1CPLLAMP2LCALLDLY_250MSDJNZR1,GLARE_LPMOVA,COUNTER;时间减1(十进制)ADDA,#99HDAAMOVCOUNTER,A;时间未到,继续闪烁JNZGLARE;时间到,返回RET;--------------------------------------------------DLY_1S:MOVR7,#14DLY_1S_A:MOVTHl,#03CH;置50ms定时初值MOVTL1,#0B0HSETBTR1JNBTF1,$CLRTF1DJNZR7,DLY_1S_ACLRTR1RETDLY.250MSMOVR7,#05HDLY_250_A:MOVTH1,#03CHMOVTLl.#0B0HSETBTR1JNBTF1,$CLRTF1DJNZR7,DLY_250_ACLRTR1RETTIMERO:PUSHPSW;保护现场PUSHACCCLRTF0;清溢出标志MOVTH0,#0F6H;重置初值MOVTL0,#03CHMOVA,POSITION;确定当前显示位置CJNEA,#0FEH,TIMER0_AMOVA,COUNTER;根据位置将显示内容送A,第1位显示时间ANLA,#0FHLJMPTIMER0,BTIMERO_A:CJNEA,#0FDH,T_ENDMOVA,COUNTER;第2位显示时间十位ANLA,#0F0HSWAPATIMERO_B:PUSHACC暂存显示内容MOVA,#0FFH;关显示MOVDPTR,#WM_ADDRMOVX@DPTR,APOPACC;查段码ADDA,#04HMOVCA,@A+PCLJMPTIMER0_CDB3FH,06H,05BH,04FH,066H,06DH,07DHDB07H,7FH,6FHTIMERO_C:MOVDPTR,#DM_ADDR;将段码送出@DPTR,AMOVX@DPTR,AMOVA,POSITION;将位码送出MOVDPTR.#WM_ADDRMOVX@DPTR,AMOVAPOSITION;改变位码寄存器RLAMOVPOSITION,ACJNEA,#0FBH,T_END;一遍扫描末完,转MOVPOSITION,#0FEH;重置位码寄存器T_END:POPACC;恢复现场POPPSWRETI;中断返回11·5请自行设计一个温度采集系统,要求按1路/秒的速度顺序捡测8路温度点,测温范围为+20~+100C,测量精度为±%。要求用5位数码管显示温度,最高位显示通道号,次高位显示一,低三位显示温度值。答按题意设计电路如题图11-3所示。图中数码管采用共阴极,因为测量精度为±%,所以采用8位的ADC0809即可满足要求,在显示温度时最低位单位为0.l0C。单片机工作频率为l2MHz,采用定时器0定时为50ms。其地址分配及编程如下;==================================DM_ADDREQU0DFFFH;数码管段码地址WM_ADDREQU0BFFFH;数码管位码地址ADC_ADDREQU07FF0H;AD0809转换通道0地址;----------------------------------------------------------POSITIONEQN30H;显示位码寄存器CHANNELEQU31H;通道寄存器DISPLAYlEQU38H;显示数据寄存器(高位)DISPLAY2EQU39HDISPLAYSEQU3AHDISPLAY4EQU3BHDISPLAYSEQU3CH;显示数据寄存器(低位)CONEQU3DH;秒汁数器题图11-3;-------------------------------------------------------ORG0000H;转l0ms定时中断程序LJMPMAINORG000BHLJMPTIMER0ORG0030HMAIN:MOVSP,#50H;修改堆栈指针MOVPOSITION,#0FEH;设置位码寄存器MOVTMOD,#01H;设置定时器0工作方式MOVTH0,#0D8H;定时器0置初值(l0ms)MOVTL0,#0F0HSETBTR0;启动定时器0SETBET0;允许定时器0中断SETBEA;开中断CLR10H;秒标志位清0MOVCON,#100;秒计数器置初值START:MOVCHANNEL,#00H;通道设置(0通道)EX5A:MOVDPTR,#ADC_ADDRMO