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是什么意思。
就以上问题特求大神指点
|