找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27571|回复: 32
收起左侧

关于数码管问题,我会单个数码管显示0到9,如何在这基础上显示0-99或0-999?

  [复制链接]
ID:102056 发表于 2016-10-13 20:54 | 显示全部楼层 |阅读模式
#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
QQ截图20161012212428.png
回复

使用道具 举报

ID:142647 发表于 2016-10-13 21:30 | 显示全部楼层
好的那就等你看见
回复

使用道具 举报

ID:102056 发表于 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.

CPU

CPU

数码管

数码管
回复

使用道具 举报

ID:111634 发表于 2016-10-14 16:21 | 显示全部楼层
如果真理解了0~9显示,那么就一定会0~999显示。不会0~999显示,就一定没有真理解了0~9显示。
回复

使用道具 举报

ID:148885 发表于 2016-11-20 21:11 | 显示全部楼层
从个十百依次自加,逢九清零前位加一
回复

使用道具 举报

ID:138155 发表于 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      
                    
                 
回复

使用道具 举报

ID:149388 发表于 2016-11-22 09:19 | 显示全部楼层
添加循环嵌套
回复

使用道具 举报

ID:111634 发表于 2016-11-22 11:48 | 显示全部楼层
继续计数。
回复

使用道具 举报

ID:90566 发表于 2016-11-22 12:55 | 显示全部楼层
用for语句最好
回复

使用道具 举报

ID:149245 发表于 2016-11-22 15:24 | 显示全部楼层
分离出个位十位百位等,当各位加到10时候十位进一,个位清零
回复

使用道具 举报

ID:102056 发表于 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;

   }
}


回复

使用道具 举报

ID:102056 发表于 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;

   }
}


回复

使用道具 举报

ID:149091 发表于 2016-11-22 21:54 | 显示全部楼层
十位对变量求模,个位对变量求余
回复

使用道具 举报

ID:55331 发表于 2016-11-26 14:44 | 显示全部楼层
两种方法,一种是从0-99,然后这个数字对10取整,将这个数字显示在十位数的数码管,对10取余,将这个数字显示在十位数的数码管,持续刷新,多少次后,数字加1,对100进行取余,保证数字只有0-100。
一种是0-9显示,每次对10取余,取余结果在个位上显示,当取余结果为0时,十位数的数字加1,十位数对10取余,取余结果在十位上显示。
回复

使用道具 举报

ID:149853 发表于 2016-11-27 22:36 | 显示全部楼层
看楼主的程序,你需要了解动态扫描。需要加入位选。
位选的作用就是选择单片机上的数码管的某一个数码管。
位选有单片机的专门i/o口,楼主查下
回复

使用道具 举报

ID:146734 发表于 2016-11-27 22:40 | 显示全部楼层
根据经侦,中断计算一显示时间,然后根据时间,终断,进行编程
回复

使用道具 举报

ID:150441 发表于 2016-11-27 22:53 | 显示全部楼层
除  和求 余
回复

使用道具 举报

ID:150661 发表于 2016-11-27 23:49 | 显示全部楼层
多个数码管并联,并且需要改程序
回复

使用道具 举报

ID:150658 发表于 2016-11-28 11:08 | 显示全部楼层
可以用定时器中断写
回复

使用道具 举报

ID:150658 发表于 2016-11-28 11:08 | 显示全部楼层
参考(郭天祥)那本书
回复

使用道具 举报

ID:150658 发表于 2016-11-28 11:11 | 显示全部楼层
单纯用这种循环的方法解决不好,建议学习一下定时器中断,那样你就不知是0~99  0~999啦甚至可以更大
回复

使用道具 举报

ID:153199 发表于 2016-12-16 18:02 | 显示全部楼层
增加硬件和程序
回复

使用道具 举报

ID:155314 发表于 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. }
复制代码
回复

使用道具 举报

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

明明我数码管显示先写消影再写位选之后写了段选最后写个延时就是为了使数码管动态显示
回复

使用道具 举报

ID:102056 发表于 2016-12-16 22:23 | 显示全部楼层

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
}

}
回复

使用道具 举报

ID:156793 发表于 2016-12-22 11:02 | 显示全部楼层
动态扫描
回复

使用道具 举报

ID:156899 发表于 2016-12-22 16:46 | 显示全部楼层
原理图Kian起来好乱啊
回复

使用道具 举报

ID:150126 发表于 2016-12-23 15:13 | 显示全部楼层
把位选改下就行了
回复

使用道具 举报

ID:153199 发表于 2016-12-25 18:56 | 显示全部楼层
感谢楼主分享,真心不错
回复

使用道具 举报

ID:271665 发表于 2018-1-4 21:51 | 显示全部楼层
楼主怎么让数码管显示某一个数字时,用按键暂停显示,同时要求发光二极管闪烁??
回复

使用道具 举报

ID:271741 发表于 2018-1-5 00:36 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:469510 发表于 2019-6-27 10:39 | 显示全部楼层
谢谢分享,刚好用到!
回复

使用道具 举报

ID:307020 发表于 2019-6-28 08:42 | 显示全部楼层
非常经典的例程,几乎每一本C51编程的书里都有,感谢楼主给大家增加黑币的机会。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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