本帖最后由 izhonguo 于 2019-3-7 00:59 编辑
各位大神新年好,想请教一个简单的程序如何写。想利用51单片机的P00和P01两个串口输出一个16位的数组【0 0 0 1 1 1 0 0 ****】等数据,然后利用LS164这个芯片实现并口输出,写的程序如下,请各位大佬看一下是哪里有问题,为何不能按照想要的结果输出?
#include <reg52.h>
sbit LS164_DATA = P0^0; //74LS164数据线
sbit LS164_CLK = P0^1; //74LS164时钟线
/********************************************************************
* 名称 : delay()
* 功能 : 延时
* 输入 : i
* 输出 : 无
***********************************************************************/
void LS164_Write(unsigned long state, unsigned long state2) //74LS164写32位扩展引脚函数
{
unsigned char i;
for(i=0;i<32;i++) //循环写后32位扩展引脚状态
{
LS164_CLK = 0;
if(state2 & 0x00000001)
{
LS164_DATA = 1;
}
else
{
LS164_DATA = 0;
}
LS164_CLK = 1;
state2 = state2>>1;
}
for(i=0;i<32;i++) //循环写前32位扩展引脚状态
{
LS164_CLK = 0;
if(state & 0x00000001)
{
LS164_DATA = 1;
}
else
{
LS164_DATA = 0;
}
LS164_CLK = 1;
state = state>>1;
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main(void)
{
unsigned char state_in[] = {0,0,0,0,0,0,0,1,
0,0,0,0,0,0,1,1,
0,0,0,0,0,1,1,1,
0,0,0,0,1,1,1,1,
1,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,
1,1,1,0,0,0,0,0,
1,1,1,1,0,0,0,0};
unsigned char j;
unsigned long state=0x0; //0x0103070F
unsigned long state2=0x0; //0x80C0E0F0
LS164_Write(0x0,0x0); //所有继电器无动作,开关常闭NC(24V接NO)
for(j=0;j<32;j++) //循环写数组内前32位的状态为一个32位的long类型的4字节(32bit)
{
if(state_in[j]==1)
{
state = state^(0x80000000>>j); //按位异或运算:两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为1,0^0为0,1^1为0。
}
// state=0x01;
// LS164_Write(state);
}
for(j=32;j<64;j++) //循环写数组内前32位的状态为一个32位的long类型的4字节(32bit)
{
if(state_in[j]==1)
{
state2 = state2^(0x80000000>>(j-32));
}
// state=0x01;
// LS164_Write(state);
}
LS164_Write(state,state2);
// state=0x10; //1 0 0 0 0 0 1 1
while(1);
// {
// LS164_Write(state);
// delayms(100);
// }
}
|