用普通IO口做PWM输出

2019-03-24 19:27发布

本人现在想用IO口做PWM输出,频率1KHz,然后用两按键(+、-)来调节占空比0-100%,对应数码管显示000-100。 现波形是OK了,也可以调占空比,但是出现一个问题数码管显示乱七八糟,调了两天都没有调好,还请大哥们帮忙指 点。   #include<reg52.h>
#define uint   unsigned int
#define uchar unsigned char
sbit up=P2^0;       //加1按键 
sbit down=P2^1;     //减1按键   
sbit pwm_out=P1^0;  //PWM输出端口  
char disp=0;       //显示计数器
char pwm_disp=50;   //占空比显示单元,初始化为中间值     
     timer0_count=100;//定时中断计数器 
uchar code disp_bit[]={0xbf,0xdf,0xef}; //数码管位码 P2.4,P2.5,P2.6      
uchar code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管段码        0,1,2,3,4,5,6,7,8,9 
void display(); //延时子函数 
void delay(int x)
{
 int i,j;           
 for(i=0;i<x;i++)
 for(j=1;j<120;j++);
}          //T0定时器初使化 
void init()
{
  TMOD=0x01;          //T0方式1计时       
  TH0=(65536-8)/256;  //定时10uS
  TL0=(65536-8)%256;
  EA=1;               //总中断开    
  ET0=1;              //定时器0开    
  TR0=1;     //启动定时器
} //T0定时中断子函数 
void timer0() interrupt 1 using 0
{
  TH0=(65536-8)/256;  //重置定时初值 10uS  
  TL0=(65536-8)%256;
  if(pwm_disp==timer0_count )//占空比计数器等于定时中断计数器否 
      {
        pwm_out=1;        //开通输出
      }        
   
  if(timer0_count==0)   //定时中断计数器为0否  
     {
       pwm_out=0;         //关断输出     
       timer0_count=100;  //重置初始值
     }
  timer0_count--;
} //显示子函数   
void display()
{   delay(10);
    switch(disp)           
      {  case 0:
           {
       P2=0xbf;                 //P2为位码  
             P0=TABLE[pwm_disp/100];  //P0为段码    
    break; 
           }
         case 1:
           {
             P2=0xdf;       
             P0=TABLE[(pwm_disp%100)/10];
    break; 
           }
         case 2:
           {
             P2=0xef;       
             P0=TABLE[pwm_disp%10]; 
    break; 
           }       }
  disp++;//显示计数器加1    
  if(disp>=3)//显示计数器等于3     
     disp=0; //则清零    
} //主程序  
void main()
{  
  init();
   while(1)
     {
    if(up==0)//增1键按下否    
         { delay(10);
            if(up==0)      
             { pwm_disp++;
               if( pwm_disp>100)
               pwm_disp=0;
      if(up==0);
             }
          }
       if(down==0)//减1键按下否  
         { delay(10);
            if(down==0)  
            { pwm_disp--;
              if( pwm_disp==0)
               pwm_disp=100;    
      if(down==0);
             }
         }
  }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。