找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1939|回复: 0
收起左侧

51单片机基于esp8266 WIFI的刷卡器程序

[复制链接]
ID:538181 发表于 2019-5-14 18:07 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include "reg52.h"                       
  2. #include "rc522.h"
  3. #include "stdio.h"
  4. #include "math.h"
  5. #include "stdlib.h"
  6. #include "string.h"
  7. #include "lcd1602.h"
  8. #define RELOAD_COUNT 0xFA//宏定义波特率发生器的载入值
  9. #define uchar unsigned char          //对数据类型进行声明定义
  10. #define uint unsigned int       
  11. sfr AUXR=0x8E;
  12. sfr BRT=0x9C;
  13. sfr AUXR1=0xA2;
  14. sbit led=P2^7;
  15. sbit BEEP=P2^6;
  16. sbit TEST=P2^5;
  17. uchar Receive,i;
  18. uint n;
  19. uchar s=0,c=0,h=0;
  20. uchar Recive_table[15];
  21. char status;//按键状态
  22. unsigned char code CardKeyABuf[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
  23. unsigned char  CT[2];                                                                               
  24. unsigned char  SN[4];//从卡片读取的卡号存放在这里                        
  25. // 系统注册的卡号
  26. unsigned char  code card_1[4]={0XFD,        0X31,        0X9A,        0X15};
  27. unsigned char  code card_2[4]={0X84,        0X4D,        0XC3,   0XDB};
  28. unsigned char  code  id_1[16]={"20150502310028"};
  29. unsigned char  code  id_2[16]={"20150502310033"};
  30. //WiFi模块设置
  31. unsigned char LYMS[13]={0x41,0x54,0x2B,0x43,0x57,0x4D,0x4F,0x44,0x45,0x3D,0x32,0x0D,0x0A};//AT+CWMODE=2 设置成路由模式
  32. unsigned char SZLY[38]={0x41,0x54,0x2B,0x43,0x57,0x53,0x41,0x50,0x3D,0x22,0x45,0x53,0x50,
  33. 0x38,0x32,0x36,0x36,0x22,0x2C,0x22,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x22,
  34. 0x2C,0x31,0x31,0x2C,0x33,0x0D,0x0A};//AT+CWSAP="ESP8266","0123456789",11,0 设置路由
  35. unsigned char RST[8]={0x41,0x54,0x2B,0x52,0x53,0x54,0x0D,0x0A};//AT+RST 重启
  36. unsigned char SZDLJ[13]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x31,0x0D,0x0A};//AT+CIPMUX=1 设置成多连接
  37. unsigned char KQFU[21]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x52,0x56,0x45,0x52,0x3D,
  38. 0x31,0x2C,0x35,0x30,0x30,0x30,0x0D,0x0A};//AT+CIPSERVER=1,5000 开启TCP服务端口
  39. unsigned char FSSJ[11]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x4E,0x44,0x3D};//AT+CIPSEND= 发送数据

  40. /****************************************************
  41. 名称:延时函数
  42. 功能:精准延时
  43. *****************************************************/
  44. void usdelay(uint f)
  45. {
  46.         while(f--);
  47. }
  48. /****************************************************
  49. 名称:读卡号函数
  50. 功能:读取测试卡号
  51. *****************************************************/
  52. void Display_ID( unsigned char * SrcBuf )
  53. {
  54.         char xdata DisplayBuf[10];
  55.         char *pDisplayChar;
  56.         unsigned char Tmp, i;
  57.         pDisplayChar = DisplayBuf;
  58.         for( i = 0; i < 4; i++ )
  59.         {
  60.                 Tmp = ( ( *SrcBuf ) >> 4 ) & 0x0F;       
  61.                 if( ( Tmp >=0 ) && ( Tmp <= 9 )        )
  62.                 {
  63.                         *pDisplayChar ++ = '0' + Tmp;       
  64.                 }
  65.                 else
  66.                 {
  67.                         *pDisplayChar ++ = 'A' + Tmp - 10;
  68.                 }

  69.                 Tmp = ( *SrcBuf ) & 0x0F;       
  70.                 if( ( Tmp >=0 ) && ( Tmp <= 9 )        )
  71.                 {
  72.                         *pDisplayChar ++ = '0' + Tmp;       
  73.                 }
  74.                 else
  75.                 {
  76.                         *pDisplayChar ++ = 'A' + Tmp - 10;
  77.                 }

  78.                 SrcBuf ++;
  79.         }
  80.         *pDisplayChar ++ = '\0';

  81.         writecom(0x80);
  82.         writestr(DisplayBuf);  
  83. }

  84. /*******************************************************************************
  85. * 函数名         :UsartInit()
  86. * 函数功能                   :设置串口
  87. *******************************************************************************/

  88. void Uart_Init()//使用定时器1作为波特率发生器
  89. {
  90.         SCON=0x50;//设置为串行口以方式1工作,8位异步通讯,允许接收中断。//一帧信息为10位,1位起始位,8位数据位(低位在先),1位停止位。
  91.         PCON=0x80;//SMOD波特率选择位为1,SMOD=1.
  92.         TMOD=0x21;//设置定时器1为波特率发生器,工作在模式2,8位自动装载
  93.         TH1=RELOAD_COUNT;//波特率9600,TH1=256-FOSC/16/12/波特率
  94.         TL1=TH1;
  95.         EA=1;//总中断打开
  96.         ES=0;//关闭串口中断
  97.         TR1=1;//启动定时器1
  98. }
  99. /********************************************************************
  100. 名称:串口发送函数
  101. 功能:MCU向其他与其连接的设备发送数据(此处是无线WIFI模块ESP8266)
  102. ********************************************************************/
  103. void Send_Uart (uchar value)
  104. {
  105.         ES=0;//关闭串口中断
  106.         TI=0;//清发送完毕中断请求标志位
  107.         SBUF=value;//发送
  108.         while(TI==0);//等待发送完毕
  109.         TI=0;//清发送完毕中断请求标志位
  110.         ES=1;//允许串口中断
  111. }
  112. /********************************************************************
  113. 名称:WIFI模块设置函数
  114. 作用:启动模块,以便可以实现无线接入和控制
  115. ********************************************************************/
  116. void ESP8266_Set(uchar *puf)//数组指针*puf指向字符串数组
  117. {
  118.         while(*puf!='\0')//遇到空格跳出循环
  119.                 {
  120.                         Send_Uart(*puf);//向WIFI模块发送控制指令
  121.                         usdelay(5);
  122.                         puf++;
  123.                 }
  124.         usdelay(5);
  125.         Send_Uart('\r');//回车
  126.         usdelay(5);
  127.         Send_Uart('\n');//换行
  128.         delayms(1000);
  129. }
  130. /****************************************************
  131. 名称:ESP8266发送数据函数
  132. 功能:用于与wifi模块相连的终端发送数据
  133. *****************************************************/
  134. void ESP8266_Sent(uchar *puf)//数组指针*puf指向字符串数组
  135. {
  136.         ESP8266_Set(FSSJ);
  137.         while(*puf!='\0')//遇到空格跳出循环
  138.         {       
  139.                 Send_Uart(*puf);//向WIFI模块发送控制指令。
  140.                 usdelay(5);
  141.                 puf++;
  142.         }
  143.         usdelay(5);
  144.         Send_Uart('\n');//换行
  145.         delayms(10);
  146. }


  147. /*蜂鸣器滴响*/
  148. void Beep(int a)         
  149. {        int i;
  150.         for(i=0;i<a;i++)                 
  151.         {
  152.                 BEEP = 0;
  153.                 delayms(100);
  154.                 BEEP = 1;
  155.         }
  156. }

  157. /*******************************************************************************
  158. * 函 数 名         : Timer0Init
  159. * 函数功能                   : 定时器0初始化
  160. *******************************************************************************/
  161. void Timer0Init()
  162. {
  163.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  164.         TH0=0XFC;        //给定时器赋初值,定时1ms
  165.         TL0=0X18;       
  166.         ET0=1;//打开定时器0中断允许
  167.         EA=1;//打开总中断
  168.         TR0=1;//打开定时器                       
  169. }
  170. void Timer0() interrupt 0
  171. {
  172.         static uint i;
  173.         TH0=0XFC;        //给定时器赋初值,定时1ms
  174.         TL0=0X18;
  175.         i++;
  176.         if(i==1000)
  177.         {
  178.                 s++;
  179.                         if(s>59)
  180.         {
  181.                 c++;
  182.         }
  183.         if(c>59)
  184.         {
  185.                 h++;
  186.         }
  187.         if(h>23)
  188.         {
  189.             h=0;
  190.         }               
  191.         }       
  192. }
  193. /*******************************************************************************
  194. * 函数名         : Usart() interrupt 4
  195. * 函数功能                  : 串口通信中断函数
  196. *******************************************************************************/
  197. void Usart() interrupt 4
  198. {
  199.         static uchar i=0;
  200.         if(RI==1)
  201.         {
  202.                 RI=0;
  203.                 Receive=SBUF;//MCU接收wifi模块反馈回来的据
  204.                 Recive_table[i]=Receive;
  205.                 i++;
  206.                 if((Recive_table[i-1]=='\n'))i=0;//遇到换行重新装值
  207.         }
  208.         else TI=0;
  209. }

  210. /*******************************************************************************
  211. * 函 数 名       : main
  212. * 函数功能                 : 主函数
  213. *******************************************************************************/
  214. void main()
  215. {
  216.         RC522_Init();//re522刷卡器初始化
  217.         Timer0Init();//定时器0中断初始化
  218.         lcdinit();
  219.         Uart_Init(); //串口初始化
  220.         ESP8266_Set(LYMS);//WiFi模块设置
  221.         ESP8266_Set(SZLY);
  222.         ESP8266_Set(RST);
  223.         ESP8266_Set(SZDLJ);
  224.         ESP8266_Set(KQFU);

  225.         while(1)
  226.         {        led=0;
  227.                  status = PcdRequest(PICC_REQALL,CT);//向卡发送请求读取的信号,并且向CT数组内写入从卡片读取的数据
  228.                 status = PcdAnticoll(SN);//防冲撞处理,防止读卡出现冲突        ,往SN写入4字节卡号
  229.                 if(TEST==0)
  230.                         {        delayms(20);
  231.                                 if(TEST==0)
  232.                                 {        Display_ID(SN);//按下按键读取卡号
  233.                                         delayms(3000);
  234.                                 }
  235.                         }
  236.                 if(status == MI_OK)       
  237.                 {
  238.                     led=1;
  239.                         Beep(5);
  240.                   if(0 == memcmp(SN,card_1,4))
  241.                           {
  242.                           ESP8266_Sent(id_1);
  243.                           Send_Uart(h);
  244.                           Send_Uart(':');
  245.                           Send_Uart(c);
  246.                           Send_Uart(':');
  247.                           Send_Uart(s);
  248.                           Send_Uart('\n');//换行
  249.                           writecom(0x80+0x42);
  250.                           writedata(h);
  251.                           writecom(0x80+0x44);
  252.                           writedata(':');
  253.                           writecom(0x80+0x45);
  254.                           writedata(c);
  255.                           writecom(0x80+0x47);
  256.                           writedata(':');
  257.                           writecom(0x80+0x48);
  258.                           writedata(s);
  259.                         }
  260.                   if(0 == memcmp(SN,card_2,4))
  261.                           {
  262.                           ESP8266_Sent(id_2);
  263.                           Send_Uart(h);
  264.                           Send_Uart(':');
  265.                           Send_Uart(c);
  266.                           Send_Uart(':');
  267.                           Send_Uart(s);
  268.                           Send_Uart('\n');//换行
  269.                            writecom(0x80+0x42);
  270.                           writedata(h);
  271.                           writecom(0x80+0x44);
  272.                           writedata(':');
  273.                           writecom(0x80+0x45);
  274.                           writedata(c);
  275.                           writecom(0x80+0x47);
  276.                           writedata(':');
  277.                           writecom(0x80+0x48);
  278.                           writedata(s);
  279.                         }
  280.                 }
  281.        
  282.         }
  283. }               
复制代码

所有资料51hei提供下载:
单片机课设程序.zip (81.01 KB, 下载次数: 18)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表