标题: 关于数码管问题,我会单个数码管显示0到9,如何在这基础上显示0-99或0-999? [打印本页]

作者: king@    时间: 2016-10-13 20:54
标题: 关于数码管问题,我会单个数码管显示0到9,如何在这基础上显示0-99或0-999?
#include<reg52.h>
sbit WEI = P1^6;
sbit DU = P1^7;
unsigned char code Disp_Tab[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //段选
#define uchar unsigned char //  8bit, 0 ~     255
#define uint  unsigned int  // 16bit, 0 ~  65,535
void delayms(uint m)    // 11.0592MHz 晶振ms延时,偏差小于1%
{
    uint i, j;
    for(i=m; i>0; i--)
        for(j=114; j>0; j--);
}


void main()
{
   unsigned char i = 0;  
   WEI = 1;
   P0 = 0X7f;
   WEI = 0;               
   DU = 1;
        while(1)
        {
                for(i = 0; i < 10; i++)                //循环10次
                {
                        P0 =  Disp_Tab[i];
                        delayms(500);
                }
        }
}


QQ截图20161011115402.png (120.71 KB, 下载次数: 121)

QQ截图20161011115402.png

QQ截图20161012212428.png (103.94 KB, 下载次数: 118)

QQ截图20161012212428.png

作者: 546456451    时间: 2016-10-13 21:30
好的那就等你看见
作者: king@    时间: 2016-10-13 22:04
标题: 数码管显示0-99
本帖最后由 king@ 于 2016-10-13 22:13 编辑

#include<reg52.h>
sbit WEI = P1^6;
sbit DU = P1^7;
unsigned char  DISP_smg[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
#define uchar unsigned char //  8bit, 0 ~     255
#define uint  unsigned int  // 16bit, 0 ~  65,535
void delayms(uint m)    // 11.0592MHz 晶振ms延时,偏差小于1%
{
    uint i, j;
    for(i=m; i>0; i--)
        for(j=114; j>0; j--);
}




void main()
{
   unsigned char C0 = 0;
   unsigned char i = 0;
   DU = 0;
   P0 = 0x00;
   DU = 1;
   
        while(1)
        {
                for(i = 0; i < 10; i++)                //循环10次
                {
                    WEI = 1;
                    P0 = 0x7f;
                    WEI = 0;               
                    DU = 1;
                    P0 =  DISP_smg;

                    delayms(400);              
                    WEI = 1;
                    P0 = 0xbf;
                    WEI = 0;
                    DU = 1;
                    P0        =  DISP_smg[C0];
                    delayms(400);        
                    if(i==8)
                    {
                      C0 = C0+1;
                    }
                 


      }        
            
   }
}

数码管显示0-99,显示过程不停得闪烁到了99溢出,延时怎样修改和到了99怎样暂停或者返回到00.

QQ截图20161013221247.png (120.88 KB, 下载次数: 136)

CPU

CPU

QQ截图20161013221215.png (146.82 KB, 下载次数: 116)

数码管

数码管

作者: zl2168    时间: 2016-10-14 16:21
如果真理解了0~9显示,那么就一定会0~999显示。不会0~999显示,就一定没有真理解了0~9显示。
作者: qi_dianzikeji    时间: 2016-11-20 21:11
从个十百依次自加,逢九清零前位加一
作者: wuyibin2003    时间: 2016-11-22 09:00
while(1)
        {
                for(i = 0; i < 10; i++)                //循环10次
                {
                    WEI = 1;
                    P0 = 0x7f;
                    WEI = 0;               
                    DU = 1;
                    P0 =  DISP_smg;
                    delayms(400);              
                    WEI = 1;
                    P0 = 0xbf;
                    WEI = 0;
                    DU = 1;
                    P0        =  DISP_smg[C0];
                   删掉试试看 0-9      
                    
                 
作者: Chinese小贝    时间: 2016-11-22 09:19
添加循环嵌套
作者: zl2168    时间: 2016-11-22 11:48
继续计数。
作者: lsrly    时间: 2016-11-22 12:55
用for语句最好
作者: 柔柔弱弱任溶溶    时间: 2016-11-22 15:24
分离出个位十位百位等,当各位加到10时候十位进一,个位清零
作者: king@    时间: 2016-11-22 20:04
已解决000-999
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P1^7;
sbit wela=P1^6;
uchar num,count;
uint bai=0,shi=0,ge=0;
void display(uint bai,uint shi,uint ge);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
void delay1ms(void)   //误差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}
void main()
{
        TMOD=0x00;
        TH0=(8192-8000)/32;
        TL0=(8192-8000)%32;
        EA=1;
        ET0=1;
        TR0=1;

        while(1)
        {
        display(bai,shi,ge);
        }
        
}
void display(uint bai,uint shi,uint ge)
{   
            bai=num/100;
        shi=(num - (bai*100))/10;
        ge=num%10;


                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0x7f;
        wela=0;
        dula=1;
        P0=table[ge];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xbf;
        wela=0;
        dula=1;
        P0=table[shi];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[bai];
        delay1ms();


}
void timer0()interrupt 1
{
    TH0=(8192-8000)/32;
    TL0=(8192-8000)%32;
   count++;
   if(count ==125)
   {
        count = 0;
         num++;
        if(num==999)
          num = 0;

   }
}



作者: king@    时间: 2016-11-22 20:09
以实测,满足000-999
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P1^7;
sbit wela=P1^6;
uchar num,count;
uint bai=0,shi=0,ge=0;
void display(uint bai,uint shi,uint ge);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
void delay1ms(void)   //误差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}
void main()
{
        TMOD=0x00;
        TH0=(8192-8000)/32;
        TL0=(8192-8000)%32;
        EA=1;
        ET0=1;
        TR0=1;

        while(1)
        {
        display(bai,shi,ge);
        }
        
}
void display(uint bai,uint shi,uint ge)
{   
            bai=num/100;
        shi=(num - (bai*100))/10;
        ge=num%10;


                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0x7f;
        wela=0;
        dula=1;
        P0=table[ge];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xbf;
        wela=0;
        dula=1;
        P0=table[shi];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[bai];
        delay1ms();


}
void timer0()interrupt 1
{
    TH0=(8192-8000)/32;
    TL0=(8192-8000)%32;
   count++;
   if(count ==125)
   {
        count = 0;
         num++;
        if(num==999)
          num = 0;

   }
}



作者: shao5874705    时间: 2016-11-22 21:54
十位对变量求模,个位对变量求余
作者: qq779089973    时间: 2016-11-26 14:44
两种方法,一种是从0-99,然后这个数字对10取整,将这个数字显示在十位数的数码管,对10取余,将这个数字显示在十位数的数码管,持续刷新,多少次后,数字加1,对100进行取余,保证数字只有0-100。
一种是0-9显示,每次对10取余,取余结果在个位上显示,当取余结果为0时,十位数的数字加1,十位数对10取余,取余结果在十位上显示。
作者: 咆哮的阿杰    时间: 2016-11-27 22:36
看楼主的程序,你需要了解动态扫描。需要加入位选。
位选的作用就是选择单片机上的数码管的某一个数码管。
位选有单片机的专门i/o口,楼主查下
作者: 小耗子    时间: 2016-11-27 22:40
根据经侦,中断计算一显示时间,然后根据时间,终断,进行编程
作者: cqzk    时间: 2016-11-27 22:53
除  和求 余
作者: 14100807    时间: 2016-11-27 23:49
多个数码管并联,并且需要改程序
作者: DIY小裕    时间: 2016-11-28 11:08
可以用定时器中断写
作者: DIY小裕    时间: 2016-11-28 11:08
参考(郭天祥)那本书
作者: DIY小裕    时间: 2016-11-28 11:11
单纯用这种循环的方法解决不好,建议学习一下定时器中断,那样你就不知是0~99  0~999啦甚至可以更大
作者: liuzhaoxin1020    时间: 2016-12-16 18:02
增加硬件和程序
作者: 幻夜_蒙    时间: 2016-12-16 18:20
  1. while(1)//循环部分
  2. {
  3. nuim++;//计数
  4. sum[0]=num/100;//分离百位
  5. sum[1]=num%100/10;;//分离出十位
  6. sum[0]=nuim%10;//分离出个位
  7. for(i=0;i<3;i++)
  8. {
  9. //设置位选
  10. //输出sum[i]
  11. }

  12. }
复制代码

作者: king@    时间: 2016-12-16 22:20
咆哮的阿杰 发表于 2016-11-27 22:36
看楼主的程序,你需要了解动态扫描。需要加入位选。
位选的作用就是选择单片机上的数码管的某一个数码管。 ...

明明我数码管显示先写消影再写位选之后写了段选最后写个延时就是为了使数码管动态显示
作者: king@    时间: 2016-12-16 22:23
幻夜_蒙 发表于 2016-12-16 18:20

while(1)//循环部分
{
nuim++;//计数
sum[0]=num/100;//分离百位
sum[1]=num%100/10;;//分离出十位
sum[0]=nuim%10;//分离出个位              应该改成sum[2]=nuim%10;
for(i=0;i<3;i++)
{
//设置位选
//输出sum
}

}
作者: zfz761124    时间: 2016-12-22 11:02
动态扫描
作者: 成工之道    时间: 2016-12-22 16:46
原理图Kian起来好乱啊
作者: 51黑点子论坛    时间: 2016-12-23 15:13
把位选改下就行了
作者: liuzhaoxin1020    时间: 2016-12-25 18:56
感谢楼主分享,真心不错
作者: 易恒    时间: 2018-1-4 21:51
楼主怎么让数码管显示某一个数字时,用按键暂停显示,同时要求发光二极管闪烁??
作者: zqd605370721    时间: 2018-1-5 00:36
感谢楼主分享
作者: yzhbyyy    时间: 2019-6-27 10:39
谢谢分享,刚好用到!
作者: wj_yuq    时间: 2019-6-28 08:42
非常经典的例程,几乎每一本C51编程的书里都有,感谢楼主给大家增加黑币的机会。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1