⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdc.c

📁 飞利浦10碟VCD控制程序
💻 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 + -