《汇编语言的单片机程序设计》由会员分享,可在线阅读,更多相关《汇编语言的单片机程序设计(39页珍藏版)》请在金锄头文库上搜索。
1、 单片机接口技术及应用单片机接口技术及应用 汇编语言的单片机程序设计汇编语言的单片机程序设计 *应用电子系3 汇编语言的单片机程序设计汇编语言的单片机程序设计课程目录n一、程序设计概述一、程序设计概述n二、汇编语言的伪指令二、汇编语言的伪指令n三、汇编语言的典型程序结构三、汇编语言的典型程序结构n四、汇编语言的子程序设计四、汇编语言的子程序设计n五、汇编语言实用子程序举例五、汇编语言实用子程序举例n六、几个端口实验的任务书六、几个端口实验的任务书*1.延时子程序设计例:编写例:编写10ms延时子程序。(假设晶振频率延时子程序。(假设晶振频率为为12MHZ)D10ms: MOV R5,#10 ;
2、1usD1ms: MOV R4,#249 ;1us DL: NOP NOP DJNZ R4,DL ;4x249=996us DJNZ R5,D1ms ;2us,总循环共(1+996+2) 10=9990us RET; 2us*延时子程序设计要点:u初始化:循环次数赋值初始化:循环次数赋值u循环体次数计算:晶振频率循环体次数计算:晶振频率机器周期机器周期循循环体时间环体时间循环次数循环次数u精确计算:考虑赋值次数与时间,还要考虑精确计算:考虑赋值次数与时间,还要考虑进入与返回时间进入与返回时间u进入时,应注意子程序使用到的寄存器的保进入时,应注意子程序使用到的寄存器的保护;返回时,无参数带出。护
3、;返回时,无参数带出。u多时间延时子程序如何设计?多时间延时子程序如何设计?外循环次数参数带入,内循环时间固定。外循环次数参数带入,内循环时间固定。*子程序:DLnms: NOPD1ms: MOV R4,#249 DL: NOP NOP DJNZ R4,DL DJNZ R5,D1ms RET; 主程序: MOV R5,#n CALL DLnms 多时间延时子程序调用*2.输入设备子程序设计拨码开关电路设计拨码开关状态的读取?设置输入端口读输入端口保存输入值KEYRD: MOV P3, #0FFH MOV A, P3 MOV R5, A RET*轻触开关电路设计轻触开关状态的读取?设置输入端口读
4、输入端口去抖动保存输入值*ANYKEY:MOV P3,#0FFHNOKEY: MOV A,P3 CPL A JZ NOKEY ;无键按下 MOV TEMP,P3 ;有键按下,TEMP为存储器单元,保存结果 CALL D10ms MOV A,P3 CJNE A, TEMP,NOKEY;去抖 MOV R5,A; 保存按键 SETB 00H;有键标志 RET *例:有二个轻触开关,分别控制二个计数器,例:有二个轻触开关,分别控制二个计数器,每按一次,计数器加每按一次,计数器加1,最大分别加到,最大分别加到5与与9,又从,又从0开始。编写其子程序。开始。编写其子程序。寄存器资源分配: R3、R4:保存
5、计数值 R5:保存开关值设计关键点: 是否有按键? 有按键,是什么键? 是否同一次按下的键?*按键判断、去抖ANYKEY: MOV P3,#03HNOKEY: MOV A,P3 ORL A, #0FCH CPL A JZ NOKEY MOV TEMP,A CALL D10MS MOV A,P3 ORL A, #0FCH CPL A CJNE A,TEMP,NOKEY MOV R5,A RETKEYAGIN: MOV P3,#03HKEYTA: MOV A, P3 ORL A, #0FCH CPL A CJNE A,TEMP, KEYCH SJMP KEYTAKEYCH: NOP RET按键释放
6、判断*计数控制COUNTER: MOV A,R5 CJNE A,#01,KEY2CON CJNE R3,#05,CON1ADD MOV R3,#00H SJMP CONOVERCON1ADD: INC R3 SJMP CONOVERKEY2CON: CJNE R4,#09H,CON2ADD MOV R4,#00H SJMP CONOVERCON2ADD: INC R4CONOVER: NOP RET*主程序引用: TEMP EQU 30H ORG 0000H LJMP MAIN ORG 00100HMAIN: MOV R3,#00HMOV R4,#00HLOOP: LCALL DISPLCAL
7、L ANYKEYLCALL COUNTERLCALL KEYAGIN SJMP LOOPDISP: MOV A,R3 SWAP A ORL A, R4 MOV P1, A RET *问题:1. 分析程序工作过程多个子程序调用关系2. 如何分解任务(判键去抖计数键盘再次判断显示)3. 显示从P1口输出,用发光二极管代替,也可以用带译码的数码实现4. 修改程序,将程序修改为二键,先选择需要调整的计数位(可以闪烁显示),再用相同二键分别实现加减功能改变计数值。*3.信号处理(运算)子程序设计例:编写多字节无符号数的减法子程序。设2个多字节无符号数的低字节地址分别存于R0和R1中,低字节在高地址单元。
8、相减后的差存放在减数原来的位置。子程序入口:(R0)=被减数低字节地址; (R1)=减数的低字节地址; (R7)=字节数子程序出口: (R1)=差的高字节地址;*程序:ORG 0000H ljmp MAIN ORG 0040HMAIN: MOV R0,#37H MOV R1,#3FH ACALL NSUB SJMP $NSUB: MOV R7,#3 CLR CNSUB1: MOV A,R0 SUBB A,R1 MOV R1,A DEC R0 DEC R1 DJNZ R7,NSUB1 INC R1 RET END*例:利用子程序实现c=a2+b2。设a,b,c分别存于内部RAM的30H,31H,
9、32H三个单元中。 子程序入口:(A)=预平方数; 子程序出口:(A)=平方值;*SQR: MOV DPTR,#TAB MOVC A,A+DPTR RETTAB: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 ENDORG 0000H LJMP MAIN ORG 0040HMAIN: MOV 30H,#4 MOV 31H,#5 MOV A,30H ACALL SQR MOV R1,A MOV A,31H ACALL SQR ADD A,R1 MOV 32H,A SJMP $*例:将1位十六进制数转换成相应的ASCII码。设十六进制数存放在R0中,转换后的ASCII
10、码存放于R2中。ORG 0000H ljmp MAINORG 0040H MAIN:MOV R0,#0BH ACALL HASC SJMP $HASC: MOV A,R0 ANL A,#0FH PUSH ACC CLR C SUBB A,#0AH POP ACC JC LOOP ADD A,#07HLOOP: ADD A,#30H MOV R2,A RET END*例:双字节二进制数转换成BCD码。设(R2R3)为双字节二进制数,(R4R5R6)为转换完的压缩型BCD码。ORG 0000H ljmp MAIN ORG 0040HMAIN: MOV R2,#0B2H MOV R3,#1BH AC
11、ALL DCDTH SJMP $*DCDTH: CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,#16LOOP: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R7,LOOP RET END*4.输出设备子程序设计例:数据端与P0口正序连接。编写程序,实现功能:上电后数码管显示“P”,1秒后,显示
12、从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,重新开始。 *ORG 0000H JMP START ORG 0100HSTART: MOV SP,#5FH MOV P0,#8CH ;显示P MOV P3,#0FFH CALL D_1S CALL DISP JMP START*DISP: MOV R7,#16 MOV R2,#0LOOP: MOV A,R2 MOV DPTR,#CODE_P0 MOVC A,A+DPTR MOV P0,A INC R2 SETB RS0 ;切换组 CALL D_1S CLR RS0 DJNZ R7,LOOP RET D_1S:(子程序) CODE_P0
13、:DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H, DB 0C6H,0A1H,86H,8EH *有时为方便走线而采用逆序连接,显示段码要进行调整:CODE_P2:DB 03H,9FH,25H,0DH,99H,49H,40H,1FH DB 01H,09H,11H,0C1H,63H,85H,61H,71HCODE_P0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH试比较: *1.本章总结2.编程思路3.端口输入出与编
14、程验证*例:P1口与开关及LED发光二极管的接口电路如图所示,其中,作并行输出口,分别与LED3LED0连接。当输出为1,即高电平时,LED不发光;输出为0,即低电平,LED发光。作并行输入口,分别接开关K3K0,通过开关的不同位置向输入“0”或“1”开关信号。要求读入引脚上的开关K3K0的预置状态,再经输出驱动LED3LED0发光二极管,使发光二极管显示开关状态。*LED34.7KK31KK21KK11KK01K+5VLED24.7KLED14.7KLED0P1.77407P1.3P1.2P1.1P1.08051P1.67407P1.57407P1.474074.7K*编写程序如下:ORG
15、0000HMAIN:MOV A, #0FFH MOV P1, A ;置P1低4位为输入,高4位输出灭显示 MOV A, P1 ;输入P1低4位的开关状态 SWAP A ;将低4位输入的数据转到高4位 MOV P1, A ; 将开关状态输出驱动相应的LED显示HERE: SJMP HEREEND*用一个准备好状态标志来表示每当开关状态K3K0设置完成后,将准备好状态标志置“1”,否则此标志为“0”,用一个开关S表示,当按钮按下引脚为“1”,说明开关设置完成。S开关不下压,P2.3=0,未准备好。那么,CPU就查询这个“S”,一直查到S=1为止。输入过程如图:设置K3K0查S=1否?S=1输入数据
16、送L3L0 显示*LED34.7KK31KK21KK11KK01K+5VLED24.7KLED14.7KLED0P1.77407P1.3P1.2P1.1P1.08051P1.67407P1.57407P1.474074.7K RVCCS P2.3*输入状态信息输入数据Ready?NY程序如下: TEST: MOV P2,#0FFH MOV A,P2 ANLA,#01H JZTEST MOV P1,#0FH MOV A,P1 SWAP A MOV P1,A 修改程序,用一个主程序+2个子程序实现*P1.3P1.2P1.1P1.0P2.0RVCCSP1.7P1.6P1.5P1.47447DCBA8051例:用一片74LS4(BCD-七段数码转换器)可外接一只共阳极七段数码管。要求不用延时的方法看到显示内容。欲显示的数据事先放在片内RAM30H起始的数据区内,共10个显示内容。*思考与实践1、数据端与P0口正序连接。编写程序,分别实现功能:上电后数码管显示“P”,按下任何键后,显示从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,进入等待按键状态。 2、数据端与P0口逆序连接,有二个轻触开关与P3连接。编写程序,分别实现功能: 上电后数码管显示“P”闪烁,按下其中一键后,变化字符,字符有16种变化;按下另一键,变化闪烁频率,有10种明显的频率变化。 *谢谢大家!*思考与实践*