#includestc8051.h#defineucharunsignedchar#defineWREN0X06#defineWRITE0X02#defineREAD0X03sbitSPI_CS=P1^4;sbitSPI_SI=P1^5;sbitSPI_SO=P1^6;sbitSPI_SCLK=P1^7;voiddelay(unsignedintnum){unsignedinti;for(i=0;inum;i++);}/********************************************函数的功能:任意写入一字节函数原型:voidwrite_byte(ucharbyte)函数输入:一字节数函数输出:无********************************************/voidwrite_byte(ucharbyte){uchari;for(i=0;i8;i++){if((byte&0x80)==0)//判断字节最高位SPI_SI=0;elseSPI_SI=1;SPI_SCLK=0;delay(500);SPI_SCLK=1;//上升沿作用下写入数据delay(500);byte=1;}}/********************************************函数的功能:连写操作数函数原型:voidwrite_data(ucharlenth,ucharaddr,ucharvalue[])函数输入:长度,首地址,数据函数输出:无********************************************/voidwrite_data(ucharlenth,ucharaddr,uchar*write_data)/*不需要长度*/{uchari;SPI_CS=0;write_byte(WREN);//写入写使能端WREN=0X06SPI_CS=1;SPI_CS=0;write_byte(WRITE);//写入写指令WRITE=0X02write_byte(addr);//写入首地址for(i=0;ilenth;i++){write_byte(*(write_data+i));}SPI_CS=1;}/********************************************函数的功能:读入任意一字节数函数原型:ucharread_byte()函数输入:数据函数输出:数据********************************************/ucharread_byte(){uchari;ucharsum=0;//定义一个空字节for(i=0;i8;i++){SPI_SCLK=1;delay(500);SPI_SCLK=0;//下升沿作用下移出数据delay(500);sum=1;if(SPI_SO==1)sum++;}returnsum;}/********************************************函数的功能:连读操作函数原型:ucharread_data(ucharadress,ucharlenth)函数输入:首地址函数输出:数据********************************************/uchar*read_data(ucharadress,ucharlenth)//定义成返回地址的函数{uchari;ucharRceiveBuffer[256];//定义接收缓冲SPI_CS=0;write_byte(READ);//写入读指令READ=0X03write_byte(adress);//写首地址for(i=0;ilenth;i++){RceiveBuffer[i]=read_byte();//读出数据}SPI_CS=1;returnRceiveBuffer;//数组名即为首地址}/********************************************函数的功能:串行口的接收函数原型:voiduart_receive();函数输入:无函数输出:接收到的数据********************************************/ucharuart_receive(){uchartemp;while(!RI);//监测RI。当RI变为1的时候。标志收到数据temp=SBUF;//收到的数据放在全局变量RI=0;//清零标志位returntemp;}/********************************************函数的功能:串行口的发送子程序函数原型:voiduart0_send()函数输入:要输出的数据函数输出:无********************************************/voiduart0_send(uchartemp){SBUF=temp;//发送while(!TI);//判断是否发送完毕,当TI=1的时候,标志发送完毕TI=0;//清零标志位}/********************************************函数的功能:串行口的初始化函数原型:voiduart0_init(void);函数输入:无函数输出:无********************************************/voiduart0_init(void){SCON=0X50;//串口工作在模式1TMOD=0X20;//定时器T1工作在模式2PCON=0X80;TH1=0XF4;TL1=0XF4;//晶振频率22.1184MHZ波特率为9600TR1=1;//开启定时器T1}voidmain(void){ucharFreamStart,Freamend,w_lenth,w_addr,r_adress,*r_data,r_lenth,*w_value;uchari;uart0_init();while(1){FreamStart=uart_receive();if(FreamStart==0x01)//判断帧头,执行写操作{w_addr=uart_receive();//读出串口接收的地址w_lenth=uart_receive();for(i=0;iw_lenth;i++){w_value[i]=uart_receive();//读出串口接收的数据}Freamend=uart_receive();if(Freamend==0xa8)//判断帧尾,调用写操作write_data(w_lenth,w_addr,w_value);//数组作为实参,w_value[i],要引用数组的首地址}elseif(FreamStart==0x02)//判断帧头,执行读操作{r_adress=uart_receive();//读出串口接收的地址r_lenth=uart_receive();Freamend=uart_receive();//串口接收的数据返给帧尾if(Freamend==0xa8)//判断帧尾,调用读操作{r_data=read_data(r_adress,r_lenth);//返回地址。必须要用指针或数组的名来接受for(i=0;ir_lenth;i++){uart0_send(*r_data++);//读出串口接收的数据//r_data++;}}}else;}}