找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6273|回复: 9
收起左侧

为什么单片机数码管一直在闪烁?

[复制链接]
ID:427104 发表于 2018-11-15 23:12 | 显示全部楼层 |阅读模式
        初学者 弄了一个60分钟倒计时,为什么 数码管一直在闪烁、

  1. #include <REGX51.H>
  2. #include <intrins.h>  
  3. void Delay1000ms();
  4. void Delay5ms();
  5. char temp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  6. void main (void)
  7. {
  8. char i = 10;
  9. char shi = 5;
  10. char bai = 9;
  11. char qian = 5;
  12. while(1)
  13. {
  14. P2 = temp[i--];
  15. Delay1000ms();
  16. if(i<0)i=9,shi--;
  17. if(shi<0)shi=5,bai--;
  18. if(bai<0)bai=9,qian--;
  19. if(qian<0)i=0,shi=0,bai=0,qian=0;

  20. {
  21.   P3_2 = 1;
  22.   P3_3 = 1;
  23.   P3_4 = 1;
  24.   P2 = temp[qian];
  25.   P3_1 = 0;
  26.   Delay5ms();
  27.   P3_1 = 1;
  28.   P3_3 = 1;
  29.   P3_4 = 1;
  30.   P2 = temp[bai];
  31.   P3_2 = 0;
  32.   Delay5ms();
  33.   P3_1 = 1;
  34.   P3_2 = 1;
  35.   P3_4 = 1;
  36.   P2 = temp[shi];
  37.   P3_3 = 0;
  38.   Delay5ms();
  39.   P3_1 = 1;
  40.   P3_2 = 1;
  41.   P3_3 = 1;
  42.   P2 = temp[i];
  43.   P3_4 = 0;
  44.   Delay5ms();
  45. }
  46. }
  47. }
  48. void Delay1000ms()  //@11.0592MHz
  49. {
  50. unsigned char i, j, k;
  51. _nop_();
  52. i = 3;
  53. j = 26;
  54. k = 223;
  55. do
  56. {
  57.   do
  58.   {
  59.    while (--k);
  60.   } while (--j);
  61. } while (--i);
  62. }

  63. void Delay5ms()  //@11.0592MHz
  64. {
  65. unsigned char i, j;
  66. i = 9;
  67. j = 24;
  68. do
  69. {
  70.   while (--j);
  71. } while (--i);
  72. }
复制代码




回复

使用道具 举报

ID:203000 发表于 2018-11-16 10:40 | 显示全部楼层
因为你在15行设了“Delay1000ms();”1秒延时。
回复

使用道具 举报

ID:269211 发表于 2018-11-16 13:59 | 显示全部楼层
延时问题,调一下延时
回复

使用道具 举报

ID:302640 发表于 2018-11-16 16:27 | 显示全部楼层
是的,延时时间过长,在人眼可视范围内就变成闪烁了
回复

使用道具 举报

ID:354116 发表于 2018-11-16 19:02 | 显示全部楼层
延时太长,把延时调到人眼能识别的40ms以下,就可以了
回复

使用道具 举报

ID:423511 发表于 2018-11-16 19:50 | 显示全部楼层
Delay1000ms延迟时间太长,我把12行的while语句里的内容改了一下,你试一下:
回复

使用道具 举报

ID:423511 发表于 2018-11-16 19:54 | 显示全部楼层
Delay1000ms()延迟时间太长,我把第12行的while语句中的内容改了一下,Delay1000ms()那段语句就不用要了,你试一下:
while(1)
{
         for(j=10;j>0;j--)
         {
          for(i=25000;i>0;i--)
          {
     P2 = temp[10-j];
                 if(j<1)shi--;
     if(shi<0)shi=5,bai--;
     if(bai<0)bai=9,qian--;
     if(qian<0)i=0,shi=0,bai=0,qian=0;

    {
      P3_2 = 1;
      P3_3 = 1;
      P3_4 = 1;
      P2 = temp[qian];
      P3_1 = 0;
      Delay5ms();
      P3_1 = 1;
      P3_3 = 1;
      P3_4 = 1;
      P2 = temp[bai];
      P3_2 = 0;
      Delay5ms();
      P3_1 = 1;
      P3_2 = 1;
      P3_4 = 1;
      P2 = temp[shi];
      P3_3 = 0;
      Delay5ms();
      P3_1 = 1;
      P3_2 = 1;
      P3_3 = 1;
      P2 = temp[i];
      P3_4 = 0;
      Delay5ms();
    }
   }
  }
}
}
回复

使用道具 举报

ID:423511 发表于 2018-11-16 20:01 | 显示全部楼层
weiweimao1 发表于 2018-11-16 19:54
Delay1000ms()延迟时间太长,我把第12行的while语句中的内容改了一下,Delay1000ms()那段语句就不用要了, ...

第8行改为   char  i , j ;
回复

使用道具 举报

ID:337490 发表于 2018-11-16 20:03 | 显示全部楼层
视觉停留效果,延时不要太长,二三十的延时就可以了
回复

使用道具 举报

ID:427251 发表于 2018-11-16 21:09 | 显示全部楼层
缩短延时到肉眼看不见
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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