找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4058|回复: 9
打印 上一主题 下一主题
收起左侧

求助:12LED+两位数码管时钟程序的问题

[复制链接]
跳转到指定楼层
楼主
10黑币
我在隔壁论坛搬了一个资料来,做出来发现数码管的十位,也就是分的十位没有消隐,并且按键调整分的时候应该是个位数加1,而十位也在跟着加1,走时也是,22过了就是33,直到99,然后一分钟后又显示00,作为小时的LED也不进位。。以下是程序和原理图,我不太会修改程序,也不是硬件的问题,麻烦各位帮我提点意见,谢谢!

#include <reg51.h>
  unsigned char code table[]=
     {0x88,0x9f,0xc4,0x85,0x93,0xa1,0xa0,0x8f,0x80,0x81} ;
  sbit SMG_s = P2^1; //??????????(??)
  sbit SMG_g = P2^0; //??????????(??)
  //???,,LED,,?????,?????,??,
  sbit LED1 = P0^0; //???
  sbit LED2 = P0^1;
  sbit LED3 = P0^2;
  sbit LED4 = P0^3;
  sbit LED5 = P0^4;
  sbit LED6 = P0^5;
  sbit LED7 = P0^6;
  sbit LED8 = P0^7;
  sbit LED9 = P2^7;
  sbit LED10 = P2^6;
  sbit LED11 = P2^5;
  sbit LED12 = P2^4;
  sbit DP = P1^7;
  sbit S = P3^2;  //??,,,?????,,,12??
  sbit F = P3^3;  //??,,,?????,,,60??
unsigned char time=0,shi=0,fen=0,miao=0,DP1;
void InitTimer0(void)
{
   TMOD = 0x01;
    TH0 = 0x4C;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

////////////????
void delay(unsigned int z)
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void jianceanjian()
{
if(S==0)
{
  delay(5);
if(S==0)
{
  shi++;
  while(S==0);
}
}
if(F==0)
{
  delay(5);
if(F==0)
{
  fen++;
  while(F==0);
}
}
}
void display(char x1,char x2)
{
    SMG_s=1;
delay(1);
    SMG_g=0;

    P1=table[x1];
DP=DP1;
    delay(5);
   SMG_s=0;
delay(1);
    SMG_g=1;
    P1=table[x2];
DP=DP1;
    delay(5);//???????????
   
}
void qingkongshi()
{
P0=0XFF;
LED9=1;
LED10=1;
LED11=1;
LED12=1;
}
void main(void)
{
    InitTimer0();//定时50ms
while(1)
{
  jianceanjian();
  if(fen>59)
   {
   fen=0;
   shi++;
   }
   if(shi>11)
   {
   shi=0;
   }
   qingkongshi();
    switch(shi)
  {
      case 1:LED1=0; break;
      case 2:LED2=0; break;
   case 3:LED3=0; break;
      case 4:LED4=0; break;
   case 5:LED5=0; break;
      case 6:LED6=0; break;
   case 7:LED7=0; break;
      case 8:LED8=0; break;
   case 9:LED9=0; break;
      case 10:LED10=0; break;
   case 11:LED11=0; break;
      case 0:LED12=0; break;
  
   }
   display(fen%10,fen/10);   
}
}
void Timer0Interrupt(void) interrupt 1
{
   TH0 = 0x4C;
  TL0 = 0x00;
    time++;
if(time>19)
  {
   time=0;
   miao++;
   if(miao>59)
   {
    miao=0;
    fen++;
   }
   DP1=~DP1;
  }
}

file:///C:/Users/Administrator/AppData/Roaming/Tencent/Users/1006381187/QQ/WinTemp/RichOle/1598%7DAMIGW3_]I%60576Z26(A.png

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2017-3-4 19:32 | 只看该作者
硬件不同吧?
回复

使用道具 举报

板凳
ID:166064 发表于 2017-3-4 20:16 | 只看该作者
硬件不同吧?
回复

使用道具 举报

地板
ID:111634 发表于 2017-3-4 21:05 | 只看该作者
何止是隔壁论坛的资料,网上多数程序都不靠谱,不是有问题,就是没注释,不完整。
学习单片机首先要选择正确的程序,拿着一个错误的程序(而且没注释、冗长),叫别人修改。好啊!祝你好运。
回复

使用道具 举报

5#
ID:99130 发表于 2017-3-4 21:35 | 只看该作者

我是按原理图做的,程序是别人按照请求的人给的原理图写的。应该是程序的问题
回复

使用道具 举报

6#
ID:96682 发表于 2017-3-5 13:04 | 只看该作者
LZ,原理图有误啊,看 LED 那里这样连接能正常工作吗?数码管与 P1 口也没对应好,应为EAFGDBC,DP
源码里的 0x8f 改为 0x9d
回复

使用道具 举报

7#
ID:151348 发表于 2017-3-5 19:32 | 只看该作者
本帖最后由 imxuheng 于 2017-3-6 08:46 编辑

你那个电路图那些LED根本不会亮的,网上找程序最好是搜“开发板光盘资料”什么的,给出仿真源文件的
回复

使用道具 举报

8#
ID:99130 发表于 2017-3-5 21:32 | 只看该作者
imxuheng 发表于 2017-3-5 19:32
你找个电路图那些LED根本不会亮的,网上找程序最好是搜“开发板光盘资料”什么的,给出仿真源文件的

不见得
回复

使用道具 举报

9#
ID:155507 发表于 2017-3-6 01:07 | 只看该作者
AT89C51在单片机业内是比较老款的芯片了,更进一步说,基本就是8051内核最原始的芯片。这款芯片的P0口内部是有接弱上拉电阻,如果作为简单的电平信号处理来使用,是可以不用增加上拉电阻的。但如果是要直接驱动LED等一些电流相对大点的负载,那么为了安全起见是必须要接上拉电阻的。
如果不加上拉电阻,很容易造成短路或驱动故障。
因此,在AT89C51单片机的P0口接入上拉电阻,是必不可少的环节。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:168489 发表于 2017-3-6 10:59 | 只看该作者
硬件不同
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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