秦晓飞系列-单片机原理及应用-第10章 系统实用程序.ppt_第1页
秦晓飞系列-单片机原理及应用-第10章 系统实用程序.ppt_第2页
秦晓飞系列-单片机原理及应用-第10章 系统实用程序.ppt_第3页
秦晓飞系列-单片机原理及应用-第10章 系统实用程序.ppt_第4页
秦晓飞系列-单片机原理及应用-第10章 系统实用程序.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、,第10章 系统实用程序,主讲教师:秦晓飞上海理工大学光电学院,第10章 系统实用程序,10.1 主程序和子程序的概念 10.2 数据采集及简单控制程序 10.3 数据处理程序 10.4 代码转换程序 10.5 抗干扰技术 10.6 最短程序,10.1 主程序和子程序的概念,10.1 主程序和子程序的概念,10.1.1 主程序 主程序是单片机系统控制程序的主框架。 是一个顺序执行的无限循环的程序 运行过程必须构成一个圈。,图10-1 主程序结构,10.1 主程序和子程序的概念,10.1.2 子程序及参数传递 子程序包括普通子程序(简称子程序)和中断服务子程序。 在程序设计中,有时需反复执行某段

2、程序。通常把具有一定功能的公用程序段作为子程序。 在主程序需要执行这种操作的地方执行一条调用指令,转到子程序去执行;完成规定操作以后,再返回到原来的程序(主程序)继续执行。 子程序中通常包含现场保护和现场恢复两部分。 主程序和子程序之间的信息交换,称之为参数传递: 用工作寄存器或累加器传递参数; 用指针寄存器来传递参数。,图10-2 调子程序,10.1 主程序和子程序的概念,10.1.2 子程序及参数传递 1.用工作寄存器或累加器来传递参数 例10-1 用程序实现c=a2+b2。 设:a、b和c分别存于内部RAM的DA、DB和DC 3个单元中。通过两次调用子程序查平方表,结果在主程序中相加得到

3、。 其入口条件是:(A)=待查表的数;出口条件是(A)=平方值。,主程序片段: STAR:MOVA,DA;取第一操作数 ACALLSQR;调用查表程序 MOVR1,A;a2暂存R1中 MOVA,DB;取b ACALLSQR;第2次调用查表程序 ADDA,R1;a2b2 MOVDC,A;结果存于DC中 SJMP;等待,子程序片段: SQR:INCA;偏移量调整(RET一字节) MOVCA,A+PC;查平方表 RET TAB:DB 0,1,4,9,16 DB 25,36,49,64,81 END,10.1 主程序和子程序的概念,10.1.2 子程序及参数传递 2.用指针寄存器来传递参数 如果参数在

4、片内RAM中,则可用 R0 或 R1 作指针; 如参数在片外RAM或程序存储器中,则可用 DPTR 作指针。 例10-2 将R0和R1指出的内部RAM中两个3字节无符号整数相加,结果送到由R0指出的内部RAM中。入口时,R0和R1分别指向加数和被加数的低位字节;出口时,R0指向结果的高位字节。低字节在高地址,高字节在低地址。(此处书上错),NADD:MOVR7,#3;3字节加法 CLRC NADD1:MOVA,R0;取加数低字节 ADDCA,R1;取被加数低字节并加到A MOVR0,A DEC R0 DECR1 DJNZR7,NADD1 INCR0 RET,10.1 主程序和子程序的概念,10

5、.1.3 中断服务子程序 主程序调用子程序与主程序被中断去执行中断服务子程序的过程是不同的: 调用子程序是当主程序运行到 “LCALL”等指令时,先自动压入断点,再进入子程序;当执行子程序到最后一条指令RET时,自动弹出断点送PC,返回主程序; 程序中断是随机的。当主程序运行时,遇到中断申请,则CPU执行完当前指令后,首先自动压入断点,然后转去执行中断服务子程序。当中断服务程序执行到最后一条指令RETI时,同样弹出断点送PC,返回主程序。,10.2 数据采集及简单控制程序,10.2 数据采集及简单控制程序,10.2.1 数据采集程序 典型数据采集程序框图举例:,图10-2 数据采集总流程图,1

6、0.2 数据采集及简单控制程序,10.2.2 航标灯控制程序 例10-3 用89C51单片机试制一个“航标灯”。fosc12MHZ 要求: 黑夜定时周期循环发光,定时间隔为2s,即亮2s,灭2s。 当白天到来时,航标灯应熄灭,停止定时器工作。 编程思路: 采用定时加计数的方法定时2 s。 如图10.5所示的光敏三极管来区分白天与黑夜。,黑夜时,无光照,T1和T2均截止,使INT00,发出中断请求。CPU进入外部中断处理程序,启动定时器工作,利用定时器中断控制灯定时闪闪发光。用软件查询INT0引脚,只要INT00,定时器便继续工作。 白天时,日光使T1导通,T2输出低电平,INT01,立即关闭定

7、时器,结束外部中断处理并返回到主程序。,图10-5 航标灯控制电路,10.2 数据采集及简单控制程序,10.2.2 航标灯控制程序 设:T0定时和R7软件计数可以延时2s。R7软件计数为40次,T0定时50ms,T0采用模式1,计数初值为:216-12501000123CB0H,主程序:ORG0000H AJMPMAIN ORG0003H AJMPWBINT;外部中断0入口地址 ORG000BH AJMPT0INT;T0中断入口地址 ORG0100H MAIN:MOVSP,#30H;设置堆栈指针 CLRP1.7;设灯的初态为“灭” CLRIT0 ;外部中断0为电平触发方式 CLRPX0;外部中

8、断0为低优先级 SETBEX0;允许外部中断0中断 SETBEA;CPU允许中断 HERE:AJMPHERE;等待外部中断请求 外部中断0中断服务程序(由0003H转来): WBINT:MOVTMOD,#01H;T0定时,模式1 MOVTL0,#0B0H;T0计数初值 MOVTH0,#3CH SETBPT0;设T0为高优先级中断,SETBTR0;启动T0 SETBET0;T0开中断 MOVR7,#40;软件计数值 HERE1:JNBP3.2,HERE1 ;查询INT0,为低(黑夜),等待T0中断 CLRET0 ;为高(白天),禁止T0中断 CLRTR0;关T0 CLRP1.7;熄灯 RETI;

9、返回主程序 定时器0中断服务程序(由000BH转来): T0INT:MOVTL0,#0B0H;重赋T0初值 MOVTH0,#3CH DJNZR7,EXIT;软件计数为0吗? MOVR7,#40H ;计数已到,重赋初值 CPLP1.7 ;输出取反控制灯“亮”或“灭” EXIT:RETI;中断返回 END,10.2 数据采集及简单控制程序,10.2.3 水位控制程序 1.水位控制原理 图10-6中虚线表示允许水位变化的上、下限。水塔安装固定的3根金属棒。其中,A棒处于下限水位,A棒接+5V电源,C棒处于上限水位,B棒在上、下限水位之间。B棒、C棒各通过一个电阻与地相连。 单片机控制电机转动,电机带

10、动水泵供水供水时,水位上升,当达到上限时,由于水导电,B、C棒连通+5V。b和c两端均为”1”.这时,应停止电机工作,不再供水。 当水位降到下限时,B、C棒都不能与棒导通,b和c两端均为”0”。启动电机供水. 当水位处于上下限之间,棒与A棒导通.棒不能与棒导通,b端为”1”,c端为“0”状态。应继续维持原有的工作状态。,图10-6 水塔水位控制原理图,10.2 数据采集及简单控制程序,10.2.3 水位控制程序 2.水位控制电路 如图10-7所示 3.信号输入与输出 水位信号由P1.0和P1.1输入 由P1.2端输出,去控制电机。 由P1.3输出报警信号,驱动一只发光二极管进行光报警。,图10

11、-7 水塔水位控制电路,10.2 数据采集及简单控制程序,10.2.3 水位控制程序 4.控制程序,图10-8 水塔水位控制程序流程,10.2 数据采集及简单控制程序,10.2.3 水位控制程序 4.控制程序,主程序: ORG0030H LOOP:ORLP1,#03H;此处书上错 ;为检查水位状态作准备 MOVA,P1 JNBACC.0,ONE;P1.0=0则转 JBACC.1,TWO;P1.1=1则转 BACK:ACALLD10S;延时10s AJMPLOOP ONE:JNBACC.1,THREE;P1.1=0则转 CLR93H ;0P1.3,启动报警装置 SETB92H ;1P1.2,停止

12、电机工作 FOUR:SJMPFOUR THREE:CLR92H;启动电机 AJMPBACK TWO:SETB92H;停止电机工作 AJMPBACK,延时子程序D10S(延时10s): ORG0100H D10S:MOVR3,#19H LOOP3:MOVR1,#85H LOOP1:MOVR2,#0FAH LOOP2:DJNZR2,LOOP2 DJNZR1,LOOP1 DJNZR3,LOOP3 RET,10.2 数据采集及简单控制程序,10.2.4 蜂鸣器报警子程序 压电式蜂鸣器约需10mA的驱动电流 当P1.0输出高电平1时,压电蜂鸣器两端获得约+5V电压而鸣叫; 当P1.0输出低电平0时,压电

13、蜂鸣器两引线间的直流电压降至接近于0V,蜂鸣器停止发声。,图10-10 使用三极管作驱动的单音频报警电路,图10-9 使用7406作驱动的单音频报警电路,10.2 数据采集及简单控制程序,10.2.4 蜂鸣器报警子程序 连续鸣音30ms的控制子程序清单:,SND:SETBP1.0;P1.0输出高电平,启动蜂鸣器鸣叫 MOVR7,#1EH;延时30 ms DL:MOVR6,#0F9H DL1:DJNZR6,DL1;小循环延时1 ms DJNZR7,DL CLRP1.0;P1.0输出低电平,停止蜂鸣器鸣叫 RET,10.3 数据处理程序,10.3 数据处理程序,10.3.1 排序程序 例10-4

14、将片内RAM 50H59H中的数据按从小到大的顺序排序 解:这是一个排序问题,按从小到大排列称升序排列,反之称降序排列。 根据题意,排序程序在执行时,取前数与后数比较:如果前数小于后数,则继续顺序比较下去;如果前数大于后数,则前数和后数交换后再继续比较下去。第一次循环将在最后单元中得到最大的数(冒泡法)。得到所有数据的升序排列需要经过多重循环。,CLR00H;清除交换标志位 QUE:MOVR3,#9H;10个数据循环次数 MOVR0,#50H;数据存放区首址 MOVA,R0;取前数 L2:INCR0 MOVR2,A;保存前数 SUBBA,R0;前数减后数 MOVA,R2;恢复前数 JCL1;顺

15、序则继续比较 SETB00H;逆序则建立标志位 XCHA,R0;前数与后数交换 DECR0 XCHA,R0 INCR0;仍指向后数单元,L1:MOVA,R0 DJNZR3,L2;依次重复比较 JB00H,QUE;交换后重新比较 RET,10.3 数据处理程序,10.3.2 数字滤波程序 前向通道中,必须消除被测信号中的噪音和干扰。噪音有两大类: 一类为周期性的。典型为50Hz的工频干扰。采用硬件滤波电路能有效地消除其影响。 另一类为不规则随机性的,可以用数字滤波方法予以削弱或滤除。数字滤波,就是通过程序计算或判断来减少干扰在有用信号中的比重,实际是一种程序滤波。经常采用的中值法、去极值法可对采

16、样信号进行数字滤波,以消除常态干扰。 这里以中值法为例讲解:中值滤波是对某一参数连续采样n次(n一般取奇数),然后把n次的采样值从小到大或从大到小排列,再取中间值作为本次采样值。该算法的采样次数常为3次或5次。 现以3次采样为例。 3次采样值分别存放在R2、R3和R4中,程序运行之后,将3个数据从小到大顺序排列,仍然存放在R2、R3和R4中,中值在R3中。,10.3 数据处理程序,10.3.2 数字滤波程序,程序清单: FILT2:MOVA,R2;R2R3吗? CLRC SUBBA,R3 JCFILT21 MOVA,R2 ;R2R3时,交换R2和R3 XCHA,R3 MOVR2,A FILT2

17、1:MOVA,R3;R3R4吗? CLRC SUBBA,R4 JCFILT22 ;R3R4时,排序结束 MOVA,R4 ;R3R4时,交换R3和R4 XCHA,R3 XCHA,R4;R3R2吗? CLRC SUBBA,R2 JNCFILT22 ;R3R2时,排序结束,MOVA,R2 ;R3R2时,以R2为中值 MOVR3,A;中值在R3中 FILT22:RET,10.3 数据处理程序,10.3.3 标度变换(工程量变换) 1.线性参数标度变换 前提条件是参数值与A/D转换结果(采样值)之间应呈线性关系。 当输入信号为0(即参数值起点值), A/D输出值不为0时,标度变换公式为: 式中: A0参

18、数量程起点值,一次测量仪表的下限; Am参数量程终点值,一次测量仪表的上限; Ax参数测量值,实际测量值(工程量); N0量程起点对应的A/D转换值,仪表下限所对应的数字量; Nm量程终点对应的A/D值,仪表上限所对应的数字量; Nx测量值对应的A/D值(采样值),是经数字滤波后的采样值。 其中,A0、Am、N0和Nm对一个检测系统来说是常数。 在参数量程起点(输入信号为0), A/D值为0时(即N00)。标度变换:,10.3 数据处理程序,10.3.3 标度变换(工程量变换) 1.线性参数标度变换 很多测量系统中,参数量程起点值(即仪表下限值)A00,对应的0。可进一步简化为: 2.非线性参

19、数标度变换 如果传感器输出特性是非线性的,可采用查表法进行标度变换。,10.4 代码转换程序,10.4 代码转换程序,各种代码之间的转换常采用算法处理和查表方式。 例10-5 单字节二翻十子程序。将00HFFH 内二进制数转换为BCD数(0256)。 解:入口:(A)=二进制数。出口:百、十和个位分别存入R0指出的两个RAM单元。,图10-15 二进制数转换成 BCD数子程序,程序清单: BINBCD:MOVB,#100 DIVAB;(A)=百位数 MOVR0,A;百位BCD存入RAM INCR0 MOVA,#10 XCHA,B DIVAB;(A)=十位数,(B)=个位数 SWAPA ADDA

20、,B;(A)=压缩BCD码(十位个位) MOVR0,A;存入RAM RET,10.4 代码转换程序,例10-6 单字节十翻二子程序。将2位BCD数(压缩为1字节)转换成二进制数。 解:将累加器A中的压缩BCD码转换成二进制数,结果仍在A中。 方法是将A中的高位乘以10,再加上A的低位字节。,程序清单: DTOB:MOVR2,A;暂存 ANLA,#0F0H;屏蔽低4位 SWAPA MOVB,#10 MULAB;高位乘以10 MOVR3,A;暂存 MOVA,R2;取BCD数 ANLA,#0FH;取BCD数个位 ADDA,R3;得转换结果 RET,10.4 代码转换程序,例10-7 一位十六进制数转

21、换成ASCII码。 解:本程序中,由R0指出十六进制数存放单元,经转换后结果仍存于原处。,程序清单: HEXASC1:MOVA,R0;取十六进制数 ANLA,#0FH;屏蔽高4位 ADDA,#03H;修正偏移量 MOVCA,A+PC;查表,取ASCII代码 XCHA,R0;存储 INCR0;更新地址 RET ASCTAB:DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H,10.4 代码转换程序,例10-8 十六进制数的ASCII代码转换成二进制数。 解:对于小于或等于9的数的ASCII代码,减去30

22、H得4位二进制数;对于大于9的十六进制数的ASCII代码,减去37H得4位二进制数。则正好是0AH0FH的结果。程序以R2作为入口和出口。,程序清单: ASCHEX:MOVA,R2;取操作数 CLRC SUBBA,#30H;09的转换 MOVR2,A;暂存结果 SUBBA,#0AH;结果是否9? JCSBIO;9则转换正确,返回 XCHA,R2 SUBBA,#07H;9,则再减7H,即减去37H(书上错了) SBIO: MOVR2,A;存放结果 SBIO:RET(书上错了),10.5 抗干扰技术,10.5 抗干扰技术,干扰可以沿各种线路侵入,也可以以场的形式(高电压、大电流、电火花等)从空间侵

23、入微机系统;电网中各种浪涌电压入侵,系统的接地装置不良或不合理等,也是引入干扰的重要途径。 干扰对微机系统的影响有3个部位: 前向通道、CPU内核及后向通道。对前向通道的干扰会使输入的模拟信号失真,数字信号出错。对这一部位的抗干扰,硬件方面可采用光电隔离、硬件滤波电路等措施,在软件方面可采用前面讲的数字滤波方法。 干扰可使微机系统内核三总线上的数字信号错乱,从而引发一系列无法预料的后果,形成一系列错误。CPU得到错误的地址信号后,引起程序计数器出错,使程序运行离开正常轨道,导致程序失控、飞跑或死循环,进而使后向通道的输出信号混乱,不能正常反映微机系统的真实输出,从而导致一系列严重后果。本节主要

24、讨论软件抗干扰的问题。,10.5 抗干扰技术,10.5.1 软件陷阱技术 当CPU受到干扰后,会将一些操作数当作指令码来执行,造成程序执行混乱。这时,首先要尽快将程序纳入正轨(执行真正的指令序列)。 软件陷阱:用一条引导指令强行将捕获的程序引向一个指定的地址,在那里有一段专门对程序出错进行处理的程序,以使程序按既定目标执行。 一般的软件陷阱由3条指令构成: NOP NOP LJMP ERR ERR:一段专门对程序出错进行处理的程序,以使程序按既定目标执行。 下面我们研究,在各个程序存储区间,如何布置软件陷阱: 1.未使用的中断向量区 假设:程序只使用了3个中断:INT0、T0和T1,那么在未使

25、用的中断向量区设置陷阱,就能及时捕捉到错误中断。如下所示:,10.5 抗干扰技术,10.5.1 软件陷阱技术 1.未使用的中断向量区,ORG0000H 0000START:LJMPMAIN;引向主程序入口 0003LJMPPGINT0;INT0中断正常入口 0006NOP;冗余指令 0007NOP 0008LJMPERR;陷阱 000BLJMPPGT0;T0中断正常入口 000ENOP;冗余指令 000FNOP 0010LJMPERR;陷阱 0013LJMPERR;未使用INT1,设陷阱 0016NOP;冗余指令 0017NOP 0018LJMPERR;陷阱 001BLJMPPGT1;T1中断

26、正常入口 001ENOP;冗余指令 001FNOP 0020LJMPERR;陷阱 0023LJMPERR;未用串口中断,设陷阱 0026NOP;冗余指令 0027NOP 0028LJMPERR;陷阱,10.5 抗干扰技术,10.5.1 软件陷阱技术 2.未使用的大片ROM空间 未编程ROM,都维持(0FFH),是一条单字节指令“MOV R7,A”,只要每隔一段设置一个陷阱,就能捕捉到弹飞的程序。软件陷阱要指向出错处理过程ERR才稳妥,ERR可安排在0030H开始的地方。可以用“00 00 20 00 30” 5字节作为陷阱来填充ROM中的未使用空间。即指令:NOP / NOP / LJMP 0

27、030H,或隔一段设置一个陷阱“02 00 30”,即指令:LJMP 0030H,其它单元保持0FFH不变。 3.表格区 表格有两类:一类是数据表格,供“MOVC A,A+PC”指令或“MOVC A,A+DPTR”指令使用;另一类是散转表格,供“JMP A+DPTR”指令使用,其内容为一系列的3字节指令LJMP或两字节指令AJMP。 由于表格的内容和索引值是一一对应关系,表格中安排陷阱代码会破坏表格的连续性,因此只能在表格的最后安排5字节陷阱 (NOP / NOP / LJMP ERR)。 4.程序区 程序区的指令串中间常有一些断裂点,正常执行程序到不会继续往下执行了,这类指令有LJMP、SJ

28、MP、AJMP、RET和RETI。在这种地方安排陷阱后,就能有效地捕获到它,而又不会影响正常执行的程序流程。,10.5 抗干扰技术,10.5.1 软件陷阱技术 4.程序区 例如:根据A中内容的正、负、零情况进行三分支的程序中,软件陷阱的安置方式如下: JNZXYZ;零处理 AJMPABC;断裂点 NOP NOP LJMPERR;陷阱 XYZ:JBACC.7,VUW;正处理 AJMPABC;断裂点 NOP NOP LJMPERR;陷阱 VUW: ;负处理 ABC:MOVA,R0;取结果 RET;断裂点 NOP NOP LJMPERR,10.5 抗干扰技术,10.5.2 软件看门狗 看门狗程序运行

29、监视系统 (WATCHDOG) 特性:本身能独立工作,基本上不依赖于CPU;CPU在一个固定的时间间隔内和该系统打一次交道(喂一次狗),以表明系统目前尚正常;当CPU陷入死循环后,能及时发觉并使系统复位。 在8096系列单片机和增强型89C51系列单片机芯片内已经内嵌了程序运行监视系统,使用起来很方便。在普通型51系列单片机中,必须由用户自己建立。 自己构建看门狗的方法:纯软件法,外接硬件法。这里以纯软件法为例讲解: 当系统陷入死循环后,只有比它更高级的中断才能夺走对CPU的控制。为此,用一个定时器来作WATCHDOG,将它的溢出中断设定为高优先级中断,其他中断均设为低优先级中断。 例如:用T

30、0,作定时约为16 ms,在初始化时建WATCHDOG: MOVTMOD,#01H;设置T0为16位定时器 SETBET0;允许T0中断 SETBPT0;设置T0为高级中断 MOVTH0,#0E0H;定时约16 ms(6 MHz晶振) SETBTR0;启动T0 SETBEA;开中断,10.5 抗干扰技术,10.5.2 软件看门狗 WATCHDOG启动以后,工作程序必须经常“喂它”,执行一条“MOV TH0,#0E0H”指令,且每两次间隔不大于16ms (如可以每10ms“喂”一次)。当程序陷入死循环后,16ms之内即可引起一次T0溢出,产生高优先级中断,从而跳出死循环。T0中断直接转向出错处理程序,在中断向量区放置一条“LJMP

温馨提示

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

评论

0/150

提交评论