单片机新手,请教个问题

[复制链接]
 楼主| tongshaoqiang 发表于 2012-12-2 23:44 | 显示全部楼层 |阅读模式
本帖最后由 tongshaoqiang 于 2012-12-4 22:39 编辑

各位前辈,刚入门51单片机,没想通用4位数码管显示十进制数字,感觉即使位选后,段选总是想通的,实现不了。大家给指点一下。
我想实现前两位数码管显示0~59每隔1s计数,没考虑好怎么实现。(下面我写的代码)哪位有耐心的帮俺指点一下啊,困惑了好几晚上了。:dizzy:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit pnp1=P1^0;
sbit pnp2=P1^1;
sbit pnp3=P1^2;
sbit pnp4=P1^3;
sbit D1=P2^0;
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,shi,ge;
   void main()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
  while(1)
{
display(shi,ge);
  }
}
void display(uchar shi,uchar ge)
{
     P0=table[shi];
  // P0=0xff;
      pnp1=0;
      delayms(5);  //显示十位
  
      
       P0=table[ge];
       P0=0xff;
       pnp1=1;
       pnp2=0;
    // P0=0xff;
       delayms(5);  //显示ge位
      //pnp2=1;
}
void T0_time() interrupt 1
{

   TH0=(65536-45872)/256;
   TL0=(65536-45872)%256;
   num1++;
   if(num1==20)
   {
     num1=0;
     num++;
     if(num==60)
     num=0;
     shi=num/10;
     ge=num%10;
   
    }
}

void delayms(uint xms)
{         
  uint i,j;
  for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
anazel 发表于 2012-12-2 23:46 | 显示全部楼层
没大看明白
chenyu988 发表于 2012-12-3 08:24 | 显示全部楼层
感觉即使位选后,段选总是想通的-->感觉即使位选后,段选总是先通的??
 楼主| tongshaoqiang 发表于 2012-12-3 09:32 | 显示全部楼层
chenyu988 发表于 2012-12-3 08:24
感觉即使位选后,段选总是想通的-->感觉即使位选后,段选总是先通的??

即使位选后,点亮数码管时,两个数码管的段选总是相通的,所以控制个位,十位数字也跟着变。
T_X_T 发表于 2012-12-3 10:02 | 显示全部楼层
好好看看电路分析下,这个应该不难
hdl551890 发表于 2012-12-3 10:11 | 显示全部楼层
表达的不怎么清楚  没弄明白
W_Controller 发表于 2012-12-3 10:27 | 显示全部楼层
首先,你控制个位的时候,有没有关掉十位;
其次,你关掉十位,有没有灭余晖。
chen583128612 发表于 2012-12-3 13:10 | 显示全部楼层
顶一个:lol
zhang7676050 发表于 2012-12-3 13:20 | 显示全部楼层
有点不明白
alvin_zhou2009 发表于 2012-12-3 14:01 | 显示全部楼层
静态还是动态显示?如果是静态的话,你可以先将位选用硬件接通再试一下,然后再送段码一试。
qkhhyga 发表于 2012-12-3 15:26 | 显示全部楼层
要是单片机直接连LED数码管的话要通过扫描位选的方式来点亮数码管
 楼主| tongshaoqiang 发表于 2012-12-3 17:07 | 显示全部楼层
W_Controller 发表于 2012-12-3 10:27
首先,你控制个位的时候,有没有关掉十位;
其次,你关掉十位,有没有灭余晖。 ...

如果十位数跟个位数同时显示,比如11 12 13 14.......关掉十位的话,十位“1”显示不了。
wangyy608 发表于 2012-12-3 17:10 | 显示全部楼层
tongshaoqiang 发表于 2012-12-3 17:07
如果十位数跟个位数同时显示,比如11 12 13 14.......关掉十位的话,十位“1”显示不了。 ...

切换的速度足够快,超过人眼的反应时间久不存在这个问题
W_Controller 发表于 2012-12-3 17:20 | 显示全部楼层
tongshaoqiang 发表于 2012-12-3 17:07
如果十位数跟个位数同时显示,比如11 12 13 14.......关掉十位的话,十位“1”显示不了。 ...

数码管的这种显示称作动态扫描,原理就是利用人的视觉暂留现象;这个时间一般在5ms左右,人肉眼是感觉不出闪烁的。
nmji12 发表于 2012-12-3 18:52 | 显示全部楼层
你连问题都没表达清楚说明你对你碰到的问题的点都没把握住
xzwangc 发表于 2012-12-3 20:42 | 显示全部楼层
新概念51单片机C语言教程:入门、提高、开发、拓展全攻略------郭天祥
看看这本书也许对你有点帮助。
yuyi21ic 发表于 2012-12-3 21:31 | 显示全部楼层
除了7楼说的原因外,再用万用表检查下硬件连线是否有短路的地方。
 楼主| tongshaoqiang 发表于 2012-12-3 21:39 | 显示全部楼层
xzwangc 发表于 2012-12-3 20:42
新概念51单片机C语言教程:入门、提高、开发、拓展全攻略------郭天祥
看看这本书也许对你有点帮助。 ...

呵呵,我正在看。
icecut 发表于 2012-12-3 22:57 | 显示全部楼层
让1bit led交替显示2个数.速度快点,然后用手晃晃开发板,你就能发现神奇
W_Controller 发表于 2012-12-4 08:07 | 显示全部楼层
icecut 发表于 2012-12-3 22:57
让1bit led交替显示2个数.速度快点,然后用手晃晃开发板,你就能发现神奇

呵呵,这个就是摇摇棒的原理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

993

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部