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

📄 main.c

📁 ATMEGA8+LM358-125KHzRFID读卡程序。 功能稳定。 11.0592MHz.不需74X4060。
💻 C
📖 第 1 页 / 共 2 页
字号:
            	}
            	Lcd_Mask=RightMask[p];
            	a1=lcdrd();
            	a1&=(~Lcd_Mask);
            	a1|=(a2&Lcd_Mask);
            	lcdwd(a1);
            	ly+=p;
            	Lcd_CurrentY+=p;
         	}
         	else
         	{
         		lcdwd(a2);
            	ly+=8;
            	Lcd_CurrentY+=8;
         	}
         	//a1=*s;
         	a1 = pgm_read_byte(s);
      	}
   	Lcd_CurrentY=y;
	}
}

//显示汉字
void displaychinesechardot(unsigned int Index)
{
	unsigned char *s;
	s =(unsigned char *)(ChineseCharDot + Index * CHINESECHARDOTSIZE);  //赋值汉字点阵首地址(数组名+  )

   	if(Lcd_CurrentX > LCD_RIGHT-CHINESECHARSIZE+1)
    {
    	Lcd_CurrentX=LCD_LEFT;
		Lcd_CurrentY+=CHINESECHARSIZE;
		if(Lcd_CurrentY>LCD_BOTTOM-CHINESECHARSIZE+1)
		{
            Lcd_CurrentY=LCD_TOP;
		}
	}
	putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,s);
}


//显示英文字符
void displayenglishchardot(unsigned char english)
{
	unsigned char *s;
	s=(unsigned char *)(EnglishCharDot+((english-32)*ENGLISHCHARDOTSIZE));
	if(Lcd_CurrentX>LCD_RIGHT-ENGLISHCHARSIZE+1)
	{
		Lcd_CurrentX=LCD_LEFT;
		Lcd_CurrentY+=CHINESECHARSIZE;
		
		if(Lcd_CurrentY>LCD_BOTTOM-CHINESECHARSIZE+1)
		{
         	Lcd_CurrentY=LCD_TOP;
		}
   }
   putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,s);
}

//信息显示
void put_char(unsigned int ucdata)
{
	unsigned int i;
	if(ucdata < 128)
	{
	  displayenglishchardot((unsigned char)ucdata);
	}
	else
	{
		for(i = 0;i != (CHINESECHARNUMBER * 2);i++)
		{
			if(ucdata == pgm_read_word(ChineseCode + i))
         	{
         		displaychinesechardot(i);
            	break;
         	}
      	}
	}
}

//显示汉字或英文字符
void put_str(unsigned char *s)
{
	unsigned int i;
	for(;*s != 0;s++)
	{
		i = *s;
      	if(*s > 127)
      	{
      		s++;
         	i = i * 256 + *s;
      	}
      	if(i == '\n')
      	{
      		Lcd_CurrentX = LCD_LEFT;
         	if(Lcd_CurrentY > LCD_BOTTOM - CHINESECHARSIZE + 1)
         	{
            	Lcd_CurrentY = LCD_TOP;
         	}
        	else
        	{
            	Lcd_CurrentY += CHINESECHARSIZE;
        	}
      	}
      	put_char(i);
   	}
}

//显示汉字或英文字符
void put_str_xy(unsigned char x,unsigned char y,unsigned char *s)
{
	Lcd_CurrentX = x;
	Lcd_CurrentY = y;
	put_str(s);
}

void put_num(unsigned char x,unsigned char y,unsigned long num,unsigned char dec,unsigned char spc)
{
	unsigned char i;
	unsigned char buf1[10];
	Lcd_CurrentX=x;
	Lcd_CurrentY=y;
	unsigned long temp = 1000000000;
	unsigned char out = 0;
	for(i = 0;i < 10;i++)
	{
		out = num / temp;
		num %= temp;
		temp /= 10;
//		put_c(out + 48);
		put_char(out + 48);
	}
	/*
	for(i=0;i<spc;i++)
	{
		buf1[i]=(char)48+ num-((num/10)*10);
		
		num=num/10;
	}
	
	for(i = spc;i != 0;i--)
	{
		
		if(dec==i)
		{
			put_char('.');
		}
		put_char(buf1[i-1]);
	}
	*/
}

//端口初始化
void port_init(void)
{
	PORTB = 0x02;
	DDRB  = 0x3e;
	PORTC = 0x00;
	DDRC  = 0x00;
	PORTD = 0x03;
	DDRD  = 0x02;
}

//定时T1初始化
void timer1_init(void)
{
	TCCR1B = 0x00;//停止定时器
	TIMSK |= 0x24;//中断允许
	TCNT1H = 0xFF;
	TCNT1L = 0xF8;//初始值
	OCR1AH = 0xFE;
	OCR1AL = 0xFF;//匹配A值
	OCR1BH = 0xFE;
	OCR1BL = 0xFF;//匹配B值
	ICR1H  = 0xFF;
	ICR1L  = 0xFF;//输入捕捉匹配值
	TCCR1A = 0x00;
	TCCR1B = 0xC5;//启动定时器
}

ISR(TIMER1_OVF_vect)
{
	TCCR1B = 0x00;
	PORTB |= 0x02;
	put_str_xy(40,16,"  Ready!  ");
}

//定时器T1输入捕捉中断服务程序
//#pragma interrupt_handler timer1_capt_isr:6
//void timer1_capt_isr(void)
ISR(TIMER1_CAPT_vect)
{
	//timer 1 input capture event, read (int)value in ICR1 using;
	// value=ICR1L;            //Read low byte first (important)
	// value|=(int)ICR1H << 8; //Read high byte and shift into top byte
	// TIFR|=BIT(ICF1);//软件写1清中断标志
	static unsigned char tr = 0;
	static unsigned int bit_no = 0;
	static unsigned char one_time = 0;
	TCCR1B = 0;
	TCNT1 = 0;
	if((ICR1 > 6) || (ICR1 == 1) || (ICR1 == 4))
	{
		bit_no = 0;
		return;
	}
	if(test_end == 0)
	{
		if(tr == 1)
		{
//			put_c(ICR1L);
			bit_array[bit_no] = 1;
			bit_no++;
			if(bit_no >= 255)
			{
				test_end = 1;
			}
//			put_c('1');
			if(ICR1L > 4)
			{
				bit_array[bit_no] = 1;
				bit_no++;
				if(bit_no >= 255)
				{
					test_end = 1;
				}
//				put_c('1');
			}
//			TCCR1B = 0xC5;	//上升沿触发
			TCCR1B = 0x85;	//下降沿触发
			tr = 0;
		}
		else
		{
//			bit_array[bit_no] = '0';
			bit_array[bit_no] = 0;
			bit_no++;
			if(bit_no >= 255)
			{
				test_end = 1;
			}
//			put_c('0');
			if(ICR1L > 4)
			{
//				bit_array[bit_no] = '0';
				bit_array[bit_no] = 0;
				bit_no++;
				if(bit_no >= 255)
				{
					test_end = 1;
				}
//				put_c('0');
			}
//			TCCR1B = 0x85;	//下降沿触发
			TCCR1B = 0xC5;	//上升沿触发
			tr = 1;
		}
	}
}

//定时器T2初始化
void timer2_init(void)
{
	TCCR2  = 0x00;//停止定时器
	ASSR   = 0x00;//异步时钟模式
	TCNT2  = 0x00;//初始值
	OCR2   = 0x2B;//匹配值
	TIMSK |= 0x00;//中断允许
	TCCR2  = 0x19;//启动定时器
}

//串口通信初始化
void usart_init(void)
{
	UCSRB = 0x00;//禁止中断
	UCSRA = 0x00;
	UCSRC = BIT(URSEL) | 0x06;
	UBRRL = 0x47;
	UBRRH = 0x00;
	UCSRB = 0x98;
}

void put_c(unsigned char dat)
{
	while(!(UCSRA & (1 << UDRE)));
	UDR = dat;
}

void put_s(unsigned char *dat,unsigned char enter)
{
	while(*dat)
	{
		put_c(*dat);
		dat++;
	}
	if(enter == 1)
	{
		put_c(0x0d);
		put_c(0x0a);
	}
}

void put_long(unsigned long dat)
{
	unsigned long temp = 1000000000;
	unsigned char i = 0;
	unsigned char out = 0;
	for(i = 0;i < 10;i++)
	{
		out = dat / temp;
		dat %= temp;
		temp /= 10;
		put_c(out + 48);
	}
//	out = dat % temp;
//	put_c(out + 48);
}

void init_devices(void)
{
	cli(); //禁止所有中断
	MCUCR  = 0x00;
	MCUCSR = 0x80;//禁止JTAG
	GICR   = 0x00;
	port_init();
	timer1_init();
	timer2_init();
//	usart_init();
	lcdreset();
	sei();//开全局中断
}
//主函数
int main(void)
{
	unsigned char i = 0;
	init_devices();
	lcdfill(0xff);
	delay_ms(250);
	lcdfill(0x00);   //清屏
//	put_str_xy(0,0,"RFID CardReader");
	put_str_xy(21,0,"RFID读卡器");
//	put_str_xy(0,16,"NO.");
	put_str_xy(0,16,"卡号:");
//	put_num(0,16,123456789,0,10);
	put_s("RFID Card Reader",1);
	while(1)
	{
		if(test_end == 1)
		{
			/*
			cli();
			i = 0;
			for(i = 0;i < 255;i++)
			{
				put_c(bit_array[i] + 48);
			}
			put_c(bit_array[i] *48);
			put_s("end.",1);
			put_s("",1);*/
			i = Manchester_decode();
			if(i != 0)
			{
				for(i = 0;i < 255;i++)
				{
					put_c(bit_array[i] + 48);
				}
				put_c(bit_array[i] *48);
				put_s("end.",1);
				put_s("",1);
			}
			test_end = 0;
//			sei();
		}
	}
	return 0;
}

unsigned char Manchester_decode(void)
{
	unsigned char i,j,k;
	unsigned char col_parity = 0;
	unsigned char row_parity = 0;
	unsigned char temp = 0;
	unsigned char start_data[20] = {1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
	unsigned long rfid = 0;
	for(i = 0;i < 128;i++)
	{
		for(j = 0;j < 20;j++)
		{
			if(bit_array[i+j] != start_data[j])
			{
				break;
			}
		}
		if(j == 20)
		{
			put_s("",1);
			put_s("Find RFID Card.",1);
			i += 20;
			for(k = 0;k < 11;k++)
			{
				row_parity = 0;
//				读出五位数据
				temp = 0;
				for(j = 0;j < 5;j++)
				{
					temp <<= 1;
					if((bit_array[i] == 0) && (bit_array[i+1] == 1))
					{
						temp |= 0x01;
						if(j < 4)
						{
							row_parity++;
						}
					}
					else if((bit_array[i] == 1) && (bit_array[i+1] == 0))
					{
						temp &= 0xfe;
					}
					else
					{
						put_s("解码错误。",1);
						
						PORTB |= 0x02;
						return(decode_error);
					}
					i += 2;
				}
				id_code[k] = (temp >> 1);
				temp &= 0x01;
				row_parity %= 2;
				if(k < 10)
				{
					if(row_parity != temp)
					{
						put_s("奇偶校验错误。",1);
						put_s("k=",0);
						put_c(k + 0x30);
						put_s("",1);
						put_s("id_code[k]=",0);
						put_c(id_code[k] + 0x30);
						put_s("",1);
						put_s("row_parity=",0);
						put_c(row_parity + 0x30);
						put_s("",1);
						put_s("temp=",0);
						put_c(temp + 0x30);
						put_s("",1);
						
						PORTB |= 0x02;
						return(odd_parity_error);
					}
				}
				else
				{
					if(temp != 0)
					{
						put_s("最后一位错误。",1);
						put_s("temp=",0);
						put_c(temp + 0x30);
						put_s("",1);
						return(last_bit_error);
					}
				}
			}
			
			col_parity = 0;
			
			for(i = 0;i < 4;i++)
			{
				temp = 0;
				col_parity >>= 1;
				for(j = 0;j < 10;j++)
				{
					
					if((id_code[j] & (1 << i)) == (1 << i))
					{
						temp++;
					}
				}
				temp %= 2;
				if(temp == 1)
				{
					col_parity |= 0x08;
				}
			}
			
			if(col_parity == id_code[10])
			{
//				put_str_xy(0,0,"OK");
				if(k == 11)
				{
					put_s("ID Card :",0);
					for(j = 2;j < 10;j++)
					{
						/*
						if(id_code[j] < 10)
						{
							put_c(id_code[j] + 0x30);
						}
						else
						{
							put_c(id_code[j] + 0x37);
						}*/
						rfid += (((unsigned long)(id_code[j])) << (4 * (9 - j)));
					}
				}
	//			put_long(rfid);
				put_num(40,16,rfid,0,10);
				
				return(good);
			}
			else
			{
//				put_str_xy(0,0,"NG");
				return(col_parity_error);
			}
			
			
		}
	}
	if(i == 128)
	{
		put_s("找不到开始信息.",1);
		return(nofind_start);
	}
	
}


⌨️ 快捷键说明

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