RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32設(shè)計(jì)的校園一卡通項(xiàng)目

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-05-18 11:07 ? 次閱讀

1. 項(xiàng)目簡(jiǎn)介

信息時(shí)代的校園, 離不開信息化的管理, 數(shù)字化"校園一卡通"建設(shè)是校園信息化建設(shè)的重要組成部分, 是為信息化校園提供信息采集的基礎(chǔ)工程也是獲取學(xué)校信息化服務(wù)的主要方式之一。

校園一卡通將只能 IC 卡的強(qiáng)大功能與計(jì)算機(jī)網(wǎng)絡(luò)的數(shù)字化理念融入校園, 將學(xué)校各個(gè)系統(tǒng)連為一體, 動(dòng)態(tài)掌握每一持卡人情況, 極大提高學(xué)校的管理水平和服務(wù)質(zhì)量。

本文介紹通過STM32 微控制器+RFID RC522設(shè)計(jì)的一個(gè)校園一卡通消費(fèi)充值機(jī)的項(xiàng)目,可以模擬實(shí)現(xiàn)充值、消費(fèi)、修改密碼、掛失、登錄、查詢.......等操作。

硬件介紹:

MCU:STM32F103ZE6

刷卡模塊: RFID-RC522

LCD屏: 正點(diǎn)原子的3.5寸LCD屏+觸摸屏

完整項(xiàng)目下載地址: https://download.csdn.net/download/xiaolong1126626497/63983899

視頻演示地址: https://live.csdn.net/v/182606

運(yùn)行效果:

pYYBAGKEYuKAMpZeAAor8wiC1dE458.png

poYBAGKEYuOAMwsjAAo6r0xcZFM739.pngpYYBAGKEYuSAZwSMAAkO7Q27ckU512.png

2. 項(xiàng)目實(shí)現(xiàn)

2.1 RFID-RC522模塊

RFID-RC522模塊直接淘寶購(gòu)買的現(xiàn)成模塊,模塊實(shí)物圖如下:

poYBAGKEYuSAZAsDAANn2CPHYoc334.png

RC522是NXP公司設(shè)計(jì)的13.56MHz非接觸式讀寫卡芯片,可以讀寫IC卡,具備低電壓、低成本、體積小的特點(diǎn),本身支持SPI接口通信,任何單片機(jī)都與通信,SPI時(shí)序模擬也非常簡(jiǎn)單。

現(xiàn)在地鐵卡、校園卡、公交卡都是屬于M1(S50)卡,M1卡內(nèi)部有16個(gè)扇區(qū),每個(gè)扇區(qū)分為4個(gè)塊,每個(gè)塊的容量是16個(gè)字節(jié),每個(gè)扇區(qū)里的最后一個(gè)塊是存放密碼,每次對(duì)塊里的數(shù)據(jù)讀寫都需要驗(yàn)證IC卡的密碼,只有具備寫權(quán)限才可以對(duì)塊進(jìn)行讀寫,密碼驗(yàn)證通過之后可以直接利用修改密碼、讀寫扇區(qū)等等,讀取卡號(hào)是不需要驗(yàn)證密碼的。

關(guān)于IC卡的詳細(xì)介紹請(qǐng)看這里: https://blog.csdn.net/xiaolong1126626497/article/details/117075834

本項(xiàng)目里STM32與RCC522通信使用的SPI是模擬時(shí)序,可以很方便的移植到其他的單片機(jī)。

SPI模擬時(shí)序代如下:

/*
函數(shù)功能:移植接口--SPI時(shí)序讀寫一個(gè)字節(jié)
函數(shù)參數(shù):data:要寫入的數(shù)據(jù)
返 回 值:讀到的數(shù)據(jù)
*/
u8 RC522_SPI_ReadWriteOneByte(u8 tx_data)
{			  	 
  u8 rx_data=0;				 
  u8 i;
  for(i=0;i<8;i++)
	{
		RC522_SCLK=0;  
		if(tx_data&0x80){RC522_OUTPUT=1;}
		else {RC522_OUTPUT=0;}
		tx_data<<=1;	
		RC522_SCLK=1;
		rx_data<<=1;
		if(RC522_INPUT)rx_data|=0x01;
	}
	return rx_data; 
}


/*
函數(shù)功能:初始化RC522的IO口	 
*/
void RC522_IO_Init(void)
{
	RCC->APB2ENR |= 0x01 << 0;
	AFIO->MAPR |= 0x01 << 26;

	RCC->APB2ENR |= 0x01 << 2;     //PA時(shí)鐘使能 
	
//#define RC522_CS	PAout(10)
//#define RC522_SCLK	PAout(13)
//#define RC522_OUTPUT	PAout(14)
//#define RC522_INPUT	PAin(15)
//#define RC522_RST	PAout(0)

	GPIOA->CRL &= 0xFFFFFFF0;
	GPIOA->CRL |= 0x00000003;

	GPIOA->CRH &= 0x000FF0FF;
	GPIOA->CRH |= 0x43330300;

	RC522_CS = 1;
	RC522_SCLK = 1;
}

2.2 LCD屏

LCD使用的是正點(diǎn)原子3.5寸屏,驅(qū)動(dòng)芯片是NT35310,支持8080時(shí)序,本身STM32大容量芯片具備FSMC接口的,可以直接使用FSMC接口操作LCD屏完成操作,這里考慮到程序的移植性,因?yàn)樾∪萘浚腥萘康谋热鏢TM32F103C8T6就沒有FSMC接口,為了方便程序可以移植到這些開發(fā)板正常運(yùn)行,當(dāng)前項(xiàng)目采用的是模擬8080時(shí)序方式,直接使用GPIO口模擬時(shí)序操作LCD屏;雖然刷屏效率比FSMC慢不少,但是本項(xiàng)目的界面也不需要很高的刷新率,沒有圖頻繁的切換效果,所以整體效果還是不錯(cuò)的。

模擬時(shí)序代碼如下: 如果要移植到其他單片機(jī)上,只需要修改GPIO口即可。

void lcd_write_cmd(u8 reg)
{
	LCD_CS = 0;	//拉低片選腳,選中 LCD
	LCD_RS = 0;	//拉低數(shù)據(jù)/命令控制線,選擇要操作命令

	LCD_RD = 1;	//禁止讀
	LCD_WR = 0;	//拉低 WR,準(zhǔn)備寫操作
	
	//數(shù)據(jù)總線輸出命令, 把要發(fā)送的命令放到數(shù)據(jù)總線上
	GPIOB->ODR = (u16)reg;
	
	LCD_WR = 1;	//拉高 WR 寫使能
	LCD_CS = 1;	//拉高片選,結(jié)束操作
}

void lcd_write_data(u16 data)
{
	LCD_CS = 0;	//拉低片選腳,選中 LCD
	LCD_RS = 1;	//拉高數(shù)據(jù)/命令控制線,選擇要操作數(shù)據(jù)

	LCD_RD = 1;	//禁止讀
	LCD_WR = 0;	//拉低 WR,準(zhǔn)備寫操作
	
	//數(shù)據(jù)總線輸出數(shù)據(jù), 把要發(fā)送的數(shù)據(jù)放到數(shù)據(jù)總線上
	GPIOB->ODR = data;
	
	LCD_WR = 1;	//拉高 WR 寫使能
	LCD_CS = 1;	//拉高片選,結(jié)束操作
}

void lcd_set_cursor(u16 x, u16 y)
{
	lcd_write_cmd(SET_X_ADDR);
	lcd_write_data(x>>8);
	lcd_write_data(x&0xff);

	lcd_write_cmd(SET_Y_ADDR);
	lcd_write_data(y>>8);
	lcd_write_data(y&0xff);
}

void lcd_write_reg(u16 cmd, u16 parameter)
{
	lcd_write_cmd(cmd);
	lcd_write_data(parameter);
}

void lcd_draw_dot(u16 x, u16 y, u16 color)
{
	lcd_set_cursor(x, y);
	lcd_write_cmd(WRITE_MEMORY_START);
	lcd_write_data(color);	// [15:0] --> [R4-R0:G5-G0:B4-B0]
}

void lcd_show_screen(const u8 * image, u32 size, u16 x, u16 y)
{
	u32 i = 0;

	lcd_set_cursor(x, y);	//設(shè)置光標(biāo)位置
	lcd_write_cmd(WRITE_MEMORY_START);	 //開始寫入GRAM

	while( i < size ){
		lcd_write_data( *image<<8 | *(image+1) ); 
		image += 2;
		++i;
	}
}

//畫矩形	  
//(x1,y1),(x2,y2):矩形的對(duì)角坐標(biāo)
void lcd_draw_rectblock(u16 y1, u16 y2, u16 color)
{
	u16 i;
	for( ; y1<=y2; ++y1){
		lcd_set_cursor(0,y1);		  //設(shè)置光標(biāo)位置
		lcd_write_cmd(WRITE_MEMORY_START);		  //開始寫入GRAM
		for(i=0; i<320; ++i){
			lcd_write_data( color );    //寫數(shù)據(jù)
		}
	}
}

void lcd_show_image(const u8 * image, u16 width, u16 high, u16 x, u16 y)
{	
	u32 i,j;

	for(i=0; i0)incx=1; //設(shè)置單步方向 
	else if(delta_x==0)incx=0;//垂直線 
	else {incx=-1;delta_x=-delta_x;} 
	if(delta_y>0)incy=1; 
	else if(delta_y==0)incy=0;//水平線 
	else{incy=-1;delta_y=-delta_y;} 
	if( delta_x>delta_y)distance=delta_x; //選取基本增量坐標(biāo)軸 
	else distance=delta_y; 
	for(t=0;t<=distance+1;t++ )//畫線輸出 
	{  
		lcd_draw_dot(uRow,uCol, WHITE);//畫點(diǎn) 
		xerr+=delta_x ; 
		yerr+=delta_y ; 
		if(xerr>distance) 
		{ 
			xerr-=distance; 
			uRow+=incx; 
		} 
		if(yerr>distance) 
		{ 
			yerr-=distance; 
			uCol+=incy; 
		} 
	} 
}

void lcd_draw_circle(u16 x,u16 y,u8 r, u16 color)
{
	int a, b, di;

	a = 0;
	b = r;	  
	di = 3 - (r << 1);	//判斷下個(gè)點(diǎn)位置的標(biāo)志

	while(a<=b){
		lcd_draw_dot(x+a,y-b, color);	//5
 		lcd_draw_dot(x+b,y-a, color);	//0           
		lcd_draw_dot(x+b,y+a, color);	//4               
		lcd_draw_dot(x+a,y+b, color);	//6 
		lcd_draw_dot(x-a,y+b, color);	//1       
 		lcd_draw_dot(x-b,y+a, color);             
		lcd_draw_dot(x-a,y-b, color);	//2             
  		lcd_draw_dot(x-b,y-a, color);	//7     	         
		++a;
		//使用Bresenham算法畫圓     
		if(di < 0)
			di += 4*a + 6;	  
		else{
			di+=10+4*(a-b);   
			--b;
		}						    
	}
}

void lcd_clear(u16 color)
{
	u32 index;      
	u32 point;
	point = 480*320; 		//得到總點(diǎn)數(shù)
	lcd_set_cursor(0x00,0x00);	//設(shè)置光標(biāo)位置 
	lcd_write_cmd(WRITE_MEMORY_START);  	//開始寫入GRAM	  	  
	for(index=0; index;>;>

3.3 觸摸屏

觸摸屏是LCD屏本身自帶的,觸摸芯片是XPT2046,是一個(gè)12位的ADC芯片,通信協(xié)議是SPI時(shí)序。

項(xiàng)目里采用模擬SPI時(shí)序進(jìn)行與觸摸屏芯片通信,因?yàn)閄PT2046本身是ADC芯片,所以在屏幕上按下后讀取出來的數(shù)據(jù)是模擬數(shù)據(jù)值—物理坐標(biāo)值,我們還需要將它轉(zhuǎn)為屏幕坐標(biāo)與LCD屏的像素點(diǎn)對(duì)應(yīng)起來,這樣使用起來才比較方便。

XPT2046核心代碼如下:

#include "stm32f10x.h"
#include "xpt2046.h"
#include "delay.h"

/*
#define T_SCK	PAout(12)
#define T_MI	PAin(6)
#define T_MO	PAout(11)
#define T_PEN	PAin(7)
#define T_CS	PAout(8)
*/
void xpt2046_init(void)
{
	RCC->APB2ENR |= 0x01 << 2;	// ENABLE port a clock

	GPIOA->CRL &= 0x00FFFFFF;	// 浮空輸入
	GPIOA->CRL |= 0x44000000;	// 推挽輸出

	GPIOA->CRH &= 0xFFF00FF0;
	GPIOA->CRH |= 0x00033003;

	T_CS = 1;
	T_SCK = 0;
}

/*
cmd format 1: 10010000	0x90	Y-POSITION Measure
cmd format 2: 11010000	0xd0	X-POSITION Measure
*/
u16 xpt2046_read(u8 cmd)
{
	T_SCK = 0;
	T_MO = 0;
	T_CS = 0;
	
	for(u8 i=0; i<8; ++i){
		T_SCK = 0;
		if( cmd & 0x80 )
			T_MO = 1;
		else
			T_MO = 0;
		cmd <<= 1;
		T_SCK = 1;
	}
	// 15時(shí)鐘周期轉(zhuǎn)換
	T_SCK = 0;
	T_MO = 0;
	T_SCK = 1;
	u16 data = 0;
	for(u8 i=0; i<12; ++i){
		T_SCK = 0;
		data <<= 1;
		T_SCK = 1;
		if( T_MI )
			data |= 0x01;
	}
	T_CS = 1;

	return (data);
}

u8 xpt2046_position(TOUCH * xpt2046_pos)
{
	if( !T_PEN ){
		u8 i, j;
		u16 tmp;
		u16 x[16], y[16];
		
		for(i=0; i<16; ++i){
			x[i] = xpt2046_read(XPOS);
			y[i] = xpt2046_read(YPOS);
		}
		for(i=0; i<16; ++i){
			for(j=0; j<16-i; ++j){
				if(x[j]>x[j+1]){
					tmp = x[j];
					x[j] = x[j+1];
					x[j+1] = tmp;
				}
				if(y[j]>y[j+1]){
					tmp = y[j];
					y[j] = y[j+1];
					y[j+1] = tmp;
				}
			}
		}

		u32 sum_x, sum_y;

		sum_x = sum_y =0;
		for(i=3; i<13; i++){
			sum_x += x[i];
			sum_y += y[i];
		}
		xpt2046_pos->x = sum_x / 10;
		xpt2046_pos->y = sum_y / 10;

		return 0;
	}
	else
		return 1;
}

u8 touch_position(TOUCH * touch_pos)
{
	TOUCH xpt2046_pos;

	if( !xpt2046_position(&xpt2046_pos) ){
		touch_pos->x = 320 - (xpt2046_pos.x - 300) / 11.25;
		touch_pos->y = 480 - (xpt2046_pos.y - 200) / 7.7;
		return 0;
	}
	else{
		touch_pos->x = 0xffff;
		touch_pos->y = 0xffff;
		return 1;
	}
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • IC卡
    +關(guān)注

    關(guān)注

    2

    文章

    165

    瀏覽量

    34114
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10895

    瀏覽量

    355721
  • 一卡通
    +關(guān)注

    關(guān)注

    1

    文章

    24

    瀏覽量

    9658
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    看誰還敢研究一卡通!

    奇虎工程師破解一卡通漏洞惡意充值遭拘役  楊某和林某案發(fā)前均為奇虎公司的網(wǎng)絡(luò)工程師。去年12月底,楊某發(fā)現(xiàn)本市市政一卡通充值系統(tǒng)存在漏洞。他用自己的卡片試驗(yàn),并破解了卡內(nèi)芯片帶有的系統(tǒng)密碼,發(fā)現(xiàn)自己
    發(fā)表于 09-27 16:10

    校園一卡通系統(tǒng)下的子系統(tǒng)仿真,proteus現(xiàn)在沒有關(guān)于RFID的器件,那有沒有什么思路提供?

    現(xiàn)在在做校園一卡通系統(tǒng),要給一卡通系統(tǒng)下的子系統(tǒng)仿真,proteus現(xiàn)在沒有關(guān)于RFID的器件,那有沒有什么思路提供,謝謝各位大佬了。
    發(fā)表于 05-01 22:39

    “旅游一卡通”系統(tǒng)的研究與設(shè)計(jì)

    通過分析河南旅游的特點(diǎn),對(duì)“旅游一卡通”系統(tǒng)進(jìn)行了研究與設(shè)計(jì)。文章闡述了“旅游一卡通”的功能,并對(duì)系統(tǒng)的總體設(shè)計(jì)進(jìn)行了研究。分析了傳統(tǒng)三層應(yīng)用軟件系統(tǒng)的不足,
    發(fā)表于 09-04 09:37 ?14次下載

    基于數(shù)字化校園環(huán)境的一卡通設(shè)計(jì)與實(shí)現(xiàn)

    一卡通系統(tǒng)是校園數(shù)字信息化建設(shè)的重要組成部分,本文根據(jù)既定目標(biāo),合理規(guī)劃一卡通系統(tǒng)建設(shè),討論了系統(tǒng)的結(jié)構(gòu)、數(shù)據(jù)庫(kù)設(shè)計(jì)、系統(tǒng)網(wǎng)絡(luò)安全、應(yīng)用集成、數(shù)據(jù)挖掘等關(guān)鍵技術(shù)和
    發(fā)表于 02-25 11:29 ?15次下載

    學(xué)校銀行一卡通系統(tǒng)解決方案

    校園一卡通系統(tǒng)隨著智能卡技術(shù)的發(fā)展而成為學(xué)校提升管理水平,促進(jìn)學(xué)校管理手段的現(xiàn)代化的強(qiáng)有力載體。目前,校園一卡通系統(tǒng)所采用的方案也有好多種,在前期的
    發(fā)表于 08-07 09:35 ?1717次閱讀

    一卡通管理系統(tǒng)設(shè)計(jì)方案

    一卡通系統(tǒng)是以非接觸式IC卡讀寫技術(shù)為基礎(chǔ)的一卡通管理系統(tǒng)。其根本需求是信息共享、集中控制,因此系統(tǒng)的設(shè)計(jì)不應(yīng)是各單個(gè)功能的簡(jiǎn)單組合,從統(tǒng)網(wǎng)絡(luò)平臺(tái)、統(tǒng)數(shù)據(jù)庫(kù)、統(tǒng)
    發(fā)表于 04-20 15:43 ?50次下載
    <b class='flag-5'>一卡通</b>管理系統(tǒng)設(shè)計(jì)方案

    基于校園一卡通的門禁系統(tǒng)設(shè)計(jì)

    針對(duì)為排查外來人員,方便本單位人員進(jìn)出大門的需求,提出了種基于校園一卡通的門禁系統(tǒng)設(shè)計(jì)方案,該系統(tǒng)以STC89C52RC單片機(jī)為核心,設(shè)計(jì)相關(guān)外圍電路,實(shí)現(xiàn)對(duì)讀卡器讀取的一卡
    發(fā)表于 11-03 15:03 ?283次下載

    基于校園一卡通系統(tǒng)的自助校園網(wǎng)注冊(cè)系統(tǒng)的設(shè)計(jì)

    基于校園網(wǎng)絡(luò)用戶注冊(cè)需要,結(jié)合一卡通系統(tǒng)基礎(chǔ)數(shù)據(jù)庫(kù)平臺(tái),以校園卡為開戶重要憑證,設(shè)計(jì)套基于校園卡的校園
    發(fā)表于 01-04 17:13 ?11次下載

    RFID-MFRC522-一卡通

    RFID-MFRC522-一卡通
    發(fā)表于 10-23 09:59 ?64次下載

    高校數(shù)字化校園建設(shè)--手機(jī)校園一卡通模式研究

    大多數(shù)高校建設(shè)校園一卡通系統(tǒng)中,使用承載一卡通系統(tǒng)信息的載體是非接觸射頻卡(Mifare One),它是一卡通系統(tǒng)里最基礎(chǔ)的、最重要的設(shè)備。但隨著物聯(lián)網(wǎng)、移動(dòng)終端的大量普及應(yīng)用,高校
    發(fā)表于 12-09 06:31 ?1798次閱讀
    高校數(shù)字化<b class='flag-5'>校園</b>建設(shè)--手機(jī)<b class='flag-5'>校園</b><b class='flag-5'>一卡通</b>模式研究

    指紋識(shí)別技術(shù)用于校園一卡通系統(tǒng)設(shè)計(jì)方案

    校園一卡通系統(tǒng)將射頻卡技術(shù)與指紋識(shí)別技術(shù)應(yīng)用到數(shù)字校園系統(tǒng),作為電子身份載體的IC卡,通過指紋識(shí)別技術(shù)進(jìn)行身份認(rèn)證,從而方便師生自動(dòng)完成諸如借/還書、消費(fèi)、考試、考勤等與其身份相關(guān)的活動(dòng),提高
    發(fā)表于 07-05 16:30 ?1599次閱讀
    指紋識(shí)別技術(shù)用于<b class='flag-5'>校園</b><b class='flag-5'>一卡通</b>系統(tǒng)設(shè)計(jì)方案

    解析智能一卡通系統(tǒng)設(shè)計(jì)方案

    目前社會(huì)上使用較多的卡有:磁卡、條碼卡、凸字卡、IC卡、紅外卡等,近幾年又從國(guó)外引進(jìn)了非接觸ID感應(yīng)卡、非接觸型IC卡、智能CPU卡等。而真正“一卡通”是種什么樣概念,明確的回答是:真正
    發(fā)表于 06-05 01:28 ?1626次閱讀
    解析智能<b class='flag-5'>一卡通</b>系統(tǒng)設(shè)計(jì)方案

    復(fù)旦一卡通門禁系統(tǒng)的組成及整合應(yīng)用分析

    校園一卡通應(yīng)用中,往往會(huì)牽涉到多個(gè)子系統(tǒng)的整合。整合上存在諸多問題,比如接口不致、通訊方式不同、采用不同的數(shù)據(jù)庫(kù)等,直是困擾系統(tǒng)集成商的
    發(fā)表于 01-14 11:35 ?1749次閱讀

    基于校園一卡通的門禁系統(tǒng)設(shè)計(jì)方案

    電子發(fā)燒友網(wǎng)站提供《基于校園一卡通的門禁系統(tǒng)設(shè)計(jì)方案.pdf》資料免費(fèi)下載
    發(fā)表于 10-25 11:32 ?1次下載
    基于<b class='flag-5'>校園</b><b class='flag-5'>一卡通</b>的門禁系統(tǒng)設(shè)計(jì)方案

    校園一卡通系統(tǒng)中RFID讀寫器的設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《校園一卡通系統(tǒng)中RFID讀寫器的設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 10-31 11:31 ?0次下載
    <b class='flag-5'>校園</b><b class='flag-5'>一卡通</b>系統(tǒng)中RFID讀寫器的設(shè)計(jì)
    RM新时代网站-首页