[求助] 用普通IO口做PWM输出

wuwenlin   2011-11-18 19:23 楼主

本人现在想用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);
             }
         }
  }
}

回复评论 (15)

建议好好看一下数码管显示那里,指针数组等,或者是段选位选什么的,好好看一看,显示那里应该比较简单
我爱电子!
点赞  2011-11-18 20:12

回复 楼主 wuwenlin 的帖子

你把其他函数屏蔽掉啊,然后就调试数码管看看。。。
点赞  2011-11-18 21:27

你的位码是共阴的,而你的段码是共阳的

如果你的数码管是共阴的,段码改成uchar code TABLE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F};

如果你的数码管是共阳的,位码改成uchar code disp_bit[]={0x40,0x20,0x10};

点赞  2011-11-19 00:54
我仔细检查了段码和位码都没有错啊。一开始我把显示函数放到中断里,显示程序正常,但是PWM输出的频率变成10HZ左右。拿出来频率1KHZ正常。所以请教各位大哥我应该把显示放在那里呢?
点赞  2011-11-19 08:35

引用: 原帖由 wuwenlin 于 2011-11-19 08:35 发表 我仔细检查了段码和位码都没有错啊。一开始我把显示函数放到中断里,显示程序正常,但是PWM输出的频率变成10HZ左右。拿出来频率1KHZ正常。所以请教各位大哥我应该把显示放在那里呢?

位码断码没错?难道你输出端还加非门了?

我也没看见你在哪用了display函数呀

[ 本帖最后由 孤獨の快樂 于 2011-11-19 10:07 编辑 ]
点赞  2011-11-19 10:00
先一部分一部分测试吧
点赞  2011-11-19 10:09
可以考虑一下液晶,显示内容多,驱动也方便!
点赞  2011-11-19 11:05
数码管每一位都加了PNP三极管。
我把显示放到While(1)中,显示就不行了。
如放在中断函数中显示正常,但PWM频率降到10HZ左右。
所以发贴求助,看显示放那才可以。或者在加些程序呢。。。
点赞  2011-11-19 14:04

以前无聊我也做过

单纯的EEer~
点赞  2011-11-19 15:38
请大哥支招啊。。谢谢!
点赞  2011-11-21 10:16
少用delay
点赞  2011-11-21 16:51
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);
             }这段按键程序不好,一但安下按键就有问题。显示有问题if(down==0);会堵死CPU。
点赞  2011-11-23 20:41

那我该如何解决呢?我现在就是出现这个问题,一直没有解决。请兄弟指点指点。。。

点赞  2011-11-24 09:11
先一部分一部分测试吧
点赞  2012-1-19 16:29

if(up==0);和if(down==0);应该是while(up==0);和while(down==0);吧

试试把其它函数删了,只剩显示函数,会不会错

可以试试把pwm_disp类型改成uchar

[ 本帖最后由 孤獨の快樂 于 2012-1-20 01:02 编辑 ]
点赞  2012-1-20 01:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复