共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 跳转至页
回复
打赏帖 | |
---|---|
C语言函数宏的三种封装方式被打赏50分 | |
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769LVGL优化显示被打赏26分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】STM32F769驱动ST7789以及显示优化被打赏36分 | |
【分享开发笔记,赚取电动螺丝刀】S32K146 PAL模拟I2C驱动适配被打赏23分 | |
我想要一部加热台+电源硬件设计规范被打赏16分 | |
我想要一部加热台+LED背光驱动芯片RT9293知识被打赏18分 | |
【分享开发笔记,赚取电动螺丝刀】S32K146 ADC 模块配置使用被打赏24分 |