那位先生对RAMTRON公司的VRS51L3074有研究,请帮帮忙...小弟是个小菜鸟,用51汇编写了一个定时中断的小程序,但是没有中断产生,实在查不出程序有什么问题,没办法了.我是用Timer0做定时器,设置定时溢出中断方式工作.定时器在JTAG调试的时候已经有溢出的标志位产生,但是就是没有中断产生不知道是怎么回事,我用的是Keil uVision 3来编译产生HEX文件的.我怀疑可能是编译器的问题.具体的原代码如下: #include<VRS51L3074_Keil.INC>
T250usFlag BIT 7FH ;Time flag definition(bit address area) T500usFlag BIT 7EH ;Time flag definition (bit addressable area) T1msFlag BIT 7DH T2msFlag BIT 7CH T4msFlag BIT 7BH T10msFlag BIT 7AH T100msFlag BIT 79H
IncTCounterFlag EQU 7FH ;Time counter definition(common data area) ResvITCFlag EQU 7EH ;Reserve the last IncTCounterFlag value T10msCounter EQU 7DH T100msCounter EQU 7CH
ORG 0000H LJMP MAIN
ORG 001BH LJMP TimeInterrupt
ORG 0090H MAIN: LCALL INITTIMER SCAN: LCALL TimeFlagGenerator AJMP SCAN ;//------------------------------------------------------------------------- ;//****************TIMER0 INITIALIZATION(定时器0初始化)*******************// ;//------------------------------------------------------------------------- ;//说明:子程序初始化timer0为16-bit自动重载中断模式下的定时器。 ;//------------------------------------------------------------------------- INITTIMER: MOV GENINTEN,#00H ;Enable all interrupts MOV A,PERIPHEN1 ;Timer0 Enable ORL A,#01H MOV PERIPHEN1,A ;Bit7-Enable SPI CS Line ;Bit6-SPI Interface Enable ;Bit5-I2C Interface Enable ;Bit4-UART1 Interface Enable ;Bit3-UART0 Interface Enable ;Bit2-Timer2 Enable ;Bit1-Timer1 Enable ;Bit0-Timer0 Enable
MOV A,INTSRC1 ANL A,#0F7H MOV INTSRC1,A MOV T0T1CFG,#00H ;Bit7-Not used ;Configure timer0 as a 16-bit timer ;Bit6-Timer1 Gating Enable ;Bit5-Timer0 Gating Enable ;Bit4-Timer1 Clock Source ;Bit3-Timer1 Output Enable ;Bit2-Timer1 8-bit Operating Mode Enable ;Bit1-Timer0 Output Enable ;Bit0-Timer0 8-bit Operating Mode Enable
MOV T0T1CLKCFG,#00H ;Timer0 prescaler initialization
MOV 8BH,#0D8H ;Load TH0 MOV 8AH,#0EFH ;Load TL0
MOV RCAP0H,#0D8H ;The reload capture register initialization MOV RCAP0L,#0EFH
MOV A,INTEN1;Timer0 interrupt enable ORL A,#080H MOV INTEN1,A
MOV GENINTEN,#01H ;Activate global interrupts
MOV T0CON,#04H ;Start timer0
RET ;//------------------------------------------------------------------------- ;//******************TIMER INTERRUPT (定时中断服务程序)*******************// ;//------------------------------------------------------------------------- ;// Description:计数器每250us产生一次中断,中断服务程序定义一个存储单元 ;//IncTCounterFlag用于计算250us的中断产生次数,每次中断,IncTCounterFlag加1 ;//置位250us中断标志中断返回. ;//-----------------------------------------------------------------------// TimeInterrupt:
MOV GENINTEN,#02H ;All interrrupt are deactivated
SETB T250usFlag ;Set 100 microsecond flag
INC IncTCounterFlag ;Increase time counter flag
MOV GENINTEN,#01H ;Activate globe interrupt
RETI
;!!! 下面的程序不用考虑 !!! ;//------------------------------------------------------------------------- ;//******************TIMER FLAG GENERATOR(时间标志产生器)*****************// ;//------------------------------------------------------------------------- ;//说明:时间标志产生器以250us为基本计时单位,中断服务程序每250us产生一次溢 ;// 出中断,中断服务程序设置250us时间中断标志,并使计数器IncTCounterFlag加1 ;// 时间产生器程序定义了ResvITCFlag用于保存上一次计数器IncTCounterFlag的值 ;// 每次程序被调用时,都将IncTCounterFlag的值与上一次的比较,存储单元的8为 ;// 那一位发生改变,并设置相应的时间标志.8位地址单元的高3位未用,低5位与时间 ;// 标志位的关系如下所示: ;// Bit Timer_Flag ;// Bit.0 无 ;// Bit.1 500usFlag ;// Bit.2 1msFlag ;// Bit.3 2msFlag ;// Bit.4 4msFlag ;// Bit.5 未用(可用于产生8msFlag) ;// Bit.6 未用(可用于产生16msFlag) ;// Bit.7 未用(可用于产生32msFlag) ;// 10msCounter 10msFlag ;// 100msCounter_100msFlag ;//资源占用情况:R0、R1、Timer0、内部数据存储器位寻址区79H-7EH、非位寻址区 ;// 的7EH单元。 ;//输出参数:T500usFlag、1msFlag、2msFlag、4msFlag、10msFlag、100msFlag位状态 ;//------------------------------------------------------------------------- TimeFlagGenerator: ;-------------------------------------------- ;--------------Timer run test --------------- ;---测试出Timer0已经启动并且产生了溢出标志--- ;-------------------------------------------- ; MOV A,T0CON ; ANL A,#080H ; JZ TimeFlagGenerator ; MOV A,T0CON ; ANL A,#7FH ; MOV T0CON,A ;-------------------------------------------- MOV A,ResvITCFlag ;Fetch the last IncTCounterFlag value MOV ResvITCFlag,IncTCounterFlag;Reserve the current IncTCounterFlag value in ResvITCFlag XRL A,IncTCounterFlag ;Which bit has been changed ;Set500usFlag: JNB ACC.1,Set1msFlag ;ACC.1无变化跳转 SETB T500usFlag ;有变化,设置500us时间标志 Set1msFlag: JNB ACC.2,Set2msFlag ;ACC.2无变化跳转 SETB T1msFlag ;有变化,设置1ms时间标志 INC T10msCounter ;10毫秒计数器加1 INC T100msCounter;100毫秒计数器加1 Set2msFlag: JNB ACC.3,Set4msFlag ;ACC.3无变化,跳转 SETB T2msFlag ;有变化,设置2ms时间标志 Set4msFlag: JNB ACC.4,Set10msFlag ;ACC.4无变化,跳转 SETB T4msFlag ;有变化,设置4ms时间标志 Set10msFlag: MOV A,T10msCounter ;取10毫秒计数器值 CJNE A,#10,Set100msFlag ;计数器值不等于10跳转 SETB T10msFlag ;计数器值等于10,设置10毫秒时间标志 MOV T10msCounter,#00H ;计数器值清0 Set100msFlag: MOV A,T100msCounter ;取100毫秒计数器值 CJNE A,#100,GeneratorRet ;100毫秒计数器值不等于100跳转 SETB T100msFlag ;计数器值等于100,设置100毫秒时间标志 MOV T100msCounter,#00H ;100毫秒计数器值清0 GeneratorRet: ;子程序返回 RET END
万分感谢! |