微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 89c51,矩阵键盘控制PWM波

89c51,矩阵键盘控制PWM波

时间:10-02 整理:3721RD 点击:
大神好,请帮我看下程序,没有错误,一直能输出方波,可是用键盘却调不了大小
#include < reg51.h >
void delay(unsigned char t);
unsigned char key;
sbit  KEY=P1^0;                                         //PWM输出
unsigned char PWM=0xce ;         //赋初值脉宽50%

/*********************************************************/
void main()
{  
    TMOD=0x22;                                        //T0、T1方式 2
    TH0=0x9c ;                  //产生频率10kHZ   即周期100us
    TL0=0x9c ;                  //频率调节
    TH1=PWM;                   //脉宽调节
    TL1=PWM;
     EA=1;                                                //开定时器中断T0、T1
     ET0=1;
     ET1=1;                                                //开定时器T0关定时器T1
     TR0=1;
     TR1=0;
{
unsigned char temp;
P2=0xff;
while(1)
{
  do {temp=P2;}
    while(temp==0xff);
    delay(10);
  do{temp=P2;}
    while(temp==0xff);
  switch(temp)
    { case 0xfe:key=1;break;
      case 0xfd:key=2;break;
      case 0xfb:key=3;break;
      case 0xf7:key=4;break;
      case 0xef:key=5;break;
      case 0xdf:key=6;break;
      case 0xbf:key=7;break;
      case 0x7f:key=8;break;
    default:  break;
  }
  while(temp!=0xff)//等待键释放
    {temp=P2;}
}
}
   while(1)
   {
                   if(key==1)                         //增加脉宽
                {
                        if(PWM!=0xfa)
                        {
                                delay(10);
                                if(key==1)
                                {
                                        PWM++;
                                        while(key==1);
                                }
                        }
                }
                if(key==2)                                 //减少脉宽
                {
                        if(PWM!=0x0A)
                        {
                                delay(10);
                                if(key==2)
                                {
                                        PWM--;
                                        while(key==2);
                                }
                        }
                }
            if(key==3)                                //脉宽复位
                {
                        delay(10);
                        if(key==3)
                        {
                                PWM=0xce;
                                while(key==3);
                        }
                }
   }
}
/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1
{  
    TR0=0 ;
    TH1=PWM;                         //赋脉宽值
        TL1=PWM;
    TR1=1;
        TR0=1;
    KEY=0;                       //输出高脉宽
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
    TR1=0 ;
    KEY=1 ;     //输出低脉宽
}
/*********************************************************/
// 延时子程序
/*********************************************************/  
void delay(unsigned char t)
{
    while(t--);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top