📄 zd8212.c
字号:
// --------------------------------------
// Function: H4001 64位RFID只读卡读头
// MCU: PIC16F690
// Crystal: 12Mhz
// Designed by: yuzhengting
// Date: 2009/2/16
// --------------------------------------
// Compiler:
// PICC 9.6
// RFID基站芯片:U2270B
// --------------------------------------
#include <pic.h>
#include "config.h"
/*********************************************************************************************************
** Function name : interrupt ISR(void)
** Descriptions : 中断入口函数
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void interrupt ISR(void)
{
if (TMR2IE && TMR2IF) //判TMR0 中断
{
TMR2IF = 0; //清除TMR0 中断标志
CLRWDT();
clk_10ms++;
clk_20ms++;
clk_50ms++;
clk_100ms++;
clk_500ms++;
if(clk_20ms >= 4)
{
clk_20ms = 0;
flag_20ms = 1;
}
if(clk_50ms >= 10)
{
clk_50ms = 0;
flag_50ms = 1;
}
if(clk_100ms >= 20)
{
clk_100ms = 0;
flag_100ms = 1;
}
if(clk_500ms >= 100)
{
clk_500ms = 0;
flag_500ms = 1;
clk_2s++;
if(clk_2s > 6)
{
if(flag_card)
{
flag_card = 0;
}
}
}
}
}
/*********************************************************************************************************
** Function name : time_dly
** Descriptions : 1ms延时程序
** Input : 延迟计数
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void time_dly(uint delay_cnt) //1ms延时
{
uchar ncount;
while(delay_cnt--)
{
CLRWDT();
for(ncount=240; ncount>0;ncount--);
CLRWDT();
}
}
/*********************************************************************************************************
** Function name : init_io
** Descriptions : 初始化IO口
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void init_io(void)
{
ANSEL = 0;
ANSELH = 0;
TRISA0 = 1;
TRISA1 = 0;
TRISA2 = 1;
TRISA3 = 1;
TRISA4 = 0;
TRISA5 = 0;
TRISB0 = 0;
TRISB4 = 0;
TRISB5 = 0;
TRISC0 = 1;
TRISC1 = 0;
TRISC4 = 1;
TRISC5 = 0;
TRISC6 = 0;
TRISC7 = 1;
BEEP_0();
WD00 = 1;
WD10 = 1;
}
/*********************************************************************************************************
** Function name : init_t1
** Descriptions : 初始化定时器1
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void init_t1(void)
{
TMR1H = 0XFA;
TMR1L = 0X17;
T1CON = 0X01;
TMR1IE = 0;
}
/*********************************************************************************************************
** Function name : init_t2
** Descriptions : 初始化定时器2
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void init_t2(void)
{
TMR2IF = 0;
T2CON = 0X75;
PR2 = 230;
TMR2 = 0X00;
PEIE = 1;
TMR2IE = 1;
}
/*********************************************************************************************************
** Function name : init_ram
** Descriptions : 初始化RAM
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void init_ram(void)
{
flag_beep = 0;
clk_10ms = 0;
clk_20ms = 2;
clk_50ms = 4;
clk_100ms = 8;
clk_2s = 8;
buzzer_cycle = 1;
flag_beep = 1;
MOTOR_F_BUF = 1;
MOTOR_R_BUF = 1;
}
/*********************************************************************************************************
** Function name : s_mode
** Descriptions : 选择输出模式
** Input : 无
** Output : 无
** Created Date : 2009-02-16
** Comment : 系统默认输出为韦根输出
********************************************************************************************************/
void s_mode(void)
{
if(MODE)
{
flag_vg = 1;
flag_uart = 0;
}
else
{
flag_uart = 1;
flag_vg = 0;
}
}
/*********************************************************************************************************
** Function name : init_uart
** Descriptions : 初始化串口通讯
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void init_uart(void)
{
TXEN = 1;
SYNC = 0;
SPEN = 1;
SPBRG = 17;
}
/*********************************************************************************************************
** Function name : initial
** Descriptions : 初始化单片机
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void initial(void)
{
init_io();
init_t2();
init_t1();
init_ram();
init_uart();
s_mode();
RX_E();
}
/*********************************************************************************************************
** Function name : TaskBEEP
** Descriptions : 蜂鸣器进程
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void TaskBEEP(void)
{
uchar i;
CLRWDT();
if(flag_beep)
{
CLRWDT();
buzzer_cnt++;
if(buzzer_cnt<20)
{
CLRWDT();
i=buzzer_cnt<<1;
if(i<20)
{
BEEP_1();
}
if(i>20)
{
BEEP_0();
}
}
else if(buzzer_cnt >= 20)
{
CLRWDT();
buzzer_cnt =0;
if(buzzer_cycle>1)
{
buzzer_cycle--;
}
else
{
flag_beep = 0;
}
}
}
else
{
CLRWDT();
BEEP_0();
}
}
/*********************************************************************************************************
** Function name : set_decode
** Descriptions : 为数组decode赋值
** Input : 缓存
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void set_decode(uchar buf)
{
uchar i;
CLRWDT();
i = line_num /8;
switch(vir_num)
{
case 0: decode[i].onebit.b0 = buf; line_num++; vir_num++; break;
case 1: decode[i].onebit.b1 = buf; line_num++; vir_num++; break;
case 2: decode[i].onebit.b2 = buf; line_num++; vir_num++; break;
case 3: decode[i].onebit.b3 = buf; line_num++; vir_num++; break;
case 4: decode[i].onebit.b4 = buf; line_num++; vir_num++; break;
case 5: decode[i].onebit.b5 = buf; line_num++; vir_num++; break;
case 6: decode[i].onebit.b6 = buf; line_num++; vir_num++; break;
case 7: decode[i].onebit.b7 = buf; line_num++; vir_num = 0; break;
}
}
/*********************************************************************************************************
** Function name : gethead
** Descriptions : 获取同步头信息
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void gethead(void)
{
uchar i;
uchar x,y;
CLRWDT();
for(i=0; i<64; i++)
{
x = i / 8;
y = i % 8;
switch(y)
{
case 0:
if ((decode[x].onebit.b0 == 0) & (decode[x].onebit.b1 == 1)
& (decode[x].onebit.b2 == 1) & (decode[x].onebit.b3 == 1)
& (decode[x].onebit.b4 == 1) & (decode[x].onebit.b5 == 1)
& (decode[x].onebit.b6 == 1) & (decode[x].onebit.b7 == 1)
& (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1))
{
line_num = x + 1;
vir_num = 2;
goto GETHEADEND;
}
break;
case 1:
if ((decode[x].onebit.b1 == 0) & (decode[x].onebit.b2 == 1)
& (decode[x].onebit.b3 == 1) & (decode[x].onebit.b4 == 1)
& (decode[x].onebit.b5 == 1) & (decode[x].onebit.b6 == 1)
& (decode[x].onebit.b7 == 1) & (decode[x+1].onebit.b0 == 1)
& (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1))
{
line_num = x + 1;
vir_num = 3;
goto GETHEADEND;
}
break;
case 2:
if ((decode[x].onebit.b2 == 0) & (decode[x].onebit.b3 == 1)
& (decode[x].onebit.b4 == 1) & (decode[x].onebit.b5 == 1)
& (decode[x].onebit.b6 == 1) & (decode[x].onebit.b7 == 1)
& (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1)
& (decode[x+1].onebit.b2 == 1) & (decode[x+1].onebit.b3 == 1))
{
line_num = x + 1;
vir_num = 4;
goto GETHEADEND;
}
break;
case 3:
if ((decode[x].onebit.b3 == 0) & (decode[x].onebit.b4 == 1)
& (decode[x].onebit.b5 == 1) & (decode[x].onebit.b6 == 1)
& (decode[x].onebit.b7 == 1) & (decode[x+1].onebit.b0 == 1)
& (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1)
& (decode[x+1].onebit.b3 == 1) & (decode[x+1].onebit.b4 == 1))
{
line_num = x + 1;
vir_num = 5;
goto GETHEADEND;
}
break;
case 4:
if ((decode[x].onebit.b4 == 0) & (decode[x].onebit.b5 == 1)
& (decode[x].onebit.b6 == 1) & (decode[x].onebit.b7 == 1)
& (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1)
& (decode[x+1].onebit.b2 == 1) & (decode[x+1].onebit.b3 == 1)
& (decode[x+1].onebit.b4 == 1) & (decode[x+1].onebit.b5 == 1))
{
line_num = x + 1;
vir_num = 6;
goto GETHEADEND;
}
break;
case 5:
if ((decode[x].onebit.b5 == 0) & (decode[x].onebit.b6 == 1)
& (decode[x].onebit.b7 == 1) & (decode[x+1].onebit.b0 == 1)
& (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1)
& (decode[x+1].onebit.b3 == 1) & (decode[x+1].onebit.b4 == 1)
& (decode[x+1].onebit.b5 == 1) & (decode[x+1].onebit.b6 == 1))
{
line_num = x + 1;
vir_num = 7;
goto GETHEADEND;
}
break;
case 6:
if ((decode[x].onebit.b6 == 0) & (decode[x].onebit.b7 == 1)
& (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1)
& (decode[x+1].onebit.b2 == 1) & (decode[x+1].onebit.b3 == 1)
& (decode[x+1].onebit.b4 == 1) & (decode[x+1].onebit.b5 == 1)
& (decode[x+1].onebit.b6 == 1) & (decode[x+1].onebit.b7 == 1))
{
line_num = x + 2;
vir_num = 0;
goto GETHEADEND;
}
break;
case 7:
if ((decode[x].onebit.b7 == 0) & (decode[x+1].onebit.b0 == 1)
& (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1)
& (decode[x+1].onebit.b3 == 1) & (decode[x+1].onebit.b4 == 1)
& (decode[x+1].onebit.b5 == 1) & (decode[x+1].onebit.b6 == 1)
& (decode[x+1].onebit.b7 == 1) & (decode[x+2].onebit.b0 == 1))
{
line_num = x + 2;
vir_num = 1;
goto GETHEADEND;
}
break;
}
}
GETHEADEND:
if(line_num == 0)
{
CLRWDT();
err_cnt++;
}
}
/*********************************************************************************************************
** Function name : TaskCARD
** Descriptions : 获取卡号任务
** Input : 无
** Output : 无
** Created Date : 2009-02-16
********************************************************************************************************/
void TaskCARD(void)
{
uchar i;
uint temp;
uchar buf;
i = 0;
RFW_1();
for(i=0; i<16; i++)
{
decode[i].onebit.b0 = 1;
decode[i].onebit.b1 = 1;
decode[i].onebit.b2 = 1;
decode[i].onebit.b3 = 1;
decode[i].onebit.b4 = 1;
decode[i].onebit.b5 = 1;
decode[i].onebit.b6 = 1;
decode[i].onebit.b7 = 1;
}
half = 0;
lastbit = 0;
err_cnt = 0;
line_num = 0;
vir_num = 0;
TMR1H = 0X00;
TMR1L = 0X00;
for(i=0; i<192; i++)
{
CLRWDT();
clk_10ms = 0;
flag_10ms = 0;
while(RFID != lastbit)
{
if(clk_10ms >=2)
{
goto TaskCARDEND;
}
}
CLRWDT();
temp = TMR1H;
temp = ((temp << 8) | TMR1L);
TMR1H = 0X00;
TMR1L = 0X00;
if(((temp > TIME1) && (temp < TIME2)) || ((temp > TIME3) && (temp < TIME4)))
{
if((temp > TIME1) && (temp < TIME2))
{
if(half==1)
{
half=0;
if(lastbit)
{
set_decode(1);
}
else
{
set_decode(0);
}
}
else
{
half=1;
}
}
else
{
if(half == 1)
{
if(lastbit)
{
set_decode(0);
}
else
{
set_decode(1);
}
}
else
{
err_cnt++;
i = 0;
line_num = 0;
vir_num = 0;
if(err_cnt >2)
{
goto TaskCARDEND;
}
}
half = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -