共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |