本帖最后由 山水2000 于 2014-6-28 09:36 编辑
我做了一个跟据PWM宽度来解码的程序,设计在800uS PWM时解码,但800uS时无法解码,而是800uS的2倍1600uS时解码成功,不明求解,谢谢。
脉宽在800uS是无法反转,而在它的2倍1600uS时才能返转,不明白什么原因,
https://www.yleee.com.cn/forum.php?mod=image&aid=216513&size=300x300&key=c69ae6a5042337cf&nocache=yes&type=fixnone
1.6mS是才能解码,800uS时无法解码,不明白为什么是原来的2倍才能解码成功
程序如下,汇编的,我只会一点点汇编,C的不懂。
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F104E T0扩展为外部下降沿中断举例--------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-755-82905966 -------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* 如果要在文章中应用此代码,请在文章中注明使用了宏晶科技的资料及程序 */
/*---------------------------------------------------------------------*/
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//芯片的工作频率为10.0592MHz
AUXR DATA 08EH //辅助寄存器
;-----------------------------------------------------
ORG 0000H
LJMP MAIN //复位入口
ORG 000BH //中断入口
LJMP T0INT
;------------------------开始-------------------------
ORG 0100H
MAIN:
MOV SP,#3FH
MOV AUXR,#80H //定时器0为1T模式
MOV TMOD,#04H //设置定时器0为16位自动重装载外部记数模式
MOV A,#0FFH //设置定时器0初始值
MOV TL0,A
MOV TH0,A
SETB TR0 //定时器0开始工作
SETB ET0 //开定时器0中断
SETB EA
SJMP $
;----------------------PWM检测------------------------
//中断服务程序
;----------------------PWM大于800uS-------------------
T0INT:
CALL DELAY //调用800uS延时,检测小于800uS PWM信号
JB P3.4,LM //(高电平转移)小于800uS 就跳转到下一程序则行
CPL P3.0
CLR P3.1
RETI
;----------------------PWM小于800uS-------------------
LM: //(小于800uS)运行程序
CLR P3.0
CPL P3.1 //将测试口取反
RETI
;------------------------延时-------------------------
DELAY:
DELAY800US: ;误差 -0.032552083333us
MOV R6,#84H
DL0:
MOV R5,#20H
DJNZ R5,$
DJNZ R6,DL0
RET
;------------------------结束-------------------------
END
|