找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1915|回复: 2
收起左侧

stc15单片机pca用T0分频,只能用16位自动重载模式吗

[复制链接]
ID:92556 发表于 2020-8-21 22:52 | 显示全部楼层 |阅读模式



想要实时改变输出的频率,比如用按键调节不同的频率

想使用T0,模式1,改变重载数值,的方法来改变,输出频率但是不行,

只能象下面一样用16位自动重载模式吗


//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "STC15W401AS.h"

//-----------------------------------------------

#define FOSC 11059200L

#define CCP_S0 0x10               //P_SW1.4
#define CCP_S1 0x20               //P_SW1.5
//-----------------------------------------------
#define uint unsigned int
#define uchar unsigned char
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
    //P10 = ! P10;                    //将测试口取反
}

/* Timer2 interrupt routine */
void tm2_isr() interrupt 12
{
    //P11 = ! P11;                    //将测试口取反
}
float PL;
int Xt1,Xt0;
        float t1,t0;
        uchar hZ1,l1,h0,l0;

//-----------------------------------------------

void Init_usart1()
{   
          SCON=0X50;
          T2L=(65536-(FOSC/4/19200));   //这个单片机没有定时器1,因此,用定时器2作为波特率发生器。
    T2H=(65536-(FOSC/4/19200))>>8;
    AUXR=0x14;                //T2为1T模式,并启动定时器2
    AUXR|=0x01;               //选择定时器2为串口1的波特率发生器
    ES=1;                     //使能串口1中断
    EA=1;
}

void dutyANDf(void)
{


        t1=0.5/PL;                             //高电平时长
        t0=(1/PL)-t1;                        //低电平时长
        Xt1=65536-1000000*t1;        //高电平的时长转换成的定时器16位数
        Xt0=65536-1000000*t0;;  //低电平的时长转换成的定时器16位数

        hZ1=(uchar)(Xt1>>8);     //高电平高八位保存
        l1=(uchar)Xt1;                //高电平低八位保存
       // h0=(uchar)(Xt0>>8);     //低电平高八位保存
       // l0=(uchar)Xt0;                //低电平低八位保存


}


/* main program */
void main()
{
                P1M1 &= ~1; //P1.x 设置为推挽输出
    P1M0 |=  1;
       
               
                ACC=P_SW1;                    //读取外围设备控制切换寄存器
    ACC&=~(CCP_S0|CCP_S1);        //CCP_S0=0 CCP_S1=0,设置PWM0输出在P1.1引脚。
    P_SW1=ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
    CCON=0;                       //初始化PCA控制器                                                                      //??CF                                    //????????
    CL=0;                         //复位PCA寄存器高低位
    CH=0;                         //
    CMOD=0x84;                    //设置PCA时钟源为T0的溢出,且禁止所有PCA定时器溢出中断(PCA不作定时器功能)

       
                /*****************************PWM0 - P1.1***************************************/               
    PCA_PWM0=0x80;                //PCA模块0为6位模式                                       
    CCAP0H=CCAP0L=0x20;           //PWM0占空比50% ((40H-20H)/40H)
               
//        CCAP0H=CCAP0L=0x00;           //PWM0占空比50% ((40H-20H)/40H)
          CCAPM0=0x42;                  //允许CCAPM1比较器功能和PWM功能       
                /*****************************PWM1 - P1.0***************************************/       
               
                PCA_PWM1=0x80;                //PCA模块0为6位模式                                       
    CCAP1H=CCAP1L=0x30;           //PWM1占空比25% ((40H-30H)/40H)
          CCAPM1=0x42;                  //允许CCAPM2比较器功能和PWM功能               
               
               
                AUXR |= 0x80;                   //定时器0为1T模式
                 TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)

         TH0 = (65535-156)/256;
                 TL0 = (65535-156)%256;                   //初始化计时值
    TR0 = 1;                        //定时器0开始计时

               
    CR=1;                         //启动PCA运行
    while (1);


}

回复

使用道具 举报

ID:213173 发表于 2020-8-22 06:03 | 显示全部楼层
自动重载模式同样可以随时改变重载数值,自动重载模式比非自动重载模式定时更精准。
回复

使用道具 举报

ID:92556 发表于 2020-8-26 00:36 | 显示全部楼层
wulin 发表于 2020-8-22 06:03
自动重载模式同样可以随时改变重载数值,自动重载模式比非自动重载模式定时更精准。

好的,,谢谢回复  我用定时器,中断实现了实时改频率,有空再按你说的试下,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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