📄 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 "adc.h"
#include <stdio.h>
//#define DEBUG 1
unsigned char code R_T1[61] = {254,241,230,219,209,199,190,181,172,165,157,150,143,137,130,125,119,114,
109,104,100,96,92,88,84,81,77,74,71,68,65,63,60,58,55,53,51,49,47,45,43,
42,40,39,37,36,35,33,32,31,30,29,28,27,26,25,24,23,22,21,20};
//unsigned char code R_T2[25] = {242,228,215,203,192,182,172,162,154,146,138,131,124,117,111,106,100,95,90,
// 86,82,78,73,70,67}; /4
unsigned char code R_T2[45] = {240,224,210,197,184,173,162,152,143,134,126,118,111,105,98,93,87,82,78,73,
69,65,62,58,55,52,49,46,44,42,39,37,35,34,32,30,29,27,26,25,23,22,21,20,19}; // /14
void Temperature_test(void)
{
unsigned char i,j;
char Tempteratrue = 0;
unsigned char Rntc = 0; //热敏电阻的阻值
unsigned long Time1 = 0; //标准电阻充放电时间
unsigned long Time2 = 0; //热敏电阻充放电时间
P0_DIR = 0x00; //R RT C端都设为输出
P_Rsta = 0; //放电
P_Rntc = 0;
P_Ctest = 0;
Delay100us(100);
P0_DIR = 0x28; //RT C端设为输入,R端设为输出
P_Rsta = 1; //通过电阻R对C充电
while(P_Ctest != 1)
{
Time1++ ;
}
P0_DIR = 0x00; //R RT C端都设为输出
P_Rsta = 0; //放电
P_Rntc = 0;
P_Ctest = 0;
Delay100us(100);
P0_DIR = 0x18; //R C端设为输入,RT端设为输出
P_Rntc = 1; //通过热敏电阻RT对C充电
while(P_Ctest != 1)
{
Time2++;
}
Rntc = (unsigned char)((0x64*Time2)/Time1); //计算出热敏电阻值
for(i = 0;i<62;i++)
{
if((Rntc <= R_T1[i] )&& (Rntc > R_T1[i+1])) Tempteratrue = 5+i;
if(Rntc >254)
{
for(j = 0; j<46 ;j++)
{
if(((Rntc/14) <= R_T2[j])&& ((Rntc/14) > R_T2[j+1]))Tempteratrue = (-40)+i;
}
}
}
PutChar(Tempteratrue);
}
/**********************************************************************************************
Function: main
Description: 定时休眠,通过RTC唤醒,
判断收到寻卡信号,发送卡号,并判断是否出了此区域,
Calls:
Init();
Init_Receiver();
Transmitter();
Delayms();
Receiver();
Called By:
Input:
Output:
Return:
Others:
**********************************************************************************************/
void main(void)
{
// unsigned char _set_card;
unsigned char temp= 0;
// _set_card=Config();//接收配置读卡器发送过来的卡号,并返回卡号
// RW_Flash(_set_card);//存储或者是从eeprom中取出卡号和配置参数
Init();
// InitADC();
// TxBuf[0]=TransmitCardNo;//前置码
// 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); //设置唤醒定时器
while(1)
{
Temperature_test();
// Delay100us(4000);
//----------------------------------------------
//发送卡号
//----------------------------------------------;
//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
Temperature_test();
//temp = Temperature_test();
// PutChar(temp);
//PutChar(0x77); //test
// Transmitter(&TxBuf[0]);//发送卡号
#endif
Delay100us(1);
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+12;//初始化配置参数存放地址
//--------------------------------------------//
//如果需要配置,则将卡号和配置参数写到FLASH中
if(set_card)
{
if(!((RxBuf[1]==0)&&(RxBuf[2]==0)&&(RxBuf[3]==0)&&(RxBuf[4]==0)&&(RxBuf[5]==0)&&(RxBuf[6]==0)
&&(RxBuf[7]==0)&&(RxBuf[8]==0)&&(RxBuf[9]==0)&&(RxBuf[10]==0)&&(RxBuf[11]==0)&&(RxBuf[12]==0)))
{
//如果12字节卡号数据全部为0,则发送过来的卡号数据就不需要存储到FLASH中
for(m=1,addr_card=Addr_Cardno;m<13;m++,addr_card++)
{
EEWrite(addr_card, RxBuf[13-m]); //将12字节卡号参数写到FLASH中
}
}
EEWrite(config_addr, RxBuf[13]);//将配置参数写到FLASH中
EEWrite((config_addr+1), RxBuf[14]);//将时间参数写到FLASH中
}
//--------------------------------------------//
//从FLASH中读出12字节的卡号以及配置参数
for(m=1,addr_card=Addr_Cardno;m<13;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]
^RxBuf[8]^RxBuf[9]^RxBuf[10]^RxBuf[11]^RxBuf[12]^RxBuf[13]^RxBuf[14])==RxBuf[15]))
{
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[5];
TxBuf[6]=RxBuf[6];
TxBuf[7]=RxBuf[7];
TxBuf[8]=RxBuf[8];
TxBuf[9]=RxBuf[9];
TxBuf[10]=RxBuf[10];
TxBuf[11]=RxBuf[11];
TxBuf[12]=RxBuf[12];
TxBuf[13]=RxBuf[15];
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
/*
//定时器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 + -