找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2993|回复: 3
收起左侧

基于51单片机+RC522的闯红灯检测源码

[复制链接]
ID:201598 发表于 2018-10-22 21:04 | 显示全部楼层 |阅读模式
    系统采用51单片机为主控,rc522为检测装置,主要是模拟,红绿灯通过定时器控制,原理就是逻辑判断,在红灯时有车(卡)扫过,就会存储下车牌号,通过液晶显示车牌,以及红灯信息,有闯红灯信息。代码如下。

单片机源程序如下:
  1. #include "common.h"
  2. #include "RC522.h"
  3. #include "stdio.h"
  4. #include "12864.h"

  5. #define uchar unsigned char
  6. #define uint unsigned int


  7. char serNum[5];
  8. char Old_serNum[5]=0,Card_serNum[20][5]=0,buf[9];
  9. char str[MAX_LEN];
  10. char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  11. int num,flag,i,j,num1=0;
  12. char temp=29,flag0=0,flag1=0,flag2,flag3,aa;
  13. char temp1=1;
  14. void T1_time1(void) interrupt 1
  15. {
  16.         TH0=(65536-50000)/256;
  17.         TL0=(65536-50000)%256;
  18.         aa++;
  19.                        
  20.         if(aa==20)
  21.         {               
  22.                 aa=0;
  23.                 temp--;
  24.         }
  25.                
  26.         if(flag1==0)
  27.         {
  28.                 if((temp>0)&&(temp<30)) {RED=0;YELLOW=1;GREEN=1;flag=1;}
  29.         }
  30.         if(flag0==0)
  31.         {
  32.                 if(temp==0)
  33.                 {
  34.                         temp=29;
  35.                         flag1=1;
  36.                 }
  37.         }
  38.                
  39.         if(flag1==1)
  40.         {
  41.                 if((temp>5)&&(temp<30))  {RED=1;YELLOW=1;GREEN=0;flag=0;}
  42.                 if((temp<=5)&&(temp>=0)) {RED=1;YELLOW=0;GREEN=1;flag=0;}
  43.                 flag0=1;
  44.                 if(temp==0)
  45.                 {
  46.                         temp=29;
  47.                         flag1=0;
  48.                         flag0=0;
  49.                 }       
  50.         }
  51. }


  52. void ShowCard_Id()
  53. {
  54.         int i;
  55.   char *ptr=buf;

  56.         for(i=0; i<4; i++,ptr+=2)
  57.         {
  58.                 sprintf(ptr,"%02x",Card_serNum[num1][i]);
  59.                 buf[8]='\0';
  60.                 Lcd_Display(1,5,buf);
  61.         }       
  62. }
  63. void show_card()
  64. {
  65.         char card;
  66. card=Card_serNum[num1][0];
  67.                 switch(card)
  68. {                        case 0x25:
  69.                 Lcd_Display(3,4,"吉A 88888");
  70.                 break;
  71.                         case 0x63:
  72.                 Lcd_Display(3,4,"吉B 66J67");
  73.                         break;
  74.                         case 0x96:
  75.                 Lcd_Display(3,4,"吉C 98889");
  76.                         break;
  77.                         case 0x80:
  78.                 Lcd_Display(3,4,"吉A YIJ88");
  79.                         break;
  80.                 case 0x00:
  81.                 Lcd_Display(3,4,"00 00000  ");
  82.                 break;
  83. }
  84. }
  85. void InoutHandle()
  86. {
  87.         unsigned char state;
  88.         unsigned char readBuf[16];
  89.        
  90.                 state = PcdRequest(PICC_REQIDL, str);
  91.                 if(state != MI_OK)  return;
  92.        
  93.                 state = PcdAnticoll(serNum);
  94.                 if(state != MI_OK)  return;

  95.                 state = PcdSelect(serNum);
  96.                 if(state != MI_OK)  return;

  97.                 state = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey , serNum);
  98.                 if(state != MI_OK)  return;

  99.                 state = PcdRead(1, readBuf);
  100.                 if(state != MI_OK)  return;

  101.                 for(j=0;j<5;j++)
  102.                 {
  103.                                 if(Old_serNum[j]!=serNum[j])
  104.                                 {
  105.                                                 flag2=1;
  106.                                 }
  107.                 }
  108.                 if(flag2==1)
  109.                 {               
  110.                                 for(j=0;j<5;j++)
  111.                                 {
  112.                                         Old_serNum[j]=serNum[j];
  113.                                 }       
  114.                                 Card_serNum[temp1][0]=Old_serNum[0];
  115.                                 Card_serNum[temp1][1]=Old_serNum[1];
  116.                                 Card_serNum[temp1][2]=Old_serNum[2];
  117.                                 Card_serNum[temp1][3]=Old_serNum[3];
  118.                                 temp1++;
  119.                                 if(temp1==20)
  120.                                                 {
  121.                                                         temp1=0;
  122.                                                 }
  123.                                 flag2=0;
  124.                 }
  125.                 PcdHalt();               

  126. }
  127. void key_stck()
  128. {
  129.         key0 = 1;
  130.         key1 = 1;
  131.         key2 = 1;
  132.         key3 = 1;

  133.         if( key0 == 0 )
  134.         {
  135.                 delay_10ms(5);
  136.                     if( key0 == 0 )
  137.                         {
  138.                                 while(!key0);
  139.                                 if(num1!=0)                num1--;
  140.                                 else                                   num1=0;
  141.                         }
  142.         }
  143.         if( key1 == 0 )
  144.         {
  145.                 delay_10ms(5);
  146.                     if( key1 == 0 )
  147.                         {
  148.                                 while(!key1);
  149.                                 num1++;
  150.                                 if(num1==20)
  151.                                 {
  152.                                                 num1=0;
  153.                                 }
  154.                         }
  155.         }
  156.         if( key2 == 0 )
  157.         {
  158.                 delay_10ms(5);
  159.                     if( key2 == 0 )
  160.                         {
  161.                                 while(!key2);

  162.                
  163.                         }
  164.         }
  165.         if( key3 == 0 )
  166.         {
  167.                 delay_10ms(5);
  168.                     if( key3 == 0 )
  169.                         {
  170.                                 while(!key3);
  171.                         }
  172.         }

  173. Lcd_Num_Display(4,1,num1);
  174. Lcd_Display(3,1,"车牌:");
  175. Lcd_Display(2,1,"违章车辆:  台");
  176. Lcd_Num_Display(2,6,temp1-1);
  177.         if(Card_serNum[1][0]!=0)
  178.         {                       
  179.                 Lcd_Display(1,1,"有违章");       
  180.         }
  181.         if(Card_serNum[1][0]==0)
  182.         {                       
  183.                 Lcd_Display(1,1,"无违章");       
  184.         }
  185.         show_card();
  186. }
复制代码

0.png

所有资料51hei提供下载:
RFID闯红灯检测.zip (166.88 KB, 下载次数: 26)
回复

使用道具 举报

ID:1 发表于 2018-10-22 21:25 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:489394 发表于 2023-4-7 10:16 | 显示全部楼层
没有原理图或者仿真图吗
回复

使用道具 举报

ID:240656 发表于 2023-4-9 14:19 | 显示全部楼层
啥有用的信息都没有
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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