共2条
1/1 1 跳转至页
请大家帮忙看看 看了4天了,也不知道问题出那里了?
问
START:
MOV SP,#60H
CLR CY ;清除进位位
MOV p2,#11111110B ;p2.0 是输出口
MOV p1,#11111111B ;p1.0 p1.1 p1.2 p1.3是输入口
MOV t0_counterH,#0
MOV t0_counterL,#0
MOV t0h_record,#0
MOV t0l_record,#0
MOV TMOD,#11H ;设置工作方式寄存器
SETB IT0 ;下降沿触发外部中断0
MOV TL0,#00H
MOV TH0,#00H
MOV TH1,#00H
MOV TL1,#00H
CLR t0_start_flag
SETB EX0 ;开放外部中断0
SETB TR1
SETB ET1 ;允许T1中断
SETB EA ;CPU开放中断
CLR FLAG0
CLR FLAG
LOOP: JNB FLAG0,LOOP ;等待INT0中断...
CLR EA ;关闭总中断
CLR FLAG0
MOV A,t0_counterL
CJNE A,t0l_record,ALTER
MOV A,t0_counterH
CJNE A,t0h_record,ALTER
SETB EA ;开放总中断
LJMP LOOP
ALTER:
MOV t0l_record,t0_counterL
MOV t0h_record,t0_counterH
MOV R2,#00H ;送被除数和除数
MOV R3,#00H
MOV R4,t0_counterH
MOV R5,t0_counterL
MOV R6,#00H
MOV R7,#50
LCALL NDIV1 ;调用计算子程序
SETB EA ;开放总中断
WAIT: JNB FLAG,WAIT ;去抖
CLR EA ;关闭总中断
CLR FLAG
CLR TR1 ;关闭定时器1
MOV t0_H,R4 ;装载数据
MOV t0_L,R5
MOV A,#0FFH
SUBB A,R5
MOV t0_R5,A
MOV TL1,A
MOV A,#0FFH
SUBB A,R4
MOV t0_R4,A
MOV TH1,A
SETB TR1 ;启动定时器1
SETB EA ;开放总中断
LJMP LOOP
;;;;;;;;;;;;;; 外部脉冲中断子程序(/INT0);;;;;;;;;;;;;;;;;
INT0P:
JB t0_start_flag,NEXT
SETB t0_start_flag
SETB TR0
LJMP over
NEXT:
CLR t0_start_flag
CLR TR0
MOV t0_counterL,TL0
MOV t0_counterH,TH0
MOV TL0,#00H
MOV TH0,#00H
SETB FLAG0
over: NOP
RETI
;;;;;;;;;;;中断IT1子程序/输出方波中断子程序;;;;;;;;;;;;
IT1P:
;clr EX0
CLR TR1 ;关闭定时器1
MOV TL1,t0_R5
MOV TH1,t0_R4
CPL P2.0
SETB TR1 ;启动定时器1
SETB FLAG
;setb EX0
RETI
;;;;;;;;;;;;;;;;;;双字节除法子程序;;;;;;;;;;;;;;;;;;;;
除以50(省略.......)
现在的问题是:输出方波是输入方波的25倍,但是频率有跳变.
比如输入方波频率40HZ,但是输出方波频率在961,1000,998之间跳变,请高手帮忙看看怎么回事?谢谢 答 1: 你得到T0中断时间应当用两次中断时间差求得你只用了一次中断等待,就把计时作为输入周期,这样的结果肯定是错的。解决方法如题 答 2: 请zysunol详细讲讲,是我/INT0中断有问题吗?我用的是T0计数器呀!
MOV SP,#60H
CLR CY ;清除进位位
MOV p2,#11111110B ;p2.0 是输出口
MOV p1,#11111111B ;p1.0 p1.1 p1.2 p1.3是输入口
MOV t0_counterH,#0
MOV t0_counterL,#0
MOV t0h_record,#0
MOV t0l_record,#0
MOV TMOD,#11H ;设置工作方式寄存器
SETB IT0 ;下降沿触发外部中断0
MOV TL0,#00H
MOV TH0,#00H
MOV TH1,#00H
MOV TL1,#00H
CLR t0_start_flag
SETB EX0 ;开放外部中断0
SETB TR1
SETB ET1 ;允许T1中断
SETB EA ;CPU开放中断
CLR FLAG0
CLR FLAG
LOOP: JNB FLAG0,LOOP ;等待INT0中断...
CLR EA ;关闭总中断
CLR FLAG0
MOV A,t0_counterL
CJNE A,t0l_record,ALTER
MOV A,t0_counterH
CJNE A,t0h_record,ALTER
SETB EA ;开放总中断
LJMP LOOP
ALTER:
MOV t0l_record,t0_counterL
MOV t0h_record,t0_counterH
MOV R2,#00H ;送被除数和除数
MOV R3,#00H
MOV R4,t0_counterH
MOV R5,t0_counterL
MOV R6,#00H
MOV R7,#50
LCALL NDIV1 ;调用计算子程序
SETB EA ;开放总中断
WAIT: JNB FLAG,WAIT ;去抖
CLR EA ;关闭总中断
CLR FLAG
CLR TR1 ;关闭定时器1
MOV t0_H,R4 ;装载数据
MOV t0_L,R5
MOV A,#0FFH
SUBB A,R5
MOV t0_R5,A
MOV TL1,A
MOV A,#0FFH
SUBB A,R4
MOV t0_R4,A
MOV TH1,A
SETB TR1 ;启动定时器1
SETB EA ;开放总中断
LJMP LOOP
;;;;;;;;;;;;;; 外部脉冲中断子程序(/INT0);;;;;;;;;;;;;;;;;
INT0P:
JB t0_start_flag,NEXT
SETB t0_start_flag
SETB TR0
LJMP over
NEXT:
CLR t0_start_flag
CLR TR0
MOV t0_counterL,TL0
MOV t0_counterH,TH0
MOV TL0,#00H
MOV TH0,#00H
SETB FLAG0
over: NOP
RETI
;;;;;;;;;;;中断IT1子程序/输出方波中断子程序;;;;;;;;;;;;
IT1P:
;clr EX0
CLR TR1 ;关闭定时器1
MOV TL1,t0_R5
MOV TH1,t0_R4
CPL P2.0
SETB TR1 ;启动定时器1
SETB FLAG
;setb EX0
RETI
;;;;;;;;;;;;;;;;;;双字节除法子程序;;;;;;;;;;;;;;;;;;;;
除以50(省略.......)
现在的问题是:输出方波是输入方波的25倍,但是频率有跳变.
比如输入方波频率40HZ,但是输出方波频率在961,1000,998之间跳变,请高手帮忙看看怎么回事?谢谢 答 1: 你得到T0中断时间应当用两次中断时间差求得你只用了一次中断等待,就把计时作为输入周期,这样的结果肯定是错的。解决方法如题 答 2: 请zysunol详细讲讲,是我/INT0中断有问题吗?我用的是T0计数器呀!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |