單片機源程序如下:
- #include "reg52.h"
- #include "rc522.h"
- #include "stdio.h"
- #include "math.h"
- #include "stdlib.h"
- #include "string.h"
- #include "lcd1602.h"
- #define RELOAD_COUNT 0xFA//宏定義波特率發生器的載入值
- #define uchar unsigned char //對數據類型進行聲明定義
- #define uint unsigned int
- sfr AUXR=0x8E;
- sfr BRT=0x9C;
- sfr AUXR1=0xA2;
- sbit led=P2^7;
- sbit BEEP=P2^6;
- sbit TEST=P2^5;
- uchar Receive,i;
- uint n;
- uchar s=0,c=0,h=0;
- uchar Recive_table[15];
- char status;//按鍵狀態
- unsigned char code CardKeyABuf[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
- unsigned char CT[2];
- unsigned char SN[4];//從卡片讀取的卡號存放在這里
- // 系統注冊的卡號
- unsigned char code card_1[4]={0XFD, 0X31, 0X9A, 0X15};
- unsigned char code card_2[4]={0X84, 0X4D, 0XC3, 0XDB};
- unsigned char code id_1[16]={"20150502310028"};
- unsigned char code id_2[16]={"20150502310033"};
- //WiFi模塊設置
- unsigned char LYMS[13]={0x41,0x54,0x2B,0x43,0x57,0x4D,0x4F,0x44,0x45,0x3D,0x32,0x0D,0x0A};//AT+CWMODE=2 設置成路由模式
- unsigned char SZLY[38]={0x41,0x54,0x2B,0x43,0x57,0x53,0x41,0x50,0x3D,0x22,0x45,0x53,0x50,
- 0x38,0x32,0x36,0x36,0x22,0x2C,0x22,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x22,
- 0x2C,0x31,0x31,0x2C,0x33,0x0D,0x0A};//AT+CWSAP="ESP8266","0123456789",11,0 設置路由
- unsigned char RST[8]={0x41,0x54,0x2B,0x52,0x53,0x54,0x0D,0x0A};//AT+RST 重啟
- unsigned char SZDLJ[13]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x31,0x0D,0x0A};//AT+CIPMUX=1 設置成多連接
- unsigned char KQFU[21]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x52,0x56,0x45,0x52,0x3D,
- 0x31,0x2C,0x35,0x30,0x30,0x30,0x0D,0x0A};//AT+CIPSERVER=1,5000 開啟TCP服務端口
- unsigned char FSSJ[11]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x4E,0x44,0x3D};//AT+CIPSEND= 發送數據
- /****************************************************
- 名稱:延時函數
- 功能:精準延時
- *****************************************************/
- void usdelay(uint f)
- {
- while(f--);
- }
- /****************************************************
- 名稱:讀卡號函數
- 功能:讀取測試卡號
- *****************************************************/
- void Display_ID( unsigned char * SrcBuf )
- {
- char xdata DisplayBuf[10];
- char *pDisplayChar;
- unsigned char Tmp, i;
- pDisplayChar = DisplayBuf;
- for( i = 0; i < 4; i++ )
- {
- Tmp = ( ( *SrcBuf ) >> 4 ) & 0x0F;
- if( ( Tmp >=0 ) && ( Tmp <= 9 ) )
- {
- *pDisplayChar ++ = '0' + Tmp;
- }
- else
- {
- *pDisplayChar ++ = 'A' + Tmp - 10;
- }
- Tmp = ( *SrcBuf ) & 0x0F;
- if( ( Tmp >=0 ) && ( Tmp <= 9 ) )
- {
- *pDisplayChar ++ = '0' + Tmp;
- }
- else
- {
- *pDisplayChar ++ = 'A' + Tmp - 10;
- }
- SrcBuf ++;
- }
- *pDisplayChar ++ = '\0';
- writecom(0x80);
- writestr(DisplayBuf);
- }
- /*******************************************************************************
- * 函數名 :UsartInit()
- * 函數功能 :設置串口
- *******************************************************************************/
- void Uart_Init()//使用定時器1作為波特率發生器
- {
- SCON=0x50;//設置為串行口以方式1工作,8位異步通訊,允許接收中斷。//一幀信息為10位,1位起始位,8位數據位(低位在先),1位停止位。
- PCON=0x80;//SMOD波特率選擇位為1,SMOD=1.
- TMOD=0x21;//設置定時器1為波特率發生器,工作在模式2,8位自動裝載
- TH1=RELOAD_COUNT;//波特率9600,TH1=256-FOSC/16/12/波特率
- TL1=TH1;
- EA=1;//總中斷打開
- ES=0;//關閉串口中斷
- TR1=1;//啟動定時器1
- }
- /********************************************************************
- 名稱:串口發送函數
- 功能:MCU向其他與其連接的設備發送數據(此處是無線WIFI模塊ESP8266)
- ********************************************************************/
- void Send_Uart (uchar value)
- {
- ES=0;//關閉串口中斷
- TI=0;//清發送完畢中斷請求標志位
- SBUF=value;//發送
- while(TI==0);//等待發送完畢
- TI=0;//清發送完畢中斷請求標志位
- ES=1;//允許串口中斷
- }
- /********************************************************************
- 名稱:WIFI模塊設置函數
- 作用:啟動模塊,以便可以實現無線接入和控制
- ********************************************************************/
- void ESP8266_Set(uchar *puf)//數組指針*puf指向字符串數組
- {
- while(*puf!='\0')//遇到空格跳出循環
- {
- Send_Uart(*puf);//向WIFI模塊發送控制指令
- usdelay(5);
- puf++;
- }
- usdelay(5);
- Send_Uart('\r');//回車
- usdelay(5);
- Send_Uart('\n');//換行
- delayms(1000);
- }
- /****************************************************
- 名稱:ESP8266發送數據函數
- 功能:用于與wifi模塊相連的終端發送數據
- *****************************************************/
- void ESP8266_Sent(uchar *puf)//數組指針*puf指向字符串數組
- {
- ESP8266_Set(FSSJ);
- while(*puf!='\0')//遇到空格跳出循環
- {
- Send_Uart(*puf);//向WIFI模塊發送控制指令。
- usdelay(5);
- puf++;
- }
- usdelay(5);
- Send_Uart('\n');//換行
- delayms(10);
- }
- /*蜂鳴器滴響*/
- void Beep(int a)
- { int i;
- for(i=0;i<a;i++)
- {
- BEEP = 0;
- delayms(100);
- BEEP = 1;
- }
- }
- /*******************************************************************************
- * 函 數 名 : Timer0Init
- * 函數功能 : 定時器0初始化
- *******************************************************************************/
- void Timer0Init()
- {
- TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
- TH0=0XFC; //給定時器賦初值,定時1ms
- TL0=0X18;
- ET0=1;//打開定時器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時器
- }
- void Timer0() interrupt 0
- {
- static uint i;
- TH0=0XFC; //給定時器賦初值,定時1ms
- TL0=0X18;
- i++;
- if(i==1000)
- {
- s++;
- if(s>59)
- {
- c++;
- }
- if(c>59)
- {
- h++;
- }
- if(h>23)
- {
- h=0;
- }
- }
- }
- /*******************************************************************************
- * 函數名 : Usart() interrupt 4
- * 函數功能 : 串口通信中斷函數
- *******************************************************************************/
- void Usart() interrupt 4
- {
- static uchar i=0;
- if(RI==1)
- {
- RI=0;
- Receive=SBUF;//MCU接收wifi模塊反饋回來的據
- Recive_table[i]=Receive;
- i++;
- if((Recive_table[i-1]=='\n'))i=0;//遇到換行重新裝值
- }
- else TI=0;
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- *******************************************************************************/
- void main()
- {
- RC522_Init();//re522刷卡器初始化
- Timer0Init();//定時器0中斷初始化
- lcdinit();
- Uart_Init(); //串口初始化
- ESP8266_Set(LYMS);//WiFi模塊設置
- ESP8266_Set(SZLY);
- ESP8266_Set(RST);
- ESP8266_Set(SZDLJ);
- ESP8266_Set(KQFU);
- while(1)
- { led=0;
- status = PcdRequest(PICC_REQALL,CT);//向卡發送請求讀取的信號,并且向CT數組內寫入從卡片讀取的數據
- status = PcdAnticoll(SN);//防沖撞處理,防止讀卡出現沖突 ,往SN寫入4字節卡號
- if(TEST==0)
- { delayms(20);
- if(TEST==0)
- { Display_ID(SN);//按下按鍵讀取卡號
- delayms(3000);
- }
- }
- if(status == MI_OK)
- {
- led=1;
- Beep(5);
- if(0 == memcmp(SN,card_1,4))
- {
- ESP8266_Sent(id_1);
- Send_Uart(h);
- Send_Uart(':');
- Send_Uart(c);
- Send_Uart(':');
- Send_Uart(s);
- Send_Uart('\n');//換行
- writecom(0x80+0x42);
- writedata(h);
- writecom(0x80+0x44);
- writedata(':');
- writecom(0x80+0x45);
- writedata(c);
- writecom(0x80+0x47);
- writedata(':');
- writecom(0x80+0x48);
- writedata(s);
- }
- if(0 == memcmp(SN,card_2,4))
- {
- ESP8266_Sent(id_2);
- Send_Uart(h);
- Send_Uart(':');
- Send_Uart(c);
- Send_Uart(':');
- Send_Uart(s);
- Send_Uart('\n');//換行
- writecom(0x80+0x42);
- writedata(h);
- writecom(0x80+0x44);
- writedata(':');
- writecom(0x80+0x45);
- writedata(c);
- writecom(0x80+0x47);
- writedata(':');
- writecom(0x80+0x48);
- writedata(s);
- }
- }
-
- }
- }
復制代碼
所有資料51hei提供下載:
單片機課設程序.zip
(81.01 KB, 下載次數: 18)
2019-5-14 18:06 上傳
點擊文件名下載附件
51單片機基于WIF的刷卡器程序
|