找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7524|回复: 1
收起左侧

stc51单片机PCA控制全流程命令

[复制链接]
ID:26188 发表于 2015-2-18 01:10 | 显示全部楼层 |阅读模式
定时器频率
#define   T100Hz   (FOSC / 12 / 100)
方波脉冲频率
#define   T100KHz   (FOSC / 4 / 100000)
struct PCA_
{//PCA_结构数据类型
    unsigned int        Cycle;            //频率
    unsigned int        Match;            //重装值容器
    unsigned int        Dou;              //扩展精度自加容器
    unsigned int        Doub;             //扩展精度终点容器
    unsigned char       PWM_Value;        //脉宽值
}PCA_0,PCA_1;                             //结构变量名
void PCA_isr() interrupt 7 using 1
{
    if(CCF0)
    {
        CCF0 = 0;                  //清中断
        CCAP0L = PCA_0.Match;
        CCAP0H = PCA_0.Match >> 8;  //装入比较值到比较捕获寄存器
        PCA_0.Match += T100Hz;      //计算下次需要装入的值
        if (PCA_0.Dou-- == 0)
            {//如果Dou自减1后为0
            PCA_0.Dou = PCA_0.Doub;  //扩展定时时间
            TI=1;
            Uart1_SendData('0');
        }
    }
    if(CCF1)
    {
        CCF1 = 0;                   //清中断
        CCAP1L = PCA_1.Match1;
        CCAP1H = PCA_1.Match1 >> 8;  //装入比较值到比较捕获寄存器
        PCA_1.Match1 += T100Hz;      //计算下次需要装入的值
        if (PCA_1.Dou-- == 0)
            {//如果Dou自减1后为0
            PCA_1.Dou = PCA_1.Doub;  //扩展定时时间
            TI=1;
            Uart1_SendData('1');
        }
    }

}
void PCA_Timers_Setup()
{
//清空PCA控制器、计数器
    CCON = 0;                 //清计数溢出CF,PCA时钟停止,清模块0、1中断标记
    CL = 0;                   //清PCA16位计数器
    CH = 0;
//计数时钟选择
    CMOD&=0xF1;               //设置PCA 16位计数器工作在12T模式
    //CMOD|=0x02;               //设置PCA 16位计数器工作在2T模式
    //CMOD|=0x04;               //设置PCA 16位计数器使用定时器1溢出计数
    //CMOD|=0x06;               //设置PCA 16位计数器计数使用P1.2\P4.1输入脉冲,最高速度2T
    //CMOD|=0x08;               //设置PCA 16位计数器计数使用系统时钟全速
    //CMOD|=0x0A;               //设置PCA 16位计数器工作在4T模式
    //CMOD|=0x0C;               //设置PCA 16位计数器工作在6T模式
    //CMOD|=0x0E;               //设置PCA 16位计数器工作在8T模式
//计数溢出控制
    CMOD&=0xFE;               //禁止PCA计数器溢出产生中断标志CF
    //CMOD|=0x01;               //允许PCA计数器溢出产生中断标志CF
//模块0定时器与高速方波模式设定装入值
    PCA_0.Match = T100Hz;       //装入100Hz重装值
    CCAP0L = PCA_0.Match;
    CCAP0H = PCA_0.Match >> 8;  //装入比较值到比较捕获寄存器
    PCA_0.Match += T100Hz;      //重装值累加
//模块1定时器与高速方波模式设定装入值
    PCA_1.Match = T100Hz;       //装入100Hz重装值
    CCAP1L = PCA_1.Match;
    CCAP1H = PCA_1.Match >> 8;  //装入比较值到比较捕获寄存器
    PCA_1.Match += T100Hz;      //重装值累加
//模块0PWM模式设定装入值
    CCAP0H = CCAP0L = PCA_0.PWM_Value;   //输出50%PWM波
    CCAP0H = CCAP0L = 0x00;
    PCAPWM0 = 0x00;               //固定输出高
    CCAP0H = CCAP0L = 0xFF;
    PCAPWM0 = 0x03;               //固定输出低
//模块1PWM模式设定装入值
    CCAP1H = CCAP1L = PCA_1.PWM_Value;   //输出50%PWM波
    CCAP1H = CCAP1L = 0x00;
    PCAPWM1 = 0x00;               //固定输出高
    CCAP1H = CCAP1L = 0xFF;
    PCAPWM1 = 0x03;               //固定输出低

//模块0捕获模式设定
    CCAPM0 = 0x11;            //负捕获,开匹配中断CCFO
    //CCAPM0 = 0x21;            //正捕获,开匹配中断CCFO
    //CCAPM0 = 0x31;            //双向捕获,开匹配中断CCFO
//模块1捕获模式设定
    CCAPM1 = 0x11;            //负捕获,开匹配中断CCFO
    //CCAPM1 = 0x21;            //正捕获,开匹配中断CCFO
    //CCAPM1 = 0x31;            //双向捕获,开匹配中断CCFO
//模块0定时器模式设定
    CCAPM0 = 0x49;            //开比较器,允许计数器值与比较器相同时产生中断CCF0
//模块1定时器模式设定
    CCAPM1 = 0x49;            //开比较器,允许计数器值与比较器相同时产生中断CCF0
//模块0高速方波模式
    CCAPM0 = 0x4D;            //与定时器模式相同情况下,TOG置1,在发生匹配时,P1.3\P4.2电位直接翻转
//模块1高速方波模式
    CCAPM1 = 0x4D;            //与定时器模式相同情况下,TOG置1,在发生匹配时,P1.4\P4.3电位直接翻转
//模块0PWM模式
    CCAPM0 = 0x42;            //允许比较器比较,选择PWM开关,硬件产生PWM波,关闭比较中断CCFO
//模块1PWM模式
    CCAPM1 = 0x42;            //允许比较器比较,选择PWM开关,硬件产生PWM波,关闭比较中断CCF1
//公用
    CR = 1;                   //计数器开始计数
    EA = 1;                   //开总中断
    PCA_0.Dou = 0;
    PCA_1.Dou = 0;             //中断内扩展定时时间
}




相关帖子

回复

使用道具 举报

ID:91009 发表于 2015-9-24 23:07 | 显示全部楼层
有问题请教
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表