51学习笔记之利用定时器0产生最大周期为16s的PWM波(STC12C5A60S2)

发布者:Yuexiang666最新更新时间:2024-07-24 来源: cnblogs关键字:51学习  定时器0  PWM波  STC12C5A60S2 手机看文章 扫描二维码
随时随地手机看文章

硬件:STC12C5A60S2 


功能:实现PWM波生成。该程序周期为256ms,输出端口为P1.3。


代码:


#include 'reg51.h'

#include 'intrins.h'

#define FOSC 11059260L

#define T1MS  (65536-FOSC/12/1000)


//定时器产生的脉冲大约为1MS,PWM经过256分频后的时间是256ms

//通过调T1MS的数值,PWM的最大周期时间是16s。


typedef unsigned char BYTE;

typedef unsigned int WORD;


/*Declare SFR associated with the PCA */

sfr CCON = 0xD8; //PCA control register

sbit CCF0 = CCON^0; //PCA module-0 interrupt flag

sbit CCF1 = CCON^1; //PCA module-1 interrupt flag

sbit CR = CCON^6; //PCA timer run control bit

sbit CF = CCON^7; //PCA timer overflow flag

sfr CMOD = 0xD9; //PCA mode register

sfr CL = 0xE9; //PCA base timer LOW

sfr CH = 0xF9; //PCA base timer HIGH

sfr CCAPM0 = 0xDA; //PCA module-0 mode register

sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW

sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH

sfr CCAPM1 = 0xDB; //PCA module-1 mode register

sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW

sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH

sfr PCAPWM0 = 0xf2;

sfr PCAPWM1 = 0xf3;


void Delay_xms(unsigned int z){        

    unsigned char i, j;

    unsigned int k;

    for(k=0;k

        _nop_();

        _nop_();

        i = 12;

        j = 84;

        do{while (--j);} 

        while (--i);

    }

    

}


//定时器0初始化


void Time0Init()

{

    TMOD = 0x01;

    TL0=T1MS;

    TH0=T1MS>>8;

    TR0=1;

    ET0=1;

    EA=1;    

}


void PWMInit()

{

    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/2

    CMOD = 0x04;

    //Disable PCA timer overflow interrupt

    CCAP0H = CCAP0L = 0x80; //PWM0 port output 50% duty cycle square wave

    CCAPM0 = 0x42; //设备为定时器0溢出脉冲

    CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave

    PCAPWM1 = 0x03;

    CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode

    //and no PCA interrupt

    CR = 1; //PCA timer start run

}




void PWMSet(float a)   //输入a表示占空比

{

    CCAP0H =CCAP0L =(BYTE)((1-a)*256);

}


void main()

{


    Time0Init();

  PWMInit();

    PWMSet(0.1);

while(1)

{


        PWMSet(0.5);    //占空比为百分之50

    Delay_xms(2000);

}

}



//定时器0中断

void tm0_isr() interrupt 1 using 1

{

    TL0=T1MS;

    TH0=T1MS>>8;

}


关键字:51学习  定时器0  PWM波  STC12C5A60S2 引用地址:51学习笔记之利用定时器0产生最大周期为16s的PWM波(STC12C5A60S2)

上一篇:51学习笔记之以硬件spi与max6675通信实现K型热电偶测温
下一篇:51学习笔记之关键词data、bdata、idata、pdata、xdata、code的含义

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved