找回密码
 立即注册

QQ登录

只需一步,快速开始

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

流星雨程序不懂请大家帮帮我吧

[复制链接]
跳转到指定楼层
楼主
ID:67818 发表于 2014-11-1 00:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序在下面
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:67818 发表于 2014-11-1 00:38 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar abit=16; //流到哪位
uchar atimer0_n;
uchar code abit8[9]={1,2,4,8,16,32,64,128,0};
uchar nn;
char a,b,c,d;

main()
{        TMOD = 0x11;       
        TL0 = 0x00;                //2.5ms
        TH0 = 0xF7;       
        TF0 = 0;               
        TR0 = 1;       
        EA=1;ET0=1;
        while(1)
        {
         a=abit;
         if(a>7||a<0)
                a=8;
         b=abit-1;
         if(b>7||b<0)
                 b=8;
         c=abit-2;
         if(c>7||c<0)
                 c=8;
                 d=abit-3;
         if(d>7||d<0)
                 d=8;
       
               
        atimer0_n++;
        if(atimer0_n==255)
        atimer0_n=0;
        if(atimer0_n<5)
                P1=0xff-abit8[a];
        if(atimer0_n<40)
                P1=0xff-abit8[b];
        if(atimer0_n<150)
                P1=0xff-abit8[c];       
        if(atimer0_n<255)
                P1=0xff-abit8[d];       
        }
}

atimer0 () interrupt 1
{       
        TL0 = 0x00;                //50ms
        TH0 = 0x4C;
        nn++;
        if(nn==2)
        {
                nn=0;abit--;
                 if(abit==0)
                 abit=16;
        }

               
}
回复

使用道具 举报

板凳
ID:67818 发表于 2014-11-1 00:41 | 只看该作者
while(1)后面就彻底看不懂了,我脑子有点笨呵呵,请大神耐心详细解答在此先谢谢啦
回复

使用道具 举报

地板
ID:1 发表于 2014-11-1 02:21 | 只看该作者
最好有电路图
回复

使用道具 举报

5#
ID:51348 发表于 2014-11-1 17:15 | 只看该作者
前面一段是排序,来排列最亮到最暗,总共4位,后面是给四个LED赋值进行占空比调整,其中a>7||a<0是16进制转化为2进制,然后八位2进制按位进行或运算,主要是定位哪一位

评分

参与人数 1黑币 +50 收起 理由
huqin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:67818 发表于 2014-11-1 22:05 | 只看该作者
T29 发表于 2014-11-1 17:15
前面一段是排序,来排列最亮到最暗,总共4位,后面是给四个LED赋值进行占空比调整,其中a>7||a

不懂你说的16进制转换成2进制的意识,A不是被赋值为16吗   IF(A>7||A<0)  还有A=8 B=8 C=8 D=8又是什么意识求老师耐心讲解
回复

使用道具 举报

7#
ID:51348 发表于 2014-11-2 03:05 | 只看该作者
本帖最后由 T29 于 2014-11-2 03:06 编辑

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar abit=16; //流到哪位
uchar atimer0_n; //主程序循环次数
uchar code abit8[9]={1,2,4,8,16,32,64,128,0};
uchar nn;
char a,b,c,d;

main()
{        TMOD = 0x11;        
        TL0 = 0x00;                //2.5ms
        TH0 = 0xF7;        
        TF0 = 0;               
        TR0 = 1;        
        EA=1;ET0=1;
        while(1)
        {
         a=abit;//初次赋值,中间赋值在定时,再次赋值在定时里
    //8次循环显示,四位LED          abcd 00000000
          //                                         abc d0000000
          //                                           ab cd000000
          //                                             a bcd00000
          //                                                abcd0000
          //以上是a的值是16-8之间的变化,7-0是低四位加上退出四位,同时进行赋值给abcd进行占空比
         if(a>7||a<0)a=8;//在单片机里面,无符号数据小于0会变成最大值,也就是小于0会变成255
         b=abit-1;
         if(b>7||b<0)b=8;
         c=abit-2;
         if(c>7||c<0)c=8;
         d=abit-3;
         if(d>7||d<0)d=8;
        
               
        atimer0_n++;
        if(atimer0_n==255)
        atimer0_n=0;
        if(atimer0_n<5)P1=0xff-abit8[a];//256-128转成2进制,0为亮,01111111时间最短循环5次,所以最暗
        if(atimer0_n<40)P1=0xff-abit8;//256-64转成2进制,0为亮,10111111
        if(atimer0_n<150)P1=0xff-abit8[c]; //256-32转成2进制,0为亮,11011111      
        if(atimer0_n<255) P1=0xff-abit8[d]; //256-16转成2进制,0为亮,11101111  时间最长,最亮     
        }
}

atimer0 () interrupt 1
{        
        TL0 = 0x00;                //50ms
        TH0 = 0x4C;
        nn++;
        if(nn==2)
        {
                nn=0;abit--;
                 if(abit==0)abit=16;
        }

               
}


只能靠易会理解了,说不清楚呀
回复

使用道具 举报

8#
ID:67818 发表于 2014-11-2 10:34 | 只看该作者
T29 发表于 2014-11-2 03:05
#include
#define uint unsigned int
#define uchar unsigned char

虽然现在还不能理解,但是过一段时间就会好的

因此对于您的解答我非常感谢!
回复

使用道具 举报

9#
ID:67992 发表于 2014-11-3 10:31 | 只看该作者
[img][/img]
在if条件判断中可以转换进制吗?可不可以赋值?比如if(i=8)?
回复

使用道具 举报

10#
ID:67992 发表于 2014-11-3 10:36 | 只看该作者
求a>7||a<0是16进制转化为2进制,设a=0和a=8时表达式的值为多少?
回复

使用道具 举报

11#
ID:67992 发表于 2014-11-3 15:44 | 只看该作者
本帖最后由 dgahz 于 2014-11-4 10:09 编辑

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar abit=16;
uchar atimer0_n;
uchar code abit8[9]={254,253,251,247,239,223,191,127,255}; /*对应{11111110,11111101,11111011,11110111,11101111,
uchar nn;                                                                                       11011111,10111111,01111111,11111111} 0为灯亮,
char a,b,c,d;                                                                                 1为灯灭*/

main()
{        TMOD = 0x11;        
        TL0 = 0x00;          /*每进一次中断abit变动一次。则 a,b,c,d 变动一次。
        TH0 = 0xF7;          取a,b,c,d 的值,值代表数组abit8[]元素的序号。相当P1口赋值相应元素。
        TF0 = 0;                while执行扫描50ms进一次中断*/
        TR0 = 1;        
        EA=1;ET0=1;                        
        while(1)              /*   if(a>7||a<0)中“||”是或者的意思,即如果a>7或者a<0只要其中一个成立则条件成立,执行下面语句,否则跳过。
                                        当abit在16-11时:a=b=c=d=8. 灯全灭。
        {                              当abit=10:a=8,b=8,c=8,d=7.进一次中断11111111,11111111,11111111,01111111
         a=abit;                    当abit=9: a=8,b=8,c=7,d=6.进一次中断11111111,11111111,01111111,10111111
         if(a>7||a<0)            当abit=8: a=8,b=7,c=6,d=5.进一次中断11111111,01111111,10111111,11011111
                a=8;                当abit=7: a=7,b=6,c=5,d=4.进一次中断01111111,10111111,11011111,11101111
         b=abit-1;                 当abit=6: a=6,b=5,c=4,d=3.进一次中断
                                        当abit=5: a=5,b=4,c=3,d=2.进一次中断
                                        当abit=4: a=4,b=3,c=2,d=1.进一次中断
         if(b>7||b<0)            当abit=3: a=3,b=2,c=1,d=0.进一次中断
                 b=8;               当abit=2: a=2,b=1,c=0,d=8.进一次中断
         c=abit-2;                 当abit=1: a=1,b=0,c=8,d=8.进一次中断
         if(c>7||c<0)            当abit=0: a=0,b=8,c=8,d=8.进一次中断
                                                        
                 c=8;                当abit在16-11时:满足4个if条件,a=b=c=d=8;P1=abit8[8]=11111111,灯全灭。也就是说有
         d=abit-3;                  一段时间灯是不亮的。
         if(d>7||d<0)             当abit=0时:第1个条件不满足,不执行a=8,则a=abit=0;后面3个条件b<0,c<0,d<0都满足,
                 d=8;                 所以执行b=c=d=8.*/
        
               
        atimer0_n++;
        if(atimer0_n==255)        //假设某一次进中断取得abit=7:则 a=7,b=6,c=5,d=4.则有如下:
        atimer0_n=0;
        if(atimer0_n<5)
                P1=abit8[a];      //P2=01111111    //255次循环中这句只执行了5次
        if(atimer0_n<40)
                P1=abit8;       //P2=10111111   //255次循环中这句只执行了40次
        if(atimer0_n<150)
                P1=abit8[c];   //P2=11011111   //255次循环中这句只执行了150次
        if(atimer0_n<255)
                P1=abit8[d];    //P2=11101111   //255次循环中这句只执行了255次
        }                                                           //执行的次数越多等效于灯亮的时间越长,每次循环视觉上4灯亮。

}                                           /*while一直重复执行到50ms结束再进中断取得新的a,b,c,d值为止,abit变则相当于a,b,c,d值变。
                                              while执行255次则n同步等于255,50ms中能执行多少个255次不知道。*/
atimer0 () interrupt 1
{        
        TL0 = 0x00;                //50ms
        TH0 = 0x4C;
        nn++;
        if(nn==2)
        {
                nn=0;abit--;          //abit变化范围16-0;
                 if(abit==0)
                 abit=16;
        }

               
}                                          //程序效果右移
回复

使用道具 举报

12#
ID:67818 发表于 2014-11-3 22:55 | 只看该作者
好人啊谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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