📄 function.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 + -