?? head.c
字號(hào):
//=====================================================================
//filename : time1()
//功 能 : 定時(shí)器1中斷服務(wù)程序,定時(shí)時(shí)間50mS, 如果處于等待發(fā)送狀態(tài)
// 在等待時(shí)間超過(guò)2秒沒(méi)有得到主CPU應(yīng)答情況取消發(fā)送
//=====================================================================
void timer1() interrupt 3 using 3
{
TL1 = 0xb0;
TH1 = 0x3c; //定時(shí)器1=100us;
time_50ms_flag = 1; //50ms則讀一次讀頭程序
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)
{
led_flag = 0;
LED = 1;
}
}
}
//=====================================================================
//曼徹斯特碼處理函數(shù)
//曼切斯特碼頭特征: 在碼緩沖區(qū)中連續(xù)9個(gè)1則是頭碼
// 找到頭碼后紀(jì)錄數(shù)據(jù)啟始位置
// 找到頭碼返回1,沒(méi)有頭碼返回0
//
//數(shù)據(jù)格式如下:
// U7 U6 U5 U4 P 0 = 用戶標(biāo)識(shí)
// U3 U2 U1 U0 P 1 = 用戶標(biāo)識(shí)
// 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 列校驗(yàn) P 行校驗(yàn)
//數(shù)據(jù)正確返回0 錯(cuò)誤返回1
//=====================================================================
void decode_data()
{
UINT8 i,k,s;
WDT_CONTR = 0x3c;
clr_oldbuf();
//------------------------------------------------------------------------------
//判斷程序接收到的數(shù)據(jù)是否正確
//00 14 00 00 0F 1B 1D 05 0A 03 10 00
//00 14 00 00 0F 1B 1D 05 0A 03 10 00
if(card_code[10] & 0x01)
{
clr_rcbuf();
return;
} //最后1位=1 則錯(cuò)誤
k = 0;
for(i=0;i<10;i++) //列校驗(yàn),偶校驗(yàn); 行校驗(yàn),異或校驗(yàn);
{
s=card_code[i];
if(s & 0xe0)
{
clr_rcbuf();
return;
}
ACC = s;
if(P)
{
clr_rcbuf();
return;
}
k ^= ACC;
}
k ^= card_code[10];
k &= 0x1e;
if(k)
{
clr_rcbuf();
return;
}
card_code[11] = 0x12;
s = card_code[0];
DT1 = 0; //輸出數(shù)據(jù)值
TL1 = 0XB0;
TH1 = 0X3C;
wait_flag = 1; //等待發(fā)送維根數(shù)據(jù)標(biāo)志
wait_time = 10; //等待發(fā)送時(shí)間500毫秒
LED = 0; //接收到一個(gè)刷卡信號(hào)以后輸出指示
led_flag = 1; //led顯示標(biāo)志
led_time = 15; //led 閃爍時(shí)間 2 秒
Ready = 0; //輸出=0,通知主CPU準(zhǔn)備發(fā)送韋根數(shù)據(jù)
//--------------------------------------------------------------------------
//開(kāi)始發(fā)送數(shù)據(jù), i=發(fā)送的數(shù)據(jù)個(gè)數(shù),k=發(fā)送的數(shù)據(jù)位
//向主CPU傳送EM卡的卡號(hào),采用串行移位寄存器方式發(fā)送數(shù)據(jù)
//dt1傳送數(shù)據(jù),dt0 傳送同步時(shí)鐘, dt0=0時(shí)數(shù)據(jù)有效,dt0=1時(shí)改變數(shù)據(jù)
i = 0;
k = 0;
while(1)
{
if(s & 0x80)
DT1 = 1;
else DT1 = 0; //輸出數(shù)據(jù)值
wait_time = 6;
while(DT0)
{
WDT_CONTR = 0x3c;
if(!wait_flag)
{
Ready=1;
clr_rcbuf();
return;
}
}
wait_time = 6;
while(!DT0)
{
WDT_CONTR = 0x3c;
if(!wait_flag)
{
Ready = 1;
clr_rcbuf();
return;
}
}
wait_time = 6;
s <<= 1;
if(++k > 7) //1個(gè)字節(jié)數(shù)據(jù)發(fā)送完畢
{
k = 0;
if(++i > 12)
{
Ready = 1;
clr_rcbuf();
return;
}
else s = card_code[i];
}
}
}
//
void clr_rcbuf()
{
UINT8 i;
UINT8 data *sip;
sip =& card_code;
for(i=0;i<12;i++)
{
*sip = 0;
sip++;
}
}
//
void clr_oldbuf()
{
UINT8 i;
UINT8 data *sip;
sip =& old_card;
for(i=0;i<12;i++)
{
*sip = 0;
sip++;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -