20948|15

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用普通IO口做PWM输出 [复制链接]

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

此帖出自51单片机论坛

最新回复

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
点赞 关注
 

回复
举报

2734

帖子

0

TA的资源

裸片初长成(初级)

沙发
 
建议好好看一下数码管显示那里,指针数组等,或者是段选位选什么的,好好看一看,显示那里应该比较简单
此帖出自51单片机论坛
 
个人签名我爱电子!
 
 

回复

535

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 

回复 楼主 wuwenlin 的帖子

你把其他函数屏蔽掉啊,然后就调试数码管看看。。。
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

4
 

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

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

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

此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

5
 
我仔细检查了段码和位码都没有错啊。一开始我把显示函数放到中断里,显示程序正常,但是PWM输出的频率变成10HZ左右。拿出来频率1KHZ正常。所以请教各位大哥我应该把显示放在那里呢?
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

6
 

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

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

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

[ 本帖最后由 孤獨の快樂 于 2011-11-19 10:07 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

7228

帖子

195

TA的资源

五彩晶圆(高级)

7
 
先一部分一部分测试吧
此帖出自51单片机论坛
 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(中级)

8
 
可以考虑一下液晶,显示内容多,驱动也方便!
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

9
 
数码管每一位都加了PNP三极管。
我把显示放到While(1)中,显示就不行了。
如放在中断函数中显示正常,但PWM频率降到10HZ左右。
所以发贴求助,看显示放那才可以。或者在加些程序呢。。。
此帖出自51单片机论坛
 
 
 

回复

281

帖子

0

TA的资源

一粒金砂(高级)

10
 

以前无聊我也做过

此帖出自51单片机论坛
 
个人签名单纯的EEer~
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

11
 
请大哥支招啊。。谢谢!
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

12
 
少用delay
此帖出自51单片机论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

13
 
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。
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

14
 

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

此帖出自51单片机论坛
 
 
 

回复

108

帖子

0

TA的资源

一粒金砂(高级)

15
 
先一部分一部分测试吧
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

16
 

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

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

可以试试把pwm_disp类型改成uchar

[ 本帖最后由 孤獨の快樂 于 2012-1-20 01:02 编辑 ]
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表