以下是一个c编写的程序。求高手解惑

[复制链接]
 楼主| 211c求知 发表于 2012-8-18 11:51 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uint unsigned int
uint k,i;
sbit D1=P0^0;
sbit D2=P0^1;
sbit D3=P0^2;
sbit D4=P0^3;
sbit D5=P0^4;
sbit D6=P0^5;
sbit D7=P0^6;
sbit D8=P0^7;
void start()
{   
     int i=0;
     P0=0XFF;              
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;
     EA=1;
     ET0=1;
     TR0=1;
}
void main()
{  
    start();
   while(1)
   {
      if(k==40)//每两秒更换一次指示灯,共有八个指示灯
         {
           k=0;
           i++;         
         if(i==8)
         i=0;      
         }
         if(k%4==0)//每个指示灯都是每隔0.2秒闪烁一次。
         {   
           if(i==0)
           D1=~D1;      
           if(i==1)
            D2=~D2;         
            if(i==2)
            D3=~D3;         
            if(i==3)
            D4=~D4;;
            if(i==4)
            D5=~D5;
            if(i==5)
            D6=~D6;
            if(i==6)
            D7=~D7;
            if(i==7)
            D8=~D8;
         }                    
   }
}
void temer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
     k++;
}
//下载到51开发板上时,问题是指示灯还没有到两秒有的指示灯也亮了,同一时间有多个灯亮了。求高手指点。
ZG11211 发表于 2012-8-20 17:16 | 显示全部楼层
第一,从精简思维出发,不需要int整形变量,只要char字符型即可
第二,执行效率上来说if(k%4==0){
                                     switch(i) {
                                                          case 0:P0 =1;D1=~D1; break;//P0=1 清屏
                                       case 1:————————————
                                       --------------------
                                       case 7

}   
}

评分

参与人数 1威望 +1 收起 理由
211c求知 + 1 我很赞同

查看全部评分

wenshu20 发表于 2012-8-24 15:13 | 显示全部楼层
i和k的关系有点矛盾
xiaozhangccit 发表于 2012-8-24 15:45 | 显示全部楼层
if(k%4==0)
{
  .....
}
这个效率上有问题,在这里面会浪费时间的,假设第一次k==4,i==0执行了第一个if(i==0)后,但并没有终止这个if(k==4),应该终止以下的if比较语句的,因为i==0后肯定不会等于其他1,2,3...这样效率降低了,浪费了时间
songhere 发表于 2012-8-25 23:23 | 显示全部楼层
这排版,啧啧。。。
雷影少年 发表于 2012-8-26 17:17 | 显示全部楼层
2楼的程序也有点问题的,你的程序应该没有闪烁的
LZ的程序只注意给关注的灯取反了,忘记在让关注的灯闪烁的同时把别的等给关掉,照成了多盏灯同时亮的结果,建议程序这样写
  1. if(k>=40)
  2. {
  3. k=0;
  4. if(k%4==0)
  5. {
  6. switch(i)
  7. {
  8. case 0: D1=~D1;
  9. ...
  10. }
  11. }
  12. else P0=0;//0点亮取0xff,1点亮取0
  13. if(++i=8) i=0;
  14. }



 楼主| 211c求知 发表于 2012-8-28 17:56 | 显示全部楼层
谢谢你,是的,每次一旦检测到了就终止往下的检测。。
 楼主| 211c求知 发表于 2012-8-28 17:57 | 显示全部楼层
4# xiaozhangccit
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部