找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新手想做一个定时器控制的动态数码管 遇到问题 求大神解答 代码如下

[复制链接]
跳转到指定楼层
楼主
本帖最后由 MTR 于 2020-2-20 23:29 编辑

#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit A0=P2^2;
sbit A1=P2^3;
sbit A2=P2^4;

u8 code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main ()
{
        u8 j=0;
        int i,k;
        TMOD|=0x01;
        TH0=0xFC;
        TL0=0X18;
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
                switch(j)
                {
                        case(0):    A0=0;A1=0;A2=0;break;
                        case(1):    A0=1;A1=0;A2=0;break;
                        case(2):    A0=0;A1=1;A2=0;break;
                        case(3):    A0=1;A1=1;A2=0;break;
                        case(4):    A0=0;A1=0;A2=1;break;
                        case(5):    A0=1;A1=0;A2=1;break;
                        case(6):    A0=0;A1=1;A2=1;break;
                        case(7):    A0=1;A1=1;A2=1;break;
                }
                if(i==1000)
                {
                        P0=shuzu[j];
                        i=0;                  
                        j++;
                        if(j==7)
                        {
                                j=0;
                        }
                }        


        }
           //while(1);

}
void time0() interrupt 1
{
        static int i;
        TH0=0xFC;
        TL0=0X18;
        i++;        
}
为什么实现不了我理想中的 数码管从右向左动态显示0-7呢 程序哪里出了问题(编译没有问题 语法上应该没错) 求解答 感谢!

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

使用道具 举报

沙发
ID:235200 发表于 2020-2-21 00:42 | 只看该作者
位的选择最好在中断里实现较好
#define A0 P22
#define A1 P23
#define A2 P24
#define DISP P0

//共阴数码管显示段码
u8 code dispcode[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
u8 dispbuf[8]={0,1,2,3,4,5,6,7};
void time0() interrupt 1 using 1
{
        static u8 wei;                 //wei用于位扫描
        DISP=0;                        //消影
        DISP=SHUZI[dispbuf[wei]];   //显示缓冲区数据依次显示
        switch(wei)
        {
                case 0:A2=1;A1=1;A0=1;break;
                case 1:A2=1;A1=1;A0=0;break;       
                case 2:A2=1;A1=0;A0=1;break;
                case 3:A2=1;A1=0;A0=0;break;
                case 4:A2=0;A1=1;A0=1;break;
                case 5:A2=0;A1=1;A0=0;break;       
                case 6:A2=0;A1=0;A0=1;break;
                case 7:A2=0;A1=0;A0=0;break;       
        }
        wei++;
        wei%=8;                         //m在0-7之间变化
}
TH0  TL0改为
       TH0=0xF8;
        TL0=0XCD;  //11.0592MHZ  或0x30 对应12MHz
主程序只需要:
while(1)
{
;
}
回复

使用道具 举报

板凳
ID:213173 发表于 2020-2-21 05:32 | 只看该作者
错误已在注释中指出


  1. #include<reg51.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. sbit A0=P2^2;
  5. sbit A1=P2^3;
  6. sbit A2=P2^4;

  7. u8 code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  8. u8 i=0;//中断标志

  9. void main ()
  10. {
  11.         u8 j=0;
  12. //        int i,k;
  13.         TMOD|=0x01;
  14.         TH0=0xFC;
  15.         TL0=0X18;
  16.         EA=1;
  17.         ET0=1;
  18.         TR0=1;
  19.         while(1)
  20.         {
  21.                 if(i==1)
  22.                 {
  23.                         i=0;//中断标志清0
  24.                         P0=0x00;//消隐
  25.                         switch(j)//送位码
  26.                         {
  27.                                 case(0):A0=0;A1=0;A2=0;break;
  28.                                 case(1):A0=1;A1=0;A2=0;break;
  29.                                 case(2):A0=0;A1=1;A2=0;break;
  30.                                 case(3):A0=1;A1=1;A2=0;break;
  31.                                 case(4):A0=0;A1=0;A2=1;break;
  32.                                 case(5):A0=1;A1=0;A2=1;break;
  33.                                 case(6):A0=0;A1=1;A2=1;break;
  34.                                 case(7):A0=1;A1=1;A2=1;break;
  35.                         }
  36.                         P0=shuzu[j];//送段码
  37. //                        i=0;                  
  38.                         j++;
  39.                         if(j>=8)
  40.                         {
  41.                                 j=0;
  42.                         }
  43.                 }        
  44.         }
  45.         //while(1);
  46. }
  47. void time0() interrupt 1
  48. {
  49. //        static int i;//静态局部变量外部函数不可使用
  50.         TH0=0xFC;
  51.         TL0=0X18;
  52. //        i++;        
  53.         i=1;
  54. }
复制代码



回复

使用道具 举报

地板
ID:462827 发表于 2020-2-21 09:04 | 只看该作者
  1. #include<reg51.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. sbit A0=P2^2;
  5. sbit A1=P2^3;
  6. sbit A2=P2^4;

  7. u8 j=0;
  8. u8 code shuzu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  9. void delay(u16 t)
  10. {
  11.     while(t--);
  12. }

  13. void main ()
  14. {
  15.     u8 i;
  16.     TMOD|=0x01;
  17.     TH0=0xFC;
  18.     TL0=0X18;
  19.     EA=1;
  20.     ET0=1;
  21.     TR0=1;
  22.     while(1)
  23.     {
  24.         for(i=0;i<8;i++)
  25.         {
  26.             A0=i&0x01;
  27.             A1=i&0x02;
  28.             A2=i&0x04;
  29.             P0=shuzu[(i+j)%8];
  30.             delay(100);
  31.             P0=0x00;
  32.         }
  33.     }
  34. }

  35. void time0() interrupt 1
  36. {
  37.     static int tick=0;
  38.     TH0=0xFC;
  39.     TL0=0X18;
  40.     tick++;
  41.     if(tick==1000)
  42.     {
  43.         tick=0;
  44.         j=(j+1)%8;
  45.     }
  46. }
复制代码
回复

使用道具 举报

5#
ID:687423 发表于 2020-2-21 09:06 | 只看该作者
楼主的大致思路没有问题,但是在c语言变量方面的控制存在些问题,中断程序中的i和主函数的i并不是一个i,中断的i++只是对中断函数的i进行了处理,并没有对主函数中的i处理,直接将i设置为全局变量,就可以实现了。
回复

使用道具 举报

6#
ID:688861 发表于 2020-2-21 14:10 | 只看该作者

大哥您这个程序太强了 是每一个数码管都会从0-7
我想做的仅仅是从右到左这8个数码管一次从0-7 然后接着循环
回复

使用道具 举报

7#
ID:688861 发表于 2020-2-21 14:57 | 只看该作者
wulin 发表于 2020-2-21 05:32
错误已在注释中指出

您的注释我看明白了 可是在中断服务函数里没有持续的加1 怎么能够计时呢 这个程序我传到单片机里显示的是8个数码管全亮
回复

使用道具 举报

8#
ID:688861 发表于 2020-2-21 14:58 | 只看该作者
。。jj 发表于 2020-2-21 09:06
楼主的大致思路没有问题,但是在c语言变量方面的控制存在些问题,中断程序中的i和主函数的i并不是一个i,中 ...

明白 感谢!
回复

使用道具 举报

9#
ID:462827 发表于 2020-2-21 19:24 | 只看该作者
MTR 发表于 2020-2-21 14:10
大哥您这个程序太强了 是每一个数码管都会从0-7
我想做的仅仅是从右到左这8个数码管一次从0-7 然后接着 ...

那简单,把我那份代码的
P0=shuzu[(i+j)%8];
这一行代码改成
P0=(i<=j)?shuzu[ i]:0;
就可以了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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