打印

详细注解的PWM c程序 给初学者的

[复制链接]
3862|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
还我今生|  楼主 | 2008-6-23 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stc2052.h"
unsigned int pulse_width_MAX = 0xF0;        // ;PWM 脉宽最大值, 占空比 = 93.75%
unsigned int pulse_width_MIN = 0x10;        // ;PWM 脉宽最小值, 占空比 = 6.25%
unsigned int step =0x38;
unsigned int pulse_width;
unsigned int i,j;
unsigned char state;
void PCAinit();                         //PCA模块初始化
void delay1ms(unsigned int TIME);       //1ms延时程序(大概是1ms)
void zhankongbi();                      //调节占空比
void st();                             //用来表示pulse_width的状态函数

void main(void)
{
    EA=0;
    PCAinit();            //初始化PCA定时器

    zhankongbi();
}

void PCAinit()
{
    CMOD=0x80;              //PCA 在空闲模式下停止 PCA 计数器工作
                          //PCA 时钟模式为fosc/12
                          //禁止 PCA 计数器溢出中断
    CCON=0x00;            //禁止 PCA 计数器工作, 清除中断标志、计数器溢出标志
    CL=0X00;              //清0计数器 
    CH=0X00;                 
//下面设置模块0为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.7(第11脚)输出
    CCAPM0=0x42;          //PCA(计数器阵列)模块0的工作模式 :8位PWM工作模式
    PCA_PWM0=0x00;          //赋值为0,pwm才能有高电平输出
//下面设置模块1为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.5(第9脚)输出
    CCAPM1=0x42;          //PCA(计数器阵列)模块1的工作模式 :8位PWM工作模式
    PCA_PWM1=0x00;        //赋值为0,pwm才能有高电平输出 

    EPCA=1;                // 开 PCA 中断
    EA =1;                // 开总中断
    CR=1;                //将PCA 计数器打开
}
void zhankongbi()
{
    pulse_width=pulse_width_MIN;
    while(1)
    {
        st();
        if(state==0)
        {
            pulse_width+=step;
        
        }             
        if(state==1)    
        {
            pulse_width-=step; 
    
           }
        CCAP0H=pulse_width;             // 模块0站空比的比较值
        CCAP1H=pulse_width;             // 模块1站空比的比较值
           delay1ms(1000);    
    }
}
                              
void delay1ms(unsigned int TIME)
{
    for(i=0;i<TIME;i++)
        for(j=0;j<400;j++)
        {;}    
}


void st()
{
    if(pulse_width==pulse_width_MIN)
        state=0;
    if(pulse_width==pulse_width_MAX)
        state=1;
}

相关帖子

沙发
还我今生|  楼主 | 2008-6-23 11:09 | 只看该作者

程序功能说明

程序在P3.7和P3.5都输出3.9k的PWM信号 
其脉冲宽度从6.25% 慢慢递增到93.75%
然后在从93.75%递减到6.25%
程序完全由本人自己写的,非网摘。
这也是本人自己写的第一个比较完善的程序,
现分享给大家,希望给有心学习的初学者
(其实我也是初学者,嘿嘿,高手应该能从我的程序中看出来)
一点帮助。
也希望各位大虾提出优化意见。

注:程序生成hex文件 在stc12c2052ad单片机上调试通过,误差极小。

使用特权

评论回复
板凳
还我今生|  楼主 | 2008-6-23 11:11 | 只看该作者

漏了一点 所用晶振为12M

使用特权

评论回复
地板
还我今生|  楼主 | 2008-6-24 13:56 | 只看该作者

霍霍 自己顶一个

使用特权

评论回复
5
wrainp| | 2008-6-24 14:41 | 只看该作者

ding --

  ding --

使用特权

评论回复
6
wrainp| | 2008-6-27 00:50 | 只看该作者

step

为什么 step =0x38啊?

那每次pulse_width+=step;就是加0x38?   这个数值是怎么得到的?

使用特权

评论回复
7
hotpower| | 2008-6-27 02:44 | 只看该作者

.

使用特权

评论回复
8
gyt| | 2008-6-27 13:39 | 只看该作者

不错不错

使用特权

评论回复
9
keaiduole| | 2008-8-3 22:16 | 只看该作者

还行,做个记号先、、、、、、、

使用特权

评论回复
10
songzhige| | 2012-12-3 22:41 | 只看该作者
一堆乱码,,怎么看的明白,,

使用特权

评论回复
11
icecut| | 2012-12-3 23:00 | 只看该作者
lz自己写的怎么这么多nbsp啊...莫非你用网页写的?

使用特权

评论回复
12
528388812| | 2012-12-3 23:02 | 只看该作者
这是程序?还是什么?

使用特权

评论回复
13
1638574407| | 2012-12-4 00:17 | 只看该作者
好乱啊

使用特权

评论回复
14
logokfu| | 2012-12-4 00:21 | 只看该作者
icecut 发表于 2012-12-3 23:00
lz自己写的怎么这么多nbsp啊...莫非你用网页写的?

论坛新改版的缘故

使用特权

评论回复
15
zhang7676050| | 2012-12-4 09:28 | 只看该作者
什么也看不清,一堆乱码

使用特权

评论回复
16
hdl551890| | 2012-12-5 09:51 | 只看该作者
确实乱码比内容多

使用特权

评论回复
17
yuanxiaote| | 2012-12-6 21:55 | 只看该作者
拷贝到记事本里,改后缀为HTML,立刻清楚明白

使用特权

评论回复
18
wdliming| | 2012-12-6 22:09 | 只看该作者
yuanxiaote 发表于 2012-12-6 21:55
拷贝到记事本里,改后缀为HTML,立刻清楚明白

试过了,不错!

使用特权

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

本版积分规则

217

主题

1381

帖子

1

粉丝