修改定时器中断的2个题(10ms,50ms) 实现流水灯的一个题,让把每个题的源码抄下来 然后再写上计算过程。源码如下:(1)10ms: ;ORG 0000H ; 定义程序的起始地址为0000H ;LJMP RESET_VEC ; 无条件跳转到RESET_VEC标签处 ;ORG 000BH ; 定义下一个代码段的起始地址为000BH ;;LJMP T0_VEC ; 注释掉了一个跳转指令 ;MOV TH0,#3CH ; 把3CH赋值给TH0寄存器 ;MOV TL0,#0B0H ; 把0B0H赋值给TL0寄存器 ;XRL P1,#0FFH ; 把P1寄存器与0FFH进行异或操作 ;RETI ; 返回中断前的状态 ;ORG 0040H ; 定义下一个代码段的起始地址为0040H (2);RESET_VEC: ; 定义一个标签 ;MOV sp,#60H ; 把60H赋值给SP寄存器 ;MOV TMOD,#01H ; 把01H赋值给TMOD寄存器 ;MOV TH0,#3CH ; 把3CH赋值给TH0寄存器 ;;3CB0H ;MOV TL0,#0B0H ; 把0B0H赋值给TL0寄存器 ;;50MS ;SETB ET0 ; 设置ET0寄存器的值为1 ;SETB EA ; 设置EA寄存器的值为1 ;SETB TR0 ; 设置TR0寄存器的值为1,启动T0定时器计数 ;SJMP $ ; 无条件跳转到当前地址(死循环) ;END ; 程序结束 50ms: ;ORG 0000H ;LJMP RESET_VEC ;ORG 000BH ;;LJMP T0_VEC ;MOV TH0, #23H ;MOV TL0, #DBH ;XRL P1, #0FFH ;RETI ;ORG 0040H ;RESET_VEC: ;MOV sp, #60H ;MOV TMOD, #01H ;TO==>MODE1 ;MOV TH0, #0D8H ;;D8F0H ;MOV TL0, #0F0H ;;10MS ;SETB ET0 ;ENABLE T0 INT ;SETB EA ;SETB TR0 ;T0 IS RUNNING ;SJMP $ ;END 3. (1)依次 ORG 0000H LJMP RESET_VEC ORG 001BH MOV TH1,#0BH MOV TL1,#0DCH DJNZ R7,EXIT0 MOV R7,#10H INC R6 MOV A,R6 ANL A,#07H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P1,A EXIT0: RETI ORG 0040H TABLE: DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H RESET_VEC: MOV sp,#60H MOV TMOD,#10H MOV TH1,#0BH MOV TL1,#0DCH MOV R7,#10H MOV R6,#00H MOV P1,#0FEH;1111 1110 SETB ET1 SETB EA SETB TR1 SJMP $ END (2)逐个 ;ORG 0000H ;LJMP RESET_VEC ;ORG 001BH ;MOV TH1,#0BH ;MOV TL1,#0DCH ;DJNZ R7,EXIT0 ;MOV R7,#10H ;MOV A,P1 ;RL A ;MOV P1,A ;EXIT0: ;RETI ;ORG 0040H ;RESET_VEC: ;MOV sp,#60H ;MOV TMOD,#10H ;MOV TH1,#0BH ;MOV TL1,#0DCH ;MOV R7,#10H ;MOV P1,#0FEH;1111 1110 ;SETB ET1 ;SETB EA ;SETB TR1 ;SJMP $ ;END
时间: 2023-07-28 14:07:05 浏览: 146
第一个问题是修改定时器中断的两个题(10ms,50ms)实现流水灯,让把每个题的源码抄下来,然后再写上计算过程。
第一部分(10ms)的计算过程:
1. 时钟源为11.0592 MHz,即1秒钟有11,059,200个时钟周期。
2. 定时器0的工作方式为16位自动重载定时器,即TH0和TL0寄存器的初始值为0x3CB0。
3. 定时器0每计数完一次,即50个时钟周期后会产生一次中断。
4. 因此,我们要求的定时器中断为10ms,即10000微秒。根据时钟源的频率,每微秒有11.0592个时钟周期。因此,10ms有110592个时钟周期。
5. 每50个时钟周期产生一次中断,因此,我们需要计数110592/50=2211.84次才会产生一次10ms的中断。
6. 由于定时器0是16位的,因此,我们需要将计数值分解成TH0和TL0寄存器的初始值。2211.84转换成16进制为0x8A3,即TH0=0x8A,TL0=0x3。
第二部分(50ms)的计算过程:
1. 时钟源为11.0592 MHz,即1秒钟有11,059,200个时钟周期。
2. 定时器0的工作方式为16位自动重载定时器,即TH0和TL0寄存器的初始值为0xD8F0。
3. 定时器0每计数完一次,即65536个时钟周期后会产生一次中断。
4. 因此,我们要求的定时器中断为50ms,即50000微秒。根据时钟源的频率,每微秒有11.0592个时钟周期。因此,50ms有552960个时钟周期。
5. 每65536个时钟周期产生一次中断,因此,我们需要计数552960/65536=8.4375次才会产生一次50ms的中断。
6. 由于定时器0是16位的,因此,我们需要将计数值分解成TH0和TL0寄存器的初始值。8.4375转换成16进制为0x8,即TH0=0x0D,TL0=0xF0。
阅读全文