sbit Send_EN = P5^5;
bit Busy;//設置單次發送完成標志
bit uart1_rec_ok; //命令到達標志
bit uart1_rec_ok1;
bit uart1_rec_ok2;
unsigned char Rec_data[5];
unsigned char Send_data[7];
unsigned char rec_addr; //撥碼開關
unsigned char Rec_point;//字節數
/*********************************************************************************/
void delay_ms(unsigned int time) // //@11.0592MHz
{
unsigned char i, j;
do
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
while(time--);
}
/*********************************************************************************/
void uart1_init(void)
{
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xE0; //設定定時初值
T2H = 0xFE; //設定定時初值
AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
AUXR |= 0x10; //啟動定時器2
ES = 1;
EA = 1;
}
/*********************************************************************************/
void system_init(void)
{
XD_74hc595_init();
XD_74hc165_init();
uart1_init();
}
/*********************************************************************************/
void Uart1sendData(unsigned char send_data)//寫發送串口數據
{
while(Busy); //檢測是否發送
Busy=1; //設置單次發送標志
SBUF=send_data; //把需要發送的數據給SBUF
}
/*********************************************************************************/
void serial_send(unsigned char *send_str)//發送數據
{
unsigned char i;
Send_EN = 1; //RS485設置為發送方向
for(i=0;i<6;i++)//發送6個字節
{
Uart1sendData(*send_str);
send_str++;
}
Send_EN = 0;//RS485設置為接收方向
}
/*********************************************************************************/
void main(void)
{
unsigned char read_time;
// unsigned char i,j;
// unsigned char ceshi_data;
system_init();
while(1)
{
read_time++;
if(read_time>=50)//延時
{
read_time = 0;
XD_74hc165_Readdata();//讀取165
rec_addr = P1&0X0F;//設置撥碼開關
}
/*-------------------------------------------------*/
if(uart1_rec_ok)
{
uart1_rec_ok = 0;
if(Rec_data[0]==rec_addr)
{
if(Rec_data[1]==0x01)
{
XD_write_74hc595(Rec_data[2],Rec_data[3],Rec_data[4]);
delay_ms(120);
HC595_SRCLK = 0;
HC595_EN_A = 1 ;
HC595_EN_B = 1 ;
HC595_EN_C = 1 ;
}
if(Rec_data[1]==0x00)
{
XD_74hc165_Readdata();
Send_data[0]=XD_74hc165_DATA[0];
Send_data[1]=0x00;
Send_data[2]=XD_74hc165_DATA[1];
Send_data[3]=0x00;
Send_data[4]=XD_74hc165_DATA[2];
Send_data[5]=0x00;
serial_send(Send_data);
}
}
}
/*-------------------------------------------------*/
}
}
/*********************************************************************************/
void Uart1_int() interrupt 4
{
unsigned char uart1_rec_data;
if(RI)
{
RI=0; //發生串口中斷
uart1_rec_data = SBUF; //把收到的數據給uart1_rec_data
if(uart1_rec_ok2) //檢測幀頭
{
Rec_data[Rec_point] = SBUF; //保存接收字節,并遞增計數器
Rec_point++; //繼續接收字節
if(Rec_point>=5) //空閑時間超過4個字節傳輸時間即認為一幀命令接收完畢
{
Rec_point = 0; //字節清0
uart1_rec_ok2 = 0;
uart1_rec_ok = 1; //命令到達標志
}
}
else
{
if(uart1_rec_ok1)
{
if(uart1_rec_data==0x55)
{
uart1_rec_ok1 = 0;
uart1_rec_ok2 = 1;
Rec_point = 0;
}
else
{
uart1_rec_ok1 = 0;
Rec_point = 0;
}
}
else
{
if(uart1_rec_data==0xaa)
{
uart1_rec_ok1 = 1;
}
}
}
}
if(TI) //字節發送完畢
{
TI=0; //手動清零發送中斷標志位
Busy=0;//設置單次發送完成標志
}
}
以上中文字都是自己加進去的不知道是否正確 接收格式AA 55 01 00 XX XX XX AA 55代表頭幀 01代表地址 00代表數據類型 XX XX XX任意值
0x00表示讀LED的狀態,0x01表示打開繼電器 后面三個字節可為任意值,單片機收到該條命令后,會返回3個字節,這3個字節共有24個進制位,分別代表24個LED的狀態,LED點亮相應的位為0,否則為1。
我現在不明白的地方有幾個希望指點指點 bit uart1_rec_ok1;
bit uart1_rec_ok2;
分別定義的什么標識符 如uart1_rec_ok1=0代表什么 =1代表什么
if(Rec_data[1]==0x00)
{
XD_74hc165_Readdata();
Send_data[0]=XD_74hc165_DATA[0];
Send_data[1]=0x00;
Send_data[2]=XD_74hc165_DATA[1];
Send_data[3]=0x00;
Send_data[4]=XD_74hc165_DATA[2];
Send_data[5]=0x00;
serial_send(Send_data);
}
返回的是3個字節,這3個字節共有24個進制位 加0X00是什么意思。
就以上問題特求大神指點
|