📄 system.c
字号:
}
else n = 0;
}
}
else //上次读卡时电平是高电平
{
while(DIN)
{
if(TH0 > 6)
{
TR0 = 0;
return;
}
}
sz.sk[0] = TH0;
sz.sk[1] = TL0;
last_level_flag = 0;
if(sz.kk > 300) //不是空跳转则是有效数据0
{
TL0 = 0;
TH0 = 0;
if(head_flag)
{
*sip <<= 1;
*sip |= 1;
if(++j > 4)
{
j = 0;
++i;
//*sip &= 0x1f;
++sip;
}
}
else if(++n == 9)
{
head_flag = 1;
i = 0;
j = 0;
sip = &card_code;
}
}
}
}
TR0 = 0;
CFE = 1; //读禁止
//WDT_CONTR = 0x3c;
new_flag = 1;
s = 2;
n = 0;
for(i=0;i<11;i++)
{
n |= card_code[i];
if(card_code[i] & 0xe0)
{
new_flag = 0;
return;
}
//else if(card_code[i] != old_card[i])
// {
// old_card[i] = card_code[i];
// card_code[i] = 0;
// new_flag = 0;
// s = 0;
// }
}
if(n == 0)
{
new_flag = 0;
return;
}
}
if(card_code[10]&0x01) //最后1位=1 则错误
{
new_flag = 0;
return;
}
k = 0;
for(i=0;i<10;i++)
{
ACC = card_code[i];
if(P) //行校验
{
new_flag = 0;
return;
}
k ^= ACC;
}
k ^= card_code[10];
k &= 0x1e; //列校验
if(k)
{
new_flag = 0;
return;
}
for(i=2;i<10;i++)
{
card_code[i] = card_code[i]>>1;
}
card_code[10] = 0;
for(i=2;i<10;i++)
{
card_code[10] ^= card_code[i];
}
//card_code[10] = card_code[10] ^ card_code[1];
card_code[0] = 0xAA; //帧头
card_code[1] = 0xAA; //帧头
card_code[11] = 0x55; //帧尾
uart_send1(card_code,12);
CCF0 = 0;
CH = CH_VALUE; //定时记数初值
CL = CL_VALUE; //定时记数初值
CR = 1; //PCA计数器计数开
LED = 0; //接收到一个刷卡信号以后输出指示
led_flag = 1; //led显示标志
led_time = 15; //led 闪烁时间 1.5 秒
//WDT_CONTR = 0x3c;
}
//=====================================================================
//曼彻斯特码处理函数
//曼切斯特码头特征: 在码缓冲区中连续9个1则是头码
// 找到头码后纪录数据启始位置
// 找到头码返回1,没有头码返回0
//
//数据格式如下:
// U7 U6 U5 U4 P 0 = 用户标识
// U3 U2 U1 U0 P 1 = 用户标识
// D31 D30 D29 D28 P 2
// D27 D26 D25 D24 P 3
// D23 D22 D21 D20 P 4
// D19 D18 D17 D16 P 5
// D15 D14 D13 D12 P 6
// D11 D10 D9 D8 P 7
// D7 D6 D5 D4 P 8
// D3 D2 D1 D0 P 9
// X X X X 0
//
// X 列校验 P 行校验
//数据正确返回0 错误返回1
//=====================================================================
//00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
//00 A 0 0 7 D F E 5 B F
/*void decode_data()
{
UINT8 i,k,s;
//WDT_CONTR = 0x3c;
//------------------------------------------------------------------------------
//判断程序接收到的数据是否正确
//00 14 00 00 0F 1B 1D 05 0A 03 10 00
//00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
s = card_code[0];
DT1 = 1; //输出数据值
wait_flag = 1; //等待发送维根数据标志
wait_time = 10; //等待发送时间500毫秒
Ready = 0; //输出=0,通知主CPU准备发送韦根数据
//while(!wait_flag);
//--------------------------------------------------------------------------
//开始发送数据, i=发送的数据个数,k=发送的数据位
//向主CPU传送EM卡的卡号,采用串行移位寄存器方式发送数据
//DT1传送数据,SCLK 传送同步时钟, SCLK=0时数据有效,SCLK=1时改变数据
i=0; k=0;
while(1)
{ if(s&0x80)DT1=1;else DT1=0; //输出数据值
wait_time=6;
while(SCLK)
{ //WDT_CONTR=0x3c;
if(!wait_flag){Ready=1;return;}
}
wait_time=6;
while(!SCLK)
{ //WDT_CONTR=0x3c;
if(!wait_flag){Ready=1;return;}
}
wait_time=6;
s<<=1;
if(++k>7) //1个字节数据发送完毕
{ k=0; if(++i>12){Ready=1;return;}
else s=card_code[i];
}
}
}*/
/***********************************************************************************
函数名称:sys_init()
功能描述:系统初始化子程序
参 数:无
***********************************************************************************/
void sys_init(void)
{
P1 = 0xFF;
P3 = 0xFF;
LED = 0;
EA = 0;
//WDT_CONTR = 0x3C; //喂狗
//send_buf[23] = 0x0D;
//sum_buf[4] = 0x0D;
//uart_rcv_finish = 0;
//uart_start_flag = 0;
//uart_rcv_flag = 0;
//tx_flag = 0; //接收状态
/* 定时器0初始化 */
TMOD &= 0xF0;
TMOD |= 0X01; //工作方式
TH0 = 0;
TL0 = 0;
/* 定时器1初始化
timer1_out = 0;
timer1_tick = 0;
timer1_N = 0x7D0;
//AUXR &= 0xBF; //12T模式
//AUXR |= T1x12; //1T模式
TMOD &= 0x0F;
TMOD |= TMOD_VALUE1; //工作方式
TH1 = TH1_VALUE;
TL1 = TL1_VALUE;
//PT1 = 1; //定时器1中断优先级高
ET1 = 1; //定时器1中断开
//TR1 = 0; //定时器1关
TR1 = 1; //定时器1开 */
/* 串口初始化 */
/* 定时器1作波特率发生器 */
//AUXR &= 0xBF; //12T模式
//AUXR |= T1x12; //1T模式
SCON = SCON_VALUE;
TMOD &= 0x0F;
TMOD |= TMOD_VALUE; //工作方式2,8位自动重装
TH1 = TH1_VALUE;
TL1 = TL1_VALUE;
//PCON &= 0x7F; //波特率不倍增
PCON |= 0x80; //波特率倍增
//PS = 1; //串口中断优先级高
//ES = 1; //串口中断开
TR1 = 1; //定时器1开
/* PCA初始化 */
CCON = 0; //PCA中断溢出标志清零,PCA计数器禁止,CF,CR,CCF1,CCF0
CMOD = CMOD_VALUE; //PCA记数脉冲选择,Fosc/12
//CMOD |= CIDL; //空闲模式PCA计数器停止工作
CH = CH_VALUE; //定时记数初值
CL = CL_VALUE; //定时记数初值
/* PCA模块0定时模式或高速输出模式设置 */
PCAM0_timer_out = 0;
PCAM0_timer_tick = 0;
PCAM0_timer_N = 9;
CCAPM0 = CCAPM0_VALUE; //PCA模块0工作模式
CCAP0L = CCAP0L_VALUE; //PCA模块0捕获/比较初值 定时和高速输出模式用
CCAP0H = CCAP0H_VALUE; //PCA模块0捕获/比较初值 定时和高速输出模式用
//PCA_PWM0 = 0x00; //PWM第九位清0
//PCA_PWM0 = 0x03; //PWM第九位置1
/* PCA模块1定时模式或高速输出模式设置
PCAM1_timer_out = 0;
PCAM1_timer_tick = 0;
PCAM1_timer_N = 9;
CCAPM1 = CCAPM1_VALUE; //PCA模块1工作模式
CCAP1L = CCAP1L_VALUE; //PCA模块1捕获/比较初值 定时和高速输出模式用
CCAP1H = CCAP1H_VALUE; //PCA模块1捕获/比较初值 定时和高速输出模式用
//PCA_PWM0 = 0x00; //PWM第九位清0
//PCA_PWM0 = 0x03; //PWM第九位置1 */
//CMOD |= ECF; //PCA记数溢出中断使能
//CR = 1; //允许PCA计数器计数
EPCA_LVD = 1; //PCA中断开
EA = 1;
uart_send1(old_card,12);
LED = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -