1、第4章 MCS-51汇编语言程序设计,单片机程序设计步骤 常见程序设计范例,汇编语言程序设计步骤,1、拟制设计任务书 2、建立数学模型 3、确立算法 4、绘制程序流程图 5、编制汇编语言源程序 6、上机调试,拟制设计任务书,程序功能 技术指标 精度等级 实施方案 工程进度 所需设备 研究经费及人员分工,建立数学模型,把被控对象的物理过程抽象并归纳为数学模型。 数学模型可以是:数学表达式数学的推理和判断运行状态的模拟,确立算法,把数学模型转化为计算机能够处理的形式,绘制程序流程图,采用模块化设计思想将任务分解成一个个子任务,分别绘制流程图。 子模块要有直观性和概括性,注明各个模块之间的关系。,编
2、制汇编语言源程序,熟悉指令系统 掌握设计方法和技巧 注意程序的正确性和可读性,上机调试,检验程序的正确性和完整性 各子模块分别调试 系统联调 软硬件联调,单片机应用开发程序种类,开机初始化程序 主程序 控制算法 信号采集、预处理程序 人机交互程序 通讯程序 其他,常用程序类型,判断程序设计 巡回检测程序设计 数字滤波程序设计 标度变换程序设计 上下限报警处理程序设计 显示程序设计 定时程序设计 键盘控制程序设计 抗干扰技术,主程序,主程序可以是一个简单的死循环,也可以是个巡检程序,主要根据控制方案的不同有不同的形式。 单片机中常见的外围设备控制方式 1、程序控制方式 2、中断控制方式,巡回检测
3、程序设计,所谓的巡回检测就是对生产过程中的各个参数按照一定的周期进行检查和测量,检测的数据通过计算机处理后可以进行显示、打印和报警等操作。,初始化程序,上电复位后对单片机及外围可编程接口进行初始化编程。 开中断、设定中断优先级 设定串口通讯方式 设定定时器工作方式 设置堆栈指针,设置时钟系统的初始值 设置控制算法程序的初始值 清除动态数据缓冲区 设置8251、8255等可编程器件的控制字,初始化举例,将堆栈指针更改为50h Mov a,#50h Mov sp,a 开中断 Mov a,0ffh Mov ie,a,实例: 初始化程序功能:设置定时器0、外部 中断0和外部中断1的中断程序入口; 设置
4、定时器0的工作方式为方式1,定时时间为100ms;设置计数单元(30H)初值。,ORG 0000H AJMP START ORG 0003H AJMP SAMPLE ;转采样中断程序 ORG 000BH AJMP TIME0 ;转8秒定时中断程序ORG 0013HAJMP EOC ;转EOC中断处理程序 START: MOV TMOD,#01H;置定时器0为工作方式1 MOV TH0,#3CH,MOV TL0,#0B0H ;定时器初值设定 MOV 30H,#00H ;置计数初值SETB IT0 ;中断请求信号为脉冲方式 SETB IT1 ;中断请求信号为脉冲方式 SETB EX0 ;外部中断0
5、中断允许SETB ET0 ;定时器0中断允许 SETB EA ;开中断SETB TR0 ;启动定时器 HERE: AJMP HERE ;等待中断,顺序程序,一个简单的例子: 双字节减法子程序 双字节减法子程序(SUB2)程序入口:被减数放在SUB1_H、SUB1_L单元中,减数放在 SUB2_H、SUB2_L单元中; 程序出口:差放在 DIFF_H、DIFF_L单元中。,CLR CMOV A,SUB1_L ;ASUB1_LSUBB A,SUB2_L ;低8位相减MOV DIFF_L,A ;保存低8位差值MOV A,SUB1_H ;ASUB1_HSUBB A,SUB2_H ;高8位相减MOV D
6、IFF_H,A ;保存高8位差值RET,一阶滞后滤波,常见的滤波方法属于静态滤波,主要适用于变化比较快的参数,如压力、流量等。对于慢速随机变化的参数,采用在短时间内连续采样求平均值的方法,其滤波效果不太好。在这种情况下,通常采用动态滤波方法,如一阶滞后滤波法,其表达式为 Yn=(1-)Xn+Yn-1,假设COEFF1内存储平滑系数,COEFF2内存储常 数(1-),MUL1、MUL2为乘法子程序参数入口, PR为乘法子程序参数出口DATA1中存放y(n-1), DATA2中存放x(n)MOV MUL1_H,COEFF1_H MOV MUL1_L,COEFF1_L MOV MUL2_H,DATA
7、1_H MOV MUL2_H,DATA1_L ACALL MULTD ; MOV BUFF1,PR_H MOV BUFF2,PR_L MOV MUL1_H,COEFF2_H MOV MUL1_L,COEFF2_L,MOV MUL2_H,DATA2_H MOV MUL2_H,DATA2_L ACALL MULTD ; CLR C MOV A,PR_H ; ADD A,BUFF1 MOV DATA1 _H,A MOV A,PR_L ADDC A,BUFF2 ; MOV DATA1 _L,A,分支程序,分支执行程序在执行时,首先判定给定的条件是否满足,根据判定的结果(真或假)再执行相应的操作。,两个
8、16位无符号数比较,CLR CY ;标志位清零 MOV A,MH ;AMHMOV R2,NH ;R2NHSUBB A,R2 ;高8位比较JZ HEQU ;高8位相等,转低8位比较 JC LESS ;有借位,转MN 理程序,HEQU: CLR CY ;标志位清零 MOV A,ML ;AMLMOV R2,NL ;R2NLSUBB A,R2 ;低8位比较JZ EQU ;A=0,则M=N,转EQUJC LESS ;有借位,则MN处理程序 ;无借位,执行MN 理 程序 EUQ: ;M=N 处理程序 LESS: ;MN 处理程序,两个8位有符号数的比较,由于M和N均为有符号数, M和N两数在比较时,可能出
9、现以下四种情况: (1)M0,N0, 即两数均为正数。 (2)M0,N0, 即M为负数,N为正数。 (4)M0,N0, 即两数均为负数。,MOV A,M ;AMMOV R2,N ;R2NSUBB A,R2 ;M和N 比较JZ EQU ;M和N相等,转相等处理程序JB PSW.2,FLOW ;判断是否溢出JB ACC.7,LESS ;无溢出,且A的最高位为1,则MN FLOW: JB ACC.7,BIG ;有溢出,且A的最高位为1,则MN LESS: MN处理程序 EUQ: M=N处理程序,逻辑判断程序,逻辑判断程序的设计步骤: (1)读入数据(开关状态或阀门的位置); (2)屏蔽不需要的状态位
10、; (3)与所要求的状态比较; (4)判断比较结果,选择程序入口。,例3-1 图3-5中A、B、C、D表示4个开关,当四个开关均闭合时,顺序执行相应的程序,否则,继续检测。 逻辑判断程序流程框图如图。,CHECK: MOV A,P1 ;读入开关状态 ANL A,#55H ;屏蔽无用位XRL A,#00H ;判断A、B、C、D是否全部闭合JNZ CHECK ;A、B、C、D没全部闭合,继续检测 ;否则顺序执行相应程序,指令冗余技术,由于51系列单片机指令长度不超过3个字节,当PC值改变后,可能出现三种情况: (1)PC值指向一单字节指令,程序自动纳入正轨; (2)PC值指向一双字节指令,由于双字
11、节指令有操作数,则有可能将操作数当成操作码执行; (3)PC值指向一三字节指令,由于三字节指令有两个操作数,出错的几率更大。,下面以两数比较的程序演示如何在程序区设置软件陷阱,从而避免程序跑飞。CLR CY ;进位标志清零MOV A,MSUBB A,N ;M-NJZ MNEQU ;转M=N处理程序JC LESS ;转MN处理程序AJMP BPIONT ;转至断裂点,NOP ;设置陷阱NOPLJMP ERROR MNEQU: ;M=N处理程序AJMP BPIONTNOPNOPLJMP ERROR LESS: ;MN处理程序,AJMP BPIONTNOPNOPLJMP ERROR BPIONT:
12、RET ;断裂点NOP ;陷阱NOP LJMP ERR,循环程序设计,当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。 循环程序设计的一个主要问题是循环次数的控制,有两种方式:第一种方法是先判断,再处理即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。第二种方法是先处理再判断,即循环一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循环,再多重循环中,内部循环不能交叉,也不允许外循环跳入内循环。,循环程序一般由四个主要部分组成: (1) 初始化部分: 为循环程序做准备, 如规定 循环次数、 给各
13、变量和地址指针预置初值。 (2) 处理部分: 为反复执行的程序段, 是循环程序的实体, 也是循环程序的主体。 (3) 循环控制部分: 这部分的作用是修改循环变量和控制变量, 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。 (4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。,设计一个延时10ms的延时子程序,已知单片机使用的晶振为6MHZ。,分析 延时时间与两个因素有关,一个是晶振频率,一个是循环次数。由于晶振采用6MHZ,一个机器周期是2us,采用单循环可以实现1ms延时,外循环10次即可达10ms延时。内循环如何实现1ms延时呢,程序中可先以未知数MT代替,
14、再根据程序的执行时间计算。,ORG 0020H 1 MOV R0, #0AH ;外循环10次 1 DL2: MOV R1, #MT;内循环MT次DL1: NOP 1 NOP ;空操作指令 2 DJNZ R1, DL1 2 DJNZ R0, DL2RET,内循环DL1到指令DJNZ R1,DL1 的计算:(112)2sMT=1000sMT=125=7DH 将7DH代入上面程序的MT,计算总的延时时间: 11+(1+1+2)125+2102s =10.062ms 若需要延时更长时间,可以采用多重循环。,算术平均滤波,所谓算术平均滤波就是把n个采样值相加,然后取其算术平均值作为本次有效的采样信号,即
15、:,PUSH PSW ;现场保护 PUSH AMOV FLAG,#00H ;进位位清零MOV R0,DATA ;设置数据存储区首址MOV R7,#08H ;设置采样数据个数CLR A ;清累加器 LOOP: ADD A,R0 ;两数相加JNC NEXT ;无进位,转NEXTINC FLAG ;有进位,进位位加1 NEXT: INC R0 ;数据指针加1DJNZ R7, LOOP ;未加完,继续加MOV R7,#03H ;设置循环次数,DIVIDE: MOV TEMP,A ;保存累加器中的内容MOV A,FLAG ;累加结果除2CLR C RRC AMOV FLAG,A MOV A,TEMP R
16、RC A DJNZ R7,DIVIDE ;未结束,继续执行 MOV SAMP,A ;保存结果至SAMP中POP A ;恢复现场POP PSW RET,复杂的例子,Pid控制器是工业上应用最广泛的一种控制器,往往把比例、积分、微分三种作用组合起来,形成PID控制器。 Pid控制器的数学表达式是:,PID: MOV R5,31H ;取wMOV R4,32H MOV R3,#00H ;取u(n) MOV R2,2AH ACALL CPL1 ;取u(n) 的补码 ACALL DSUM ;计算e(n)=w-u(n) MOV 39H,R7 ;存e(n) MOV 3AH,R6 MOV R5,35H ;取I
17、MOV R4,36H MOV R0,#4AH ;R0存放乘积高位字节地址指针 ACALL MULT1 ;计算PI=Ie(n),MOV R5,39H ;取e(n) MOV R4,3AH MOV R3,3BH ;取e(n-1) MOV R2,3CH ACALL CPL1 ;求e(n-1)的补码 ACALL DSUM ;求PP=e(n)=e(n)-e(n-1) MOV A,R7 MOV R5,A ;存e(n) MOV A,R6 MOV R4,A MOV R3,4BH ;取PI MOV R2,4AH ACALL DSUM ;求PI+ PP,MOV 4BH,R7 ;存(PI+ PP) MOV 4AH,R
18、6 MOV R5,39H ;取e(n) MOV R4,3AH MOV R3,3DH ;取e(n-2) MOV R2,3EH ACALL DSUM ;计算e(n)+ e(n-2) MOV A,R7 ;存(e(n)+ e(n-2) MOV R5,A MOV A,R6MOV R4,A,MOV R3,3BH ;取e(n-1) MOV R2,3CH ACALL CPL1 ;求e(n-1)的补码 ACALL DSUM ;计算e(n)+ e(n-2)- e(n-1) MOV A,R7 ;存和 MOV R5,A MOV A,R6 MOV R4,A MOV R3,3BH ;取e(n-1) MOV R2,3CH ACALL CPL1 ;求e(n-1)的补码ACALL DSUM ;计算e(n)+ e(n-2)- 2e(n-1),MOV R3,47H MOV R2,46H MOV R5,2FH ;取y(n-1) MOV R4,30H ACALL DSUM ;求出y(n)=y(n-1)+ KP(PI+ PP + PD) MOV 2FH,R7 ;y(n)送入y(n-1)单元 MOV 30H,R6 MOV 3DH,3BH ;e(n-1)送入e(n-2)单元 MOV 3EH,3CH MOV 3BH,39H ;e(n)送入e(n-1)单元 MOV 3CH,3AHRET,