51单片机PWM波

jackxiang 2010-7-21 00:09 | |
点击在新窗口中浏览此图片

   这次用的是AT89S52单片机,下面是俺的小程序:


#include <reg52.h>    

#define uchar unsigned char
#define uint unsigned int

sbit LED10 = P2^0;          //要控制的LED 灯
sbit K1= P3^2;              //按键K1

uchar scale;     //用于保存占空比的输出0 的时间份额,总共10 份

void initial();
/*************************************************/
/*      主程序                                       */
/*************************************************/

void main(void)        
{
        uint n;
   initial();                
        while(1)  
        {       ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
  
   if(!K1)      //如果读到K1 为0
                {
                  for(n=0;n<1000;n++); //等待按键稳定
                  while(!K1);     //等待按键松开
                  for(n=0;n<1000;n++);    //等待按键稳定松开

          //for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度
                 scale++;
                 if(scale==10)scale=0;
     }      
        }
}

/***********************************************/
/*        初始化子程序               */
/***********************************************/

void initial()
{
   RCAP2H =0xF3; //赋T2 的预置值,溢出1 次是1/1200 秒钟
    RCAP2L =0x98;      
    TR2=1;          //启动定时器
    ET2=1;          //打开定时器2 中断
    EA="1";
}

/*************************************************/
/*             1/1200 秒定时器2 中断                     */
/*************************************************/

timer2() interrupt 5    
{
        static uchar tt; //tt 用来保存当前时间在一秒中的比例位置
        TF2=0;

        tt++;
        if(tt==10) //每1/120 秒整开始输出低电平
        {
                tt="0";
                if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
                LED10=0;    
        }
                
        if(scale==tt)    //按照当前占空比切换输出高电平
        LED10=1;
                        
}



K1键用来控制亮度,每按一次增加一个亮度级别

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3318/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]