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

📄 function.c

📁 slrc632程序..网上绝对找不到.对RC632读TYPEB完整的程序包
💻 C
字号:
#include <REGX52.H>
#include <main.h>
#include <function.h>
#include <typeb.h>
/***************************
*串口缓冲区
****************************/
static idata volatile com com_buff;
/***************************
*函 数:延时程序
*void delay(uchar a)
*输入函数
***************************/
void Delay(uchar  a)
{
	static uchar b;

	while(--a)
         {
          for(b=0;b<255;b++);
	     }
}

/******************************
*函数:写MFRC500
*void WriteIO(uchar Address,uchar value)
*
*********************************/
void WriteIO(uchar Address,uchar value)
{
   uchar xdata *pa;

   pa=Base_addr;

   EA = 0;          //关闭中断

   CS_RC500();     //选中MFRC500

   *pa=Address>>3;
   pa=Address+Base_addr;
   *pa=value;

   UCS_RC500();    //不先中MFRC500

   EA = 1;
}


/******************************
*函数:读MFRC500
*uchar ReadIO(uchar Address)
*返回来为uchar
*********************************/
uchar ReadIO(uchar Address)
{
    static uchar xdata *pa;
    static uchar temp;

    pa=Base_addr;

    EA = 0;                  //关闭中断

    CS_RC500();             //选中MFRC500

    *pa=Address>>3;
    pa=Address+Base_addr;   //读取MFRC500
    temp = *pa;

    UCS_RC500();            //不选中MFRC500
  
    EA = 1;                //开中断

   return(temp);          //返回从MFRC500读出来的值
}


/******************************
*函数:蜂鸣器发声
*void BellSpeak(void)
*无返回值
*********************************/
void BellSpeak(void)
{
	Bell=0;          //输出低电平
	Delay(20);       //发出响声
	Bell=1;          //关闭峰鸣器
}

/******************************
*函数名称:void system_initial(void)
*函数功能:系统初始化
*函数说明:初始化整个系统
*返 回 值:无返回值
*********************************/
/****************************
*COM初始化
*无-->
*无-->
*Fosc = 22.1184Mhz,Baud = 115200
*Reload = Int(22118400/115200/32+0.5)
*       = Int(6.5)
*       = 6
*       = 0006H
*10000H - 0006H = FFFAH
*RCAP2H = 0xff
*RCAP2L = 0xfa
*****************************/
void system_initial(void)
{
//IO口初始化
	P0 = 0xff;
	P1 = 0xff;
	P2 = 0xff;
	P3 = 0xff;
//串口初始化
	SCON = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
	TMOD = 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
	TH1  = 0xFd;       //Baud:9600  fosc=11.0592MHz 
	TL1  = 0xF4;
	TR1 = 1;          // timer 1 run 
	ES  = 0;
	EA  = 0; 

}

/****************************
*串口发送一个字节
*输入-->unsigned char ch
*返回-->无
*****************************/
void send_char_com(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

/****************************
*串口发送字符串
*输入-->unsigned char *str;unsigned char strlen ->字符串指针;字符串长度
*返回-->无
*****************************/
void send_string_com(unsigned char *str,unsigned char strlen)
{
	unsigned char k=0;

    do 
    {
        send_char_com(*(str + k));   //发送字符串数据
        k++;
    } while(k < strlen);
}

/****************************
*韦根延时100us
*输入-->无
*返回-->无
*****************************/
void dealay100us(void)
{			
	TH0 = 0xff;
	TL0 = 0xa3;
	TF0 = 0; 
	TR0 = 1; 
	while (!TF0);
	TR0 = 0; 
	TF0 = 0;
 
}

/****************************
*韦根延时1500us
*输入-->无
*返回-->无
*****************************/
void dealay1500us(void)
{
	TH0 = 0xfa;
	TL0 = 0x99;
	TF0 = 0;  
	TR0 = 1; 
	while (!TF0);
	TR0 = 0;
	TF0 = 0; 
}

/****************************
*韦根发送数据
*输入-->*str
*返回-->无
*1:区号 2:ID号高位 3:ID号低位
*****************************/
void send_wiegand26(uchar *str) 
{ 
	uchar idata i,j; 
	static uchar data one_num; //计算1的个数 
	uchar data check_temp; //韦根包奇偶效验中间暂存 
	bit data even; //韦根包前12位偶效验 
	bit data odd; //韦根包后12位齐效验 
	static uchar data wiegand[3]; //韦根包数据24位 
//计算前8位1的个数,为偶效验用 
    wiegand[0]=*str;
    check_temp = wiegand[0]; 

	for(i = 0;i<8;i++) 
	{ 
		if(check_temp&0x01) //(check_temp&0x01) 
		{ 
			one_num++; 
		} 

		check_temp >>= 1; 
	} 

	wiegand[1] = *(str+1); 
//计算接下来的4位1的个数,为偶效验用 
	check_temp = wiegand[1]; 

	for(i = 0;i<4;i++) 
	{ 
		if(check_temp&0x80) 
		{ 
			one_num++; 
		} 

		check_temp<<=1; 
	} 
//判断1的个数 
	one_num%2 == 0 ? (even = 0):( even = 1); 
	one_num = 0; 
//计算接下来的4位1的个数,为奇效验用 
	check_temp = wiegand[1]; 

	for(i = 0;i<4;i++) 
	{ 
		if(check_temp&0x01)
		{
			one_num++;
		} 

		check_temp>>=1; 
	} 

	wiegand[2] =*(str+2); 
//计算接下来的8位1的个数,为奇效验用 
	check_temp = wiegand[2]; 

	for(i = 0;i<8;i++) 
	{ 
		if(check_temp&0x01)
		{
			one_num++;
		} 
		
		check_temp >>= 1; 

	} 
//判断1的个数 
	one_num%2 == 0 ? (odd = 1):( odd = 0); 
	one_num = 0; 

//启动发送,用定时器做时间延时 
//韦根 输出端初始化 
	Wgl = 1; 
	Wgh = 1; 
//发送偶效验 

//enen韦根包前12位偶效验标志
	if(even)                     
	{ 
		Wgh = 0; 
		dealay100us();//延时100us
		Wgh = 1; 
	} 
	else 
		{ 
			Wgl = 0; 
 			dealay100us();//延时100us
			Wgl = 1; 
		}
 
	dealay1500us();//延时一个发送周期

//发送24位数据 
	for(j=0;j<3;j++)
  	{
		for(i = 0;i<8;i++) 
		{ 
//韦根 输出端初始化 
			if((wiegand[j])&0x80) 
			{ 
					Wgh = 0;  
					dealay100us();//延时100us
					Wgh = 1; 
			} 
			else 
				{ 
					Wgl = 0; 
					dealay100us();//延时100us
					Wgl = 1; 
				}
 
		 wiegand[j] <<= 1; 
	    
		dealay1500us();//延时一个发送周期 
		} 
  	}
//发送奇效验位 
//韦根 输出端初始化 
//韦根包后12位后效验标志
	if(odd)  
	{ 
		Wgh = 0; 
		dealay100us();//延时100us 
		Wgh = 1; 
	} 
	else 
		{ 
			Wgl = 0; 
			dealay100us();//延时100us 
			Wgl = 1; 
		} 
} 


⌨️ 快捷键说明

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