?? system.c
字號(hào):
/*
+---------------------------------------------------+
| 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 |
+---------------------------------------------------+
| 功能簡(jiǎn)介: the system function |
+---------------------------------------------------+
*/
#include "system.h"
//bit uart_rcv_finish;
//static bit uart_start_flag;
//bit tx_flag; //串口收發(fā)狀態(tài)標(biāo)志 tx_flag=1 發(fā)狀態(tài) tx_flag=0 收狀態(tài)
//static UINT8 data DataBuf[5] = {"27"}; //信息區(qū)
//static UINT8 data send_buf[24] = {"~EC2A3300E000000000FC34"}; //發(fā)送數(shù)據(jù)區(qū)
//static UINT8 data rec_buf[18] = {"EC2A0033E028000002"}; //接收數(shù)據(jù)區(qū)
//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; //上次讀卡時(shí)電平
bit wait_flag = 0; //等待發(fā)送標(biāo)志
bit led_flag = 0; //led顯示標(biāo)志
bit new_flag = 0; //讀到新卡標(biāo)志
UINT8 data wait_time = 40; //等待發(fā)送時(shí)間 2 秒
UINT8 data led_time = 15; //led 閃爍時(shí)間 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;
/***********************************************************************************
函數(shù)名稱:uart_send_byte()
功能:串口發(fā)送函數(shù)
函數(shù)參數(shù):udata:發(fā)送的數(shù)據(jù)
***********************************************************************************/
void uart_send_byte(UINT8 udata)
{
TI = 0;
SBUF = udata;
while (TI == 0);
TI = 0;
}
/***********************************************************************************
函數(shù)名稱:uart_send()
功能:串口發(fā)送函數(shù)
函數(shù)參數(shù):*send_buf:發(fā)送的數(shù)據(jù)
**********************************************************************************
void uart_send(UINT8 *send_buf)
{
while (*send_buf != 0x00)
{
uart_send_byte(*send_buf);
send_buf++;
}
}*/
/***********************************************************************************
函數(shù)名稱:uart_send1()
功能:串口發(fā)送函數(shù)
函數(shù)參數(shù):*send_buf:發(fā)送的數(shù)據(jù)
n:數(shù)據(jù)個(gè)數(shù)
***********************************************************************************/
void uart_send1(UINT8 *send_buf,UINT8 n)
{
while (n--)
{
uart_send_byte(*send_buf);
send_buf++;
}
}
/***********************************************************************************
函數(shù)名稱:uart_isr()
功能描述:串口中斷服務(wù)子程序
函數(shù)參數(shù):無
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;
}
}
}
}*/
/***********************************************************************************
函數(shù)名稱:PCA_isr()
功能描述:PCA中斷服務(wù)子程序
函數(shù)參數(shù):無
***********************************************************************************/
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; //定時(shí)記數(shù)初值
CL = CL_VALUE; //定時(shí)記數(shù)初值
/*if(wait_flag) //等待發(fā)送維根數(shù)據(jù)標(biāo)志
{
if(--wait_time == 0)
{
wait_flag = 0;
Ready = 1;
}
}*/
if(led_flag) //led 顯示
{
if(--led_time == 0)
{
CR = 0;
led_flag = 0;
LED = 1;
}
}
}
}
/***********************************************************************************
函數(shù)名稱:read_head()
函數(shù)參數(shù):無
功 能 : 讀U2270程序,
U2270B周期為512us
1. 啟動(dòng)U2270后等待刷卡脈沖,如果10毫秒內(nèi)沒有脈沖信號(hào)退出
在等待時(shí)間超過2秒沒有得到主CPU應(yīng)答情況取消發(fā)送
( 1 ) 脈沖寬度>300的脈沖下跳表示數(shù)據(jù)1, 脈沖上跳表示數(shù)據(jù)0
脈沖寬度<250的脈沖跳變認(rèn)為是空跳變。 9個(gè)連續(xù)1是頭碼
( 2 ) 變量n用于記錄頭碼個(gè)數(shù). head_flag=0; 等待并解析頭碼
( 3 ) 變量 j 用于記錄數(shù)據(jù)為寬度,5個(gè)位1個(gè)字節(jié),4個(gè)有效位,
1個(gè)校驗(yàn)位(低5位)
( 4 ) 變量 i 用于記錄卡號(hào)字節(jié)數(shù),
EM卡數(shù)據(jù)格式如下:
---------------------------------------------------------------------
標(biāo)識(shí)頭 H H H H H H H H H
---------------------------------------------------------------------
用戶標(biāo)識(shí) U7 U6 U5 U4 P 00
U3 U2 U1 U0 P 14=
---------------------------------------------------------------------
卡片號(hào)碼 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 = 列校驗(yàn); P = 行校驗(yàn) 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; //啟動(dòng)u2270
new_flag = 0; //讀到新卡標(biāo)志清零
head_flag = 0;
n = 0;
i = 0;
j = 0;
last_level_flag = 0; //上次讀卡時(shí)電平標(biāo)志清零
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) //上次讀卡時(shí)是低電平
{
while(!DIN)
{
if(TH0 > 6)
{
TR0 = 0;
return;
}
}
sz.sk[0] = TH0;
sz.sk[1] = TL0;
last_level_flag = 1;
if(sz.kk > 300) //不是空跳轉(zhuǎn)則是有效數(shù)據(jù)0
{
TL0 = 0;
TH0 = 0;
if(head_flag)
{
*sip <<= 1;
if(++j > 4)
{
j = 0;
++i;
//*sip &= 0x1f;
++sip;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -