cdx9739 发表于 2011-3-2 16:54:08

stc12c5202ad PCA高速脉冲输出125K

以下是汇编程序可以实现125k频率输出:

;定义 STC12C5201 系列 MCU 特殊功能寄存器
IPH EQU 0B7H ;中断优先级高位寄存器
CH EQU 0xF9 ;PCA 计数器高8 位。
CL EQU 0xE9 ;PCA 计数器低8 位。
;------------------------
CCON EQU 0D8H ;PCA 控制寄存器。
CCF0 EQU CCON.0 ;PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。
CCF1 EQU CCON.1 ;PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。
CR EQU CCON.6 ;1:允许 PCA 计数器计数, 必须由软件清0。
CF EQU CCON.7 ;PCA 计数器溢出标志,由硬件或软件置位,必须由软件清0。
CMOD EQU 0D9H ;PCA 工作模式寄存器。
;------------------------
CCAP0H EQU 0FAH ;PCA 模块0 的捕捉/ 比较寄存器高 8 位。
CCAP1H EQU 0FBH ;PCA 模块1 的捕捉/ 比较寄存器高 8 位。
CCAP0L EQU 0EAH ;PCA 模块0 的捕捉/ 比较寄存器低 8 位。
CCAP1L EQU 0EBH ;PCA 模块1 的捕捉/ 比较寄存器低 8 位。
;------------------------
PCA_PWM0 EQU 0F2H ;PCA 模块0 PWM 寄存器。
PCA_PWM1 EQU 0F3H ;PCA 模块1 PWM 寄存器。
CCAPM0 EQU 0DAH ;PCA 模块0 的工作模式寄存器。
CCAPM1 EQU 0DBH ;PCA 模块1 的工作模式寄存器。
CCAPnL_Value EQU 18H ;18H = 24, fosc = 12MHz 时, 高速脉冲输出 = 125KHz
;;f=fosc/(4*CCAPnL)
;------------------------------------------------------------
ORG 0000H
AJMP main
;------------------------------------------------------------
ORG 003BH ;interrupt 7
PCA_interrupt:
PUSH ACC ;4 Clock
PUSH PSW ;4 Clock
CLR CCF1 ;1 Clock, 清 PCA 模块 1 中断标志
MOV A, #CCAPnL_Value ;2 Clock
ADD A, CCAP1L ;3 Clock
MOV CCAP1L, A ;3 Clock
CLR A ;1 Clock
ADDC A, CCAP1H ;3 Clock
MOV CCAP1H, A ;3 Clock
POP PSW ;3 Clock
POP ACC ;3 Clock
RETI ;4 Clock
;此中断服务程序共用 34 Clock, 进入中断服务程序还要数个 Clock

ORG 0060H
main:
MOV SP, #0E0H ;设置堆栈指针
ACALL PCA_init ;调用 PCA 初始化程序
main_loop:
NOP
NOP
NOP
SJMP main_loop
;------------------------------------------------------------
PCA_init: ;PCA 初始化程序
MOV CMOD, #00000010B ;02H,PCA 计数器在空闲模式下继续工作, CIDL = 0
MOV CCON, #00H ;清除 PCA 计数器(CH, CL)计数溢出中断标志, CF = 0
MOV CH, #00H ;清0 PCA 计数器高 8 位
MOV CL, #00H ;清0 PCA 计数器低 8 位
MOV CCAPM1, #01001101B ;4DH, 设置 PCA 模块1 为高速脉冲输出模式,ECCF1=1,允许触发中断
MOV CCAP1L, #CCAPnL_Value ;给模块1 置初值, 此句不可少
MOV CCAP1H, #0 ;给模块1 置初值, 此句不可少
MOV IPH, #01000000B ;PCA 中断的优先级设置为唯一的最高级
MOV IP, #01000000B
SETB EA ;开总中断
SETB CR ;将PCA 计数器打开
RET
;------------------------------------------------------------
END
;------------------------------------------------

以下用C51程序怎么就输出46HZ,不是输出125khz请各位高手分析一下,郁闷了好久!

#include<STC_12c5202ad.h>
void PwmInt()
{
CCON=0x00;
CL=0x00;
CH=0x00;
CMOD=0x02;
Value=0x0018;
CCAP1L=Value;
CCAP1H=Value>>8;
Value+=        0x0018;
CCAPM1=0x4d;
IPH=0x40;
IP=0x40;
CR=1;
EA=1;
}
void main()
{
uint Value;
void PwmInt();
while(1)
{;}
}



void PCA_isr() interrupt 7 using 1
{
CCF1=0;
CCAP1L=Value;
CCAP1H=Value>>8;
Value=Value+0x0018;
}

wuyalang 发表于 2011-3-30 12:30:44

ADDC A, CCAP1H ;3 Clock

汇编的这句话是有进位的加法。
C语言自己算进位,然后加进去就OK。
我试过可以。

tianzhiying 发表于 2012-1-1 21:25:54

LZ能不能告诉我那个STC_12c5202ad.h头文件在哪里下的
或者发给我
谢谢
393494354@QQ.com

zzt8899 发表于 2012-1-1 21:34:27

mark

陈纪友103 发表于 2012-5-13 16:15:15

MARK{:smile:}

优享家 发表于 2014-7-17 01:20:41

wuyalang 发表于 2011-3-30 12:30
ADDC A, CCAP1H ;3 Clock

汇编的这句话是有进位的加法。


怎样加呢

优享家 发表于 2014-7-17 01:21:35

我同样遇到这个问题,怎样处理,输出的频率都是定的,不是我要的那个频率
页: [1]
查看完整版本: stc12c5202ad PCA高速脉冲输出125K