📄 system.c
字号:
/*
+---------------------------------------------------+
| Project: SYSTEM with STC12CX052 |
| File: SYSTEM.C |
| Data: 2008-12-08 |
| Version: V 1.0 |
| Initial Editor: Li Jifeng |
+---------------------------------------------------+
| following environments are supported |
| Processor: STC12CX052 |
| Compiler: WAVE V |
| hardware: JF-2008 |
+---------------------------------------------------+
| Copyright (C) JF Ltd, 2008 |
| All Rights reserved |
+---------------------------------------------------+
| 功能简介: the system function |
+---------------------------------------------------+
*/
#include "system.h"
//bit uart_rcv_finish;
//static bit uart_start_flag;
//bit tx_flag; //串口收发状态标志 tx_flag=1 发状态 tx_flag=0 收状态
//static UINT8 data DataBuf[5] = {"27"}; //信息区
//static UINT8 data send_buf[24] = {"~EC2A3300E000000000FC34"}; //发送数据区
//static UINT8 data rec_buf[18] = {"EC2A0033E028000002"}; //接收数据区
//static UINT8 data com_n;
//static UINT8 data uart_rcv_flag = 0;
//static UINT8 data uart_rcv_len;
//static UINT8 data uart_rcv_n;
//static UINT8 data sum_buf[5] = {"FC40"};
bit last_level_flag = 0; //上次读卡时电平
bit wait_flag = 0; //等待发送标志
bit led_flag = 0; //led显示标志
bit new_flag = 0; //读到新卡标志
UINT8 data wait_time = 40; //等待发送时间 2 秒
UINT8 data led_time = 15; //led 闪烁时间 1 秒
UINT8 data card_code[12];
UINT8 data old_card[12];
//static UINT16 Txsum1;
//static UINT16 Txsum = 0x350;
//static UINT16 Rxsum = 0x390;
//static UINT16 Rxsum1 = 0x390;
//static UINT16 Rxsum2;
/***********************************************************************************
函数名称:uart_send_byte()
功能:串口发送函数
函数参数:udata:发送的数据
***********************************************************************************/
void uart_send_byte(UINT8 udata)
{
TI = 0;
SBUF = udata;
while (TI == 0);
TI = 0;
}
/***********************************************************************************
函数名称:uart_send()
功能:串口发送函数
函数参数:*send_buf:发送的数据
**********************************************************************************
void uart_send(UINT8 *send_buf)
{
while (*send_buf != 0x00)
{
uart_send_byte(*send_buf);
send_buf++;
}
}*/
/***********************************************************************************
函数名称:uart_send1()
功能:串口发送函数
函数参数:*send_buf:发送的数据
n:数据个数
***********************************************************************************/
void uart_send1(UINT8 *send_buf,UINT8 n)
{
while (n--)
{
uart_send_byte(*send_buf);
send_buf++;
}
}
/***********************************************************************************
函数名称:uart_isr()
功能描述:串口中断服务子程序
函数参数:无
EC2A0033E02800000227FBBF
**********************************************************************************
static void uart_isr(void) interrupt SIO_VECTOR using 3
{
UINT8 tmp;
if (RI)
{
RI = 0;
tmp = SBUF;
if (tmp == '~') //帧头
{
uart_start_flag = 1;
uart_rcv_flag = 0;
com_n = 0;
}
else if (uart_start_flag)
{
switch (uart_rcv_flag)
{
case 0:if (tmp == rec_buf[com_n])
{
com_n++;
}
else
{
uart_start_flag = 0;
}
if (com_n == 17)
{
uart_rcv_flag = 1;
}
break;
default:uart_start_flag = 0;
break;
}
}
}
}*/
/***********************************************************************************
函数名称:PCA_isr()
功能描述:PCA中断服务子程序
函数参数:无
***********************************************************************************/
static UINT8 PCAM0_timer_tick,PCAM0_timer_N;
bit PCAM0_timer_out;
static void PCA_isr(void) interrupt PCA_VECTOR using 3
{
if (CCF0)
{
CCF0 = 0;
CH = CH_VALUE; //定时记数初值
CL = CL_VALUE; //定时记数初值
/*if(wait_flag) //等待发送维根数据标志
{
if(--wait_time == 0)
{
wait_flag = 0;
Ready = 1;
}
}*/
if(led_flag) //led 显示
{
if(--led_time == 0)
{
CR = 0;
led_flag = 0;
LED = 1;
}
}
}
}
/***********************************************************************************
函数名称:read_head()
函数参数:无
功 能 : 读U2270程序,
U2270B周期为512us
1. 启动U2270后等待刷卡脉冲,如果10毫秒内没有脉冲信号退出
在等待时间超过2秒没有得到主CPU应答情况取消发送
( 1 ) 脉冲宽度>300的脉冲下跳表示数据1, 脉冲上跳表示数据0
脉冲宽度<250的脉冲跳变认为是空跳变。 9个连续1是头码
( 2 ) 变量n用于记录头码个数. head_flag=0; 等待并解析头码
( 3 ) 变量 j 用于记录数据为宽度,5个位1个字节,4个有效位,
1个校验位(低5位)
( 4 ) 变量 i 用于记录卡号字节数,
EM卡数据格式如下:
---------------------------------------------------------------------
标识头 H H H H H H H H H
---------------------------------------------------------------------
用户标识 U7 U6 U5 U4 P 00
U3 U2 U1 U0 P 14=
---------------------------------------------------------------------
卡片号码 D31 D30 D29 D28 P 00
D27 D26 D25 D24 P 00
D23 D22 D21 D20 P 0F
D19 D18 D17 D16 P 1B
D15 D14 D13 D12 P 1D
D11 D10 D9 D8 P 05
D7 D6 D5 D4 P 0A
D3 D2 D1 D0 P 03
X = 列校验; P = 行校验 X X X X 0 10
=====================================================================
00 14 00 00 0F 1B 1D 05 0A 03 10 00
00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
***********************************************************************************/
void read_head(void)
{
bit head_flag;
UINT8 data i,j,n,m,s,k;
UINT8 data *sip;
union sa
{
UINT16 kk;
UINT8 sk[2];
}sz;
for(m=0;m<12;m++)
{
card_code[m] = 0;
old_card[m] = 0;
}
s = 0;
while(s != 2)
{
//WDT_CONTR = 0x3c;
CFE = 0; //启动u2270
new_flag = 0; //读到新卡标志清零
head_flag = 0;
n = 0;
i = 0;
j = 0;
last_level_flag = 0; //上次读卡时电平标志清零
sip = &card_code;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(!DIN)
{
if(TH0 > 6)
{
TR0 = 0;
return;
}
}
TH0 = 0;
TL0 = 0;
while(DIN)
{
if(TH0 > 6)
{
TR0 = 0;
return;
}
}
TH0 = 0;
TL0 = 0;
//WDT_CONTR = 0x3c;
while(i < 11)
{
if(!last_level_flag) //上次读卡时是低电平
{
while(!DIN)
{
if(TH0 > 6)
{
TR0 = 0;
return;
}
}
sz.sk[0] = TH0;
sz.sk[1] = TL0;
last_level_flag = 1;
if(sz.kk > 300) //不是空跳转则是有效数据0
{
TL0 = 0;
TH0 = 0;
if(head_flag)
{
*sip <<= 1;
if(++j > 4)
{
j = 0;
++i;
//*sip &= 0x1f;
++sip;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -