本帖最后由 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);
// }
}
|