共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 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 28BYJ-48机械臂实现人脸跟随被打赏¥24元 | |
| 基于RK3506B的片温识读功能的实现被打赏¥25元 | |
| 【瑞萨RA8D1测评】基于FreeRTOS的lvgl移植教程被打赏¥29元 | |
| 电子价签墨水屏开发被打赏¥35元 | |
| 【Ozone】RTT 打印终端使用被打赏¥29元 | |
| BMS保护板绝缘检测功能-不平衡电桥技术绝缘电阻检测设计与实现被打赏¥34元 | |
| 给28BYJ-48三自由度机械臂加一个网页控制台被打赏¥32元 | |
| 用28BYJ-48电机从零搭一台三自由度机械臂被打赏¥33元 | |
| 【英飞凌开发经验】ModusToolbox配置EdgeTalk外设被打赏¥27元 | |
| 基于BQ76952PFBR的BMS保护板热插拔损坏的原因和处理措施被打赏¥32元 | |
我要赚赏金
