📄 cdc.c
字号:
#include <REG52.h>
#include <Function.h>
#include <Constant.h>
#include <intrins.h>
#include <extern.h>
sbit CDC_CLOCK =P1^3;
sbit CDC_DATA =P1^2;
sbit CDC_LOCK =P1^1;
sbit CDC_CDROM =P1^4;
unsigned char bdata pulse_code;
sbit pulsebit0 = pulse_code^0;
sbit pulsebit1 = pulse_code^1;
sbit pulsebit2 = pulse_code^2;
sbit pulsebit3 = pulse_code^3;
sbit pulsebit4 = pulse_code^4;
sbit pulsebit5 = pulse_code^5;
sbit pulsebit6 = pulse_code^6;
sbit pulsebit7 = pulse_code^7;
void InitCDC(void)
{
CDC_CLOCK =1;
CDC_DATA =1;
CDC_LOCK =1;
CDC_CDROM =0;
}
void WriteByteToCDC(unsigned char *bytebuf)
{
unsigned char i,j,tmp;
TR0=0;
TH0 = TIMER_100us_H; //定时时间100us
TL0 = TIMER_100us_L;
TR0=1;
MsDelaySelect=uSDELAY100;
CDC_CDROM=1;
us_delay100=81;
while(us_delay100);
CDC_CDROM=0;
us_delay100=45;
while(us_delay100);
for(i=0;i<4;i++)
{
tmp=*bytebuf++;
for(j=0;j<8;j++)
{
if(tmp&0x80)
{
CDC_CDROM=1;
us_delay100=6;
while(us_delay100);
CDC_CDROM=0;
us_delay100=15;
while(us_delay100);
}
else
{
CDC_CDROM=1;
us_delay100=5;
while(us_delay100);
CDC_CDROM=0;
us_delay100=5;
while(us_delay100);
}
tmp<<=1;
}
}
CDC_CDROM=1;
us_delay100=5;
while(us_delay100);
CDC_CDROM=0;
us_delay100=16;
while(us_delay100);
TH0 = TIMER_1ms_H; //定时时间1ms
TL0 = TIMER_1ms_L;
MsDelaySelect=MSDELAY;
}
/*
void CDCRewrite(void)
{
TR0=0;
TH0 = TIMER_100us_H; //定时时间100us
TL0 = TIMER_100us_L;
TR0=1;
MsDelaySelect=uSDELAY100;
CDC_CDROM=1;
us_delay100=80; //8.8ms
while(us_delay100);
CDC_CDROM=0;
us_delay100=25;
while(us_delay100); //2.3ms
CDC_CDROM=1;
us_delay100=5; //0.5ms
while(us_delay100);
CDC_CDROM=0;
TH0 = TIMER_1ms_H; //定时时间1ms
TL0 = TIMER_1ms_L;
MsDelaySelect=MSDELAY;
}
*/
void CDCRewrite(void)
{
TH0=0xb9; //9ms
TL0=0xb0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
CDC_CDROM=1;
while(!usTimeOut);
TH0=0xEC; //2.5ms
TL0=0x78;
usTimeOut=0;
MsDelaySelect=uSDELAY;
CDC_CDROM=0;
while(!usTimeOut);
TH0=0xFC; //0.5ms
TL0=0x18;
usTimeOut=0;
MsDelaySelect=uSDELAY;
CDC_CDROM=1;
while(!usTimeOut);
CDC_CDROM=0;
}
/*
//接收反向后的数据 :DATA、CLK、LOCK都反向
bit CDCRead(unsigned char *rdata)
{
unsigned char tmp,i,j;
tmp=0;
TH0=0;
TL0=0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while((!CDC_LOCK) && !usTimeOut); //等待LOCK的高电平
if(usTimeOut)return(OP_FAILURE); //LOCK没有高电平
TH0=0xd8; //LOCK高电平后等待5ms内判断是否有CLK低电平
TL0=0xf0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while(CDC_CLOCK && !usTimeOut);
if(CDC_CLOCK ) //LOCK 后5ms内没有CLK的低电平,怀疑是检测到数据尾的LOCK,重新检测
{
TH0=0;
TL0=0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while((!CDC_LOCK) && !usTimeOut); //等待LOCK的高电平
if(usTimeOut)return(OP_FAILURE); //LOCK没有高电平
TH0=0xd8; //LOCK高电平后等待5ms内判断是否有CLK低电平
TL0=0xf0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while(CDC_CLOCK && !usTimeOut);
if(usTimeOut)return(OP_FAILURE); //LOCK 后5ms内没有CLK的低电平则断定线路上没有数据
}
//执行到这里表示检测到LOCK后的第一个CLK高电平
ET0=0;
pulsebit7=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit6=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit5=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit4=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit3=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit2=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit1=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit0=CDC_DATA;
*rdata++=pulse_code;
for(i=0;i<6;i++)
{
while(!CDC_CLOCK);
while(CDC_CLOCK);
pulsebit7=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit6=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit5=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit4=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit3=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit2=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit1=CDC_DATA;
while(!CDC_CLOCK); //等待CLK为高
while(CDC_CLOCK);//等待CLK为低
pulsebit0=CDC_DATA;
*rdata++=pulse_code;
}
ET0=1;
return(OP_SUCCESS);
}
*/
//接收反向后的数据 :DATA、CLK、LOCK都反向
bit CDCRead(unsigned char *rdata)
{
unsigned char tmp,i,j;
tmp=0;
TH0=0;
TL0=0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while((!CDC_LOCK) && !usTimeOut); //等待LOCK的高电平
if(usTimeOut)return(OP_FAILURE); //LOCK没有高电平
TH0=0xd8; //LOCK高电平后等待5ms内判断是否有CLK低电平
TL0=0xf0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while(CDC_CLOCK && !usTimeOut);
if(CDC_CLOCK ) //LOCK 后5ms内没有CLK的低电平,怀疑是检测到数据尾的LOCK,重新检测
{
TH0=0;
TL0=0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while((!CDC_LOCK) && !usTimeOut); //等待LOCK的高电平
if(usTimeOut)return(OP_FAILURE); //LOCK没有高电平
TH0=0xd8; //LOCK高电平后等待5ms内判断是否有CLK低电平
TL0=0xf0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while(CDC_CLOCK && !usTimeOut);
if(usTimeOut)return(OP_FAILURE); //LOCK 后5ms内没有CLK的低电平则断定线路上没有数据
}
//执行到这里表示检测到LOCK后的第一个CLK高电平
pulsebit7=CDC_DATA;
while(!CDC_CLOCK && !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit6=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit5=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit4=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit3=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit2=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit1=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit0=CDC_DATA;
*rdata++=pulse_code;
for(i=0;i<6;i++)
{
while(!CDC_CLOCK&& !usTimeOut); //等待字节后的CLK高电平
if(usTimeOut)return(OP_FAILURE);
TH0=0xd8; //CLK高电平后等待5ms内判断是否有CLK低电平
TL0=0xf0;
usTimeOut=0;
MsDelaySelect=uSDELAY;
while(CDC_CLOCK&& !usTimeOut); //等待下一Byte的第一个CLK低电平
pulsebit7=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit6=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit5=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit4=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit3=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit2=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit1=CDC_DATA;
while(!CDC_CLOCK&& !usTimeOut); //等待CLK为高
while(CDC_CLOCK&& !usTimeOut);//等待CLK为低
pulsebit0=CDC_DATA;
*rdata++=pulse_code;
}
if(usTimeOut)return(OP_FAILURE);
else return(OP_SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -