51单片机常用的汇编程序,每个程序都带详细的注释
所有资料下载:
51单片机汇编源程序包 带详细注释.rar
(222.66 KB, 下载次数: 46)
实例1:
- ;************************;
- ;八路模拟数据采集显示电路;
- ; 2001.10.08编 ;
- ;************************;
- ;
- ;70H-77H存放采样值,78H-7BH存放显示数据,依次为个位、十位、百位、通道标志
- ;
- ;*************************************
- ;* *
- ;* 主程序和中断程序入口 *
- ;* *
- ;*************************************
- ORG 0000H ;程序执行开始地址
- LJMP START ;跳至START执行
- ORG 0003H ;外中断0中断入口地址
- RETI ;中断返回(不开中断)
- ORG 000BH ;定时器T0中断入口地址
- RETI ;中断返回(不开中断)
- ORG 0013H ;外中断1中断入口地址
- RETI ;中断返回(不开中断)
- ORG 001BH ;定时器T1中断入口地址
- RETI ;中断返回(不开中断)
- ORG 0023H ;串行口中断入口地址
- RETI ;中断返回(不开中断)
- ORG 002BH ;定时器T2中断入口地址
- RETI ;中断返回(不开中断)
- ;
- ;*************************************
- ;* *
- ;* 初始化程序中的各变量 *
- ;* *
- ;*************************************
- CLEARMEMIO: CLR A ;
- MOV P2,A ;P2口置0
- MOV R0,#70H ;内存循环清0(70H-7BH)
- MOV R2,#0CH ;
- LOOPMEM: MOV @R0,A ;
- INC R0 ;
- DJNZ R2,LOOPMEM ;
- MOV A,#0FFH ;
- MOV P0,A ;P0、P1、P3端口置1
- MOV P1,A ;
- MOV P3,A ;
- RET ;子程序返回
- ;
- ;*************************************
- ;* *
- ;* 主 程 序 *
- ;* *
- ;*************************************
- START: LCALL CLEARMEMIO ;初始化
- MAIN: LCALL DISPLAY ;显示数据一次
- LCALL TEST ;测量一次
- AJMP MAIN ;返回MAIN循环
- NOP ;PC值出错处理
- NOP ;空操作
- NOP ;空操作
- LJMP START ;重新复位起动
- ;
- DISPLAY: MOV R3,#08H ;8路信号循环显示控制
- MOV R0,#70H ;显示数据初址(70H-77H)
- MOV 7BH,#00H ;显示通道路数(0-7)
- DISLOOP1: MOV A,@R0 ;显示数据转为三位十进制BCD码存入
- MOV B,#100 ;7AH、79H、78H显示单元内
- DIV AB ;显示数据除100
- MOV 7AH,A ;商入7AH
- MOV A,#10 ;A放入数10
- XCH A,B ;余数与数10交换
- DIV AB ;余数除10
- MOV 79H,A ;商入79H
- MOV 78H,B ;余数入78H
- MOV R2,#0FFH ;每路显示时间控制 4MS*255
- DISLOOP2: LCALL DISP ;调四位LED显示程序
- DJNZ R2,DISLOOP2 ;每路显示时间控制
- INC R0 ;显示下一路
- INC 7BH ;通道显示数值加1
- DJNZ R3,DISLOOP1 ;8路显示未完转DISLOOP1再循环
- RET ;8路显示完子程序结束
- ;
- ; LED共阳显示子程序,显示内容在78H-7BH,数据在P1输出,列扫描在P3.0-P3.3口
- DISP: MOV R1,#78H ;赋显示数据单元首址
- MOV R5,#0FEH ;扫描字
- PLAY: MOV P1,#0FFH ;关显示
- MOV A,R5 ;取扫描字
- ANL P3,A ;开显示
- MOV A,@R1 ;取显示数据
- MOV DPTR,#TAB ;取段码表首址
- MOVC A,@A+DPTR ;查显示数据对应段码
- MOV P1,A ;段码放入P1口
- LCALL DL1MS ;显示1MS
- INC R1 ;指向下一地址
- MOV A,P3 ;取P3口扫描字
- JNB ACC.3,ENDOUT ;四位显示完转ENDOUT结束
- RL A ;扫描字循环左移
- MOV R5,A ;扫描字放入R5暂存
- MOV P3,#0FFH ;显示暂停
- AJMP PLAY ;转PLAY循环
- ENDOUT: MOV P3,#0FFH ;显示结束,端口置1
- MOV P1,#0FFH ;
- RET ;子程序返回
- ;
- ;LED数码显示管用共阳段码表,分别对应0-9,最后一个是"熄灭符"
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
- ;
- ; 1MS延时子程序,LED显示用
- DL1MS: MOV R6,#14H ;
- DL1: MOV R7,#19H
- DL2: DJNZ R7,DL2
- DJNZ R6,DL1
- RET
- ;
- ;模数转换测量子程序
- TEST: CLR A ;清累加器A
- MOV P2,A ;清P2口
- MOV R0,#70H ;转换值存放首址
- MOV R7,#08H ;转换8次控制
- LCALL TESTART ;启动测试
- WAIT: JB P3.7,MOVD ;等A/D转换结束信号后转MOVD
- AJMP WAIT ;P3.7为0等待
- ;
- TESTART: SETB P2.3 ;锁存测试通道地址
- NOP ; 延时2微秒
- NOP ;
- CLR P2.3 ;测试通道地址锁存完毕
- SETB P2.4 ; 启动测试,发开始脉冲
- NOP ; 延时2微秒
- NOP ;
- CLR P2.4 ; 发启动脉冲完毕
- NOP ;延时4微秒
- NOP ;
- NOP ;
- NOP ;
- RET ;子程序调用结束
- ;
- ; 取A/D转换数据至70H-77H内存单元
- MOVD: SETB P2.5 ;8090输出允许
- MOV A,P0 ;将A/D转换值移入A
- MOV @R0,A ;放入内存单元
- CLR P2.5 ;关闭8090输出
- INC R0 ;内存地址加1
- MOV A,P2 ;通道地址移入A
- INC A ;通道地址加1
- MOV P2,A ; 通道地址送8090
- CLR C ;清进位标志
- CJNE A,#08H,TESTCON ; 通道地址不等于8转TESTCONT再测试
- JC TESTCON ; 通道地址小于8转TESTCONT再测试
- CLR A ; 大于或等于8,A/D转换结束,恢复端口
- MOV P2,A ; P2口置0
- MOV A,#0FFH ;
- MOV P0,A ; P0口置1
- MOV P1,A ; P1口置1
- MOV P3,A ; P3口置1
- RET ; 取A/D转换数据结束
- TESTCON: LCALL TESTART ; 再发测试启动脉冲
- LJMP WAIT ; 跳至WAIT等待A/D转换结束信号
- ;
- END ; 程序结束
复制代码
|