- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.1 主程序和子程序的概念
10.1.2 子程序及参数传递 2.用指针寄存器来传递参数
① 如果参数在片内RAM中,则可用 R0 或 R1 作指针; ② 如参数在片外RAM或程序存储器中,则可用 DPTR 作指针。
例10-2 将R0和R1指出的内部RAM中两个3字节无符号整数相加,结果送到由R0指出 的内部RAM中。入口时,R0和R1分别指向加数和被加数的低位字节;出口时,R0指 向结果的高位字节。低字节在高地址,高字节在低地址。(此处书上错)
图10-6 水塔水位控制原理图
10.2 数据采集及简单控制程序
10.2.3 水位控制程序 2.水位控制电路 如图10-7所示 3.信号输入与输出
• 水位信号由P1.0和P1.1输入 • 由P1.2端输出,去控制电机。 • 由P1.3输出报警信号,驱动 一只发光二极管进行光报警。
C (P1.1) 0
主程序调用子程序与主程序被中断去执行中断服务子程序的过程是不同的:
① 调用子程序是当主程序运行到 “LCALL”等指令时,先自动压入断点,再 进入子程序;当执行子程序到最后一条指令RET时,自动弹出断点送PC,返回 主程序; ② 程序中断是随机的。当主程序运行时,遇到中断申请,则CPU执行完当前 指令后,首先自动压入断点,然后转去执行中断服务子程序。当中断服务程 序执行到最后一条指令RETI时,同样弹出断点送PC,返回主程序。
10.2 数据采集及简单控制程序
10.2.3 水位控制程序 1.水位控制原理
• 图 10-6 中虚线表示允许水位变化的上、下限。水塔安装固定的 3 根金属棒。其 中,A棒处于下限水位, A棒接 +5V电源, C棒处于上限水位,B棒在上、下限水 位之间。B棒、C棒各通过一个电阻与地相连。 • 单片机控制电机转动,电机带动水泵供水供水时,水位上升,当达到上限时,由于 水导电,B 、C 棒连通+5V。 b 和c两端均为” 1”.这时,应停止电机工作,不再 供水。 • 当水位降到下限时,B 、C棒都不能与A棒导通,b 和c两端均为”0”。启动电 机供水. • 当水位处于上下限之间,B棒与A棒导通.C棒不能与A棒导通,b端为”1”, c端为“0”状态。应继续维持原有的工作状态。
图10-5 航标灯控制电路
10.2 数据采集及简单控制程序
10.2.2 航标灯控制程序
设:T0定时和R7软件计数可以延时 2s。R7软件计数为40次,T0定时50ms,T0采用模 式1,计数初值为:216-12×50×1000/12=3CB0H
主程序: ORG 0000H AJMP MAIN ORG 0003H AJMP WBINT;外部中断0入口地址 ORG 000BH AJMP T0INT;T0中断入口地址 ORG 0100H MAIN: MOV SP,#30H;设置堆栈指针 CLR P1.7;设灯的初态为“灭” CLR IT0 ;外部中断0为电平触发方式 CLR PX0;外部中断0为低优先级 SETB EX0;允许外部中断0中断 SETB EA;CPU允许中断 HERE: AJMP HERE;等待外部中断请求 外部中断0中断服务程序(由0003H转来): WBINT: MOV TMOD,#01H;T0定时,模式1 MOV TL0,#0B0H;T0计数初值 MOV TH0,#3CH SETB PT0;设T0为高优先级中断 SETB TR0;启动T0 SETB ET0;T0开中断 MOV R7,#40;软件计数值 HERE1: JNB P3.2,HERE1 ;查询INT0,为低(黑夜),等待T0中断 CLR ET0 ;为高(白天),禁止T0中断 CLR TR0;关T0 CLR P1.7;熄灯 RETI;返回主程序 定时器0中断服务程序(由000BH转来): T0INT: MOV TL0,#0B0H;重赋T0初值 MOV TH0,#3CH DJNZ R7,EXIT;软件计数为0吗? MOV R7,#40H ;计数已到,重赋初值 CPL P1.7 ;输出取反控制灯“亮”或“灭” EXIT: RETI;中断返回 END
① 用工作寄存器或累加器传递参数; ② 用指针寄存器来传递参数。
图10-2 调子程序
10.1 主程序和子程序的概念
10.1.2 子程序及参数传递 1.用工作寄存器或累加器来传递参数
例10-1 用程序实现c=a2+b2。 设:a、b和c分别存于内部RAM的DA、DB和DC 3个单元中。通过两次调用子程序查 平方表,结果在主程序中相加得到。 其入口条件是:(A)=待查表的数;出口条件是(A)=平方值。
NADD: MOV CLR MOV ADDC MOV DEC DEC DJNZ INC RET R7,#3;3字节加法 C A,@R0;取加数低字节 A,@R1;取被加数低字节并加到A @R0,A R0 R1 R7,NADD1 R0
NADD1:
10.1 主程序和子程序的概念
10.1.3 中断服务子程序
0 1 1
B (P1.0) 0
1 0 1
操 作 电机运转
维持原状 故障报警 电机停转
图10-7 水塔水位控制电路
10.2 数据采集及简单控制程序
10.2.3 水位控制程序 4.控制程序
图10-8 水塔水位控制程序流程
10.2 数据采集及简单控制程序
10.2.3 水位控制程序 4.控制程序
主程序: LOOP: ORG 0030H ORL P1,#03H;此处书上错 ;为检查水位状态作准备 MOV A,P1 JNB ACC.0,ONE;P1.0=0则转 JB ACC.1,TWO;P1.1=1则转 ACALL D10S;延时10s AJMP LOOP JNB ACC.1,THREE;P1.1=0则转 CLR 93H ;0→P1.3,启动报警装置 SETB 92H ;1→P1.2,停止电机工作 SJMP FOUR CLR 92H;启动电机 AJMP BACK SETB 92H;停止电机工作 AJMP BACK 延时子程序D10S(延时10s): ORG 0100H D10S: MOV R3,#19H LOOP3: MOV R1,#85H LOOP1: MOV R2,#0FAH LOOP2: DJNZ R2,LOOP2 DJNZ R1,LOOP1 DJNZ R3,LOOP3 RET
10.2 数据采集及简单控制程序
10.2 数据采集及简单控制程序
10.2.1 数据采集程序 • 典型数据采集程序框图举例:
图10-2 数据采集总流程图
10.2 数据采集及简单控制程序
10.2.2 航标灯控制程序
例10-3 用89C51单片机试制一个“航标灯”。fosc=12MHZ 要求: ① 黑夜定时周期循环发光,定时间隔为2s,即亮2s,灭2s。 ② 当白天到来时,航标灯应熄灭,停止定时器工作。 编程思路: ① 采用定时加计数的方法定时2 s。 ② 如图10.5所示的光敏三极管来区分白天与黑夜。
10.3 数据处理程序
10.3 数据处理程序
10.3.1 排序程序
例10-4 将片内RAM 50H~59H中的数据按从小到大的顺序排序 解:这是一个排序问题,按从小到大排列称升序排列,反之称降序排列。 根据题意,排序程序在执行时,取前数与后数比较:如果前数小于后数,则继续 顺序比较下去;如果前数大于后数,则前数和后数交换后再继续比较下去。第一 次循环将在最后单元中得到最大的数 (冒泡法)。得到所有数据的升序排列需要经 过多重循环。
BACK: ONE:
FOUR: THREE: TWO:
10.2 数据采集及简单控制程序
10.2.4 蜂鸣器报警子程序
• 压电式蜂鸣器约需10mA的驱动电流 • 当P1.0输出高电平1时,压电蜂鸣器两端获得约+5V电压而鸣叫; • 当 P1.0 输出低电平 0时,压电蜂鸣器两引线间的直流电压降至接近于 0V,蜂鸣 器停止发声。
现以3次采样为例。 3次采样值分别存放在R2、R3和R4中,程序运行之后,将3个数据从小到大顺序排 列,仍然存放在R2、R3和R4中,中值在R3中。
10.3 数据处理程序
10.3.2 数字滤波程序
程序清单: FILT2: MOV A,R2;R2<R3吗? CLR C SUBB A,R3 JC FILT21 MOV A,R2 ;R2>R3时,交换R2和R3 XCH A,R3 MOV R2,A FILT21: MOV A,R3;R3<R4吗? CLR C SUBB A,R4 JC FILT22 ;R3<R4时,排序结束 MOV A,R4 ;R3>R4时,交换R3和R4 XCH A,R3 XCH A,R4;R3>R2吗? CLR C SUBB A,R2 JNC FILT22 ;R3>R2时,排序结束
第10章 系统实用程序
主讲教师:秦晓飞
上海理工大学光电学院
第10章 系统实用程序
§10.1 §10.2 §10.3 §10.4 §10.5 §10.6 主程序和子程序的概念 数据采集及简单控制程序 数据处理程序 代码转换程序 抗干扰技术 最短程序
10.1 主程序和子程序的概念
10.1 主程序和子程序的概念
• 黑夜时 , 无光照, T1 和 T2 均截止,
使INT0=0,发出中断请求。CPU进 入外部中断处理程序 , 启动定时器 工作,利用定时器中断控制灯定时 闪闪发光。用软件查询INT0引脚, 只要INT0=0,定时器便继续工作。
• 白天时,日光使T1导通,T2输出低电
平 ,INT0 = 1, 立即关闭定时器,结 束外部中断处理并返回到主程序。
图10-9 使用7406作驱动的单音频报警电路
图10-10 使用三极管作驱动的单音频报警电路
10.2 数据采集及简单控制程序
10.2.4 蜂鸣器报警子程序
连续鸣音30ms的控制子程序清单:
SND: DL: DL1: SETB MOV MOV DJNZ DJNZ CLR RET P1.0;P1.0输出高电平,启动蜂鸣器鸣叫 R7,#1EH;延时30 ms R6,#0F9H R6,DL1;小循环延时1 ms R7,DL P1.0;P1.0输出低电平,停止蜂鸣器鸣叫