• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

PWM程序分析!

#include < reg51.h >
#include < intrins.h >

sbit  K1 =P0^0 ;                    //增加键
sbit  K2 =P0^1 ;                    //减少键
sbit  BEEP =P1^5 ;                //蜂鸣器
sbit  LED = P2^0;
unsigned char PWM=0x7f ;   //赋初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);


void main()

     P1=0xff;
    TMOD=0x21 ;
    TH0=0xfc ;             //1ms延时常数
    TL0=0x66 ;            //频率调节

    TH1=PWM ;            //脉宽调节
    TL1=0 ;

     EA=1;
     ET0=1;
     ET1=1;
   
     TR0=1 ;

   while(1)
   {
     do{
            if(PWM!=0xff)
           {PWM++ ;delayms(10);}
           else Beep() ;
         }
     while(K1=0);

     do{
           if(PWM!=0x02)
          {PWM-- ;delayms(10);}
           else Beep() ;
          }
     while(K2=1);
   }
}

/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1

    TR1=0 ;
    TH0=0xfc ;
    TL0=0x66 ;
    TH1=PWM ;
    TR1=1 ;
    LED=0;      //启动输出
}

/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
    TR1=0 ;
    LED=1 ;     //结束输出
}

/*********************************************************/
//蜂鸣器子程序
/*********************************************************/

void Beep()    
  {
      unsigned char i  ;
      for (i=0  ;i<100  ;i++)
        {
          delay(100)  ;
          BEEP=!BEEP  ;                //Beep取反
        }
     BEEP=1  ;                            //关闭蜂鸣器
     delayms(100);
  }

/*********************************************************/
// 延时子程序
/*********************************************************/ 
void delay(unsigned char t)
 {
    while(t--)   ;
 }

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)

{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0 ; i < 120 ; i++) ;
     }
}

 

 

以下这部分哪位大师能详细分析下吗,为什么t没有给值就自减,还有delayms(10)是把下面的MS延时乘以10次吗??????????????????

void delay(unsigned char t)
 {
    while(t--)   ;
 }

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)

{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0 ; i < 120 ; i++) ;
     }
}

 

还有下面的TR1=0后为什么又写TR1=1??????

// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1

    TR1=0 ;
    TH0=0xfc ;
    TL0=0x66 ;
    TH1=PWM ;
    TR1=1 ;
    LED=0;      //启动输出

全部回复(3)
正序查看
倒序查看
LV.1
2
2011-11-01 08:21

这个顶起啊

0
回复
kinto
LV.5
3
2011-11-01 08:45

我来献丑:

1:void delay(unsigned char t)
 {
    while(t--)   ;
 }

这里t是由外边赋值的:unsigned char t

2,在定时中断处理程序中,先要关闭定时中断,待事情处理完毕后再启动定时中断,以免在定时中断没有处理完又进入该中断,造成死循环

0
回复
scyan
LV.5
4
2011-11-01 09:33
楼主你还要花2天的时间看看基础的吧。推荐你看视屏教程。个人认为霖峰的不错,你可以到优酷搜索,认真的话2天你这几个问题就都明白了。
0
回复