📄 main.c
字号:
/*==========================================================================================
Copyright (C), 2005, RegalCyber Tech. Co., Ltd.
File name: main.C
Author: Zhangui Duan Version: v1.2 Date: 2005-3-30
Description:
此程序文件主要是当手触摸屏幕的时候,发送寻卡信号,接收卡号并将卡号后三字节用Wiegand格式输出。
1,主程序
2,初始化程序
Other Description:
由 Keil C51 V7.05 编译通过
Function List:
1. 主程序
void main(void);
2, 初始化程序
void Init(void);
History:
1. Date:
Author:
Modification:
============================================================================================*/
#include "main.h"
#include <stdio.h>
#include "adc.h"
#define Delay_If for(temp_num2=0;((temp_num2<20)&&(test2<0x30));temp_num2++,Delayms(1))
#define DEBUG 1
unsigned char rr;
unsigned char TIME;
/****************************************************************************************
Function: isr_INT0
Description: 定时器0 190us中断
主要功能就是保证每秒钟将卡号计数器加1
Calls:
Called By: void main(void);
Input:
Output:
Return:
Others:
****************************************************************************************/
/*
void isr_INT0(void) interrupt 1 using 1
{
unsigned char i;
Time_count++;
if(Time_count==5264) //定时1S时间到 (5264)
{
Time_count=0;
rr++;
if(rr>=TIME)
{
overtime=1;//TIMEs时间到,置超时标志
rr=0; }
for(i=0;i<Max_Card_Num;i++)
{
if(No_Data[i].Counter<0xff)No_Data[i].Counter++;//数据库中每个卡号的计数器加1
if((No_Data[i].Counter>=TIME)&&(No_Data[i].Counter<0xff))
{
No_Data[i].No=0; //将此卡号从数据库中删除
No_Data[i].Counter=0xff; //将此卡号对应的计数器恢复到初始化的值
}
}
}
} */
/*********************************************************************************************
Function: main
Description: 发送寻卡信号,接收卡号并按照Wiegand格式输出
Calls:
Init();
Init_Receiver();
Transmitter();
Delayms();
Receiver();
Wiegand_Out();
Called By:
Input:
Output:
Return:
Others:
*********************************************************************************************/
void main(void)
{
unsigned char temp_num2;
unsigned char test2;
Init();
rconfbuf[0]=0x4f;//初始化发送和接收的配置字,默认收发功率为:0dBm,收发速率为:250Kbps
rconfbuf[1]=0x05;
tconfbuf[0]=0x4f;
tconfbuf[1]=0x04;
//----------------------------------------------
//存储或者是从eeprom中取出卡号和配置参数
//----------------------------------------------
InitADC();
Data0=0;
Data1=0;
TRCOUNT=0;
while(1)
{
/*do
{
test2=ReadADC();
LED_red=0;
Delay_If;
if(test2>0x30)break;
LED_red=1;
Delay_If;
if(test2>0x30)break;
}while(1); */
Touch_Identify();
}
}
/*************************************************
Function: Touch_Identify
Description: 参数配置
1,将配置参数存入FLASH中
2,从FLASH中读出配置参数
Calls: void EEInit(void);
unsigned char EERead(unsigned int addr);
void EEWrite(unsigned int addr, unsigned char b);
Called By: void main(void)
Input: set_card
根据此输入值判断是否有进行参数配置
Output:
Return:
Others:
*************************************************/
void Touch_Identify(void)
{
LED_red=0;
ET0=1; //开定时中断
overtime=0; //清超时标志
Time_count=0; //1S计时器(Time_count=5264的时候为1S)
rr=0;
if(receive_cardno( )==CardNoRight) //发送寻卡信息,接收卡号,如果有卡则校验接收的卡号
{
#ifdef DEBUG
// printf("RxBuf is: %bu ,", RxBuf[0]);
printf("%bu", RxBuf[1]);
printf("%bu", RxBuf[2]);
printf("%bu", RxBuf[3]);
printf("%bu", RxBuf[4]);
printf("%bu", RxBuf[5]);
printf("%bu", RxBuf[6]);
printf("%bu", RxBuf[7]);
printf("%bu", RxBuf[8]);
printf("%bu", RxBuf[9]);
printf("%bu", RxBuf[10]);
printf("%bu", RxBuf[11]);
printf("%bu,\n", RxBuf[12]);
/* PutChar(RxBuf[1]);
PutChar(RxBuf[2]);
PutChar(RxBuf[3]);
PutChar(RxBuf[4]);
PutChar(RxBuf[5]);
PutChar(RxBuf[6]);
PutChar(RxBuf[7]);
PutChar(RxBuf[8]);
PutChar(RxBuf[9]);
PutChar(RxBuf[10]);
PutChar(RxBuf[11]);
PutChar(RxBuf[12]);
//PutChar(TIME); */
#endif
}
ET0=0;//关闭定时器
LED_green=1;
}
/****************************************************************************************
Function: receive_cardno
Description: 发送寻卡信息,并接收卡号
Calls:
Called By: void main(void);
Input:
Output:
Return:
如果有卡号且正确则返回0x01, 否则返回0x00
Others:
****************************************************************************************/
unsigned char receive_cardno()
{
unsigned char cardright_err;
unsigned char RNum,Rnum;
//准备接收卡号
Init_Receiver(); //接收数据初始化
//清空接收区
for(Rnum=0;Rnum<RNUM;Rnum++)
{
RxBuf[Rnum]=0;
}
RNum=0;
do{
RNum++;
Receiver(RxBuf);
//判断发送过来的是否是正确的卡号
if((RxBuf[0]==ReceiveCardNo)&&((RxBuf[1]^RxBuf[2]^RxBuf[3]^RxBuf[4]^RxBuf[5]^RxBuf[6]^RxBuf[7]^RxBuf[8]^RxBuf[9]^RxBuf[10]^RxBuf[11]^RxBuf[12])==RxBuf[13]))RNum=53;
Delayms( RCdelaytime);
}while(RNum<50); //连续接收50次
if(RNum==53)cardright_err=CardNoRight;//有卡号且正确
else cardright_err=CardNoErr;//没卡或者卡号错误
return (cardright_err);
}
/*********************************************************************************************
Function: Init
Description: CPU的初始化
1,I/O口的方向初始化
2,I/O口的输出初始化
3,SPI初始化
3,串口初始化
4,发送接收缓冲区初始化
Calls:
Called By: void main(void);
Input:
Output:
Return:
Others:
*********************************************************************************************/
void Init(void)
{
// unsigned char i;
// Port ini
P0_ALT = 0x06; // Select alternate functions on pins P0.1 and P0.2, TXD RXD
P0_DIR = 0x09; // P0.0, P0.3 is input(S1, S2), the rest output
P0 = 0xF0; // P0.7-P0.4 = 1 for OFF LED_red,green,DATA0,DATA1
P1_DIR = 0x03; // P0.0, P0.3 is input(S3, S4),
LED_red=1;
LED_green=1;
// LED3=1;
// LED4=1;
PWR_UP = 1; // Turn on Radio
Delay100us(30); // Wait > 3ms
SPICLK = 0; // Max SPI clock (XTAL/8)
SPI_CTRL = 0x02; // Connect internal SPI controller to Radio
// serial communication ini
TH1 = 230; // 19200@16MHz (when T1M=1 and SMOD=1)
CKCON |= 0x10; // T1M=1 (/4 timer clock)
PCON = 0x80; // SMOD=1 (double baud rate)
SCON = 0x52; // Serial mode1, enable receiver
//TMOD = 0x20; // Timer1 8bit auto reload
TMOD = 0x22; // //定时器0,1工作在方式2
TCON = 0x40; // Start timer1
//定时器0初始化
TH0 = 2; //192us
TL0 = TH0;
TR0 = 1; //允许定时器0计数
EA=1; //打开总中断控制位
ET0=0; //关闭定时中断
TRCOUNT=0;
RxBuf[0]=0;
RxBuf[1]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -