📄 main.c
字号:
/*==============================================================================================
Copyright (C), 2005, RegalCyber Tech. Co., Ltd.
File name: main.C
Author: Zhangui Duan Version: v1.3 Date: 2005-3-30
Description:
此程序文件主要是完成接收读卡器的寻卡信号,再发送四字节的卡号
1,主程序
2,初始化CPU,I/O口,串口,RTC,SPI等
Other Description:
由 Keil C51 V7.05 编译通过
Function List:
1. 主程序
void main(void);
2, 初始化程序
void Init(void);
History:
1. Date: 2005-6-12
Author:Zhangui Duan
Modification: 由于卡号要与普通的IC卡兼容,将卡号设置为4个字节,所以发送的有效数据宽度
由原来的40位改为48位(1字节前置码+4字节卡号+1字节校验字节),同时发送缓冲区直接设置
为数组,字节长度为6字节
==============================================================================================*/
#include "main.h"
#include <stdio.h>
//#define DEBUG 1
/**********************************************************************************************
Function: main
Description: 定时休眠,通过RTC唤醒,
判断收到寻卡信号,发送卡号,并判断是否出了此区域,
Calls:
Init();
Init_Receiver();
Transmitter();
Delayms();
Receiver();
Called By:
Input:
Output:
Return:
Others:
**********************************************************************************************/
void main(void)
{
//unsigned char _set_card;
//_set_card=Config();//接收配置读卡器发送过来的卡号,并返回卡号
//RW_Flash(_set_card);//存储或者是从eeprom中取出卡号和配置参数
Init();
Init_Receiver(); //接收初始化
TxBuf[0]=TransmitCardNo;//前置码
TxBuf[1]=1; TxBuf[2]=2;TxBuf[3]=3;TxBuf[4]=4;TxBuf[5]=5;TxBuf[6]=6;TxBuf[7]=7;TxBuf[8]=8;TxBuf[9]=9;TxBuf[10]=9;
TxBuf[11]=8;TxBuf[12]=7;
TxBuf[13]=TxBuf[1]^TxBuf[2]^TxBuf[3]^TxBuf[4]^TxBuf[5]^TxBuf[6]^TxBuf[7]^TxBuf[8]^TxBuf[9]^TxBuf[10]^TxBuf[11]^TxBuf[12]; //校验字节
// WriteRTC(TIME/TICK); //设置唤醒定时器
WriteRTC(300);
while(1)
{
//----------------------------------------------
//发送卡号
//----------------------------------------------;
//REGX_CTRL = 0x0b; //关闭唤醒定时器
//while(REGX_CTRL & 0x10) // Wait for the interface to be ready
// ;
#ifdef DEBUG
LED4=0;
PutChar(0x55);
Delayms(1);
LED4=1;
#else
Transmitter(&TxBuf[0]);//发送卡号
#endif
Delay100us(200);
CK_CTRL=0x03;//省电模式
}
}
/*************************************************
Function: RW_Flash
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 RW_Flash(unsigned char set_card)
{
unsigned char m;
unsigned int addr_card,config_addr;
EEInit(); //eeprom 初始化
config_addr=Addr_Cardno+4;//初始化配置参数存放地址
//--------------------------------------------//
//如果需要配置,则将卡号和配置参数写到FLASH中
if(set_card)
{
if(!((RxBuf[1]==0)&&(RxBuf[2]==0)&&(RxBuf[3]==0)&&(RxBuf[4]==0)))
{
//如果4字节卡号数据全部为0,则发送过来的卡号数据就不需要存储到FLASH中
for(m=1,addr_card=Addr_Cardno;m<5;m++,addr_card++)
{
EEWrite(addr_card, RxBuf[5-m]); //将4字节卡号参数写到FLASH中
}
}
EEWrite(config_addr, RxBuf[5]);//将配置参数写到FLASH中
EEWrite((config_addr+1), RxBuf[6]);//将时间参数写到FLASH中
}
//--------------------------------------------//
//从FLASH中读出4字节的卡号以及配置参数
for(m=1,addr_card=Addr_Cardno;m<5;m++,addr_card++)
{
TxBuf[m]=EERead(addr_card); //读取卡号
}
tconf.buf[13]=EERead(config_addr); //读取发送配置参数
rconf.buf[13]=tconf.buf[13]; //读取接收配置参数
TIME=EERead(config_addr+1); //读取时间参数
}
/*************************************************
Function: Config
Description: 参数配置
1,接收配置读卡器发送过来的卡号,收发功率,收发速率
2,返回上述参数给配置读卡器
Calls: void Init(void)
void Init_Receiver(void)
void Receiver(unsigned char *rxbuf)
void Transmitter(unsigned char *txbuf)
Called By: void main(void)
Input:
Output:
Return:
Others:
*************************************************/
unsigned char Config(void)
{
unsigned char s,Rnum,set_card_sign;
Init();
Init_Receiver(); //接收初始化
set_card_sign=0;
Rnum=0;
do{
Rnum++;
#ifdef DEBUG
LED3=0;
#endif
//Init_Receiver(); //接收初始化
for(s=0;s<RNUM;s++)
{
RxBuf[s]=0;
}
Receiver(RxBuf);
//判断是否是设置卡号命令
if((RxBuf[0]==SetCardNo)&&((RxBuf[1]^RxBuf[2]^RxBuf[3]^RxBuf[4]^RxBuf[5]^RxBuf[6])==RxBuf[7]))
{
Rnum=255;
set_card_sign=1;
/*
#ifdef DEBUG
LED3=1;
#endif
*/
}
Delayms( Setdelaytime); //延时1ms
/*
#ifdef DEBUG
LED4=0;
#endif
*/
}while(Rnum<250); //连续接受5秒数据
/*
#ifdef DEBUG
LED4=1;
#endif
*/
//----------------------------------------------
//将接收到的卡号和参数返回给设置读卡器
//----------------------------------------------
if(set_card_sign)
{ TxBuf[0]=TransmitCardNo;
TxBuf[1]=RxBuf[1];
TxBuf[2]=RxBuf[2];
TxBuf[3]=RxBuf[3];
TxBuf[4]=RxBuf[4];
TxBuf[5]=RxBuf[7];
Delayms(5);
Rnum=0;
do{
Rnum++;
Transmitter(&TxBuf[0]);//发送接收到的数据
/*
#ifdef DEBUG
LED3=0;
Delayms(5);
LED3=1;
#endif
*/
Delay100us(RCdelaytime);
}while(Rnum<5); //连续发送5次数据
}
return set_card_sign;
}
/*************************************************
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)
{
// 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 LED1-LED4
P1_DIR = 0x03; // P0.0, P0.3 is input(S3, S4),
LED1=1;
LED2=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; // 9600@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
TCON = 0x40; // Start timer1
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -