微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大神能不能帮我看看这段程序,我这段程序那儿有错啊?

大神能不能帮我看看这段程序,我这段程序那儿有错啊?

时间:10-02 整理:3721RD 点击:
#include<reg51.h>       //包含51单片机的头文件
#define uchar unsigned char      //定义一个无符号字符,使用这一句话有个好处就是:在后面的程序中就可以直接使用uchar等词了。
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};   //0-9的数组,我在思考是否能将控制数组也能像数据数组一样集中控制呢?
uchar num,miao,fen,shi;//定义了一个num  和一个  miao
sbit key1=P0^0;   //暂停、开始
sbit key2=P0^1;   //分位+
sbit key3=P0^2;   //分位-
sbit key4=P0^3;   //十位+
sbit key5=P0^4;   //十位-
void delay(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}

void shuma(uchar miao)    //数码管显示子程序
{
P2=0x01;
P0=table[miao%10];   //显示秒钟的个位
delay();
P2=0x02;
P0=table[miao/10];   //显示秒钟的十位
delay();
P2=0x04;
P0=0xBF;            //中间的点
delay();
P2=0x08;
P0=table[fen%10];     //分钟的个位
delay();
P2=0x10;
P0=table[fen/10];    //分钟的十位
delay();
P2=0x20;
P0=0xBF;            //中间的点
delay();
P2=0x40;
P0=table[shi%10];    //小时的个位
delay();
P2=0x80;
P0=table[shi/10];      //小时的十位
delay();
}
void main()      //主函数
{
TMOD=0x10;     //TMOD是工作方式寄存器,这里的1是管的是T1,0是管的T0,T1用1后就将M0,M1置于16位计数器。最高可计数2的16次方(65536)。
TH1=(65536-50000)/256;  //TH1是T1的高8位。
TL1=(65536-50000)%256;  //TL1是T1的低8位。
EA=1;   //EA是中断的总开关,EA=1是中断允许的前提条件,如果EA=0,则禁止所有的中断。
ET1=1;  //ET1是定时器/计数器1的中断允许控制位。ET1=1则说明允许定时器1中断,如果ET1=0,则禁止定时器1中断。
TR1=1;  //TR1是定时器1的启动位。定时器1要工作,TR1肯定要等于1.等于0则关闭定时器1.
while(1)
  {
   keyprint();
   shuma(miao);
  }
}
void T1_time()interrupt 3   //中断子函数。其中interrupt是定义一个中断函数的标志。3是中断序号(0,1,2,3,4)。
{ TH1=(65536-50000)/10;  //重装定时数据。因为在第一遍中断完了过后,里面的数据会发生错乱,因此在这里必须重新设定参数。
  TL1=(65536-50000)%10;
  num++;    //定时的数据每隔0.05s 就自动加1
    if(num==20)   //如果定时数据(num)=20了。
           {num=0;   //如果num=20 则num就自动清零
             miao++;   //同时显示的数据自动加1
                 if(miao==60)  //如果显示的数字达到了60
                  {
                   miao=0;    //秒回0
                    fen++;     //分钟加1
                    if(fen==60)   //分钟到了60
                   {
                     fen=0;     //分钟回0
                     shi++;      //时钟加1
                     if(shi==24)  //小时显示到了24
                     shi=0;       //小时回0
                   }
                  }
                }
}
void keyprint()
{if(key2==0)
delay();
if(key2==0)
{ fen++;
  if(fen==60)
  {fen=0;
  while(!key2);
  }
  }
  if(key3==0)
  {delay();
  if(key3==0)
  {fen--;
  if(fen==0)
  {fen=60;
  while(!key3);
  }
  }
  }
  if(key4==0)
  {delay();
  if(key4==0)
  {shi++;
  if(shi==24)
  {shi=0;
  while(!key4);
  }
  }
  }
  if(key5==0)
  {delay();
  if(key5==0)
  {shi--;
  if(shi==0)
  {shi=24;
  while(!key5);
  }
  }
  }
  if(key1==0)
  {delay();
  if(key1==0)
  {while(!key1);
  TR0=!TR0;
}
}
}

1,你能不能先说说出什么问题了,看别人的程序很蛋疼的
2.看了你的程序,定时器重装有问题,好好研究一下TMOD寄存器究竟干嘛的,从你的注释上看你很理解很模糊
3,以后有问题自己先想办法解决,实在不行在请教,这样才有所提高!

1.TI重装有问题,TH1=(65526-50000)/256,TL1也是,怎么是TH1=(65526-50000)/10,除出的值大于256,TH1放不下啊
2.void shuma(uchar miao),分,时,都到哪里去了
3按键1最后一条是不是得改为TR1=~TR1啊,
这些都是粗心惹的祸

恩。是啊。经过我的不懈努力。这个程序已经调好了。这是一个电子时钟的程序。可以调整时间。谢谢大家的关注。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top