打印
[51单片机]

STC单片机PWM波调节的一个程序咨询

[复制链接]
2036|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mokedeng|  楼主 | 2014-3-11 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我用STC12C5A60S2 写的一个PWM波形的程序,现在是能发送出一个正常的PWM波形。
我在程序的后面还假如的按键增加或减少占空比。但是这个占空比却不能调整。
麻烦各位能给我指点一下程序的错误在哪里

还有一个是在  void PWM0_set (uchar z)   这个语句中有一个警告。我没有搞懂警告是什么意思


谢谢了



#include<STC12C5A60S2.H> //头文件


#include <intrins.h>


#define uchar unsigned char
#define uint unsigned int
uchar z;
uchar keyval;


sbit S1=P2^0;        //将S1位定义为P2.0引脚
sbit S2=P2^1;        //将S2位定义为P2.1引脚

/*******************************************************************/
/*                                                                                                                                  */
/* 延时子程序     20M晶振  1MS                                                                                                              */
/*                                                                                                                                  */
/*******************************************************************/
void delay(uint time)
{
        int a,y;
        for(a=time;a>0;a--)
         for(y=206;y>0;y--);
}






/**********************************************************************************************/

/*********************************************************************************************
函数名:PWM0占空比设置函数
调  用:PWM0_set();
参  数:0x00~0xFF(亦可用0~255)
返回值:无
结  果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
备  注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**********************************************************************************************/


void PWM0_set (uchar z)
{
        CCAP0L= z; //设置值直接写入CCAP0L
        CCAP0H= z; //设置值直接写入CCAP0H
}



/*************************************************
函数功能:按键按下 占空比增加
**************************************************/
void duty_cycle_add()
{
  z=z+10;
}


/*************************************************
函数功能:按键按下 占空比减少
**************************************************/
void duty_cycle_reduce()
{
  z=z-10;
}

void main()
{
       
        CCON=0;                           //初始化PCA控制寄存器,清除CF
        CL=0;
        CH=0;
        CMOD=0x00;           //设定PWM波的输出频率
        CCAP0L=0x80; //设置PWM0输出值为50%占空比的方波
        CCAP0H=0x80;
        CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)  P1.3作为PWM输出

        CR=1; //启动PCA定时器
       
    TMOD=0x01;      //使用定时器T0的模式1
    EA=1;           //开总中断
    ET0=1;          //定时器T0中断允许
    TR0=1;          //启动定时器T0
    TH0=(65536-50000)/256;    //定时器T0赋初值,每计数50000次(30ms)发送一次中断请求
    TL0=(65536-50000)%256;    //定时器T0赋初值
    keyval=0;              //按键值初始化为0,什么也不做

    while(1)
        {
                switch(keyval)
                                  {
                                     case 1:duty_cycle_add();
                                                 break;
                                          case 2:duty_cycle_reduce();
                                                 break;

                                   }
        }         
}






/*************************************************
函数功能:定时器T0的中断服务子程序
**************************************************/
void Time0_serve(void) interrupt 1 using 1
{
if((P2&0x03)!=0x03)         //第一次检测到有键按下
                     {
                              delay(20);   //延时20ms再去检测
                                        if(S1==0)      //按键S1被按下
                                        {
                                           delay(20);
                                   if(S1==0)
                                           keyval=1;

                                         }
                                        if(S2==0)      //按键S2被按下
                                        {
                                           delay(20);
                                   if(S2==0);
                                           keyval=2;
                                        }
                                 }       

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}

相关帖子

沙发
草民| | 2014-3-11 22:17 | 只看该作者
1、没看到你调用void PWM0_set (uchar z)函数;
2、中断服务程序里好几个delay(20),势必影响中断的实时性。

使用特权

评论回复
板凳
mokedeng|  楼主 | 2014-3-12 11:21 | 只看该作者
草民 发表于 2014-3-11 22:17
1、没看到你调用void PWM0_set (uchar z)函数;
2、中断服务程序里好几个delay(20),势必影响中断的实时性 ...

但是我想给按键防抖   那这样的话防抖的延时用在什么地方呢

使用特权

评论回复
地板
草民| | 2014-3-12 12:49 | 只看该作者
mokedeng 发表于 2014-3-12 11:21
但是我想给按键防抖   那这样的话防抖的延时用在什么地方呢

可以多进几次中断,而不是在中断里停留太久。

使用特权

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

本版积分规则

20

主题

38

帖子

0

粉丝