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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32設計的校園一卡通項目

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

1. 項目簡介

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

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

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

硬件介紹:

MCU:STM32F103ZE6

刷卡模塊: RFID-RC522

LCD屏: 正點原子的3.5寸LCD屏+觸摸屏

完整項目下載地址: https://download.csdn.net/download/xiaolong1126626497/63983899

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

運行效果:

pYYBAGKEYuKAMpZeAAor8wiC1dE458.png

poYBAGKEYuOAMwsjAAo6r0xcZFM739.pngpYYBAGKEYuSAZwSMAAkO7Q27ckU512.png

2. 項目實現(xiàn)

2.1 RFID-RC522模塊

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

poYBAGKEYuSAZAsDAANn2CPHYoc334.png

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

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

關于IC卡的詳細介紹請看這里: https://blog.csdn.net/xiaolong1126626497/article/details/117075834

本項目里STM32與RCC522通信使用的SPI是模擬時序,可以很方便的移植到其他的單片機。

SPI模擬時序代如下:

/*
函數(shù)功能:移植接口--SPI時序讀寫一個字節(jié)
函數(shù)參數(shù):data:要寫入的數(shù)據
返 回 值:讀到的數(shù)據
*/
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時鐘使能 
	
//#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使用的是正點原子3.5寸屏,驅動芯片是NT35310,支持8080時序,本身STM32大容量芯片具備FSMC接口的,可以直接使用FSMC接口操作LCD屏完成操作,這里考慮到程序的移植性,因為小容量,中容量的比如STM32F103C8T6就沒有FSMC接口,為了方便程序可以移植到這些開發(fā)板正常運行,當前項目采用的是模擬8080時序方式,直接使用GPIO口模擬時序操作LCD屏;雖然刷屏效率比FSMC慢不少,但是本項目的界面也不需要很高的刷新率,沒有圖頻繁的切換效果,所以整體效果還是不錯的。

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

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

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

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

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

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);	//設置光標位置
	lcd_write_cmd(WRITE_MEMORY_START);	 //開始寫入GRAM

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

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

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

	for(i=0; i0)incx=1; //設置單步方向 
	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; //選取基本增量坐標軸 
	else distance=delta_y; 
	for(t=0;t<=distance+1;t++ )//畫線輸出 
	{  
		lcd_draw_dot(uRow,uCol, WHITE);//畫點 
		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);	//判斷下個點位置的標志

	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; 		//得到總點數(shù)
	lcd_set_cursor(0x00,0x00);	//設置光標位置 
	lcd_write_cmd(WRITE_MEMORY_START);  	//開始寫入GRAM	  	  
	for(index=0; index;>;>

3.3 觸摸屏

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

項目里采用模擬SPI時序進行與觸摸屏芯片通信,因為XPT2046本身是ADC芯片,所以在屏幕上按下后讀取出來的數(shù)據是模擬數(shù)據值—物理坐標值,我們還需要將它轉為屏幕坐標與LCD屏的像素點對應起來,這樣使用起來才比較方便。

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時鐘周期轉換
	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;
	}
}

審核編輯:湯梓紅

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

    關注

    2

    文章

    165

    瀏覽量

    34123
  • STM32
    +關注

    關注

    2270

    文章

    10900

    瀏覽量

    355981
  • 一卡通
    +關注

    關注

    1

    文章

    24

    瀏覽量

    9658
收藏 人收藏

    評論

    相關推薦

    看誰還敢研究一卡通

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

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

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

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

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

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

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

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

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

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

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

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

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

    基于校園一卡通系統(tǒng)的自助校園網注冊系統(tǒng)的設計

    基于校園網絡用戶注冊需要,結合一卡通系統(tǒng)基礎數(shù)據庫平臺,以校園卡為開戶重要憑證,設計套基于校園卡的校園
    發(fā)表于 01-04 17:13 ?11次下載

    RFID-MFRC522-一卡通

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

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

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

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

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

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

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

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

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

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

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

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

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