找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 852|回复: 4
收起左侧

此单片机程序为何上电后先是全亮 后显示5280 然后开始计数 而不是最高位是0不显示

[复制链接]
ID:904095 发表于 2022-4-25 23:16 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit aa=P2^0;
sbit bb=P2^1;
sbit cc=P2^2;
uint sec=0;
uchar cnt=0;
uchar i=0;
signed char k;
uchar code smgchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar smgbuf[]={0xff,0xff,0xff,0xff};
uchar buf[4];
void smgdisplay();
void main()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

while(1)
         {
         smgdisplay();
        }
}

void smgdisplay()
{


  if(cnt>=20)
          {
         cnt=0;
         sec++;
         buf[0]=sec%10;
         buf[1]=sec/10%10;
         buf[2]=sec/100%10;
         buf[3]=sec/1000%10;
         for(k=4;k>=1;k--)
                 {
                 if(buf[k]==0)
                         {
                         smgbuf[k]=0xff;
                        }
                 else
                         break;                                 
                }
         for(;k>=0;k--)
                 {
                 smgbuf[k]=smgchar[buf[k]];
                }
        }
        P0=0x00;
  switch(i)
          {
     case 0 :aa=1;bb=1;cc=1;i++;P0=smgbuf[0];break;
         case 1 :aa=0;bb=1;cc=1;i++;P0=smgbuf[1];break;
         case 2 :aa=1;bb=0;cc=1;i++;P0=smgbuf[2];break;
         case 3 :aa=0;bb=0;cc=1;i=0;P0=smgbuf[3];break;
         default:break;
        }

}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
}


回复

使用道具 举报

ID:213173 发表于 2022-4-26 07:08 | 显示全部楼层
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit aa=P2^0;
  5. sbit bb=P2^1;
  6. sbit cc=P2^2;
  7. uint sec=0;
  8. uchar cnt=0;
  9. uchar i=0;

  10. uchar code smgchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11.                       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  12. uchar buf[4];
  13. void smgdisplay();
  14. void main()
  15. {
  16.         TMOD=0x01;
  17.         TH0=(65536-50000)/256;
  18.         TL0=(65536-50000)%256;
  19.         EA=1;
  20.         ET0=1;
  21.         TR0=1;
  22.         while(1)
  23.         {
  24.                 smgdisplay();
  25.         }
  26. }

  27. void smgdisplay()
  28. {
  29.         buf[0]=smgchar[sec%10];
  30.         buf[1]=smgchar[sec/10%10];
  31.         buf[2]=smgchar[sec/100%10];
  32.         buf[3]=smgchar[sec/1000%10];
  33.         P0=0x00;
  34.         P2&=0xf8;
  35.         P2|=7-i;
  36.         P0=buf[i];
  37.         i=++i%4;
  38. }

  39. void T0_time() interrupt 1
  40. {
  41.         TH0=(65536-50000)/256;
  42.         TL0=(65536-50000)%256;
  43.         cnt++;
  44.         if(cnt>=20)
  45.         {
  46.                 cnt=0;
  47.                 sec++;
  48.                 if(sec>9999)
  49.                         sec=0;
  50.         }
  51. }

复制代码
回复

使用道具 举报

ID:123289 发表于 2022-4-26 14:49 | 显示全部楼层
一步步地自己走单步运行调试,便知道了。
回复

使用道具 举报

ID:904095 发表于 2022-4-26 22:00 | 显示全部楼层
yzwzfyz 发表于 2022-4-26 14:49
一步步地自己走单步运行调试,便知道了。

单步运行的时候不进中断  有点奇怪 实际程序又是可以进中断函数的。现在问题已经找到了 谢谢
回复

使用道具 举报

ID:904095 发表于 2022-4-26 22:02 | 显示全部楼层

高手 我是个菜鸟 这些运算不会用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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