ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:20.72KB ,
资源ID:25605628      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25605628.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(程序举例.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

程序举例.docx

1、程序举例例1:将内部RAM404FH的16个数据送到外部RAM2000200FH,再将外部2000200FH数据送到内部RAM505FH中。例2:有一变量存放在片内RAM的20H单元,其取值范围为:00H05H。要求编制一段程序,根据变量值求其平方值,并存入片内RAM的21H单元。在程序存储器的一片存储单元中建立起该变量的平方表。用数据指针DPTR指向平方表的首址,则变量与数据指针之和的地址单元中的内容就是变量的平方值。采用MOVC A,A+PC指令也可以实现查表功能,且不破坏DPTR的内容,从而可以减少保护DPTR的内容所需的开销。但表格只能存放在MOVC A,A+PC指令后的256字节内,

2、即表格存放的地点和空间有一定限制。 例3:(双字节无符号数加法)设被加数存放在内部RAM的51H、50H单元,加数存放在内部RAM的61H、60H单元,相加的结果存放在内部RAM的51H、50H单元,进位存放在位寻址区的00H位中。 程序段如下:MOV R0,50H ;被加数的低字节地址 MOV R1,60H ;加数的低字节地址 MOV A,R0 ;取被加数低字节ADD A,R1 ;加上加数低字节MOV R0,A ;保存低字节相加结果INC R0 ;指向被加数高字节INC R1 ;指向加数高字节MOV A,R0 ;取被加数高字节ADDC A,R1 ;加上加数高字节(带进位加)MOV R0,A

3、;存高字节相加结果MOV 00H,C ;保存进位 。 例4:双字节BCD数加法例5:将给定的一个字节二进制码转换十进制码RESULT EQU 30H ORG 00H LJMP STARTSTART: MOV SP,#40H MOV A,#123 LCALL BINTOBAC SJMP $BINTOBAC: MOV B,#100 DIV AB ;除以100得百位数 MOV RESULT,A MOV A,B MOV B,#10 DIV AB ;余数除以10得十位数 MOV RESULT+1,A MOV RESULT+2,B ;余数为个位数 RET END例6:多分支程序跳转ORG 00HSTART

4、: MOV A,#0 CALL FUNCENTER MOV A,#1 MOV A,#2 CALL FUNCENTER MOV A,#3 CALL FUNCENTER LJMP $FUNCENTER: ADD A,ACC ;AJMP为二字节指令,地址偏移量*2 MOV DPTR,#FUNCTAB ;设置基址 JMP A+DPTR ;跳转到目标地址FUNCTAB: AJMP FUNC0 AJMP FUNC1 AJMP FUNC2 AJMP FUNC3FUNC0: MOV 30H,#0 RETFUNC1: MOV 31H,#1 RETFUNC2: MOV 32H,#2 RETFUNC3: MOV 3

5、3H,#3 RET END例7:多字节BCD取补ORG 00HMOV 30H,#12HMOV 31H,#44HMOV 32H,#89HMOV R7,#03H ;设置操作数的字节数MOV R0,#30H ;设置指针NEG: MOV A,R7 DEC A ;取字节数减1至R2中 MOV R2,A MOV A,R0 ;保护指针 MOV R3,ANEG0: CLR C MOV A,#99H SUBB A,R0 ;按字节十进制取补 MOV R0,A ;存回以R0开始的连续单元 INC R0 ;调整数据指针 DJNZ R2,NEG0 MOV A,#9AH ;最低字节单独取补 SUBB A,R0 MOV R

6、0,A MOV A,R3 ;恢复指针 MOV R0,A SJMP $ END例8(无符号数排序程序)在片内RAM中,起始地址为30H的8个单元中存放有8个无符号数。试对这些无符号数进行升序排序。(先执行后判断)数据排序常用的方法是冒泡排序法。执行时从前向后进行相邻数的比较,如数据的大小次序与要求的顺序不符就将这两个数互换,否则不互换。对于升序排序,通过这种相邻数的互换,使小数向前移动,大数向后移动。从前向后进行一次冒泡(相邻数的互换),就会把最大的数换到最后。再进行一次冒泡,就会把次大的数排在倒数第二的位置。设R7为比较次数计数器,初始值为07H,位地址00H为数据互换标志位。 START:C

7、LR 00H ;互换标志清0 MOV R7,#07H ;各次冒泡比较次数 MOV R0,#30H ;数据区首址LOOP: MOV A,R0 ;取前数 MOV 2BH,A ;暂存 INC R0 MOV 2AH,R0 ;取后数 CLR C SUBB A,R0 ;前数减后数 JC NEXT ; 前数小于后数,不互换 MOV R0,2BH DEC R0 MOV R0,2AH ;两数交换 INC R0 ;准备下一次比较 SETB 00H ;置互换标志NEXT:DJNZ R7,LOOP ;进行下一次比较 JB 00H,START ;进行下一轮冒泡 SJMP $ 例9:将内部RAM中起始地址为data的数据

8、串传送到外部RAM中起始地址为buffer的存储区域内,直到发现$ 字符停止传送。由于循环次数事先不知道,但循环条件可以测试到。所以,采用先判断后执行的结构比较适宜。(先判断后执行)程序段如下: MOV R0,#data MOV DPTR,#bufferLOOP0:MOV A,R0 CJNE A,#24H,LOOP1 ;判断是否为 $ 字符 SJMP LOOP2 ;是 $ 字符,转结束LOOP1:MOVX DPTR,A ;不是 $ 字符,执行传送 INC R0 INC DPTR SJMP LOOP0 ;传送下一数据 LOOP2: 例10:(利用累加器或寄存器)编写程序,实现c=a2+b2 。设

9、a,b,c分别存于内部RAM的30H,31H,32H三个单元中。程序段如下: START:MOV A,30H ;取a ACALL SQR ;调用查平方表 MOV R1,A ;a2 暂存于R1中 MOV A,31H ;取b ACALL SQR ;调用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存结果 SJMP $SQR : MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR ; RET TAB :DB 0,1,4,9,16 ,25,36,49,64,81 例11:(利用存储器)将R0和R1指向的内部RAM 中两个3字节无符号整数相加,结果送到由R0指向

10、的内部RAM中。入口时,R0和R1分别指向加数和被加数的低位字节;出口时,R0指向结果的高位字节。低字节在高地址,高字节在低地址。 实现程序:NADD: MOV R7,#3 ;三字节加法 CLR C ;NADD1:MOV A,R0 ;取加数低字节 ADDC A,R1 ;被加数低字节加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 RET 例12:(利用堆栈)把内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。 MAIN:MOV A,20H ; SWAP A PUSH ACC ;参数入栈 ACALL H

11、EASC POP ACC MOV R0,A ;存高位十六进制数转换结果 INC R0 ;修改指针 PUSH 20H ;参数入栈 ACALL HEASC POP ACC MOV R0,A ;存低位十六进制数转换结果 SJMP $HEASC:MOV R1,SP ;借用R1为堆栈指针 DEC R1 DEC R1 ;R1指向被转换数据 XCH A,R1 ;取被转换数据 ANL A,#0FH ;取一位十六进制数 ADD A,#2 ; 所加值为MOVC与DB间字节数 MOVC A,A+PC ;查表 XCH A,R1 ;1字节指令,存结果于堆栈 RET ;1字节指令ASCTAB:DB 30H,31H,32H

12、,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H 例13:做单一的左移/右移,八个二极管接在P1端口上。输出”0“时,发光二极管亮。先从P1.0到P1.7,然后从P1.7到P1.0。ORG 00HSTART: MOV A,#0FEH ;设置输出初值 SETB C ;进位标志置1S1: MOV P1,A ;输出A值 LCALL DELAY RLC A ;A带进位右移 JC S1 ;若移位次数达到8次,重设输出初值 MOV A,#7FH SETB CS2: MOV P1,A ;将新的A值输出 LCALL DELAY RRC A JC S

13、2 LJMP STARTDELAY: MOV R5,#20 ;延时子程序D1: MOV R6,#20D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END例14:AT89C51单片机的P1.0到P1.3端口接四个发光二极管D1到D4,P1.4到P1.7端口接了四个开关,编程将开关的状态反映到发光二极管上.(每个开关相对应不同的发光二极管) ORG 00HSTART: MOV A,P1 ;读取P1口数据 SWAP A ;交换A中高四位与低四位的位置 ORL A,#0F0H ;与0F0H进行或运算 MOV P1,A ;将开关状态送LED显示

14、SJMP START END例15:AT89C51单片机的P3.2/INT0引脚接一个开关,模拟外部中断源,编写程序,当外部中断发生时,对其作出响应(以发光二极管的灯的状态来显示)LED BIT P1.0 LEDBUF EQU 30H ORG 00H LJMP START ORG 03H ;外部中断入口 LJMP INTERRUPTSTART: CLR LEDBUF CLR LED MOV TCON,#01H ;外部中断0下降沿触发 MOV IE,#81H ;打开外部中断允许围(EX0)及总中断允许位(EA) LJMP $ ;等待中断INTERRUPT: PUSH PSW ;保护现场 CPL

15、LEDBUF ;取反LED MOV C,LEDBUF MOV LED,C POP PSW ;恢复现场 RETI END例16:定时/计数器可以用来实现定时,计数,频率测量,脉冲宽度测量,产生信号,等。用AT89C51单片机定时/计数器0的定时功能可构成一简单的方波发生器,实现周期为400us的方波输出。若改变定时/计数器0的初值可得到不同周期的方波输出。ORG 00HSJMP STARORG 0BHSJMP T0FSTAR: MOV TMOD,#0 ;T0工作方式0 MOV P3,#03FH MOV TH0,#0F9H ;赋初值高位 MOV TL0,#18H ;赋初值低位 MOV IE,#0F

16、FH ;中断允许设置 SETB TR0 ;启动T0 SJMP $T0F: CPL P3.5 ;输出信号取反 CPL P3.7 MOV TH0,#0F9H ;重装初值 MOV TL0,#18H CPL P3.0 RETI END例17:AT89C51的定时/计数器T0产生2s的定时。每当2s定时到来时,更换指示灯闪亮。每个指示灯闪亮时间位0.2s。如此的循环下去。0.2s的闪亮时间也由定时/计数器T0来完成。COUNT EQU 30HFLASH EQU 31H ORG 00H SJMP START ORG 0BH ;定时器0中断入口 LJMP INT_T0START:MOV COUNT,#00H

17、 MOV FLASH,#00H MOV TMOD,#01H ;定时器工作方式1 MOV TH0,#(65536-50000)/256 ;定时器初值 MOV TL0,#(65536-50000) MOD 256 MOV IE,#82H ;开中断 SETB TR0 ;启动定时器 SJMP $ ;等待中断INT_T0:MOV A,COUNT CJNE A,#00H,I1 ;D1闪亮 CPL P1.0 INC FLASH MOV A,FLASH CJNE A,#40,RETUNE ;达到2s? MOV FLASH,#00H INC COUNT LJMP RETUNE ;D2闪亮 I1: CJNE A,

18、#01H,I2 CPL P1.1 INC FLASH MOV A,FLASH CJNE A,#40,RETUNE ;达到2s? MOV FLASH,#00H INC COUNT LJMP RETUNE I2: CJNE A,#02H,I3 ;D3闪亮 CPL P1.2 INC FLASH MOV A,FLASH CJNE A,#40,RETUNE ;达到2s ? MOV FLASH,#00H INC COUNT LJMP RETUNE I3: ;D4闪亮 CJNE A,#03H,RETUNE CPL P1.3 INC FLASH MOV A,FLASH CJNE A,#40,RETUNE ;达

19、到2秒? MOV FLASH,#00H MOV COUNT,#00H LJMP RETUNE RETUNE: MOV TH0,#(65536-50000)/256 MOV TL0,#(65536-50000) MOD 256 RETI END例18:P2口接动态数码管的字形码笔端,P3.2和P3.3接动态数码管的数位选择端,P3.7接一个开关,编写程序,使得开关接低电平时,在两位数码管上滚动显示12345字样,开关接低电平时,在两位数码管滚动显示“HELLO”字样。KEY BIT P3.7 ;按键位HB BIT P3.2 ;数码管高位LB BIT P3.3 ;数码管低位FLAG BIT 00H

20、 :;标志位 ORG 00HSTART: JB KEY,S1 ;判断按键是高电平还是低电平 MOV DPTR,#TABLE1 ;如果是低电平,为12345显示码首地址 CLR FLAG LJMP S2S1: MOV DPTR,#TABLE2 ;如果是高电平,为“HELLO显示码首地址 SETB FLAGS2: MOV R0,#00H ;数码管偏移地址高位显示码 MOV R1,#01H ;数码管偏移地址低位显示码K1: MOV R7,#100 ;延时常数L1: SETB LB CLR HB MOV A,R0 MOVC A,A+DPTR ;查高位段码 MOV P2,A LCALL DELAY ;数

21、码管高位显示 SETB HB CLR lB MOV A,R1 MOVC A,A+DPTR ;查低位段码 MOV P2,A LCALL DELAY ;数码管低位显示 DJNZ R7,L1 JB FLAG,J1 ;扫描一次后,判断按键电平是否变化 JB KEY,START LJMP J2J1: JNB KEY,STARTJ2: INC R0 INC R1 CJNE R0,#06H,K1 ;判断是否循环完一次 LJMP STARTDELAY: MOV R5,#5 ;延时D1: MOV R6,#250 DJNZ R6,$ DJNZ R5,D1 RETTABLE1: DB 00H,06H,5BH,4FH

22、,66H,6DH,00HTABLE2: DB 00H,76H,79H,38H,38H,3FH,00H END例19:采用74LS164驱动七段数码管,单片机串行移位的输出作为74LS164的输入,74LS164的输出作为段码驱动7段数码管。编写程序,在2位独立的数码管上显示“51字样。DBUF0 EQU 30H ;存储区首地址TEMP EQU 40HDIN BIT 0B0H ;串行口输出CLK BIT 0B1H ;时钟输出口 ORG 00H MOV 30H,#1H MOV 31H,#5HDISP: MOV R0,#DBUF0 ;存入显示数据 MOV R1,#TEMP MOV R2,#2 DP1

23、0: MOV DPTR,#SEGTAB ;表头地址 MOV A,R0 MOVC A,A+DPTR ;查表指令 MOV R1,A INC R1 INC R0 DJNZ R2,DP10 MOV R0,#TEMP ;段码地址指针 MOV R1,#2 ;段码字节数 DP12: ;输出子程序 MOV R2,#8 MOV A,R0 ;取段码 DP13: RLC A ;段码左移 MOV DIN,C ;输出一位段码 CLR CLK ;发送移位脉冲 SETB CLK DJNZ R2,DP13 INC R0 DJNZ R1,DP12 SJMP $ SEGTAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4 DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9 DELAY: ;延时子程序 MOV R4,#03H AA1: MOV R5,#0FFH AA: DJNZ R5,AA DJNZ R4,AA1 RET END

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1