找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1671|回复: 12
收起左侧

求助为什么单片机数码管倒计时不了?

  [复制链接]
ID:1001243 发表于 2022-1-13 00:48 | 显示全部楼层 |阅读模式
30黑币
我想倒计时14秒,但是仿真只有一位数码管在显示,而且也不动。
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
sbit DU=P2^0;
sbit WEI=P2^1;
bit LightFlag=1;
uchar code DuanMa[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uchar LightBuf[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uint cnt;
void main()
{
        uchar num=15;
        EA=1;
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        TMOD&=0XFC;
        TMOD|=0X01;
        ET0=1;
        TR0=1;
while(1)
{
if(LightFlag==1)
{
LightFlag==0;
        num--;
        LightBuf[0]=DuanMa[num%10];
        LightBuf[1]=DuanMa[num/10%10];
}
if(num==0)
{
P0=0x00;
        LightBuf[0]=DuanMa[num%10];
        LightBuf[1]=DuanMa[num/10%10];
        while(1);
}
}
}
void Light_Scan()
{
static uchar i=0;
        switch(1)
        {
                case 0:P1=0x08;WEI=1;WEI=0;P1=LightBuf[0];DU=1;DU=0;i++;break;
                case 1:P1=0x04;WEI=1;WEI=0;P1=LightBuf[1];DU=1;DU=0;i=0;break;
        }
}
void Interrupt0()interrupt 1
{
TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        Light_Scan();
        cnt++;
        if(cnt>=500)
        {
        cnt=0;
                LightFlag=1;
        }


2022-01-13_004341.png

最佳答案

回复

使用道具 举报

ID:213173 发表于 2022-1-13 00:48 | 显示全部楼层
  1. #include <REG51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit DU =P2^0;
  5. sbit WEI=P2^1;
  6. bit LightFlag;
  7. uchar code DuanMa[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  8. uchar LightBuf[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  9. uint cnt;
  10. uchar num=15;

  11. void main()
  12. {
  13.         TMOD|=0X01;
  14.         TH0=(65536-2000)/256;
  15.         TL0=(65536-2000)%256;
  16.         EA=1;
  17.         ET0=1;
  18.         TR0=1;
  19.         while(1)
  20.         {
  21.                 if(LightFlag)
  22.                 {
  23.                         LightFlag=0;
  24.                         if(num>0)
  25.                                 num--;
  26.                 }
  27.         }
  28. }
  29. void Light_Scan()
  30. {
  31.         static uchar i=0;
  32.         switch(i)
  33.         {
  34.                 case 0:DU=1;WEI=1;P0=DuanMa[num/10];DU =0;i=1;break;
  35.                 case 1:DU=1;WEI=1;P0=DuanMa[num%10];WEI=0;i=0;break;
  36.         }

  37. }
  38. void Interrupt0()interrupt 1
  39. {
  40.         TH0=(65536-2000)/256;
  41.         TL0=(65536-2000)%256;
  42.         cnt++;
  43.         if(cnt>=500)
  44.         {
  45.                 cnt=0;
  46.                 LightFlag=1;
  47.         }
  48.         Light_Scan();
  49. }
复制代码
回复

使用道具 举报

ID:96682 发表于 2022-1-13 02:27 来自手机 | 显示全部楼层
能显示只是矛盾体结合而已
回复

使用道具 举报

ID:1001243 发表于 2022-1-13 08:06 | 显示全部楼层
wc86110 发表于 2022-1-13 02:27
能显示只是矛盾体结合而已

啊!矛盾体结合,那我该咋办
回复

使用道具 举报

ID:584814 发表于 2022-1-13 08:08 | 显示全部楼层
写法比较清奇,没有半句注释,双等于号赋值都不算什么,主程序中竟然有俩这货

while(1)
……
        while(1);
回复

使用道具 举报

ID:744809 发表于 2022-1-13 08:44 | 显示全部楼层
问题有些多
回复

使用道具 举报

ID:8222 发表于 2022-1-13 09:01 | 显示全部楼层
毛病太多了,要推倒重来。
回复

使用道具 举报

ID:415064 发表于 2022-1-13 09:09 | 显示全部楼层
地板 真相
回复

使用道具 举报

ID:53621 发表于 2022-1-13 11:22 | 显示全部楼层
  1. #include <REGX51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit DU=P2^0;
  5. sbit WEI=P2^1;
  6. bit LightFlag=1;
  7. uchar code DuanMa[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  8. uchar LightBuf[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  9. uint cnt;
  10. void main()
  11. {
  12.     uchar num=15;
  13.     EA=1;
  14.     TH0=(65536-2000)/256;
  15.     TL0=(65536-2000)%256;
  16.     TMOD&=0XFC;
  17.     TMOD|=0X01;
  18.     ET0=1;
  19.     TR0=1;
  20.     while(1)
  21.     {
  22.         if(LightFlag==1)
  23.         {
  24.             LightFlag==0;
  25.             num--;
  26.             LightBuf[0]=DuanMa[num%10];
  27.             LightBuf[1]=DuanMa[num/10%10];
  28.         }
  29.         if(num==0)
  30.         {
  31.             P0=0x00;
  32.             LightBuf[0]=DuanMa[num%10];
  33.             LightBuf[1]=DuanMa[num/10%10];
  34.         }
  35.     }
  36. }
  37. void Light_Scan()
  38. {
  39.     static uchar i=0;
  40.     switch(i)
  41.     {
  42.         case 0:P1=0x08;WEI=1;WEI=0;P1=LightBuf[0];DU=1;DU=0;i++;break;
  43.         case 1:P1=0x04;WEI=1;WEI=0;P1=LightBuf[1];DU=1;DU=0;i=0;break;
  44.     }
  45. }
  46. void Interrupt0() interrupt 1
  47. {
  48.     TH0 = (65536 - 2000) / 256;
  49.     TL0 = (65536 - 2000) % 256;

  50.     cnt++;
  51.     if(cnt>=500)
  52.     {
  53.         cnt = 0;
  54.         LightFlag = 1;
  55.         Light_Scan();
  56.     }
  57. }
复制代码
回复

使用道具 举报

ID:53621 发表于 2022-1-13 11:24 | 显示全部楼层
把Light_Scan(); 提到if(cnt>=500)外面可能会好点。
回复

使用道具 举报

ID:979299 发表于 2022-1-13 13:54 | 显示全部楼层
电路画得不怎么样,总线画的可有可无,段端口上拉了就行,不再用排阻了,位端口不用三极管驱动也可以,程序P1口扫描怎么又接到P0口呢
回复

使用道具 举报

ID:1022849 发表于 2022-4-30 00:28 | 显示全部楼层
可能是前面数码管电平高低不合适
回复

使用道具 举报

ID:278457 发表于 2022-5-3 03:37 | 显示全部楼层
楼主你为什么芯片驱动,这样比较简单点.程序好写一点.见意重新写一下,反正用不了多少时间,用个74hc595或者用74hc573
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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