打印

用PCA定时器初值怎么计算!!去解答!!

[复制链接]
6002|8
手机看帖
扫描二维码
随时随地手机跟帖
沙发
ayb_ice| | 2013-1-24 16:26 | 只看该作者
DATASHEET

使用特权

评论回复
板凳
wzy8430121| | 2013-1-24 16:27 | 只看该作者

DATASHEET

使用特权

评论回复
地板
日暮惜乔|  楼主 | 2013-1-24 22:59 | 只看该作者
本帖最后由 日暮惜乔 于 2013-1-24 23:06 编辑
ayb_ice 发表于 2013-1-24 16:26
DATASHEET


不懂。。。麻烦你能说明白点吗??
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC  11059200
#define T100Hz  (FOSC/12/20)
sbit EPCAI=IE^6;
sfr  CCON=0xD8;
sbit CCF0=CCON^0;
sbit CCF1=CCON^1;
sbit CR=CCON^6;
sbit CF=CCON^7;
sfr  CMOD=0xD9;
sfr  CL=0xE9;
sfr  CH=0xF9;
sfr  CCAPM0=0xDA;
sfr  CCAP0L=0xEA;
sfr  CCAP0H=0xFA;
sbit  led=P1^0;
uchar num,num1;
void main()
{
        num=T100Hz;
        CCON=0;
        CL=0;
        CH=0;
        CMOD=0x00;
        CCAP0L=num;
    CCAP0H=num>>8;
        CCAPM0=0x49;
        CR=1;
        EPCAI=1;
        EA=1;
        num1=1;               
        while(1);
}
void PCA_isr() interrupt 7
{
        CCF0=0;
        CCAP0L=num;
        CCAP0H=num>>8;
        num=T100Hz;
        if(num1--==0)
        {
                num1=100;
                led=~led;
        }
}
这个怎么给CCAP0L;CCAP0H;赋值呢??
  CCAP0H=0x78;    //PCA定时器寄存器值,50ms,7.3728MHz
这句是什么意思????拜托拜托

使用特权

评论回复
5
日暮惜乔|  楼主 | 2013-1-24 23:00 | 只看该作者
wzy8430121 发表于 2013-1-24 16:27
DATASHEET

能说的详细点吗

使用特权

评论回复
6
ningling_21| | 2013-1-24 23:40 | 只看该作者
本帖最后由 ningling_21 于 2013-1-25 23:10 编辑

芯片资料,要看懂...

使用特权

评论回复
7
ljl457| | 2013-1-25 09:45 | 只看该作者
/****************************************
                    PCA中断
*****************************************/
void PCA_isr() interrupt 6 using 1
{
    CCF0 = 0;                       //Clear interrupt flag
    CCAP0L = value;
    CCAP0H = value >> 8;            //Update compare value
    value += T100Hz;   
    //后面写你要的程序
   }  
/****************************************
        PCA中断初始化
*****************************************/
void PCA_INIT()
{
    CCON = 0;                       //Initial PCA control register
                                    //PCA timer stop running
                                    //Clear CF flag
                                    //Clear all module interrupt flag
    CL = 0;                         //Reset PCA base timer
    CH = 0;
    CMOD = 0x00;                    //Set PCA timer clock source as Fosc/12
                                                //Disable PCA timer overflow interrupt
    value = T100Hz;
    CCAP0L = value;
    CCAP0H = value >> 8;            //Initial PCA module-0
    value += T100Hz;
    CCAPM0 = 0x49;                  //PCA module-0 work in 16-bit timer mode and enable PCA interrupt

    CR = 1;                         //PCA timer start run
    EPCAI = 1;

}      
它的工作原理是:   第一次给 CCAP0L  CCAP0H 赋的值是value  CR = 1 ;之后 CL 和CH 开始计数,当到达设定的 CCAP0L  CCAP0H 值之后,进入到定时器中断 ,但CL和CH的值没有重新置0 而是继续走,所以CCAP0L  CCAP0H 再次累加上你定时器的初值value += T100Hz;这样第二次走的时间和第一次走的时间是一样的。
打个比方:一个人跑步,他决定要跑10公里,可是他每跑1公里后就想休息下(相当于进入中断),然后继续跑(value += T100Hz),这样10公里跑下来,他得休息10次,每次跑的路程都是一样的,就1公里,他没有来回跑,而是一直往前跑,PCA的定时器就是这个道理。我用的是STC12C5620系列的,这是其中的一个方法,PCA定时器还有一个方法我就不阐述了,DATASHEET里面有。

                  

使用特权

评论回复
评论
日暮惜乔 2013-1-29 10:14 回复TA
很棒!!!感谢!!! 
8
ayb_ice| | 2013-1-25 09:56 | 只看该作者
ningling_21 发表于 2013-1-24 23:40
有个C8051FXXX配置向导软件你试试...

你真聪明,
你知道人家用的一定是C8051F MCU

使用特权

评论回复
9
日暮惜乔|  楼主 | 2013-1-29 10:18 | 只看该作者
ljl457 发表于 2013-1-25 09:45
/****************************************
                    PCA中断
****************************** ...

我要用定时器控制输出频率,如果是200-3000之间输出每次加200,用示波器观察还好,误差很小,,但是当2000-30000输出时就误差很大,,频率有时候乱拉!!这个怎么解决呢??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

19

帖子

0

粉丝