⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timecardrecord.h

📁 门禁系统源代码 VC++
💻 H
字号:

#ifndef _TIMECARDRECORD_H
#define _TIMECARDRECORD_H

#include "AVR_TWI.h"

#define sbi(Port, Bit)	(Port |= (1<<Bit))	
#define cbi(Port, Bit)	(Port &= ~(1<<Bit))	
#define eoi(Port, Bit)	(Port ^= (1<<Bit))

#define READ_FROM_FILE	0x02
#define READ_FROM_BC	0x01
#define READ_FROM_PC	0x00

#define BaudRate_BC		9600
#define BaudRate_PC		9600

#define _COMMAND_HEAD	0xEE	//'@'
#define _COMMAND_TAIL	0xFE	//'#'

#define _REQUEST_ERR	0x00	//'?'
#define _REQUEST_DONE	0xC0	//'='

#define _SET_EEPROM_AS	0xC1	//'!'

#define _SET_TIME		0xC2	//'('
#define _READ_TIME		0xC3	//')'

#define _SET_SINGLE		0xC4	//'['
#define _READ_SINGLE	0xC5	//']'

#define _READ_EEPROM	0xC6
#define _WRITE_EEPROM	0xC7

#define _BC_INTERRUPT	0xC8	//'^'

#define CMD_VALID_TIME	3
#define CYCLE_TRY		200
#define PC_ACK_OVERTIME	2000

volatile unsigned int uc_be_pc_ack;

volatile unsigned char uc_pc_buff[192];
volatile unsigned char uc_pc_counter;
volatile unsigned char uc_pc_valid_time;

volatile unsigned char uc_bc_buff[64];
volatile unsigned char uc_bc_counter;
volatile unsigned char uc_bc_valid_time;

volatile unsigned long ul_list_counter;

volatile unsigned char uc_file_buff[64];
volatile unsigned char uc_file_pos;

volatile unsigned char uc_id_buff[12];
volatile unsigned char uc_SF;
#define SF_BE_PC_RET	0

volatile unsigned char uc_systime[7];
//	second
//	minute
//	hour
//	day
//	week
//	month
//	year

#define gate_closed()		sbi(PORTC, 1)		// 关闭闸机
#define gate_opened()		cbi(PORTC, 1)		// 打开闸机

#define command_start()		sbi(PORTC, 7)
#define command_finish()	cbi(PORTC, 7)


void set_buff_as(unsigned char uc_value, unsigned char uc_len, volatile unsigned char *uc_data)
{
	while( uc_len )
	{
		*uc_data++ = uc_value;
		--uc_len;
	}
}

unsigned int str_to_ui(unsigned char uc_len, volatile unsigned char *uc_data)
{
	unsigned int ui_addr = 0;

	while( uc_len )
	{
		ui_addr = ui_addr*10 + ((*uc_data) - 0x30);
		++uc_data;
		--uc_len;
	}

	return ui_addr;
}

void printf_char(volatile unsigned char uc_data)
{
	loop_until_bit_is_set(UCSR0A, UDRE);		// 等待数据寄存器准备就绪(为空)
	UDR0 = uc_data;								// 将需要发送的数据装载入数据寄存器
	loop_until_bit_is_set(UCSR0A, TXC);			// 等待发送完毕
}

void printf_string(unsigned char uc_len, volatile unsigned char* uc_string)
{
	while( uc_len )
	{
		printf_char(*uc_string++);
		--uc_len;
	}
}

void trans_suc_msg(unsigned char uc_cmd_type)
{
	printf_char(_COMMAND_HEAD);
	printf_char(_REQUEST_DONE);
	printf_char(uc_cmd_type);
	printf_char(_COMMAND_TAIL);
}

void trans_err_msg(unsigned char uc_cmd_type)
{
	printf_char(_COMMAND_HEAD);
	printf_char(_REQUEST_ERR);
	printf_char(uc_cmd_type);
	printf_char(_COMMAND_TAIL);
}

void trans_msg(unsigned char uc_cmd_type, unsigned char uc_len, volatile unsigned char *uc_data)
{
	printf_char(_COMMAND_HEAD);
	printf_char(_REQUEST_DONE);
	printf_char(uc_cmd_type);

	while( uc_len )
	{
		printf_char(*uc_data);
		++uc_data;
		--uc_len;
	}

	printf_char(_COMMAND_TAIL);
}

void Init_BarcodeUsart(void)
{
	// 9600,8,1,N

	UCSR1B = (1<<RXEN1) | (1<<TXEN1) | (1<<RXCIE1);
	UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);

    //	U2X=0时的计算公式
    UBRR1L = (F_CPU/BaudRate_BC/16-1)%256;
    UBRR1H = (F_CPU/BaudRate_BC/16-1)/256;	
}

void Init_PCUsart(void)
{
	// 38400,8,1,N

	UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
	UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);

    //	U2X=0时的计算公式
    UBRR0L = (F_CPU/BaudRate_PC/16-1)%256;
    UBRR0H = (F_CPU/BaudRate_PC/16-1)/256;
}

void Init_Timer1(void)
{
	TCCR1A = (1<<COM1A0);		
	TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);	// f/1024,CTC
	OCR1A = 7499;		// 1s

	TIMSK |= (1<<OCIE1A);
}


/*	***		指令格式			***		*\

	设置存储器的所有单元为同一个数据:

		PC REQUEST:		_COMMAND_HEAD 
										+ _SET_EEPROM_AS
										+ device_addr
										+ data
						_COMMAND_TAIL

		MCU ACK:		_COMMAND_HEAD
										+ _REQUEST_DONE / _REQUEST_ERR
										+ _SET_EEPROM_AS
						_COMMAND_TAIL

	单个成员权限设置:

		PC REQUEST:		_COMMAND_HEAD 
										+ _SET_SINGLE
										+ ID_0				
										+ ID_1
										+ ID_2
										+ ID_3
										+ ID_4
										+ True/False		// 能否进出的信息
						_COMMAND_TAIL

		MCU ACK:		_COMMAND_HEAD
										+ _REQUEST_DONE / _REQUEST_ERR
										+ _SET_SINGLE
						_COMMAND_TAIL

	单个成员权限情况读取:

		PC REQUEST:		_COMMAND_HEAD 
										+ _READ_SINGLE
										+ ID_0				
										+ ID_1
										+ ID_2
										+ ID_3
										+ ID_4
						_COMMAND_TAIL

		MCU ACK:		_COMMAND_HEAD
										+ _REQUEST_DONE / _REQUEST_ERR
										+ _READ_SINGLE
										+ data
						_COMMAND_TAIL

	时间设置:

		PC REQUEST:		_COMMAND_HEAD 					
										+ _SET_TIME
										+ second [BCD]
										+ minute [BCD]
										+ hour [BCD]
										+ day [BCD]
										+ week [BCD]
										+ month [BCD]
										+ year [BCD]
						_COMMAND_TAIL
	
		MCU ACK:		_COMMAND_HEAD
										+ _REQUEST_DONE / _REQUEST_ERR
										+ _SET_TIME
						_COMMAND_TAIL

	时间读取:

		PC REQUEST:		_COMMAND_HEAD 					
										+ _READ_TIME
						_COMMAND_TAIL

		MCU ACK:		_COMMAND_HEAD
										+ _REQUEST_DONE / _REQUEST_ERR
										+ _READ_TIME
										+ second [BCD]
										+ minute [BCD]
										+ hour [BCD]
										+ day [BCD]
										+ week [BCD]
										+ month [BCD]
										+ year [BCD]
						_COMMAND_TAIL

	读取存储单元数据:

		PC REQUEST:		_COMMAND_HEAD 					
										+ _READ_EEPROM
										+ device_addr
										+ data_addr_H
										+ data_addr_L
										+ data_len				// <= 128
						_COMMAND_TAIL

		MCU ACK:		_COMMAND_HEAD
										+ _REQUEST_DONE / _REQUEST_ERR
										+ _READ_LIST
										+ *data
						_COMMAND_TAIL
	
	写存储单元数据:

		PC REQUEST:		_COMMAND_HEAD 					
										+ _WRITE_EEPROM
										+ device_addr
										+ data_addr_H
										+ data_addr_L
										+ data_len				// <= 128
										+ *data
						_COMMAND_TAIL

		MCU ACK:		_COMMAND_HEAD
										+ _REQUEST_DONE / _REQUEST_ERR
										+ _WRITE_EEPROM
										+ data
						_COMMAND_TAIL

	

	barcode id 发送格式:
		
		MCK REQUEST:	_COMMAND_HEAD 					
										+ _BC_INTERRUPT
										+ id_0					// 5bytes
										+ id_1					// 5bytes
										+ id_2					// 5bytes
										+ id_3					// 5bytes
										+ id_4					// 5bytes
										+ time_0
										+ time_1
										+ time_2
										+ time_3
										+ time_4
										+ time_5
										+ time_6
						_COMMAND_TAIL

		PC ACK:			_COMMAND_HEAD 
										+ _BC_INTERRUPT
										
						_COMMAND_TAIL
						
					

	barcode id 存储格式:

			[id_0][id_1][id_2][id_3][id_4][year][month][day][hour][minute][second][week]

			


\*	*******************************		*/
/*	***		Baudrate 计算公式	***		*\

	U2X=0时的公式计算:
	UBRRL = (F_CPU/BaudRate/16-1)%256;
	UBRR1H = (F_CPU/BaudRate/16-1)/256;
	
    U2X=1时的公式计算(倍速工作模式):
    UBRRL = (F_CPU/BaudRate/8-1)%256;
    UBRRH = (F_CPU/BaudRate/8-1)/256;

\*	*******************************		*/


/*		***		PINOUT 		***			*\

Digital Output:	L00 - L07 (	PC0 - PC7 )

Digital Input:	D00 - D02 ( PE5 - PE7 [INT5 - INT7] )
				D03 - D07 ( PF3 - PF7 )

Barcode USART:	M64 USART1 ( PD2 [RXD1] , PD3 [TXD1] )

PC USART:	M64 USART0 ( PE0 [RXD0] , PE1 [TXD0] )

EEPROM:
		EEPR_WE	( PF0 )

		24C512 device address:	1010 0 A1 A0 0	--> 0xA0, 0xA2, 0xA4, 0xA6

I2C:
		SCL ( PD0 )
		SDA ( PD1 )

KEYBOARD:
			DAT ( PE3 )
			CLK ( PE4 [INT4] )

LCD:

 1:	GND
 2:	VCC
 3: BK_LIGHT
 4:	VCC
 5:	PA7
 6:	PA6
 7:	PA5
 8:	PA4
 9:	PA3
10:	PA2
11:	PA1
12:	PA0
13:	PB5
14:	PB4
15:	PB3
16:	PB2
17:	PB1
18:	PB0


\*	*******************************		*/


/*	***		ID address List		***		*\

EEPROM 24C512 ADDR: 0xA0


	所有情况如下

	1:	A**** - Z****		26 * 8192 / 8 = 26624		offset=1024
	2:	AA*** - ZZ***		676 * 256 / 8 = 21632		offset=32
	3:	#0000 - #9999		1 * 8192 / 8 = 1024			offset=1024




\*	*******************************		*/

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -