程序是用keil c写的,用单片机仿真软件proteus软件进行仿真,  #include "reg52.h"

sbit DS = P2^0;

sbit SH = P2^1;

sbit ST = P2^2;

#define uchar unsigned char

#define uint unsigned int

#define uchar unsigned char

uchar a1=0x01,a2=0x02,a3=0x04,a4=0x08,a5=0x10,a6=0x20,a7=0x40,a8=0x80;

uint a9=0x0100,a10=0x0200,a11=0x0400,a12=0x0800,a13=0x1000,a14=0x2000,a15=0x4000,a16=0x8000,s1=0x00,s1t=0x00;

uchar ul1[]={5,3,0x01,0x02,0x04};ul0[]={5,3,0x04,0x02,0x01};w[]={5,3,0x08,0x10,0x20};

void delay(unsigned int delay)

{

    unsigned char i;

    for(;delay>0;delay--)

    for(i=0;i<125;i++);

}

void s_d(uchar d[])//发送数据

{

 uchar i,j; 

  

 for(i=2;i<d[0];i++)
 {

  s1=s1^d;

  s1t=s1;

  ST=0;

  for(j=0;j<16;j++)

  {

   SH=0;

   s1t=s1t<<1;

   DS = CY;

   SH=1; 

  }

  delay(d[1]); //延迟

  ST=1;    //输出结果

  

 } 

}

main

{

main ()

{

s_d(ul1);

delay(10);

s_d(ul0);

delay(10);

s_d(w)

}

}
我是这么考虑的,a1到a16分别对应两片595的16个输出端,s1和s1l是输出的最终结果。

数组ul1[]和ul0[]是控制a1,a2,a3开启和关闭的,这三台电机作为一个整体实现一个功能,用ul0和ul1来整体控制。

ul1{5,3,0x01,0x02,0x04}这五个元素分别代表,5:数组有5个元素,3:每个电机开启的间隔时间为3秒,0x01,0x02,0x04就代表ul组的三个电机。

我用ul1这个数组作为子程序s_d的参数。但是程序这样写不行,模拟运行后发现一个灯都不能亮。于是找问题,我先不用模块化,先把函数写到main里。

main

{

  

 i=2;


  s1=ul1;

  s1t=s1;

  ST=0;

  for(h=0;h<16;h++)

  {

   SH=0;

   s1t=s1t<<1;

   DS = CY;

   SH=1; 

  }

  ST=1;



}

这样写完全正常,我不停的手动改i的值,i=2,i=3,i=4,模拟运行结果正常,

但是我如果加入一个for的循环之后,模拟运行的结果就完全错误,代码是这样的:

main

{

i=2;


for(i=2;i<ul1[0];i++)
    {

    s1=ul1;

    s1t=s1;

    ST=0;

    for(h=0;h<16;h++)

      {

       SH=0;

       s1t=s1t<<1;

       DS = CY;

       SH=1; 

       }

    ST=1;

    i++  

    }

}

把for改成for(;i<5;) 也是一样的。

我想问一下,我的代码到底错在哪里?麻烦大家帮忙看看。

还有一个问题就是如果按最初的想法模块化,子程序应该如何才能接收数组作为参数呢?应该怎么写才对?