1、 MOV R5,#05H MOV R6,#35H MOV R7,#21H ACALL DW_MUL AJMP $DW_MUL: MOV R1,#04HCLE: MOV R0,#00H INC R0 DJNZ R1,CLEMU: MOV A,R4 MOV B,R6 MUL AB MOV R0,A MOV A,B ADDC A,R0 MOV B,R7 MOV A,R5 DEC R0END实验三:设计并调试一个将双字节无符号二进制数转换为压缩BCD数的子程序。双字节无符号二进制数转换为压缩BCD数子程序 双字节无符号二进制数的地址放在R0中;存放转换结果(BCD数)的地址放在R1中。 双字节无符号二
2、进制数最大值为0FFFFH,对应的十进制数为65535,其压缩BCD编码表示为06H,55H,35H,所以转换结果应用3个字节存放。 Y=(D15D14D1D0) 2 = (02)+D15)2+D14) 2+) 2+D1) 2+D0) 2。Y0=(02)+D15,Y1= Y0+D14,Y2= Y1+D13,Y15= Y14+D0,Y= Y15。Y0|BCD =( (02)+D15)|BCD,Y1|BCD =( Y0+D14)|BCD, Y15 |BCD = ( Y14+D0)|BCDY |BCD =Y15|BCD 算法:1、Y=02、Y=Y2+Di (i =15,14,2,1,0)3、对Y进行
3、十进制调整4、重复2、3步16次 Y=Y2+Di可用Y=Y+Y+C实现(Di首先放在C中),考虑到Y存放在3个字节,应分别加3次,且要考虑每次加法产生的C。MOV SP,#60H MOV R1,#25H MOV R0,#20H MOV R0,#43H MOV R0,#4AH ACALL DW_BCDDW_BCD:DEC R0 MOV A,R0 MOV R6,A MOV A,R1 MOV R7,A MOV R2,#3CLEAR:CLR A MOV R1,A INC R1 DJNZ R2,CLEAR MOV R3,#16 CLR CYIWEI: MOV A,R6 MOV R0,A MOV A,R0
4、 RLC A MOV A,R7 MOV R1,AFANG: MOV A,R1 ADDC A,R1 DA A DJNZ R2,FANG DJNZ R3,YIWEIMOV R1,#25H MOV R0,#20H MOV R0,#0FFH INC R0 MOV R0,#0FFH ;20H 21H=FFH mov r1,#0efh ACALL DW_BCD AJMP $ DEC R0 MOV A,R0 MOV R6,A MOV A,R1 MOV R7,A ;R7=25h R6=20H MOV R2,#3 CLR A MOV R1,A INC R1 DJNZ R2,CLEAR;25H 26H 27H=0
5、0 MOV R3,#16 CLR C MOV A,R6 MOV R0,A MOV A,R0 RLC A MOV R0,A MOV A,R7 MOV R1,A ADDC A,R1 DA A;16进制到10 进制的转化 DJNZ R2,FANG DJNZ R3,YIWEI RET END实验四:利用外部中断输入引脚(中断方式)控制步进电机的转动。要求:每产生1次中断,步进电机只能步进1步。使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。为便于实验观察和操作,设INT0和INT1中断
6、触发方式为边沿。步进电机的转动控制由外部中断的服务程序来实现。当前步进电机的相位通电状态信息可以使用片内RAM中的一个字节单元来存储。 ORG 0000H LJMP RESET ORG 0003H ;外部中断0 服务程序入口 LJMP INT_EX0 ORG 000BH ;定时器/计数器0 溢出中断服务程序入口 RETI ORG 0013H ;外部中断1 服务程序入口 LJMP INT_EX1 ORG 001BH ;定时器/计数器1 溢出中断服务程序入口 ORG 0023H ;串行口中断服务程序入口 ORG 0040H ;复位处理程序 RESET: MOV SP, #67H SETB IT0
7、SETB IT1 SETB EX0 SETB EX1 MOV 30H,#11110111B CLR A ;累加器A清零 SETB EA MAIN: SJMP MAININT_EX0: ;使用INT0的中断服务程序控制步进电机正向步进 PUSH ACC MOV A,30H RR A ;累加器A的内容向右循环移位一位 MOV 30H,A MOV P1,A POP ACC RETI INT_EX1:使用INT1中断服务程序控制步进电机反向步进 RL A ;累加器A的内容向左循环移位一位 另一种实验方法: ORG 0000H ;复位入口 ORG 0003H ;外部中断0 服务程序入口 ORG 000B
8、H ; ORG 0013H ;外部中断1 服务程序入口 ORG 001BH ; ORG 0023H ;串行口中断服务程序入口 ORG 040H ;复位处理程序 MOV SP,#67H CLR A ;-使用INT0的中断服务程序控制步进电机正向步进 MOV R0,#00H ;正转至TABLE取码指针初值 ABC: MOV A, R0 ;至TABLE取码 MOV DPTR, #TABLE ;存表 MOVC A,A+DPTR ;取表代码 JZ INT_EX0 ;是否取到结束码(00H)? MOV P0, A ; 输出至P0,正转 INC R0 ;取下一个码 JMP ABC ;转至Z_M处,循环 -使
9、用INT1中断服务程序控制步进电机反向步进 MOV R0, #05 ;反转至TABLE取码指针初值 ABC1: MOVC A, A+DPTR ; JZ INT_EX1 ; MOV P0, A ; 输出至P0, 反转 INC R0 ; JMP ABC1 ; 转至F_M1处,循环 RETI ;反转子程序 TABLE: DB 0FCH, 0F9H, 0F3H, 0F6H ;正转 DB 00H ;正转结束码 DB 0F7H, 0F3H, 0FBH, 0F9H ; 反转 DB 0FDH, 0FCH, 0FEH, 0F6H 反转结束码 END ;程序结束实验五:利用定时/计数器测量电动机的转速。使用T1作
10、为定时器(定时时间为50毫秒),T0作为计数器(计数由电机测速电路产生的脉冲个数,每转4个脉冲),每1秒时间后,读出T0的值(读出后须将T0清0),将该值(速度值*4)显示到LCM显示器上(显示子程序/函数由实验库文件提供)。本次实验程序需要使用实验库文件(LCMDRV_12864.LIB)。该库中的子程序/函数占用单片机片内RAM中地址为18H20H的单元,因此实验程序不能使用这些单元。如果用汇编编写实验程序,必须先用$INCLUDE (LCMDRV_12864.INC )指令加载实验库头文件REFRESHDISP EQU 08H ;刷新显示标志SPEED_CNTH EQU 30H ;速度脉
11、冲计数高8位SPEED_CNTL EQU 31H ;速度脉冲计数低8位SECOND_CNT EQU 32H ;秒计数VAR_END EQU 32H ;最后一个字节变量的位置,STACK_INI EQU VAR_END+1 ;须保证足够的空间实验程序架构(汇编):$INCLUDE(LCMDRV_12864.INC) ;包含库程序定义 ORG 0000H ; LJMP RESET ORG 0003H ; RETI ORG 000BH ; ORG 0013H ; ORG 001BH ; LJMP INT_T1 ORG 0023H ; ORG 040H ; MOV SP,#60H ;设置栈底指针 MO
12、V R7,#00H ;初始化显示器(不显示光标) LCALL _LCM_Init SETB ET1 ;此处添加设置中断许可和优先的指令(ET1, PT1) SETB PT1 MOV TMOD,#00010110B ;定时/计数设置 MOV TH1,#3CH ;此处添加设置定时/计数器的指令(TMOD, THx, TLx) MOV TL1,#0B0H MOV TH0,#0 MOV TL0,#0 CLR REFRESHDISP ;清刷新显示标志 MOV SECOND_CNT,#20 ;启动内部定时 SETB TR1 SETB TR0 ;此处添加启动定时/计数的指令(TRx) SETB EA ;开中
13、断 JNB REFRESHDISP,$ ;判断是否需要刷新显示 MOV R7,#01H ;从第2行第8列开始显示速度值(5位数值) MOV R5,#07H MOV R2,SPEED_CNTH MOV R3,SPEED_CNTL CALL _LCM_DispUIntXY内部定时中断服务程序 *INT_T1: MOV TH1,#3CH ;此处添加重置定时常数的指令 MOV A,R7 ;此处添加保护现场内容的指令(如果有的话) PUSH ACC INC R7 CJNE R7,#20,LLEND ;判断一秒钟时间到的指令,没到时间则跳转恢复现场, MOV SPEED_CNTL, TL0 ;记录速度检测
14、计数(供主程序显示用) MOV SPEED_CNTH, TH0 MOV TL0, #00 ;速度检测计数归零 MOV TH0, #00 SETB REFRESHDISP ;设置刷新显示标志 (控制主程序刷新显示)LLEND: POP ACC ;此处添加恢复现场内容的指令(如果有的话) MOV R7,A RETI END实验六:利用8155实现并行I/O扩展。利用P1端口访问CAT24WC02(兼容AT24C02)。程序一: 使用8155实现对并行接口的扩展。利用8155的PA口输入D1区KEY组各按键的状态信息,然后将该状态信息通过单片机的P1口输出到D1区LED组显示。主程序在完成各项初始化
15、设置后,可进入一死循环,在该循环里面不断的读取8155 PA口的信息并将其输出到单片机的P1口。 AJMP MAIN MOV DPTR,#7F00H MOV A,#11110000B MOVX DPTR,A MOV DPTR,#07F01H MOVX A,DPTR MOV P1,A SJMP LOOP程序二:先将单片机内部RAM中30H37H单元的值复制到CAT24WC02中的00H07H单元。然后又将这8个数从CAT24WC02中复制到单片机内部RAM的40H47H单元中 CAT24WC02的器件地址:0A0HCAT24WC02芯片手册CAT24WCxxx.pdf实验七:利用ADC0809/
16、DAC0832实现模拟电压信号的采集与输出。使用T1作为定时器(定时时间为50毫秒),每1秒时间后,启动ADC0809转换,在转换结束后(触发外部中断)读出A/D转换值,将该值输出到DAC0832,并同时显示到LCM显示器上(显示子程序/函数由实验库文件提供)。主程序在完成对INT1和T1的设置后,可进入死循环(等待中断请求)。在T1的中断服务程序中需要使用一存储单元对T1的中断次数进行计数,当计数次数达20次时,意味着定时1秒时间到(参见实验五),此时才启动一次AD转换(通过向ADC0809的一次写操作实现)。AD转换的结束信号作为中断请求(INT1)。在对该中断的响应和服务时,才读出本次A
17、D转换的结果值,该值又作为DA转换的值(向DAC0832写)。为便于理解,数值在显示前应进行BCD转换(库文件自动完成转换)。$INCLUDE(LCMDRV_12864.INC) ;AD_VAL EQU 30H ;AD转换结果值SECOND_CNT EQU 31H ;VAR_END EQU 31H ;STACK_INI EQU VAR_END+1 ;须保证足够的空间 ORG 0000H ; ORG 0003H ; ORG 000BH ; ORG 0013H ; LJMP INT_INT1 ORG 001BH ; LJMP INT_T1 ORG 0023H ; ORG 0040H ; MOV S
18、P,#STACK_INI ;设置栈底指针 LCALL _LCM_Init SETB IT1 ;脉冲触发方式 SETB ET1 SETB EX1 SETB PT1 ;定时/计数器高级中断 CLR PX1 MOV TMOD,#00010000B MOV TH1,#3CH MOV TL1,#0B0H ;设置定时/计数器的指令(TMOD, TH1, TL1) MOV R6,#0 CLR REFRESHDISP ; MOV SECOND_CNT,#20 SETB TR1 JNB REFRESHDISP,$ ; MOV R7,#01H ;从第2行第8列开始显示转换值(5位数值) MOV R2,#00H ;转换值扩展成16位 MOV R3,AD_VALINT_INT1: PUSH ACC MOV DPTR,#3C00H ;此处添加读A/D转换结果的指令 MOV AD_VAL,A ;保存转换结果(供主程序显示用) MOV DPTR,#3800H MOVX DPTR,A ;此处添加启动D/A转换的指令设置刷新显示标志 (刷新显示由主程序完成) POP ACC 此处添加重置定时常数的指令 INC R6 CJNE R6,#20,LL1 ;判断一秒钟时间到的指令, 没到恢复现场, MOV DPTR,#3C00H此处添加启动A/D转换的指令LL1:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1