单片机源程序如下:
- #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)
|