《单片机应用实训教程》课件第1章_第1页
《单片机应用实训教程》课件第1章_第2页
《单片机应用实训教程》课件第1章_第3页
《单片机应用实训教程》课件第1章_第4页
《单片机应用实训教程》课件第1章_第5页
已阅读5页,还剩338页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章MCS-51单片机基础应用实训实训1.1单片机开发系统及使用实训1.2数字钟应用电路 实训1.3LCD显示器电路实训1.4中断与定时/计数器的应用实训1.5A/D转换接口实训1.6串行通信接口实训1.7语音电路的应用实训1.8实时时钟/日历芯片的应用

实训1.1单片机开发系统及使用1.实训目的

(1)了解单片机开发系统的基本功能,掌握单片机开发系统的使用方法。

(2)通过对典型程序的调试操作训练,掌握运用开发系统快速有效地进行调试的基本方法。

2.实训设备与器件实训设备:单片机集成开发环境、综合实训板(综合实训板电路图参见书末附图)。

3.实训步骤及要求

(1)熟悉单片机仿真开发系统的使用方法,掌握其基本功能与操作过程。

(2)用汇编语言编辑和输入源程序。

(3)对源程序进行汇编和纠错。

(4)调试程序。4.实训内容1)开发环境使用步骤

(1)将开发系统和目标板连接好,并接上电源。

(2)启动MedWin中文版,初次启动出现图1.1.1(a)所示窗口,再次启动出现图1.1.1(b)所示窗口。单击图1.1.1(b)中的“取消”或“模拟仿真”进入MedWin集成开发环境,出现图1.1.2所示界面。

(3)设置汇编(或编译)环境。图1.1.1进入窗口(a)(b)图1.1.2集成开发环境界面图1.1.3设置菜单项图1.1.4编译、汇编、连接配置窗口(a)(b)(4)新建NEW(或打开Open)文件。图1.1.5文件处理菜单项图1.1.6新建文件界面(5)对源程序进行汇编(或编译)。图1.1.7项目管理菜单(6)排除错误。(7)产生代码并装入仿真器。(8)调试程序。(9)输出代码文件。图1.1.8程序调试菜单2)常用调试方法单步运行调试(F8)。(2)跟踪运行调试(F7)。(3)全速运行至光标处调试(F4)。(4)全速连续运行调试(F9)。(5)设置断点调试(F2)。(6)自动单步运行调试。(7)设置程序计数器PC的内容(Ctrl+N)。图1.1.9单步运行图1.1.10执行至光标处(a)(b)图1.1.10执行至光标处图1.1.11全速连续运行图1.1.12断点运行(a)(b)图1.1.13自动单步运行3)程序调试实例1:查表显示程序的分析与调试(1)源程序。

ORG0000H ;汇编完成后,PC的初始值=() LJMP DISP0 ORG0800HDISP0: MOV DPTR,#4400H ;程序运行到该条指令时PC=() MOV A,#43H ;在该处观察DPH的内容=() MOVX @DPTR,A ;DPL的内容=() MOV R2,#08H MOV R3,#7FH MOV R0,#30H ;该指令执行完成后,观察R0=()、

MOV A,@R0 ;R2=()、R3=()DISP1:MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#4402H ;第一次运行到该处时A=(),第二

MOVX @DPTR,A ;次运行到该处时A=()MOV A,R3 MOV DPTR,#4401H MOVX @DPTR,A ;运行到此处SP=()LCALLT10msRR A ;运行到此处SP=()MOV R3,AINC R0 ;第一次运行到此处R3=(),第二

MOV A,@R0 ;次运行到此处R3=()DJNZ R2,DISP1SJMP DISP0TAB: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FHT10ms:MOV R4,#0FDH ;程序运行到此处SP=()TM0: MOV R5,#0AHTM1: NOP NOP DJNZ R5,TM1 ;程序循环运行3次后,R5=() DJNZ R4,TM0 RET ;程序运行到此处SP=()

;程序连续运行后,可观察的实验现象是()(2)调试步骤。①为程序加注释。在调试程序前,必须首先读懂源程序,弄清每条指令执行的结果及每段程序执行的结果与功能,分析并完成程序中的填空内容。②录入实训程序,设文件名为PROGRAM01.ASM。③对源程序进行汇编。④根据提示进行纠错。⑤产生代码并装入仿真器。⑥确定程序调试前的初始参数,将显示单元30H~37H中的内容修改为01H~08H。⑦通过调试确定填空内容的正确性。(3)调试过程。调试程序时,应先读懂源程序,确定出能反映程序正确与否的观测点及用什么调试方法和步骤能快速地检验观测点的参数及路径的变化,制定出具体的调试步骤;通过操作来验证已完成填空内容的正确性。在调试上述程序时可从以下几方面入手:首先修改RAM单元中的内容。根据题目要求,先将30H~37H单元中的初始值设置为01H~08H;再运行程序检查结果。如先用连续运行方式(F9)运行程序,观察程序运行的结果是否能显示设定单元的内容。在实际调试程序时,由于各种原因,程序运行的结果往往不一定能做到一次就达到设计者的要求,可能存在各种未知的原因而产生错误。因此,必须灵活运用各种调试手段,快速有效地找出故障点,分析出产生故障的原因并排除所有错误,直到满足设计要求为止。调试手段一般包括:①检查程序运行的路径是否正确。可采用单步(F8)运行的调试方法,边运行边观察程序运行的路径与预先设计的运行路径是否一致。若不一致,可根据运行过程中地址的变化找出故障点,分析产生故障的原因。②检查程序运行到某处的执行结果。如检查程序执行到某处后,相关单元(内部或外部)、工作寄存器、特殊功能寄存器中内容的变化。由此可判断程序运行到某处时是否正确。为提高调试速度,可将光标停留在预观察点,再用F4键快速将程序运行至光标处。通过对运行结果的观察与分析,可判断结果是否正确。若出现错误,应及时分析产生错误的原因并加以修正。③检查子程序调用的运行过程。先用单步运行(F8)的方法运行调用子程序指令,然后观察程序能否运行到该调用指令的下一条指令处,若能,则说明子程序调用的运行过程是正确的;再检查子程序的出口内容是否正确,若两者都正确,则调试完毕。若执行了调用指令后,程序不能返回到该调用指令的下一条指令处,出现系统提示忙或子程序出口结果不正确时,则应重新用跟踪运行(F7)的调试方法运行调用指令,以便跟踪运行到子程序的内部,再通过单步或跟踪运行等方法逐条运行,直至找到产生错误的原因并加以修正为止。④检查循环程序的运行过程。若程序中有循环结构,可先将光标或断点预置在循环程序的最后一条指令处,然后用全速运行到光标处(F4)或连续运行(F9)到断点处的方法运行程序。若提示系统忙,可能出现了死循环等错误,此时,应考虑用单步运行的方法检查程序循环运行的路径变化是否正确。为缩短调试时间,可在调试循环程序前,将循环初始值中的循环次数改小些,通过观察运行路径和指令运行的结果,找出循环程序内部出现的故障并加以修正。在上述调试过程中,主要是针对顺序结构、分支结构、循环结构和子程序结构的调试,究竟采用什么样的调试方法更适宜,应根据被调试程序的结构特点和程序运行结果的观测点来合理选择。4)程序调试实例2:中断显示程序分析与调试(1)源程序。

ORG 0000H START: LJMP MAIN ORG0003H LJMP GINTO ;程序运行至此处(SP)=() ORG000BH LJMPGT0 ORG0030HMAIN:MOV P1,#0FFH ;程序运行至此处,指示灯的状态为() MOV SP,#30H ;在执行该指令前,(SP)=() MOV 20H,#10H MOV TMOD,#02H ;定时器T0设定为()方式

MOV TL0,#00H MOV TH0,#00H MOV IP,#01H ;中断优先级的排列顺序为() MOV IE,#83H ;()中断源被允许中断

MOV TCON,#101H ;边沿触发方式

SETB TROHELT: NOP NOP ;程序运行到此处(SP)=() SJMP HELTGINT0:CPL P1.0 ;程序运行到此处(31H)=(),(32H)=() ACALL DELAY CPL P1.0 ACALL DELAY CPL P1.0 ACALL DELAY CPL P1.0 RETI GT0: DJNZ 20H,BACK MOV 20H,#10H XRL P1,#80H;程序运行到此处时对应指示灯状态为() ACALL DELAY BACK:RETIDELAY:MOV R3,#200 ;200msDEL2: MOV R4,#250DEL1: NOP NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET ;程序运行到此处(31H)=(),(32H)=() END(2)调试步骤。①阅读源程序,说明每条指令执行的结果及每段程序执行的结果与功能,描述程序运行路径的变化过程;完成填空内容。②录入实训程序2,设文件名为PROGAM02.ASM。③对源程序进行汇编。④根据提示进行纠错。⑤产生代码并装入仿真器。⑥确定调试方法。(3)调试过程。①检查程序运行结果。先用连续运行方式(F9)运行程序,观察指示灯变化规律是否符合设计要求;将8031单片机的P3.2(INT0)管脚置低电平,观察指示灯变化规律。②排查错误。当程序运行的结果不正确时,根据程序运行中出现的现象来分析和判断产生错误的原因,确定出具体的调试方法与步骤。例如:检查定时器中断响应的过程时,由于程序中使用了定时器T0,可根据显示的结果判断定时器的中断是否被响应,若指示灯按设计的要求变化,可断定该中断程序的运行是正确的,若显示结果不正确,则通过调试手段排查错误。

调试中断程序结构时,可采用快速运行到光标处(F4)或设置断点(F2)的方法进行调试。先将光标(或断点)设置在中断服务程序的入口地址(000BH)处,然后用F4(或F9)运行程序,观察程序是否运行至光标(或断点)处,若能,则说明该中断源的中断请求已被CPU接受,然后再用单步运行方式继续运行中断程序。当执行到中断返回指令RETI时,注意观察程序返回到何处。由此可检查中断服务程序被响应的整个运行过程。检查外部中断响应过程时,同样先将光标(或断点)设置在外部中断服务程序的入口地址(0003H)处,然后用F4(或F9)运行程序。根据调试过程中各条指令的执行结果及运行路径的变化可找出故障点,然后进行分析和排除。5)程序设计与调试实例3:数码显示34H~36H单元内容子程序DISPLAY的设计与调试(1)设计步骤。①根据题目的功能要求安排程序结构。②确定该子程序的入口和出口。③画出流程图。④编写源程序。⑤程序调试。(2)设计过程。①确定程序结构。根据题目要求,采用动态显示原理设计一个能通过LED数码管显示34H~36H单元内容(压缩BCD码)的通用子程序,选择循环程序结构,逐位循环显示各位数码。通过查表法获取与被显示数码相对应的显示字符。②明确子程序的入口和出口。该显示程序的入口为B寄存器,其内容是显示缓冲区单元的首地址,只要在调用该显示子程序之前先将显示缓冲区34H~36H单元的首地址34H送入B寄存器中,再调用该显示子程序就能将显示缓冲区单元中的内容逐一显示出来。若无明确出口,则直接用LED显示缓冲区内容。③画程序流程框图。如图1.1.14所示,将设计思想用流程图的形式描述出来。通用子程序应包括保护现场和恢复现场,究竟哪些参数需要保护,应根据子程序所占用资源的内容是否会对其他程序资源内容造成影响而定。④编程与调试。按编程框图所表达的意图,选用相应的指令予以实现,特别是要弄清MOVX类指令中DPTR内容的作用及该指令的操作过程。在调试程序时,为观察程序运行结果,先将34H~36H单元中高4位和低4位内容设置为8421BCD码;然后将该程序的最后一条子程序返回指令(RET)改为转移指令LJMPDISPLAY或SJMP$,Y,也可将断点或光标设在该指令处;连续运行程序,观察显示内容。若不正确,则根据运行现象分析产生故障的原因,并设置必要的观测点。

如图1.1.14所示,将观测点设在①点可判断取第1位被显示数据的运行结果是否正确,设在②点可判断通过查表得到的显示字符是否正确,设在③点可判断调用延时子程序过程是否正确,设在④点可判断取第2位显示字符是否正确,设在⑤点可判断下一步运行路径是否正确。通过各观测点的运行结果可分段排查引起故障的大概部位,然后再进一步找到产生故障的原因。图1.1.14显示子程序DISPLAY流程框图(3)参考程序。;功能:通过LED数码管动态显示缓冲区内容;入口:B存放显示缓冲区单元首地址;出口:无DISPLAY:PUSH PSW ;保护现场

PUSH ACC SETB RS0 CLR RS1 MOV R5,#00H ;延时初值

MOV DPTR,#PORTA MOV A,#0FFH MOVX @DPTR,A ;关显示

MOV R0,B ;显示单元首地址送R0 MOV R3,#03H ;循环显示次数初值

MOV R4,#0DFH ;显示位置初值DIS0: MOV A,@R0 ;取显示单元内容DIS1: ANL A,#0FH ;取显示内容个位

MOV DPTR,#TAB MOVC A,@A+DPTR ;查表,取显示字符

MOV DPTR,#PORTB MOVX @DPTR,A ;显示字符送B口

MOV DPTR,#PORTA MOV A,R4 MOVX @DPTR,A ;显示位送A口,显示数据个位HERE0:DJNZ R5,HERE0 ;显示延时

RR A ;显示位右移

MOV R4,A MOV A,@R0 SWAP A ANL A,#0FH ;取显示内容十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#PORTB MOVX @DPTR,A MOV DPTR,#PORTA MOV A,R4 MOVX @DPTR,A ;显示数据十位

RR A ;显示位右移

MOV R4,AHERE1:DJNZ R5,HERE1 ;显示延时

INC R0 ;显示单元地址加1 DJNZ R3,DIS0 ;循环显示时、分、秒

POP ACC ;恢复现场

POP PSW RETTAB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;共阴极字型码表

DB7FH,6FH,77H,7CH,39H,5EH,79H,71H6)程序设计与调试实例4:键盘扫描子程序SERCH的设计与调试(1)设计步骤。①根据题目的功能要求安排程序结构。②确定该子程序的入口和出口。③画出流程图。④编写源程序。⑤程序调试。(2)设计过程。①确定程序结构。针对矩阵式键盘的分布规律,如图1.1.15所示,计算键号的数学模型为“键号=列号+行首号”。采用逐列、逐行循环扫描方式,即从0列开始逐列将列线置低电平,然后逐行查询各行的逻辑电平,若查询到某行为低电平,则将该行的行首号与被设置为低电平的列号相加获得键号。根据扫描原理应选择循环程序结构,在扫描过程中,应设法记录每次循环扫描时的列号和行首号,以便一旦扫到有键输入时计算出键号。②明确子程序的入口和出口。设程序无确定入口,运行该子程序后,只要有按键输入就能计算出按下的键号值;出口为累加器A,用来存放计算出的键号值。图1.1.15矩阵式键盘结构图③画流程框图。如图1.1.16所示。图1.1.16键盘扫描子程序SERCH流程框图④编程与调试。为消除抖动,程序中需加去抖功能。调试程序时,预先选择观测点,如图1.1.16所示,设在①点可判断是否有键输入,观察列号和行首号,设在②点可观察计算的键值与输入键号是否相同,设在③点可观察按键是否释放及出口结果,调试方法同上。(3)参考程序。;功能:扫描并确定键号;入口:无;出口:累加器A,存放计算出的键号值SERCH:MOV R2,#0FEH ;首列扫描字送R2 MOV R3,#00H ;首列号送R3LINE0:MOV DPTR,#PORTA ;DPTR指针指向8155的A口

MOV A,R2 MOVX @DPTR,A ;列扫描字送8155的A口

MOV DPTR,#PORTC ;DPTR指针指向8155的C口

MOVX A,@DPTR ;读入C口的行状态

JB ACC.0,LINE1 ;若第0行无键按下,转判第1行

MOV A,#00H ;第0行行首号送A AJMP TRYK ;求键号LINE1:JB ACC.1, LINE2 ;若第1行无键按下,转判第2行

MOV A,#04H ;第1行行首号送A AJMP TRYK ;求键号LINE2:JB ACC.2, LINE3 ;若第2行无键按下,转判第3行

MOV A,#08H ;第2行行首号送A AJMP TRYK ;求键号LINE3:JB ACC.3, LINE4 ;若第3行也无键按下,转扫描下一列

MOV A,#0CH ;第3行行首号送A AJMP TRYK ;求键号LINE4: INC R3 ;扫描列号加1 MOV A,R2 ;列扫描字送A RL A ;扫描下一列

JNB ACC.4,BACK4 ;若4列扫描完,则返回

MOV R2,A ;扫描字送R2 AJMP LINE0 ;转扫描下一列TRYK: ADD A,R3 ;将行首号与列号相加,求键号

MOV 22H,A ;保护键号BACK2: ACALL KEYTEST ;判按键释放否

JZ BACK3 LCALL DISPLAY ;按键未释放,继续等待

SJMP BACK2BACK3: MOV A,22H ;按键释放,将键号送ABACK4: RET ;键盘扫描结束,返回5.实训分析与总结

(1)运用仿真系统调试简单程序结构、分支程序结构、循环程序结构、子程序结构和中断结构的关键在于,如何将对程序的分析理解和开发系统提供的基本功能有机地结合起来,其前提条件是必须对源程序的作用、结构特点、运行过程与结果有较全面的认识,并能根据程序运行过程中出现的现象和结果分析并判断产生各种故障现象的原因,再运用排除法逐一检验各种判断是否准确。

(2)在掌握程序结构特点的基础上,合理选择观测点,通过观察在观测点处参数及路径的变化检验程序运行的结果。(3)为提高调试程序的效率,应对单片机开发系统所提供的几种程序运行调试方式有足够的了解并能熟练地运用。例如,在调试过程中,若要观察最终结果,则可选择全速运行调试;若要观察相关指令的运行结果或运行路径的变化过程,则可选择单步运行;若要检查子程序的运行过程,则可选择跟踪运行调试;若要检查循环程序或中断服务程序,则可选择断点运行调试;若要定点检查程序运行到某处的结果时,则可选择快速运行到光标处调试。但实际中究竟选用哪种方法更适宜或哪几种方法结合使用更快捷,将随着分析能力与操作的熟练程度逐步提高。(4)检验程序运行结果是否正确时,应运用单片机开发系统所提供的交互界面,将程序运行过程中程序计数器PC(地址)的变化、各单元(内部RAM和外部RAM)内容的变化、特殊功能寄存器内容的变化、堆栈指针SP内容的变化与程序的理论分析结果相对照。

(5)编制程序和调试程序时,需要多次反复的过程,并非一次就能排除全部故障,特别是单片机应用系统的硬件电路和汇编程序相结合的综合调试就更加复杂,因此,必须通过反复调试,不断修改硬件和软件,直到最终符合设计要求为止。如果在调试中能够根据实验现象预先对产生故障的原因加以判断和分析,并制定出相应的调试方法和步骤,可缩小排除故障的范围,提高调试效率。

6.思考题

(1)调试程序的目的是什么?

(2)在主程序的开始为何通常要加转移命令?

(3)堆栈指针的初始值是多少?在什么情况下需用指令重新设置该指针?

(4)试绘出实训程序1和程序2的流程框图。

(5)通过操作观察在调用子程序和中断过程中堆栈指针如何变化?

(6)什么是中断嵌套?如何判断中断是否被响应?在实训程序2中,当定时器T0中断被响应后,外部中断INT0能否再被响应?实训1.2数字钟应用电路

1.实训目的

(1)掌握LED显示、键盘、定时/计数器综合应用程序的设计与分析方法。

(2)掌握运用开发系统调试LED显示、键盘及定时/计数应用程序的基本方法。

2.实训设备与器件实训设备:单片机集成开发环境、综合实训板。3.项目设计要求用单片机实现由LED数码管显示时、分、秒的数字钟,并具有用按键修改时钟参数和闹钟参数的功能;闹钟启动后能保持一段时间再自动停止。4.实训内容

1)硬件设计硬件电路的设计应从两个方面予以考虑。一是根据应用系统总体设计的参数范围、测控速度与精度等技术指标要求选择单片机。不同系列单片机或同一系列不同型号单片机芯片内部提供的资源状况各不相同,如ROM、RAM容量,定时/计数器、I/O接口、中断系统等硬件配置,应选择性价比最适合的单片机型。二是在已选定单片机型号的基础上,根据应用系统的功能要求扩展单片机外部设备的配置,如键盘、打印机、A/D、D/A、报警电路、驱动电路及通用/专用I/O接口等。

硬件电路的设计原则如下:

(1)在性价比满足应用系统要求的基础上,选择更可靠、更熟悉的单片机,缩短研制周期。

(2)尽可能选择较成熟的典型应用电路,以提高系统的可靠性。

(3)单片机内部的资源与外部扩展资源应在满足应用系统设计要求的基础上留有余地,为进一步升级和扩展其功能提供方便。

(4)应充分结合软件方案统筹考虑硬件结构,通常硬件功能较完善,其相应的软件就简单,但硬件成本较高;而硬件功能略低,其相应的软件就复杂。实际中应尽量以软件替代硬件来降低成本。(5)整个系统的相关器件应尽可能做到性能匹配,如电平、速度的匹配等。

(6)充分考虑整个系统的抗干扰设计,如选择具有抗干扰设计的单片机并充分筛选芯片与器件,在电路中采取隔离和屏蔽措施等。根据以上设计原则,选择较熟悉的MCS-51系列单片机中具有内部程序存储器的89C51单片机;为实现LED数码显示和键盘控制,扩展一片8155(或8255)通用可编程I/O接口;用蜂鸣器实现闹钟。用0#、1#、2#号键作为时钟、闹钟参数修改功能选择键与加1功能键。其中:

0#键为时钟参数修改功能选择键。按一次修改秒,按二次修改分,按三次修改小时,按四次确认修改完毕。1#键为闹钟时间参数设置功能选择键。按一次设置分,按二次设置小时,按三次确认设置完毕。

2#键为加1功能键,每按一次将根据0#、1#键的选择结果将相应单元内容加1。修改“时”时,加到23后“清0”,再加1;修改“分”时,加到59后“清0”,再加1。图1.2.1数字钟硬件接线原理图2)软件设计待硬件电路接线完成后,通常可先编写简单的测试程序对硬件电路进行测试,排除硬件电路设计中存在的错误。然后根据设计任务的要求确定系统程序的整体结构,尽可能采用模块化程序设计的方法,将任务划分为相对独立的功能模块,明确各模块的功能、时间顺序和相互关系,如系统管理、数据与信息采集、报警处理、误差处理、标度变换、数据处理、输出控制等;列出详细的资源划分表,确定各模块的出口和入口状态;建立必要的数学模型,正确描述出系统中输入和输出间的数学关系;画出各程序模块的详细流程图;根据流程图逐一编写程序;最后将各个模块连接成完整的程序。(1)软件设计的基本原则。①程序整体结构清晰、简洁、流程合理,主程序尽可能简单明了。②各种功能的实现应采用模块化、子程序化,以便于编制、阅读、连接、移植、修改和调试。③对各子程序的入口、出口条件,占用的资源要明确,以便于分析、调试和共享。④程序存储区、数据存储区、寄存器区、位寻址区、堆栈区应规划合理,做到既节约资源又不会发生相互间的冲突。⑤运行状态标志化管理,对各功能程序的运行结果、操作状态应设置状态标志,以便查询和实现运行控制。⑥运用软件或软硬件相结合等方法抑制干扰,提高系统的抗干扰能力。⑦必要时可结合硬件采取加密措施。(2)模块化程序结构。①主程序MAIN:完成系统初始化,包括时钟、闹钟初始参数及初始标识的设定;I/O口、定时/计数器初始状态的设定;键盘、闹钟和时钟显示的监控管理。②时钟参数修改子程序FTION0:关定时器,禁止闹钟时间参数修改,清闹钟修改标识,清闹钟修改位置记录;时钟修改位置记录值加1,根据记录值将对应的时钟时、分、秒修改标识置1。③闹钟参数修改子程序FTION1:禁止时钟时间参数修改,清时钟修改标识,清时钟修改位置记录;按一次闹钟设置功能键,闹钟设置记录值加1,按3次闹钟设置功能键,闹钟设置有效标志位置1,表示闹钟已设置。④加1键修改子程序CUM:根据修改(或设置)标识将时钟(或闹钟)相应单元内容加1。⑤闹钟控制子程序ALARM:判断闹钟启动时间到否。若时间到,则启动闹钟,延时10s后自动关闹钟并清除闹钟设置标识。⑥键盘测试子程序KEYTEST:判断是否有键按下。⑦查键号子程序SERCH:若有键按下,则确定键号。⑧显示子程序DISPLAY:根据显示单元首地址显示时钟(或闹钟)时间。⑨定时修正时钟参数中断服务子程序CLOCK:定时修改时钟参数。(3)资源分配:选用定时/计数器T0,定时方式2工作,每隔50ms溢出中断一次。接口地址: PORT(8155控制寄存器)8000HPORTA(8155A口地址)8001HPORTB(8155B口地址)8002HPORTC(8155C口地址)8003H

以本书配备实验板调试程序时,可用发光二极管替代蜂鸣器,并将接口地址改为:PORT(8155控制寄存器)4400HPORTA(8155A口地址)4401HPORTB(8155B口地址)4402HPORTC(8155C口地址)4403H表1.2.1单片机内部RAM部分资源分配表表1.2.1单片机内部RAM部分资源分配表(4)软件流程框图。图1.2.2主程序MAIN流程框图图1.2.3时钟修改功能子程序FTION0流程框图图1.2.4闹钟修改功能子程序FTION1流程框图图1.2.5加1键修改子程序CUM流程框图图1.2.6时钟修正中断服务子程序CLOCK流程框图(5)源程序。**************主程序MAIN****************ORG 0000HAJM MAINORG000BHLJMP CLOCK ;转时钟程序ORG0100HPORT EQU 4400H ;定义8155控制寄存器、A、B、C端口符号地址PORTA EQU 4401HPORTB EQU 4402HPORTC EQU 4403HSECBITEQU 08H ;定义各标识位符号地址MINBIT EQU 09HHOURBITEQU 0AHRMINBIT EQU 0BHRHOURBIT EQU 0CHRTIMBIT EQU 0DHARMBIT EQU 0EHTIMDATA EQU 30H ;定义各单元符号地址RTIMDATA EQU 31HMSEC1 EQU 32HMSEC2 EQU 33HSEC EQU 34HMIN EQU 35HHOUR EQU 36HRSEC EQU 37HRMIN EQU 38HRHOUR EQU 39HCOUNT EQU 3AHMAIN:MOV SP,#60H MOV DPTR,#PORT MOV A,#03H ;设8155A、B口输出,C口输入

MOVX @DPTR,A MOV 21H,#00H ;清零闹钟标识位

MOV RHOUR,#00H ;设置闹钟单元初值

MOV RMIN,#00H MOV RSEC,#00H MOV HOUR,#00H ;设置时钟单元初值

MOV MIN,#00H MOV MSEC1,#00H MOV MSEC2,#00H MOV TIMDATA,#00H ;时钟修改记忆单元清零

MOV RTIMDATA,#00H ;闹钟修改记忆单元清零

MOV COUNT,#00H ;闹钟保持10s计时单元清零 MOV TMOD,#02H ;定时器T0方式2 MOV TL0,#06H ;定时250μs初始值

MOV TH0,#06H SETB EA ;中断允许

SETB ET0 SETB TR0 ;启动定时器

MOV B,#SEC ;时钟秒单元首地址送BBEGIN:LCALLKEYTEST ;调用判别键入测试程序

JNZ RETEST ;有键输入则转去抖程序

LCALL DISPLAY ;无键输入调用显示程序

JNB ARMBIT,BEGIN ;判别闹钟设定标识位,未设定则返回

LCALL ALARM ;调闹钟程序

AJMP BEGIN ;返回RETEST:LCALLDISPLAY ;调用显示子程序延时去抖

LCALLKEYTEST JNZ KEDATA ;若无抖动,则查键号,否则返回

LJMP BEGINKEDATA:LCALLSERCH ;调键号测试程序

CJNEA,#00H,NEXT1 ;判别是否时钟修改功能键

LCALLFTION0 ;是时钟参数修改功能键则调用时 钟修改程序

SJMPNEXT3NEXT1:CJNEA,#01H,NEXT2 ;判别是否闹钟修改功能键

LCALLFTION1 ;是闹钟参数修改功能键则调用闹 钟设定程序

SJMPNEXT3NEXT2:CJNE A,#02H,NEXT3 ;判别是否加1功能键

LCALL CUM ;是加1功能键则调用加1修改程序NEXT3:SJMP BEGIN ;循环返回**************时钟参数修改子程序FTION0****************;功能:根据时钟修改功能键按下的次数,分别将时钟修改标识位SECBIT、MINBIT、HOURBIT置“1”;入口:TIMDAT,时钟修改功能键按下次数,每按一次时钟修改功能键,该单元内容加1;出口:TIMDAT、SECBIT、MINBIT、HOURBIT,根据当前TIMDAT的次数,分别将对应时钟修改标识位置1FTION0:CLR TR0 ;关定时器

CLR RMINBIT;禁止闹钟参数修改,清闹钟分修改标识位0BH CLR RHOURBIT;清闹钟小时修改标识位0CH MOV B,#SEC ;将时钟秒单元设为显示首地址 MOV RTIMDATA,#00H;清闹钟修改位置标识记录

INC TIMDATA ;将时钟修改记录值加1 MOV A,TIMDATA CJNE A,#01H,TW0 ;若记录值为1,则将时钟秒修改标识置1 SETB SECBIT ;时钟秒标识位08H置1 LJMP BAC0 TW0: CJNE A,#02H,THREE0 ;若记录值为2,则将时钟分修改标识置1 CLR SECBIT ;时钟秒标识位08H清零

SETB MINBIT ;时钟分标识位09H置1 LJMP BAC0THREE0:CJNE A,#03H,BACK ;若记录值为3,则将时钟小时修改标识置1 CLR MINBIT ;时钟分标识位09H清零

SETB HOURBIT ;时钟小时标识位0AH置1 LJMP BAC0BACK:MOV TIMDATA,#00H ;若按4次,则清时钟单元修改位置记录

CLR HOURBIT ;时钟小时标识位0AH清零

SETB TR0 ;定时器重新启动BAC0:RET**************闹钟参数修改功能键设定子程序FTION1****************;功能:根据闹钟修改功能键按下的次数,分别将闹钟修改标识位RMINBIT、RHOURBIT置“1”;入口:RTIMDAT,闹钟修改功能键按下次数,每按一次闹钟修改功能键,该单元内容加1;出口:RTIMDAT、ARMBIT、B、RMINBIT、RHOURBIT,根据当前RTIMDAT的次数,分别将对应闹钟修改标识位置1,并设置闹钟参数显示单元首地址和闹钟启动标志FTION1:CLR SECBIT ;08H清零,禁止时钟时间修改

CLR MINBIT ;时钟秒标识位09H清零

CLR HOURBIT ;时钟小时标识位0AH清零

MOV B,#RSEC ;将闹钟单元地址设为显示首地址

MOV TIMDATA,#00H INC RTIMDATA ;将闹钟修改记录值加1 MOV A,RTIMDATA CJNE A,#01H,TOW1 SETB RMINBIT;若记录值为1,则将闹钟分单元修改标识位0BH LJMP BAC1 ;置1TOW1:CJNE A,#02H,THREE1 CLR RMINBIT;若记录值为2,则将闹钟分单元修改标识位0BH SETB RHOURBIT;清零,将闹钟小时单元修改标识位0CH置1 LJMP BAC1THREE1:CLR RHOURBIT ;将闹钟小时单元修改标识位0CH清零

SETB ARMBIT ;F0标识位为1表示闹钟已设定

MOV B,#SEC ;恢复时钟显示单元首地址

MOV RTIMDATA,#00H;将闹钟修改记录值清零BAC1: RET**************加1键修改子程序CUM****************;功能:根据时钟和闹钟修改标识位的状态,将时钟或闹钟对应显示单元内容加1;入口:SECBIT、MINBIT、HOURBIT、RSECBIT、RMINBIT、RHOURBIT,若其中某标识位已被置“1”,将对应的时钟或闹钟显示单元内容加1;出口:34H~39H,时钟或闹钟显示单元CUM: JNB SECBIT,CUM0 ;若时钟秒修改标识位08H为1,则秒单元内容加1 MOV A,SEC ADD A,#01H DA A MOV SEC,A CJNE A,#60H,CUMEND MOV SEC,#00H LJMP CUMENDCUM0:JNB MINBIT,CUM1 ;若时钟分修改标识位09H为1,则分单元 内容加1 MOV A,MIN ADD A,#01H DA A MOV MIN,A CJNE A,#60H,CUMEND MOV MIN,#00H LJMP CUMENDCUM1:JNB HOURBIT,CUM2 ;若时钟小时修改标识位0AH为1, 则小时单元内容加1 MOV A,HOUR ADD A,#01H DA A MOV HOUR,A CJNE A,#24H,CUMEND MOV HOUR,#00H LJMP CUMENDCUM2:JNB RMINBIT,CUM3 ;若闹钟分修改标识位0BH为1, 则分单元内容加1 MOV A,RMIN ADD A,#01H DA A MOV RMIN,A CJNE A,#60H,CUMEND MOV RMIN,#00H LJMP CUMENDCUM3:JNB RHOURBIT,CUMEND ;若闹钟小时修改标识位0CH为1, 则小时单元内容加1 MOV A,RHOUR ADD A,#01H DA A MOV RHOUR,A CJNE A,#24H,CUMEND MOV RHOUR,#00HCUMEND:RET**************闹钟判断与启动子程序ALARM************;功能:比较闹钟设定时间到否,控制闹钟的启、停;入口:MIN、RMIN,HOUR、RHOUR,时钟和闹钟当前的时间;出口:P1.0、ARMBIT、RTIMBIT,闹钟启停控制信号、闹钟设置标识和闹钟保持时间计时标识ALARM:MOVA,RMIN CJNE A,MIN,DONT0 ;比较分单元内容,若相同则继续比较小 时单元内容,

MOV A,RHOUR ;否则返回

CJNE A,HOUR,DONT0 CLR P1.0 ;启动闹钟

SETBRTIMBIT;设置闹钟计时标时0DH,时钟开始10s计时DONT0:MOV A,COUNT;取闹钟保持计时时间

CJNE A,#10,DONT ;判断闹钟保持10s时间到否

MOV COUNT,#00H ;清除闹钟保持10s计时

SETB P1.0 ;清除闹钟

CLR ARMBIT ;清闹钟标识,取消闹钟设置

CLR RTIMBIT ;清闹钟计时标识DONT: RET*********测键入子程序KEYTEST***********;功能:判断是否有键输入;入口:无;出口:累加器A,A的内容为0表示无键输入,A的内容不为0表示有键输入KEYTEST:MOV DPTR,#PORTA ;DPTR指针指向8155的A口

MOV A,#00H MOVX @DPTR,A ;扫描字00H送8155的A口

MOV DPTR,#PORTC ;DPTR指针指向8155的C口

MOVX A,@DPTR ;读入C口行状态

CPL A ;A取反

ANL A,#0FH ;屏蔽高4位

RET**************时钟修正中断服务子程序CLOCK****************

;功能:通过定时器中断,自动修改时钟参数;入口:MSEC1、MSEC2、、SEC、MIN、HOUR,时钟毫秒、秒、分、时单元,存放原时钟参数;出口:MSEC1、MSEC2、、SEC、MIN、HOUR,时钟毫秒、秒、分、时单元,存放修改后的时钟参数

CLOCK: CLR EA ;关中断

PUSH PSW ;保护现场

PUSH ACC SETB RS1 INC MSEC1 MOV A,MSEC1 CJNE A,#28H,BACK1 ;到10ms否

MOV MSEC1,#00H INC MSEC2 MOV A,MSEC2 CJNE A,#64H,BACK1 ;到1s否

MOV MSEC2,#00H JNB RTIMBIT,BACK0 ;由标识位0DH判别闹钟启动否

INC COUNTBACK0:MOV A,SEC ADD A,#01H ;时钟秒单元内容加1 DA A MOV SEC,A CJNE A,#60H,BACK1 ;到1min否

MOV SEC,#00H MOV A,MIN ADD A,#01H ;分单元内容加1 DA A MOV MIN,A CJNE A,#60H,BACK1 ;到1h否

MOV MIN,#00H MOV A,HOUR ADD A,#01H ;小时单元内容加1 DA A MOV HOUR,A CJNE A,#24H,BACK1 ;到24h否

MOV HOUR,#00HBACK1:POP ACC ;恢复现场

POP PSW SETB EA ;开中断

RETI ;中断返回

END

5.调试方法与步骤

1)输入源程序输入源程序时,应以西文方式输入字母和符号,且中文注释前要加分号。

2)对源程序进行汇编和纠错根据自动汇编提供的错误信息逐条纠正错误,直至汇编信息提示“错误(0)”、“汇编结束”。3)确定调试方案在调试程序前一定要认真分析源程序,明确各功能程序运行的预期结果。然后结合源程序应达到的结果,确定出如何通过某些关键参数和实验现象检验程序运行结果正确与否。例如:程序运行过程中路径的变化、累加器A内容的变化、其他特殊寄存器内容的变化等。并针对具体的分析和观察对象选择较合适的调试方法。如单步运行、跟踪运行、连续运行、快速运行至光标处、设置断点等调试方法。4)调试程序

(1)调试主程序。主程序运行后,在无任何按键输入时观察有无显示,时钟是否工作,其时、分、秒显示的变化过程是否正确。若运行结果不正确,首先应根据程序运行的实际现象分析判断哪些因素可引起相关故障,再通过调试方法逐一认证和排除。例如:若定时/计数器的初始化出错,则时钟将不能工作;若显示程序出错,则将不能正确显示时钟单元内容;若定时/计数器中断服务子程序出错,则其显示数据的变化规律将不正常。(2)调试子程序。在调试主程序时,必然要调用相关的功能子程序。因此,首先应明确子程序的具体功能,通过对子程序的分析,确定子程序的入口、出口参数及相关标识位的状态,然后在满足入口条件的状态下,设法检查从主程序进入子程序,再由子程序返回到主程序的运行过程。可采用跟踪运行或运行至光标处的方法,检查从主程序进入子程序内部的运行过程,再通过单步运行等方法检查子程序内部的运行情况和返回主程序的过程。通过反复调试,发现并排除软件与硬件存在的各类问题,以满足系统设计的预期目的。5)脱机运行将调试已通过的程序写入单片机内部(或外部)程序存储器中,再将写好程序的单片机(或存储器)插入已设计好的单片机用户板上,把仿真系统与用户板脱离开来,最后将所设计的单片机应用系统独立通电运行。6.实训分析与总结

(1)实训1.2是以数字钟为例,引入单片机应用系统设计、分析与调试的一般方法。一个单片机应用系统的设计与制作,一般要经过对被控对象的需求进行调研、根据系统的功能和技术指标选择控制方案、提出系统的总体构思、硬件设计、印制板制作、元器件安装、软件设计、软硬件仿真调试、固化程序、脱机运行、整机调试等几个阶段,如图1.2.7所示。图1.2.7应用系统开发流程框图(2)在上述过程中,难点是如何构建出程序设计的整体框架,包括主程序流程框图和子程序流程框图的构建、各功能模块之间的组合关系。前面提供的各功能模块流程框图和参考程序只是针对完成实训项目基本要求而提出的一种设计方案。

(3)主程序是负责应用系统整体的管理与协调,包括单片机资源的调配、初始参数与标识位的设定、可编程部件的初始化及系统各主要部分(如键盘、显示)初始状态的管理等。构建主程序时应做到简单明了,对各种操作功能实现模块化管理,即尽可能多的采用子程序结构,方便分析与调试。(4)采用模块化、子程序化的优点是便于连接和移植,特别是重复使用时尤为方便。但使用者必须预先明确各子程序的入口参数、出口参数和所占用的资源,合理利用堆栈,避免主程序与子程序之间、子程序与子程序之间所占用的资源发生冲突。

(5)运行状态采用标志化管理可使程序结构更加简化。在上述程序中,对各按键的操作过程和状态都采用标识位来描述,如闹钟设定与否、时钟参数(时、分、秒)修改哪一位、闹钟参数(时、分)设定哪一位,闹钟保持时间到否等。(6)在调试程序前,一定要预先将源程序分析透彻,在此基础上训练如何通过实验现象分析和判断产生故障的原因及故障可能存在的大致范围;灵活运用开发系统所提供的各种调试方法,快速有效地排查和缩小故障范围。通过反复调试,不断地分析和排除故障,调试软件和硬件的能力及速度。

(7)调试程序时,要结合能反映故障存在与否的参数变化、运行路径变化、显示内容变化等,选择合适的观测点和观测对象,再运用适当的调试方法,快速地检验调试结果,由此分析和判断故障点。

(8)上面采用的硬件电路和教材所附实训板电路,都是为训练应用能力而提供的典型教学实验电路,在实际设计中应从性能技术指标和价格等方面合理选择整体方案。

7.思考题

(1)在进行软件开发时,大体需要哪几个过程?

(2)写出中断服务子程序CLOCK、时钟修改功能子程序FTION0的出口参数是什么?

(3)调试子程序过程时一般采用什么方法?

(4)在本节实训程序中,增加-1修改功能,试编写相关程序。

(5)在本节实训程序中,增加声音报警功能,试编写相关程序。

(6)在本节实训程序中,增加闹钟停止控制功能键,试编写相关程序。实训1.3LCD显示器电路1.实训目的(1)掌握LCD显示基本原理和LCD控制方法。(2)掌握LCD显示与单片机的接口电路,软件设计方法。

2.实训设备与器件实训设备:单片机集成开发环境、综合实训板、1602液晶显示模块、导线一组。

3.项目设计要求设计单片机与液晶模块的连接电路,设计液晶显示模块的初始化程序,在液晶显示模块上显示字符消息。

4.实训内容

1)硬件设计液晶显示器常用于电子设备产品中,最常见的有如计算器、电子表、数字万用表、电子游戏机等,显示的主要是数字、专用符号和固定图形,因为是属段式显示,显示内容就无法多变。随着大量电子仪器、设备的多功能化、智能化,并且普遍地采用人机交互方式,需要能够显示更为丰富的信息和通用性较强的显示器。而点阵式LCD显示器能够满足这些要求,同时用大规模专用集成电路作为点阵LCD控制驱动,使用者仅仅直接送入数据和指令就可实现所需的显示。这种由LCD板、PCB板、控制驱动电路组成的单元叫做点阵液晶显示模块(DotMatrixLCDModule)。(1)液晶模块工作原理。液晶模块的基本组成框图如图1.3.1所示。图1.3.1液晶模块组成(2)液晶模块管脚定义。表1.3.1管脚排列与功能表表1.3.2寄存器选择表(3)液晶模块与微控制器的典型连接。根据液晶模块管脚定义,模块和微控制器相连如图1.3.2所示。图1.3.2液晶与微控制器连接图(4)指令系统。格式:RSR/WDB7DB6DB5DB4DB3DB2DB1DB0。共有11种指令,如表1.33所示。表1.3.3HD447800指令表(5)显示位和标准字符库。从液晶模块显示原理知道,液晶上显示的内容对应在DDRAM相应的地址中,显示位与DDRAM地址的对应关系如表1.3.4所示。表1.3.4显示位与DDRAM地址对应关系表表1.3.5标准字库(6)单片机连接控制图。图1.3.3LCD接线原理图在图1.3.3所示电路中,产生操作字符型液晶显示模块的各驱动子程序如下:COM EQU 20H ;指令寄存器DAT EQU 21H ;数据寄存器CW_Add EQU 0000H ;指令口写地址CR_Add EQU 0002H ;指令口读地址DW_Add EQU 0001H ;数据口写地址DR_Add EQU 0003H ;数据口读地址注意,不同的硬件连接产生不同的硬件地址。2)软件设计基于图1.3.3的硬件连接,可以实现液晶的任意字符的显示,本实训基本要求实现在LCD上从字符“0”到“F”的顺序显示。程序设计采用自上而下的软件设计方法,并采用模块化程序方式。具体设计如下:

(1)子程序功能介绍。主程序:完成初始化显示缓冲区,调用各子程序实现液晶显示器初始化、设置液晶控制字、显示字符内容等。初始化子程序:用软件复位的方法设置液晶显示输入方式、光标移位方向、显示位置、字符显示点阵大小等内容。写指令代码子程序:完成向液晶指令寄存器中写入一个控制命令。写显示数据子程序:完成向液晶数据显示区中写入显示字符。图1.3.4主程序流程图(2)主程序流程图如图1.3.4所示。(3)源程序。①程序如下:;预定义工作变量COM EQU 20H ;指令寄存器DAT EQU 21H ;数据寄存器CW_Add EQU 0000H ;指令口写地址CR_Add EQU 0002H ;指令口读地址DW_Add EQU 0001H ;数据口写地址DR_Add EQU 0003H ;数据口读地址 ORG 0000H AJMP MAIN ORG 0020HMAIN: MOV SP,#06H ANL P3,#07H LCALLINT ;调用初始化子程序

MOV COM,#06H ;设置输入方式

LCALLPR1 MOV DPTR,#TAB MOV COM,#80H ;设置DDRAM地址

LCALLPR1 MOV R2,#15 ;设置循环变量初值

MOV R3,#00HWRIN: MOV A,R3 MOV A,@A+DPTR MOV DAT,A LCALL PR2 ;写数据到液晶中

LCALLDELAY ;调延时子程序

INCR3 DJNZ R2,WRIN SJMP $TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H END②写指令代码子程序如下:PR1: PUSH DPH PUSH DPL PUSH ACC MOV DPTR,#CR_Add ;设置指令口读地址PRll: MOVX A,@DPTR ;读BF和AC值

JB ACC.7,PRll ;判断是否BF=0。是,继续

MOV A,COM ;取指令代码

MOV DPTR,#CW_Add ;设置指令口写地址

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论