找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2950|回复: 9
收起左侧

为什么单片机数码管只在第7个上面亮,流水灯也只在一个上亮

[复制链接]
ID:95352 发表于 2019-11-18 23:43 | 显示全部楼层 |阅读模式
http://www.iqiyi.com/w_19say7ygl1.html
目的是通过定时器中断来让流水灯和数码管做出相应的动作;
流水灯每隔时间在第一个p10和第二个p11流水
数码管从左边到右边分别显示,并且由0-7变化,即第一个数码管显示0,第二个显示1,第三个显示2.。。。依次循环

单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
int num=0;
int p=0;
int q=0;
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
char code table1[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
void init()
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;//打开总中断
TMOD=0x01;
ET0=1;//打开定时器中断
TR0=1;//定时器中断开始
}
void delay0(int i)
{
while(i--);
}

void main()
{
init();

while(1)
{
  if(p==40)
  {
   if(num<8)
   {
       switch(num)
    {
        case 0:p20=0;p21=0;p22=0;P0=table1[num];P1=0xfe;
     case 1:p20=0;p21=0;p22=1;P0=table1[num];P1=0xfd;
     case 2:p20=0;p21=1;p22=0;P0=table1[num];P1=0xfe;
     case 3:p20=0;p21=1;p22=1;P0=table1[num];P1=0xfd;
     case 4:p20=1;p21=0;p22=0;P0=table1[num];P1=0xfe;
     case 5:p20=1;p21=0;p22=1;P0=table1[num];P1=0xfd;
     case 6:p20=1;p21=1;p22=0;P0=table1[num];P1=0xfe;
     case 7:p20=1;p21=1;p22=1;P0=table1[num];P1=0xfd;
    }
    num++;
   }
   else
   {
    num=0;
   }
      p=0;
  }
}
}
void delay1() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
p++;
q++;
}


51hei图片_20191118232916.png
51hei图片_20191118232919.png
回复

使用道具 举报

ID:25310 发表于 2019-11-19 08:18 | 显示全部楼层
LED 亮后没加延时就灭了。
回复

使用道具 举报

ID:277550 发表于 2019-11-19 09:04 | 显示全部楼层
void main(){
        init();

        while(1){
                if(p==40){
                        if(num<8){
                                switch(num){
                                case 0:p20=0;p21=0;p22=0;P0=table1[num];P1=0xfe;
                                case 1:p20=0;p21=0;p22=1;P0=table1[num];P1=0xfd;
                                case 2:p20=0;p21=1;p22=0;P0=table1[num];P1=0xfe;
                                case 3:p20=0;p21=1;p22=1;P0=table1[num];P1=0xfd;
                                case 4:p20=1;p21=0;p22=0;P0=table1[num];P1=0xfe;
                                case 5:p20=1;p21=0;p22=1;P0=table1[num];P1=0xfd;
                                case 6:p20=1;p21=1;p22=0;P0=table1[num];P1=0xfe;
                                case 7:p20=1;p21=1;p22=1;P0=table1[num];P1=0xfd;
                                }
                                num++;
                                delay(15);////////////////////////这一行,放在两个if里面。
                        }else{
                                num=0;
                        }
                        p=0;
                }
        }
}
回复

使用道具 举报

ID:277550 发表于 2019-11-19 09:13 | 显示全部楼层
函数改成这样

delay0(100);////////////////////////这一行,放在两个if里面。
回复

使用道具 举报

ID:95352 发表于 2019-11-19 09:30 | 显示全部楼层
devcang 发表于 2019-11-19 09:04
void main(){
        init();

为啥加了还是只是p1.1这个灯在亮
  1.         if(num<8)
  2.                         {
  3.                             switch(num)
  4.                                 {
  5.                                     case 0:P1=0xfe;p20=0;p21=0;p22=0;P0=table1[num];
  6.                                         case 1:P1=0xfd;p20=0;p21=0;p22=1;P0=table1[num];
  7.                                         case 2:P1=0xfe;p20=0;p21=1;p22=0;P0=table1[num];
  8.                                         case 3:P1=0xfd;p20=0;p21=1;p22=1;P0=table1[num];
  9.                                         case 4:P1=0xfe;p20=1;p21=0;p22=0;P0=table1[num];
  10.                                         case 5:P1=0xfd;p20=1;p21=0;p22=1;P0=table1[num];
  11.                                         case 6:P1=0xfe;p20=1;p21=1;p22=0;P0=table1[num];
  12.                                         case 7:P1=0xfd;p20=1;p21=1;p22=1;P0=table1[num];
  13.                                 }
  14.                                
  15.                                 delay0(50000);
  16.                                 num++;
  17.                         }
复制代码
回复

使用道具 举报

ID:95352 发表于 2019-11-19 09:38 | 显示全部楼层
  1. void main()
  2. {
  3.         init();

  4.         while(1)
  5.         {
  6.                 if(p==40)
  7.                 {
  8.                         if(num<8)
  9.                         {
  10.                             switch(num)
  11.                                 {
  12.                                     case 0:P1=0xfe;p20=0;p21=0;p22=0;P0=table1[num];
  13.                                         case 1:P1=0xfd;p20=0;p21=0;p22=1;P0=table1[num];
  14.                                         case 2:P1=0xfe;p20=0;p21=1;p22=0;P0=table1[num];
  15.                                         case 3:P1=0xfd;p20=0;p21=1;p22=1;P0=table1[num];
  16.                                         case 4:P1=0xfe;p20=1;p21=0;p22=0;P0=table1[num];
  17.                                         case 5:P1=0xfd;p20=1;p21=0;p22=1;P0=table1[num];
  18.                                         case 6:P1=0xfe;p20=1;p21=1;p22=0;P0=table1[num];
  19.                                         case 7:P1=0xfd;p20=1;p21=1;p22=1;P0=table1[num];
  20.                                 }
  21.                                
  22.                                 delay0(50000);
  23.                                 num++;
  24.                         }
  25.                         else
  26.                         {
  27.                                 num=0;
  28.                         }
  29.                     p=0;
  30.                 }
  31.         }

  32. }
复制代码



为啥加了延时之后还是一样?
回复

使用道具 举报

ID:277550 发表于 2019-11-19 09:57 | 显示全部楼层
图和程序,不对应的。 。。。。。。
回复

使用道具 举报

ID:277550 发表于 2019-11-19 14:27 | 显示全部楼层
switch
每个 case 后边,加break   


。。。。。。。。。逻辑也要调整一下的,自己慢慢 调整 试试
回复

使用道具 举报

ID:277550 发表于 2019-11-19 14:39 | 显示全部楼层
罢了,不卖关子了,贴


        while(1){
                switch(num){
                case 0:p20=0;p21=0;p22=0;P0=table1[q];P1=0xfe; break;
                case 1:p20=0;p21=0;p22=1;P0=table1[q];P1=0xfd; break;
                case 2:p20=0;p21=1;p22=0;P0=table1[q];P1=0xfb; break;
                case 3:p20=0;p21=1;p22=1;P0=table1[q];P1=0xf7; break;
                case 4:p20=1;p21=0;p22=0;P0=table1[q];P1=0xef; break;
                case 5:p20=1;p21=0;p22=1;P0=table1[q];P1=0xdf; break;
                case 6:p20=1;p21=1;p22=0;P0=table1[q];P1=0xbf; break;
                case 7:p20=1;p21=1;p22=1;P0=table1[q];P1=0x7f; break;
                }
                delay0(30);
               
                num++;
                if(num==8){
                        num=0;
                }
               
                if(p==20){
                        p=0;
                        q++;
                        if(q>9) q=0;
                }
        }
回复

使用道具 举报

ID:213173 发表于 2019-11-19 15:23 | 显示全部楼层
switch-case-break语句和位码都错了,给你改成数码管动态显示0~7+流水灯
无标题.jpg

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. sbit p20=P2^0;
  4. sbit p21=P2^1;
  5. sbit p22=P2^2;
  6. char num=0;
  7. int  q=0;
  8. bit  p=0;
  9. char code table1[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};

  10. void init()
  11. {
  12.         TMOD=0x01;
  13.         TH0=(65535-1000)/256;//1ms
  14.         TL0=(65535-1000)%256;
  15.         TR0=1;//定时器中断开始
  16.         EA=1;//打开总中断
  17.         ET0=1;//打开定时器中断
  18. }
  19. /*
  20. void delay0(int i)
  21. {
  22.         while(i--);
  23. }
  24. */
  25. void main()
  26. {
  27.         init();
  28.         P1=0xfe;//初始化
  29.         while(1)
  30.         {
  31.                 if(p==1)
  32.                 {
  33.                         p=0;
  34.                         P0=0x00;//消隐
  35.                         switch(num)//送位码
  36.                         {
  37.                                 case 0:p20=0;p21=0;p22=0;break;
  38.                                 case 1:p20=1;p21=0;p22=0;break;
  39.                                 case 2:p20=0;p21=1;p22=0;break;
  40.                                 case 3:p20=1;p21=1;p22=0;break;
  41.                                 case 4:p20=0;p21=0;p22=1;break;
  42.                                 case 5:p20=1;p21=0;p22=1;break;
  43.                                 case 6:p20=0;p21=1;p22=1;break;
  44.                                 case 7:p20=1;p21=1;p22=1;break;
  45.                         }
  46.                         P0=table1[num];//送段码
  47.                         num++;
  48.                         num%=8;//0~7
  49.                         q++;
  50.                         if(q>=500)//0.5秒
  51.                         {
  52.                                 q=0;
  53.                                 P1=(P1<<1)+1;//左移1位补1
  54.                                 if(P1==0xff)
  55.                                         P1=0xfe;       
  56.                         }
  57.                 }
  58.         }
  59. }
  60. void delay1() interrupt 1
  61. {
  62.         TH0=(65535-1000)/256;
  63.         TL0=(65535-1000)%256;
  64.         p=1;
  65. }
复制代码




回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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