我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1474|回复: 2

[资料贡献] STC单片机PWM程序

[复制链接]
  • TA的每日心情
    无聊
    2024-9-25 10:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    110

    主题

    78

    回帖

    705

    积分

    二级逆天

    积分
    705

    终身成就奖金点子奖

    QQ
    发表于 2016-11-11 09:27:25 | 显示全部楼层 |阅读模式

    STC单片机PWM程序

    我用的是STC12C1052单片机,想产生两个PWM,要求两个PWM波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256,能产生两个这样的PWM波形吗?如果能想知道CL,CH,CCAP0L,CCAP0H,CCAP1L,CCAP1H的值怎么设?
    问题补充:



    *程序思路说明: *
    * *
    *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
    *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样*
    *可以设定占空比可从1-100变化。即0.01ms*100=1ms *
    ******************************************************************************/
    #include <REGX51.H>

    #define uchar unsigned char
    /*****************************************************************************
    * TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; *
    * TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
    * 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *
    * 间为1ms*65536=65.536ms *
    ******************************************************************************/
    #define V_TH0 0XFF
    #define V_TL0 0XF6
    #define V_TMOD 0X01

    void init_sys(void); /*系统初始化函数*/
    void Delay5Ms(void);

    unsigned char ZKB1,ZKB2;

    void main (void)
    {
    init_sys();
    ZKB1=40; /*占空比初始值设定*/
    ZKB2=70; /*占空比初始值设定*/
    while(1)
    {
    if (!P1_1) //如果按了+键,增加占空比
    {
    Delay5Ms();
    if (!P1_1)
    {
    ZKB1++;
    ZKB2=100-ZKB1;
    }
    }

    if (!P1_2) //如果按了-键,减少占空比
    {
    Delay5Ms();
    if (!P1_2)
    {
    ZKB1--;
    ZKB2=100-ZKB1;
    }
    }
    /*对占空比值限定范围*/
    if (ZKB1>99) ZKB1=1;
    if (ZKB1<1) ZKB1=99;
    }
    }


    /******************************************************
    *函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
    void init_sys(void) /*系统初始化函数*/
    {
    /*定时器初始化*/
    TMOD="V"_TMOD;
    TH0=V_TH0;
    TL0=V_TL0;
    TR0=1;
    ET0=1;
    EA="1";
    }


    //延时
    void Delay5Ms(void)
    {
    unsigned int TempCyc = 1000;
    while(TempCyc--);
    }

    /*中断函数*/
    void timer0(void) interrupt 1 using 2
    {
    static uchar click="0"; /*中断次数计数器变量*/
    TH0=V_TH0;


    /*恢复定时器初始值*/
    TL0=V_TL0;
    ++click;
    if (click>=100) click="0";

    if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
    P1_3=0;
    else
    P1_3=1;

    if (click<=ZKB2)
    P1_4=0;
    else
    P1_4=1;

    } <
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    51

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

    QQ
    发表于 2018-3-21 18:01:45 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    51

    主题

    545

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2021-6-28 13:28:29 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表