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

📄 125k.c

📁 STC89C51输出125K方波信号
💻 C
字号:
#include <REG52.H>
sfr T2MOD = 0xc9;

sbit    speak_port = P2^5;

#define time0 60  //90us
#define time1 200  //300us
#define time2 460  //690us

//读卡头内部变量
sbit rf_data1 = P1^5;
bit inbak = 1;
unsigned char byte_buffer[4];
unsigned char currency_temp[4];
unsigned int pulse_time;

unsigned char eerom_delay;

//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 韦根解码 MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
/***等待电平跳变******************************************/
bit wait_change(void)
{
   unsigned char  long_time = 200;    //22.1184------ 1次为4.3us
   while(inbak == rf_data1) {if(--long_time == 0) return(0);}

   pulse_time = TH1;
   pulse_time = ((pulse_time << 8) & 0xff00) | TL1;
   TH1 = 0; TL1 = 0;
   inbak = rf_data1;
   return(1);
}
//***返回:读卡成功标记,成功读卡数据放在 byte_buffer[4]中 ************************
bit read_IDka(void)
{
   unsigned char i, j;
   unsigned char five_bit, verify_row, bit_buffer[11];
   bit verify_bit, compare_bit;

start_readid:
         //CLEARWDT; 
         //确定起始标识
         if(!wait_change()) return(0);
         if((pulse_time < time1) || inbak) goto start_readid;

         for(i=0;i<16;i++)
         {
         if(!wait_change()) return(0);
         if(pulse_time>time1 || pulse_time<time0) goto start_readid;
         }

			//speak_port = !speak_port;

        //保存位数据
         for(i=0; i<11; i++)
         {
             five_bit = 0;
             for(j=0; j<5; j++)
             {
                 five_bit <<= 1;  if(!wait_change()) return(0);
                 if(pulse_time <= time1)
                 {
                 if(pulse_time < time0) goto start_readid;
                 if(!wait_change()) return(0);  //有空跳
                 if(pulse_time<time0 || pulse_time>time1) goto start_readid;
                 }

                 else if(pulse_time > time2)  goto start_readid;
                 if(inbak == 0) five_bit |= 0x01;
             }
             bit_buffer[i] = five_bit;
         }

         //行校验
         for(i=2;i<10;i++)     //从第二行开始
         {
             verify_bit = 0;   five_bit = bit_buffer[i];
             for(j=0;j<5;j++)
             {
             if( five_bit & 0x01 ) verify_bit = !verify_bit;
             five_bit >>= 1;
             }
             if( verify_bit ) goto start_readid;
         }

         //列校验
         verify_row = 0x02;     //从第一列开始
         for(i=0;i<4;i++)       //共4列
         {
             verify_bit = 0;
             for(j=0;j<11;j++)
             {
             five_bit = bit_buffer[j];
             if( five_bit & verify_row )  verify_bit = !verify_bit;
             }
             if( verify_bit ) return(0);
             verify_row <<= 1;   //准备校验下一列
         }

         //合并成4字节数据
         for(i=0,j=2;i<4;i++)
         {
         bit_buffer[j] <<= 3;  bit_buffer[j] &= 0xf0; //高字节
         five_bit = bit_buffer[j];   j++;
         bit_buffer[j] >>= 1;  bit_buffer[j] &= 0x0f; //低字节
         byte_buffer[i] = five_bit | bit_buffer[j];  j++;
         }

         //屏蔽全0卡号和全ff卡号
         if(!byte_buffer[3] && !byte_buffer[2] && !byte_buffer[1] && !byte_buffer[0]) return(0);
         if(byte_buffer[0] == 0xff && byte_buffer[1] == 0xff
         && byte_buffer[2] == 0xff && byte_buffer[0] == 0xff)  return(0);

         //读2次卡号相同才认为成功
         compare_bit = !compare_bit;
         if(compare_bit)
         {
         currency_temp[0] = byte_buffer[0];    currency_temp[1] = byte_buffer[1];
         currency_temp[2] = byte_buffer[2];    currency_temp[3] = byte_buffer[3];
         goto start_readid;
         }
         else if(currency_temp[0] == byte_buffer[0] && currency_temp[1] == byte_buffer[1]
              && currency_temp[2] == byte_buffer[2] && currency_temp[3] == byte_buffer[3]) return(1);
 }


main()
{
	T2CON = 0;
	T2MOD = 0x02;
	RCAP2H = 0xff;
	RCAP2L = 0xf0;
	TR2 = 1;

	while(1)
	{

		if(read_IDka())
		{
			speak_port = !speak_port;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -