📄 dp51e.c
字号:
#include <reg52.h>
#include<intrins.h>
#include"IIC.h"
#define CSI24WC02 0xa0
#define MAX 20
extern bit ack;
uchar xdata DATA_BUF[MAX]; /*由于寄存器的动态的,不能放在rom区,所以不能声明为code*/
void main(void)
{
uchar n;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
PCON=0x00;
ES=1;
EA=1;
for(n=0;n<MAX;n++)
{
DATA_BUF[n]=0;
}
while(1);
}
//将DATA_BUF的数据发送回上位机;发送的数据个数n中
void send_pc(uchar *p,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
SBUF=p[i];
while(TI==0);
TI=0;
}
}
/*接收一字节串口上的数据*/
uchar rcv_data(void)
{
uchar buf;
uint m=500;
RI=0;
while(!RI)
{
m--;
if(m==0)
{
m=500;
buf=0x00;
return buf;
}
}
RI=0;
buf=SBUF;
return buf;
}
/*接收命令出错,返回出错码00H*/
void int_err(void)
{
DATA_BUF[0]=0x12;
DATA_BUF[1]=0xa1;
DATA_BUF[2]=0x022;
DATA_BUF[3]=0x00;
DATA_BUF[4]=0xb1;
send_pc(DATA_BUF,5);
TI=0;
RI=0;
}
/*读CSI24WC02的指定单元,并将数据返回给上位机
;若读CSI24WC02无应答,则返回操作失败帧
*/
bit IRcvStr(uchar sla,uchar suba,uchar no)
{
uchar i;
uchar xrl; /*异或校验位*/
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1);
if(ack==0)
{
DATA_BUF[0]=0x12;
DATA_BUF[1]=0xa1;
DATA_BUF[2]=2;
DATA_BUF[3]=0x01;
DATA_BUF[4]=0xb1;
send_pc(DATA_BUF,5);
return(0);
}
DATA_BUF[0]=0x12;
DATA_BUF[1]=0xa0;
DATA_BUF[2]=no; //no=N+1 N位数据位1位奇偶校验位//
xrl=no^0xb2;
for(i=3;i<no+2;i++)
{
DATA_BUF[i]=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
xrl=xrl^DATA_BUF[i];
}
DATA_BUF[no+2]=xrl;
send_pc(DATA_BUF,no+3);
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
/*写CSI24WC02的指定单元
;操作成功则返回操作成功回应帧*/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)
{
DATA_BUF[0]=0x12;
DATA_BUF[1]=0xa1;
DATA_BUF[2]=3;
DATA_BUF[3]=suba;
DATA_BUF[4]=0x00;
DATA_BUF[5]=suba^0xb0;
send_pc(DATA_BUF,6);
return(0);
}
DATA_BUF[0]=0x12;
DATA_BUF[1]=0xa0;
DATA_BUF[2]=1;
DATA_BUF[3]=0xb3;
send_pc(DATA_BUF,4);
s=s+4;
for(i=0;i<no-2;i++)
{
SendByte(*s); /*发送数据???*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
void ser_int(void) interrupt 4
{
uchar rd; //接收桢头
uchar i;
uchar xrl; //异或参数
uchar n; //参数个数
uchar ord; //命令字参数
bit err; //发送接收正确标志位
while(TI==0)
{
rd=SBUF;
if(rd!=0x12) break;
DATA_BUF[0]=rd;
xrl=rd;
rd=rcv_data(); //接收命令字
if(rd==0x00) break;
DATA_BUF[1]=rd;
rd=rcv_data(); //接收参数个数
if(rd==0x00) break;
DATA_BUF[2]=rd;
n=rd;
for(i=3;i<n+2;i++)
{
rd=rcv_data();
if(rd==0x00)
{
int_err();
break;
}
DATA_BUF[i]=rd;
}
rd=rcv_data(); //接收参数个数
if(rd==0x00) break;
DATA_BUF[n+2]=rd;
for(i=1;i<n+2;i++)
{
xrl=xrl^DATA_BUF[i];
}
if(xrl!=DATA_BUF[n+2]) int_err();
ord=DATA_BUF[1];
if(ord==20)
{
err=IRcvStr(CSI24WC02,DATA_BUF[3],n);
if(err==0) int_err();
break;
}
else if(ord==21)
{
err=ISendStr(CSI24WC02,DATA_BUF[3],DATA_BUF,n);
if(err==0) int_err();
break;
}
else break;
}
TI=0;
RI=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -