深圳大学未来马三诺 2023-07-20 09:34 采纳率: 57.1%
浏览 50

51单片机PWM的占空比数码管显示

51核心板上面遇到一个问题,打算将用key1,key2,控制led灯的功率,外加将占空比在数码管上输出,代码如下,但没办法正常运行,数码管闪烁,led灯不亮,究竟是什么问题,我找不到问题出在那里

#include <reg52.h>
sbit led1=P2^4;
sbit BEEP=P1^0;
sbit SEL0=P2^0;
sbit SEL1=P2^1;
sbit SEL2=P2^2;
sbit SEL3=P2^3;
sbit key1=P3^2;
sbit key2=P3^3;
static arrshumagaun[]={0x03 , 0x9f , 0x25 , 0x0d , 0x99 , 0x49 , 0x41 , 0x1f , 0x01 , 0x09};
static int i=0,s=0,k=0,m;
static void delay(int nms);
 static unsigned int s_iDuty = 50; 
static void delay(int nms)
{
int i,j;
    for (i=0;i<nms;i++)
    {  
                for (j=0;j<123;j++){}
    }
}
static void InitInterrupt(void);
static void InitTimer0(void);
static void InitInterrupt()
{
    
  ET0 = 1;  
  EA  = 1;   
}
static void InitTimer0()
{
  TMOD = 0x02;
  TH0  = 0xFF;  
  TL0  = 0x9C; 
  TR0  = 1;   
}
void main()
{
  InitInterrupt();
  InitTimer0();     
  while (1)
  {
    if (key1==0)
    {
    s_iDuty+=10;
    }
    if (key2==0)
    {
    s_iDuty-=10;
    }
    
    P0=arrshumagaun[s_iDuty];
    SEL0=0;
    delay(3);
    SEL0=1;
    
    P0=arrshumagaun[s_iDuty];
    SEL1=0;
    delay(3);
    SEL1=1;
    
    P0=arrshumagaun[s_iDuty];
    SEL2=0;
    delay(3);
    SEL2=1;
    
  }
}
void Timer0_Handler () interrupt 1
{
  static unsigned int s_iCnt1 = 0;  
  s_iCnt1++;
  if(s_iCnt1 >= 100)      
  {
    s_iCnt1 = 0;         
  }
  if(s_iCnt1 <= s_iDuty)   
  {
    led1 = 1;   
  }
  else
  { 
    led1 = 0;  
  }
}

  • 写回答

1条回答 默认 最新

  • 靓仔系 2023-10-12 16:24
    关注

    数码管的显示需要一定的刷新率,你这个延时时间太长了,在人眼中形成不了完整的图像,所以闪烁。
    还有你这判断按键是否被按下的在程序中占用的时间太短,除非你一直按着,不然靠点击很难进入 s_iDuty+=10这u但语句中

    评论

报告相同问题?

问题事件

  • 创建了问题 7月20日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现