主頁 >  其他 > [STM32] Stm32f103c8t6+RC522 實作讀卡寫卡功能(超詳細,零基礎,小白)

[STM32] Stm32f103c8t6+RC522 實作讀卡寫卡功能(超詳細,零基礎,小白)

2020-12-30 13:10:11 其他

本篇文章內容總結下來就是

  1. 讀卡 使用默認密碼讀卡所有扇區所有塊的資料
  2. 寫ID 使用默認密碼讀取卡一的0扇區的第一塊資料并寫入到卡二的0扇區的第一塊里
  3. 密碼讀卡 不同廠家的初始密碼不同,整理了一些默認密碼,如果有收集到新的也可以補充進去
  4. 寫全卡 使用默認密碼讀取卡一的全部扇區全部塊資料并寫入到卡二的全部扇區的全部塊里

目錄

從來不按套路出牌的我

一.前期準備

STM32f103c8t6開發板

Keil5編譯器

串口工具

我就問你們什么叫專業

二.代碼

簡介RC522

代碼功能

代碼

總結

三.原始碼



從來不按套路出牌的我

沒用的前言,看干貨跳過這段

想必看到這篇文章的人都是已經翻閱了大量的文章資料,已經厭倦了那種通篇都是百度百科,通篇都是復制官方資料,通篇都是怎樣點亮led燈的沒有多少營養的文章

本篇文章除了插科打諢與耐人尋味的笑點之外盡可能的把干貨提供給大家學習,我在學習RC522時大量的時間都花在查找資料上了,真正的編程時間可能只有找資料的三分之一,所以為了不讓同樣抱有學習熱情的人因為找不到合適的資料而失去耐心最終失去學習的熱情,我準備把我整理的干貨拿出來與大家分享

沒錯,不務正業的我又回來了,這回是玩一玩Stm32單片機

當然也是從基礎的C語言開始學習,大概自學了小半個月的C語言就開始上手Stm32了

自學是在B站看的視頻,一邊寫筆記一邊敲代碼,好在有java的基礎,不然我就和這行無緣了

好了廢話不多說直接干貨

一.前期準備

  1. Stm32f103c8t6開發板 1塊
  2. RC522 1杯
  3. 杜邦線 適量
  4. 輕觸開關 3g
  5. led燈 根據個人喜好添加
  6. ST-LINK V2 一根 也可以使用 CH340替代(根據個人喜好調整)
  7. 一臺計算機 低于30噸的
  8. Keil5編譯器 1千克
  9. 串口燒錄程式 1匙
  10. 串口除錯程式 1伊普西龍
  11. M1 CUID卡 2開爾文

STM32f103c8t6開發板

RC522模塊

RC522相關資料:

鏈接: https://pan.baidu.com/s/1Qob5o4tv0_gBXrRk6AvLSQ

提取碼: fkjt

接線圖

每個人接線的引腳不同,我這里是因為接入了其他無關緊要的模塊才分開接線,不影響單獨RC522連接STM32

RC522接線
RC522_RST  ======  GPIOA_Pin_0
RC522_MISO ======  GPIOA_Pin_1
RC522_MOSI ======  GPIOA_Pin_2  
RC522_SCK  ======  GPIOA_Pin_3  
RC522_SDA(NSS) ==  GPIOA_Pin_4
       GND ======  GND  
       ACC ======  ACC

按鈕接線
KEY1_ACC === GPIOB_Pin_0
KEY2_ACC === GPIOB_Pin_1
     GND === GND

燈接線(也可以使用板載燈,這里使用板載燈)

LED5_ACC === GPIOA_Pin_5 //模式燈 在選擇模式時用于顯示當前模式用
LED6_ACC === GPIOA_Pin_6 //確認燈 在識別到卡1時會亮起提示換卡
    GND === GND

Keil5編譯器

Keil5編譯器

鏈接: https://pan.baidu.com/s/10jR0g10jxdosawc49IOazQ

提取碼: uizh

Keil5開發環境

自己收集整理并添加一些自己常用的方法的Stm32f103c8t6開發環境,解壓即用

Keil5開發環境

鏈接: https://pan.baidu.com/s/1U5sOv9lvs3wwKkisiAFYAA

提取碼: z1ih

串口工具

串口除錯程式 串口燒錄程式

鏈接: https://pan.baidu.com/s/11VCAXnfmO1FCQQVjirIkrQ

提取碼: h1uz

失效私信我


我就問你們什么叫專業

硬體配置,開發環境詳細到這個地步,初學者能夠直接上手學習

這就是專業

這就是一條龍服務,以后你們給其他人分享這篇文章時都可以說被一條龍服務過

二.代碼

簡介RC522

官方檔案一共有109頁接下來都是復制這個檔案所以大家可以走了[dog]

我就簡單總結一下白話文:

1.RC522能讀卡

2.RC522能寫卡

3.RC522能... 就這樣,就是能讀卡能寫卡,我們要它的功能也就是讀卡寫卡,我沒必要為了實作一個讀卡功能把這一百多也的檔案看完,也沒有必要為了實作一個功能就把它的原理全部吃透

介紹完畢

代碼功能

  1. 讀卡 使用默認密碼讀卡所有扇區所有塊的資料
  2. 寫ID 使用默認密碼讀取卡一的0扇區的第一塊資料并寫入到卡二的0扇區的第一塊里
  3. 密碼讀卡 不同廠家初始密碼不同,整理了一些初始密碼,如果有收集到新的也可以補充進去
  4. 寫全卡 使用默認密碼讀取卡一的全部扇區全部塊資料并寫入到卡二的全部扇區的全部塊里

怎么樣,干不干,全是干貨,沒有廢話

1.讀卡效果圖

這是一張CUID白卡,一會復制可以用作對比

有人會問扇區啥意思 區塊啥意思,這個就百度去吧好多文章在講RC522或者復制卡的文章都會用很大篇幅講什么是卡什么是扇區什么是區塊什么是密碼段,之后文章就結束了也不說怎么讀怎么寫怎么復制,最后來一句未完待續或者下一篇文章再詳細的寫,之后尸沉東京灣留下一段佳話,在這里因為我是旱鴨子就不寫了

SQ代表扇區 0~15扇區

QK代表區塊 0~3區塊

2.寫ID效果圖

這是一張目標卡,我們要將這張卡的0扇區的0塊資料寫到上面那張空白卡中

1.讀取卡1

進行寫操作 放上卡1=> 讀取卡1=> 識別到卡1后列印卡唯一id,并提示可進行復制=> 放上卡2=> 寫入卡2

讀取卡2

已經寫到卡2中了

3.密碼讀卡

每個扇區的3號區塊存盤的就是該扇區的密碼,只有讀取時攜帶相同的密碼才能看到并修改該扇區的資料,如果沒有密碼都不會讀到該扇區

因為廠家為了卡片的資料安全各廠會定義自己的讀卡密碼

個人收集了一部分密碼分享一下

unsigned char KEY[14][6]={
													{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
													{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
													{0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5},
													{0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5},
													{0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},
													{0x4D, 0x3A, 0x99, 0xC3, 0x51, 0xDD},
													{0x1A, 0x98, 0x2C, 0x7E, 0x45, 0x9A},
													{0x71, 0x4C, 0x5C, 0x88, 0x6E, 0x97},
													{0x58, 0x7E, 0xE5, 0xF9, 0x35, 0x0F},
													{0xA0, 0x47, 0x8C, 0xC3, 0x90, 0x91},
													{0x53, 0x3C, 0xB6, 0xC7, 0x23, 0xf6},
													{0x8F, 0xD0, 0xA4, 0xF2, 0x56, 0xE9},
													{0x66, 0x55, 0x44, 0x11, 0x22, 0x33},
													{0x66, 0x55, 0x44, 0x33, 0x22, 0x11}
};

4.寫全卡效果

效果就是兩張一模一樣的卡

代碼

磨嘰了半天終于到了重點

代碼里出現的 if(EN) if(CN) if(OLED) 代表是否列印對應語言,

EN 代表列印英文

CN 代表列印中文

OLED 代表在螢屏顯示(因為接入一塊OLED螢屏)

尋卡

要點:每次對卡進行操作時呼叫,兩個方法一模一樣,就是第二種去掉了列印

驗證卡片資訊,防沖撞,選卡


//				
//						尋卡方法
//					
	
char Pcdmain(){
		u8 status;
	  u8 ID_num[9];
		u8 *ID;	//卡號
		status= PcdRequest(REQ_ALL,TagType);//尋卡
			if(!status){
			status = PcdAnticoll(SelectedSnr);//防沖撞	
				if(!status){
				status=PcdSelect(SelectedSnr);//選卡
					if(!status){
						if(EN)printf("Read the success !! \r\n");
						if(CN)printf("尋找卡片成功 !! \r\n");
						if(OLED)GUI_ShowString(0,16,"1",16,1);
						
						ID = Card_ID(SelectedSnr,ID_num); //獲取卡ID
						
						if(EN)printf("ID:%s !! \r\n",ID_num);
						if(CN)printf("卡號:%s !! \r\n",ID_num);
						if(OLED)GUI_ShowString(16,16,"ID:",16,1);
						if(OLED)GUI_ShowString(40,16,ID,16,1);
						return status;
					}else{
					if(EN)printf("The selected card \r\n");
					if(CN)printf("卡片未找到 \r\n");
					if(OLED)GUI_ShowString(0,16,"2",16,1);
					return status;
					}
				}else{
				if(EN)printf("Anti-collision \r\n");
				if(CN)printf("卡片沖突 \r\n");
				if(OLED)GUI_ShowString(0,16,"3",16,1);
				return status;
				}
			}else{
			if(EN)printf("Looking for failure \r\n");
			if(CN)printf("卡片未找到 \r\n");
			if(OLED)GUI_ShowString(0,16,"4",16,1);
			return status;
			}
		}



//				
//						尋卡方法
//					
	
char Pcdmain_3(){
		u8 status;
		status= PcdRequest(REQ_ALL,TagType);//尋卡
			if(!status){
			status = PcdAnticoll(SelectedSnr);//防沖撞	
				if(!status){
				status=PcdSelect(SelectedSnr);//選卡
					if(!status){
						return status;
					}else{
					return status;
					}
				}else{
				return status;
				}
			}else{
			return status;
			}
		}

讀卡

要點:密碼密碼密碼 如果密碼不對那就結束了,初始密碼需要在成員變數中定義


//				
//					notarize = 1 讀卡
//					
		

unsigned char  DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //默認密碼 	

void  notarize_type1(){
		u8 status;
		u8 section=0;
		u8 block = 0;
		unsigned char block_value[16];
	
		u8 i=0;
		status = Pcdmain();
			if(!status){
				if(EN)printf("function NO1 Read the card ...\r\n");
				if(CN)printf("功能1 讀取卡片 \r\n");
				if(OLED)GUI_ShowString(48,0,"NO_1",16,1);
						for( section = 0 ; section <16 ; section++ ){
								status = PcdAuthState(KEYA, (section*4+3), DefaultKey, SelectedSnr);// 校驗1扇區密碼,密碼位于每一扇區第3塊
							if(!status)
								{		
									for(block = 0; block< 4 ; block++){
										status = PcdRead((section*4+block), block_value);  // 讀卡,讀取1扇區0塊資料到buf[0]-buf[16] 
										if(EN)printf("SQ:%d , QK:%d     ",section,block);
											if(EN)printf("passA	");
											for (i = 0 ; i<6; i++)
											{
											if(EN)printf("%X ",block_value[i]);
											}
											if(EN)printf("		Value	");
											for (i = 6; i<10; i++)
											{
											if(EN)printf("%X ",block_value[i]);
											}
											if(EN)printf("		passB	");
											for (i = 10; i<16; i++)
											{    
											if(EN)printf("%X ",block_value[i]);
											}
											if(EN)printf("\r\n");
									}
								}else {
									if(EN)printf("wrong password \r\n");
									if(CN)printf("密碼錯誤 \r\n");
									if(OLED)GUI_ShowString(0,16,"5",16,1);
								}
							}
							if(EN)printf("\r\n");
							if(EN)printf("\r\n");
							if(EN)printf("\r\n");
				
				
				
			}else{
				if(EN)printf("Looking for failure \r\n");
				if(CN)printf("卡片未找到 \r\n");
				if(OLED)GUI_ShowString(0,16,"4",16,1);
			}
	}

復制ID

ID的重要性就不用我多說了,因為通常的ID卡扇區0是出廠就定義好的ID不能再修改,所以也是唯一性的保障,大多數的系統也只會記錄ID作為驗證使用

而除了0扇區之外的扇區多為詳細資訊存盤使用,如取電卡的電量值,水卡的水量值,飯卡的余額之類,因為這部分可以讀寫所以密碼會與出廠密碼不同


//				
//					notarize = 2 復制卡id
//					
		
	void  notarize_type2(){
		u8 status;
		u8 test_status = 0; //id在0扇區 , 測驗使用其他扇區
		u8 block_num=0;
		u8 copy_tf = 1;
		unsigned char copy_value[16];
		status = Pcdmain_3();
			if(!status){
				if(EN)printf("function NO1 Read the card ...\r\n");
				if(CN)printf("功能2 復制卡片 \r\n");
				if(OLED)GUI_ShowString(48,0,"NO_2",16,1);
				
				//讀取并復制卡1 指定扇區指定塊資料
				
				status = PcdAuthState(KEYA, (test_status*4+3), DefaultKey, SelectedSnr);// 校驗1扇區密碼,密碼位于每一扇區第3塊	DefaultKey為默認密碼
						if(!status)
							{	
									status = PcdRead((test_status*4+0), copy_value);  // 讀卡,讀取1扇區0塊資料到buf[0]-buf[16]
										if(!status)
										{
											if(EN)printf("COPY: SQ:%d , QK:%d     ",test_status,0);
											if(EN)printf("passA	");
											for (block_num = 0; block_num<6; block_num++)
											{    
											if(EN)printf("%X ",copy_value[block_num]);
											}
											if(EN)printf("		Value	");
											for (block_num = 6; block_num<10; block_num++)
											{    
											if(EN)printf("%X ",copy_value[block_num]);
											}
											if(EN)printf("		passB	");
											for (block_num = 10; block_num<16; block_num++)
											{    
											if(EN)printf("%X ",copy_value[block_num]);
											}
										
											if(EN)printf("\r\n");
											}
									if(EN)printf("Read over \r\n");
									if(CN)printf("復制成功 替換目標卡片 \r\n");
									delay_ms(500);		
									if(OLED)GUI_ShowString(0,16,"COPY OK, CARD_2",16,1);				
											
											//讀取第二張卡片
											do{
																LED6S;   	//PC13輸出低電平
																//delay_ms(200);
																//LED6S;				//PC13輸出高電平
												
												
												if(KEY1==0){
												status = Pcdmain_3();
													if(!status){
														if(EN)printf("Ready to write card 2 ...\r\n");
														if(CN)printf("寫卡2\r\n");
														if(OLED)GUI_ShowString(0,0,"CARD2...",16,1);
															status = PcdAuthState(KEYA, (test_status*4+3), DefaultKey, SelectedSnr);// 校驗1扇區密碼,密碼位于每一扇區第3塊	
																if(!status){
																	status = PcdWrite((test_status*4+0), copy_value);  // 寫卡,將buf[0]-buf[16]寫入1扇區0塊
																	if(!status){
																			
																		
																			LED6R;				//PC13輸出高電平
																			delay_ms(20);
																			LED6S;   	//PC13輸出低電平
																			delay_ms(20);
																			LED6R;				//PC13輸出高電平
																			delay_ms(20);
																			LED6S;   	//PC13輸出低電平
																			delay_ms(20);
																			LED6R;				//PC13輸出高電平
																		
																			if(EN)printf("Copy success (*^▽^*) \r\n");
																			if(CN)printf("寫入成功 (*^▽^*) \r\n");
																			if(OLED)GUI_ShowString(0,16,"Copy SUCC (*^▽^*)",16,1);
																		}else{
																			if(EN)printf("Copy the failure (╯‵□′)╯︵┻━┻ \r\n");
																			if(CN)printf("復制失敗	 (╯‵□′)╯︵┻━┻  \r\n");
																			if(OLED)GUI_ShowString(0,16,"Copy the failure",16,1);
																		}
																	}else{
																		if(EN)printf("card 2 wrong password \r\n");
																		if(CN)printf("卡2密碼錯誤 \r\n");
																		if(OLED)GUI_ShowString(0,16,"card 2 PASS WRONG",16,1);	
																	}
																	LED6R;				//PC13輸出高電平
													}else{
														if(EN)printf("Looking for failure \r\n");
														if(CN)printf("卡片2未找到 \r\n");
														if(OLED)GUI_ShowString(0,16,"4",16,1);
														LED6R;				//PC13輸出高電平
													}
													LED6R;				//PC13輸出高電平
													copy_tf = 0;
												}
											}while(copy_tf);
											
											
											
											
								}else{
									if(EN)printf("wrong password \r\n");
									if(CN)printf("密碼錯誤 \r\n");
									if(OLED)GUI_ShowString(0,16,"5",16,1);	
								}

			}else{
				if(EN)printf("Looking for failure \r\n");
				if(CN)printf("卡片未找到 \r\n");
				if(OLED)GUI_ShowString(0,16,"4",16,1);
			}
	}

密碼測驗

測驗每個扇區的第3區塊密碼,當然幸運的話就是初始密碼,點背的話也沒關系只需要255*255*255*255*255*255 = 274,941,996,890,625次嘗試也可以得到密碼


//				
//					notarize = 3 常規密碼測驗
//					
		
		void  notarize_type3(){
		u8 status;
		u8 section=0;
		u8 block_num=0;
		u8 KEY_num = 0 ;
		unsigned char block_value[16];
	
		u8 i=0;
		status = Pcdmain_3();
			if(!status){
				if(EN)printf("function NO3 Password test ...\r\n");
				if(CN)printf("功能3 常規密碼測驗 \r\n");
				if(OLED)GUI_ShowString(48,0,"NO_3",16,1);
						for( section = 0 ; section <16 ; section++ ){
					for( KEY_num =0 ; KEY_num < 13 ; KEY_num++){
								status = Pcdmain_3();
						if(!status){
								//printf("section:%d  KEY:%d %d %d %d %d %d   ",section,KEY[KEY_num][0],KEY[KEY_num][1],KEY[KEY_num][2],KEY[KEY_num][3],KEY[KEY_num][4],KEY[KEY_num][5]);
								status = PcdAuthState(KEYA, (section*4+3), KEY[KEY_num], SelectedSnr);// 校驗1扇區密碼,密碼位于每一扇區第3塊
							if(!status)
								{
									status = 1;
									//for(block_num = 0; block_num< 4 ; block_num++){
										
										status = PcdRead((section*4+3), block_value);  // 讀卡,讀取1扇區0塊資料到buf[0]-buf[16] 
										if(EN)printf("SQ:%d , QK:%d  KEY:%X %X %X %X %X %X   ",section,3,KEY[KEY_num][0],KEY[KEY_num][1],KEY[KEY_num][2],KEY[KEY_num][3],KEY[KEY_num][4],KEY[KEY_num][5]);
											if(EN)printf("passA	");
											for (i = 0 ; i<6; i++)
											{ 
											if(EN)printf("%X ",block_value[i]);
											}
											if(EN)printf("		Value	");
											for (i = 6; i<10; i++)
											{    
											if(EN)printf("%X ",block_value[i]);
											}
											if(EN)printf("		passB	");
											for (i = 10; i<16; i++)
											{    
											if(EN)printf("%X ",block_value[i]);
											}
											if(EN)printf("\r\n");
											
									//}	
									
									
									
								}else {
									
								}
							}
							status = 1;
						}
					}
							if(EN)printf("\r\n");
							if(EN)printf("\r\n");
							if(EN)printf("\r\n");
						
			}else{
				if(EN)printf("Looking for failure \r\n");
				if(CN)printf("卡片未找到 \r\n");
				if(OLED)GUI_ShowString(0,16,"4",16,1);
			}
	}

復制全卡

由于全卡每個扇區的密碼不同所以復制全卡用處不大


//				
//					notarize = 4 復制全卡
//					
		
		void  notarize_type4(){
		u8 status;
		u8 section=0;
		u8 block = 0;
		u8 block_num=0;
		u8 copy_tf = 1;
		unsigned char block_value[16];
		unsigned char copy_value[16][3][16];
	
		status = Pcdmain_3();
			if(!status){
				if(EN)printf("function NO1 Read the card ...\r\n");
				if(CN)printf("功能1 讀取卡片 \r\n");
				if(OLED)GUI_ShowString(48,0,"NO_4",16,1);
					for( section = 0; section <16 ; section++ ){
								status = PcdAuthState(KEYA, (section*4+3), DefaultKey, SelectedSnr);// 校驗1扇區密碼,密碼位于每一扇區第3塊
								if(!status)
								{	
									for(block = 0; block< 3 ; block++){
										status = PcdRead((section*4+block), block_value);  // 讀卡,讀取1扇區0塊資料到buf[0]-buf[16] 
										for( block_num = 0; block_num < 16 ; block_num++){
											copy_value[section][block][block_num] = block_value[block_num];
										}
										}
								}
							}
							
											if(EN)printf("\r\n");
											if(EN)printf("\r\n");
											if(EN)printf("\r\n");
											if(EN)printf("\r\n");
							
							for(section = 0 ; section < 16 ; section++){
									for(block = 0 ; block < 3 ; block++){
											//for(block_num = 0 ; block_num < 16 ; block_num++){
											if(EN)printf("SQ:%d , QK:%d     ",section,block);
											if(EN)printf("passA	");
											for (block_num = 0; block_num<6; block_num++)
											{    
											if(EN)printf("%X ",copy_value[section][block][block_num]);
											}
											if(EN)printf("		Value	");
											for (block_num = 6; block_num<10; block_num++)
											{    
											if(EN)printf("%X ",copy_value[section][block][block_num]);
											}
											if(EN)printf("		passB	");
											for (block_num = 10; block_num<16; block_num++)
											{    
											if(EN)printf("%X ",copy_value[section][block][block_num]);
											}
											
											if(EN)printf("\r\n");
										

							//}
							}
										if(EN)printf("\r\n");
							}
											if(EN)printf("\r\n");
											if(EN)printf("\r\n");
											if(EN)printf("\r\n");
							
							
									if(EN)printf("Read over \r\n");
									if(CN)printf("復制成功 替換目標卡片 \r\n");
									if(OLED)GUI_ShowString(0,16,"COPY OK, CARD_2",16,1);				
											
											//讀取第二張卡片
											do{
												if(KEY1==0){
												status = Pcdmain_3();
													if(!status){
														if(EN)printf("Ready to write card 2 ...\r\n");
														if(CN)printf("寫卡2\r\n");
														if(OLED)GUI_ShowString(0,0,"CARD2...",16,1);
																for(section = 0 ; section < 16 ; section++){
																		//status = Pcdmain_3();
																		//if(!status){
																			status = PcdAuthState(KEYA, (section*4+3), DefaultKey, SelectedSnr);// 校驗1扇區密碼,密碼位于每一扇區第3塊	
																			if(!status){
																			for(block = 0 ; block < 3 ; block++){
																				//status = PcdWrite((section*4+block), copy_value[section][block]);  // 寫卡,將buf[0]-buf[16]寫入1扇區0塊
																				//status = PcdWrite((section*4+block), zero);  // 寫卡,將buf[0]-buf[16]寫入1扇區0塊
																				status = PcdWrite((4*4+3), setkey);  // 寫卡,將buf[0]-buf[16]寫入1扇區0塊
																				
																				if(EN)printf("SQ:%d , QK:%d     ",section,block);
																				if(EN)printf("passA	");
																				for (block_num = 0; block_num<6; block_num++)
																				{    
																				if(EN)printf("%X ",copy_value[section][block][block_num]);
																				}
																				if(EN)printf("		Value	");
																				for (block_num = 6; block_num<10; block_num++)
																				{    
																				if(EN)printf("%X ",copy_value[section][block][block_num]);
																				}
																				if(EN)printf("		passB	");
																				for (block_num = 10; block_num<16; block_num++)
																				{    
																				if(EN)printf("%X ",copy_value[section][block][block_num]);
																				}
																				
																				if(EN)printf("\r\n");
																				
																			if(!status){
																				if(EN)printf("SQ:%d , QK:%d     Copy success (*^▽^*) \r\n",section,block);
																				if(CN)printf("SQ:%d , QK:%d     寫入成功 (*^▽^*) \r\n",section,block);
																				if(OLED)GUI_ShowString(0,16,"Copy SUCC ",16,1);
																			}else{
																				if(EN)printf("SQ:%d , QK:%d     Copy the failure (* ̄︿ ̄) \r\n",section,block);
																				if(CN)printf("SQ:%d , QK:%d     復制失敗    (* ̄︿ ̄) \r\n",section,block);
																				if(OLED)GUI_ShowString(0,16,"Copy the failure",16,1);
																			}
																				if(CN)printf("SQ:%d , QK:%d (*^▽^*) \r\n",section,block);
																			}
																		}else{
																		if(EN)printf("card 2 wrong password \r\n");
																		if(CN)printf("卡2密碼錯誤 \r\n");
																		if(OLED)GUI_ShowString(0,16,"5",16,1);	
																	}		
														}	
													}else{
														if(EN)printf("Looking for failure \r\n");
														if(CN)printf("卡片2未找到 \r\n");
														if(OLED)GUI_ShowString(0,16,"4",16,1);
													}
													copy_tf = 0;
												}
											}while(copy_tf);	
			}else{
				if(EN)printf("Looking for failure \r\n");
				if(CN)printf("卡片未找到 \r\n");
				if(OLED)GUI_ShowString(0,16,"4",16,1);
			}
	}

總結

最后顯擺一下我的手工

這篇文章寫一半的時候就停了下來,在草稿中存了小半年,最后在年末穿上秋褲的時候想了想還是補全發出來吧

讓我寫文章的動力是因為C語言可以對這類單片機進行編程,進而讀取環境資料,簡單的溫濕度模塊,人體紅外感應模塊,觸摸模塊,光敏模塊等等

而這與網路爬蟲的作用很相似,一個是獲取網路資訊的自動程式,一個是獲取現實世界資訊的自動程式,這也是我為什么寫爬蟲寫著寫著就學起C的原因

當然爬蟲這方面也在找一些有趣有挑戰的網站,如果有人能分享有挑戰的專案我也會嘗試的

三.原始碼

閑聊到這里,想要原始碼的兩種途徑

1.積分下載 鏈接我會放上來

2.私信我 陪我聊聊天好么 秋梨膏

那么終于能完結這篇文章了,主要是我太懶,沒有什么動力能刺激到我創作

預告一下,下次我要做......等一下有人敲門 我去看看......

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242451.html

標籤:其他

上一篇:程式員經常看的開源月刊《HelloGitHub》第 57 期

下一篇:【51單片機】心形流水燈

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more