找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4119|回复: 16
打印 上一主题 下一主题
收起左侧

急求帮助 占空比可调pwm波数两位码管显示占空比

[复制链接]
跳转到指定楼层
楼主
40黑币
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char                                                         
uchar time;
double count=50;        //定义占空比,并初始占空比为50%
sbit PWM=P3^0;      //P2^0口输出PWM
sbit zkb_add=P3^6;   //占空比增加的按键 的I/O口
sbit zkb_dec=P3^7;   //占空比减小 的按键 的I/O口
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};        //共阳极数码管0~9编码

/*******数码管显示占空比********************/
void display_pwm()//占空比显示
{
  uchar shi,ge;
  shi=count/10;    //十位
  ge=count%10;   //个位

  dula=0;
  P1=table[shi];
  delayms(5);
  dula=1;

  wela=0;
  P1=table[ge];
  delayms(5);
  wela=1;
}
/****************延时处理**********************/
void delayms(uint z) //延时xms程序
{
    uint x,y;
        for(y=z;x>0;x--)
                for(y=110;y>0;y--);
}


void keyscan()  //按键扫描
{
     display_pwm();
       if(zkb_add==0)            
       {
               count=count+10;        //每按一次占空比增加按键占空比加10%
               if(count>100)                                 //限定占空比上限
        {
         count=0;
        }
        }
      if(zkb_dec==0)
      {
          count=count-10;                 //每按一次占空比减小按键占空比减10%
               if(count<0)    //限定占空比下限
               {
        count=100;
               }
  }
       
}

/***********定时器0初始化***********/
void timer0_init()
{
  TMOD=0x01; //定时器0工作于方式1
  TH0=(65536-10)/256;
  TL0=(65536-10)%256;
  TR0=1;
  ET0=1;
  EA=1;
}

/**************定时0中断处理******************/
void timer0_init() interrupt 1
{
       
  TR0=0;    //设置定时器初值期间,关闭定时器
  TH0=(65536-10)/256;
  TL0=(65536-10)%256;
  TR0=1;
  time++;

  if(time<count)          //count为占空比
  {
        PWM=1;           //输出高电平
  }
  else
        PWM=0;       
  if(time>=100)
  {
        time=0;
  }

  display_pwm();

}

/*********主函数********************/
void main()
{         
        timer0_init();
        delayms(5);
        while(1)
        {
        keyscan();
        }
       

}
//急急急,仿真后数码管和输出pwm的io口没有变化,一直处于高电平  求助一下论坛的朋友老师,还请指正,单片机界的小学生在此谢过。

QQ图片20181225173204.png (29.81 KB, 下载次数: 143)

QQ图片20181225173204.png

最佳答案

查看完整内容

占空比1~99可调, #include typedef unsigned char uchar; typedef unsigned int uint; sbit Key1=P3^0; sbit Key2=P3^1; sbit PWM=P1^0; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar count,time,i; void delayms(uint k) { uint i,j; for(i=k;i>0;i--) for(j=110;j>0;j--); } void Timer0Init() //100微秒@12.000 ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2018-12-25 17:45 | 只看该作者
本帖最后由 wulin 于 2018-12-29 16:41 编辑

占空比1~99可调,



#include<reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;

sbit Key1=P3^0;
sbit Key2=P3^1;
sbit PWM=P1^0;
uchar  code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar count,time,i;

void delayms(uint k)
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=110;j>0;j--);
}
void Timer0Init()                //100微秒@12.000MHz
{
        TMOD |= 0x02;                //设置定时器模式
        TL0 = 0x9C;                //设置定时初值
        TH0 = 0x9C;                //设置定时重载值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA=1;
        ET0=1;
}
void display()
{
        static bit num=0;
        P0=0x00;
        if(num)
        {
                P2=~0xfe;
                P0=table[i/10];
                num=~num;
        }
        else
        {
                P2=~0xfd;
                P0=table[i%10];
                num=~num;
        }
}

void main( )
{
        Timer0Init();       
        count=99;
        i=100-count;
        while(1)
        {
                if(!Key1)//
                {
                        delayms(10);
                        if(!Key1)
                        {
                                if(count>1)
                                        count--;               
                                while(!Key1);
                                i=100-count;
                        }
                }
                if(!Key2)
                {
                        delayms(10);
                        if(!Key2)
                        {
                                if(count<99)
                                        count++;               
                                while(!Key2);
                                i=100-count;
                        }
                }
        }
}
void timer0() interrupt        1  
{
        time++;
        if(count>=time)
                PWM=1;
        else   PWM=0;
        if(time>99)
                time=0;
        if(time%10==0)
                display();
}

回复

使用道具 举报

板凳
ID:453955 发表于 2018-12-25 19:33 | 只看该作者
啊。我也是初学者。刚刚看了下,我对PWM目前还不是很了解;等我过两天学习了再和你交流~
回复

使用道具 举报

地板
ID:453955 发表于 2018-12-26 11:23 | 只看该作者
你占空比上下限那里有点问题吧。。上下限反了,超过上限应该就是100,不应该是0.。我觉得;还要就是按键防抖延时我好像没看到。?
回复

使用道具 举报

5#
ID:455286 发表于 2018-12-26 12:26 | 只看该作者
我有PWM输出占空比可调周期可调的程序,通过按键调解,并在1602显示当前PWM的信息,需要吗
回复

使用道具 举报

6#
ID:393736 发表于 2018-12-26 14:20 来自手机 | 只看该作者
MR_CHEN12 发表于 2018-12-26 12:26
我有PWM输出占空比可调周期可调的程序,通过按键调解,并在1602显示当前PWM的信息,需要吗

首先感谢这位朋友的回答 。占空比可调的程序我已经有了。现在的问题就是两位共阳极数码管显示的问题。不知道这位朋友能不能帮我看一下程序哪里出问题了 或者电路图。谢谢
回复

使用道具 举报

7#
ID:393736 发表于 2018-12-26 14:23 来自手机 | 只看该作者
我要上哈工大 发表于 2018-12-26 11:23
你占空比上下限那里有点问题吧。。上下限反了,超过上限应该就是100,不应该是0.。我觉得;还要就是按键防 ...

嗯 按键防抖的确没有考虑到 还请这位朋友点拨一下。还有就是现在波形输出无误且可调了。但是数码管不能正常显示 只能亮88 00,不知道怎么回事
回复

使用道具 举报

8#
ID:453955 发表于 2018-12-27 18:39 | 只看该作者
void Motor_speed_high(void)
{
        if(Key1==0)
        {
                  Delay(10);
                  if(Key1==0)
                  {
                    count0 += 25;
  
                    if(count0 >= 100)
                    {
                            count0 = 100;
                    }
                  }
                  while(!Key1);
        }
}

这是我用PWM调电机转速时的程序,就比你多了延时防抖
回复

使用道具 举报

9#
ID:453955 发表于 2018-12-27 18:47 | 只看该作者
还有,朋友你的占空比上下限的设定真的弄反了哈哈哈
回复

使用道具 举报

10#
ID:449525 发表于 2018-12-28 10:24 | 只看该作者
先各个部分确认,你的显示有没有问题?数字都正常显示么?
还有就是pwm用个定时器控制频率,01多少控制占空比,自己去研究下,不难
回复

使用道具 举报

11#
ID:456666 发表于 2018-12-28 15:12 | 只看该作者
嗯 按键防抖的确没有考虑到 还请这位朋友点拨一下。还有就是现在波形输出无误且可调了。但是数码管不能正常显示 只能亮88 00
回复

使用道具 举报

12#
ID:393736 发表于 2018-12-28 23:00 | 只看该作者
huiyu 发表于 2018-12-28 15:12
嗯 按键防抖的确没有考虑到 还请这位朋友点拨一下。还有就是现在波形输出无误且可调了。但是数码管不能正常 ...

数码管显示问题需要改中断时间和数码管延时时间  我的分别是 20ms 和 2ms   
按键消抖目前没整明白
回复

使用道具 举报

13#
ID:393736 发表于 2018-12-29 10:44 | 只看该作者
周超然 发表于 2018-12-28 10:24
先各个部分确认,你的显示有没有问题?数字都正常显示么?
还有就是pwm用个定时器控制频率,01多少控制占 ...

pwm周期20ms pwm端波形没有问题 按键也能控制占空比增减
回复

使用道具 举报

14#
ID:393736 发表于 2018-12-29 21:11 | 只看该作者
wulin 发表于 2018-12-29 15:58
占空比1~99可调,

谢谢你占空比程序  现在有另外的问题就是  输出电压和占空比不线性  
回复

使用道具 举报

15#
ID:438568 发表于 2018-12-30 19:37 | 只看该作者
第一:检查一下数码管是共阴还是共阳,代码里面是共阳
回复

使用道具 举报

16#
ID:393736 发表于 2018-12-30 22:25 | 只看该作者
大懒猫的可乐 发表于 2018-12-30 19:37
第一:检查一下数码管是共阴还是共阳,代码里面是共阳

是共阳
回复

使用道具 举报

17#
ID:465221 发表于 2019-1-9 16:49 | 只看该作者
请问这个有pcb图吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表