找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4433|回复: 6
打印 上一主题 下一主题
收起左侧

51单片机硬币识别系统设计(文档+电路+程序)

[复制链接]
跳转到指定楼层
楼主
本设计基于51内核的单片机的高识别率硬币识别装置,主要应用于各公共营业场所,如各超市,自动售货机,公共交通等。它应该能完成一角(分新版旧版),五角,一元硬币的识别,并高效率筛选假币,游戏币并将识别情况实时显示等功能,同时具有精度高、功耗低、抗干扰能力强等特点。  

本文主要从硬件和软件两部分来设计整个系统和功能的实现。硬件方面:为满足对硬币高识别率的要求,采用8位单片机、电磁传感器、激光传感器、LCD12864。系统的核心是基于51内核单片机,以模块化的设计方法将装置的硬件按功能分为几大模块进行设计,分别为:电源模块、电磁传感器模块、激光传感器模块、显示模块、滤波放大模块、A/D转换、控制模块。电源模块为系统提供电源,电磁传感器形成涡流效应,实现对真假硬币的鉴别,激光传感器检测硬币的有无和硬币大小的直径信息,利用芯片内部A/D转换电路把模拟量转换成数字量,控制模块是利用舵机来控制对硬币的筛选,显示模块是将硬币真伪和交易过程和找零结果显示出来。







单片机源程序如下:
  1. #include <stc12c5410ad.h>
  2. #define uchar unsigned        char
  3. #define uint unsigned int

  4. sbit pwm1=P3^2;
  5. sbit pwm2=P3^3;
  6. sbit pwm3=P3^4;

  7. sbit lcden=P1^3;
  8. sbit lcdrs=P1^4;
  9. sbit key2=P1^0;
  10. sbit key1=P1^2;
  11. sbit key3=P1^5;
  12. sbit key4=P1^6;
  13. sbit key5=P1^7;

  14. uint set1,set2,set3,angle1,angle2,angle3,value,
  15. time1,a,b,date,coin_count=-1,coin_error,ttff=1,
  16. coin_add,coin_set,key,temp,noww,ab,kkey1,kkey2,kkey3,kkey4,
  17. c,d,e,f,g,h,i,j,kkk;
  18. float dat;

  19. uchar code sett[]="set:";
  20. uchar code add[]="add:";
  21. uchar code y[]=".Y";
  22. uchar code now[]={"N:"};
  23. uchar code TF[]={"TF"};
  24. uchar code coin[]={"0123456789"};
  25. uchar code success[]={"success"};
  26. uchar code error[]={"+-"};
  27. uchar code pay[]={"paymentsuccess"};
  28. uchar code pladd[]={"pleaseadd"};
  29. uchar code pltake[]={"pleasetake"};
  30. uchar code welcome[]={"xinxi1138ZhengXin"};

  31. uint coins[4];

  32. void matrixkeyscan();

  33. void delay(uint i)
  34. {                                       
  35.            uint x,y;
  36.          for(x=i;x>0;x--)        
  37.                  for(y=110;y>0;y--);
  38. }

  39. void write_com(uchar com)
  40. {
  41.         lcdrs=0;
  42.          P2=com;
  43.         delay(5);
  44.         lcden=1;
  45.         delay(5);
  46.         lcden=0;
  47. }
  48. void write_data(uchar date)
  49. {
  50.         lcdrs=1;
  51.         P2=date;
  52.         delay(5);
  53.         lcden=1;
  54.         delay(5);
  55.         lcden=0;
  56. }

  57. void init_1602()
  58. {
  59.         lcden=0;
  60.         write_com(0x38);
  61.         write_com(0x0c);
  62.         write_com(0x06);
  63.         write_com(0x01);
  64. }


  65. void init_ad()
  66. {
  67.   ADC_CONTR|=0x89;
  68.   delay(5);
  69.   P1M0=0x02;
  70.   P1M1=0x02;
  71.   ADC_DATA=0;
  72.   ADC_CONTR|=0Xe1;
  73. }

  74. void qu_ad()
  75. {
  76.         ADC_CONTR|=0X08;
  77.     delay(1);
  78.     while(ADC_CONTR&0x10==0);
  79.     {
  80.         ADC_CONTR&=0Xe9;
  81.         }
  82.         dat=ADC_DATA;
  83.     dat=(5*dat)/256;        
  84.         delay(5);
  85.         dat+=0.05;
  86.         dat*=10;
  87.         date=dat;
  88.         value=date;
  89.         a=date/10;
  90.         b=date%10;         
  91. }

  92. void welcome_led()
  93. {

  94.   uchar i;

  95. write_com(0x80+2);
  96. for(i=0;i<7;i++)
  97. {
  98. write_data(welcome[i]);
  99. delay(2);
  100. }

  101. write_com(0x80+10);
  102. for(i=7;i<9;i++)
  103. {
  104. write_data(welcome[i]);
  105. delay(2);
  106. }

  107. write_com(0x80+0x40+3);
  108. for(i=9;i<14;i++)
  109. {
  110. write_data(welcome[i]);
  111. delay(2);
  112. }

  113. write_com(0x80+0x40+9);
  114. for(i=14;i<17;i++)
  115. {
  116. write_data(welcome[i]);
  117. delay(2);
  118. }

  119. delay(15000);
  120. write_com(0x01);
  121. }

  122. void lcd_1602()
  123. {
  124.         
  125.         uint k;

  126.         write_com(0x80);
  127.     for(k=0;k<=3;k++)
  128.         {
  129.         write_data(sett[k]);
  130.         delay(2);
  131.         }

  132.         write_com(0x80+0x40+0);
  133.         for(k=0;k<=3;k++)
  134.         {
  135.         write_data(add[k]);
  136.         delay(2);
  137.         }

  138.         write_com(0x80+5);
  139.         write_data(y[0]);
  140.         delay(2);
  141.         write_com(0x80+7);
  142.         write_data(y[1]);
  143.         delay(2);

  144.         write_com(0x80+0x40+5);
  145.         write_data(y[0]);
  146.         delay(2);
  147.         write_com(0x80+0x40+7);
  148.         write_data(y[1]);
  149.         delay(2);

  150.         write_com(0x80+0x40+9);
  151.         for(k=0;k<=1;k++)
  152.         {
  153.         write_data(now[k]);
  154.         delay(2);
  155.         }

  156.         write_com(0x80+0x40+12);
  157.         write_data(y[0]);
  158.         delay(2);

  159.         write_com(0x80+0x40+14);
  160.         write_data(y[1]);

  161.         write_com(0x80+4);
  162.         write_data(coin[c]);
  163.         write_com(0x80+6);
  164.         write_data(coin[d]);

  165.         c=coin_set/10;
  166.          d=coin_set%10;

  167.         write_com(0x80+0x40+4);
  168.         write_data(coin[e]);
  169.         write_com(0x80+0x40+6);
  170.         write_data(coin[f]);

  171.         e=coin_add/10;
  172.         f=coin_add%10;        

  173.         write_com(0x80+0x40+11);
  174.         write_data(coin[g]);
  175.         delay(2);
  176.         write_com(0x80+0x40+13);
  177.         write_data(coin[h]);

  178.         g=noww/10;
  179.         h=noww%10;

  180.         write_com(0x80+12);
  181.         write_data(TF[ttff]);
  182.         delay(2);


  183.         if(kkey2%2==1)
  184.         {
  185.         if((coin_set==coin_add) && (coin_set!=0))
  186.         {
  187.          write_com(0x01);
  188.          for(;;)
  189.          {
  190.           write_com(0x80+1);
  191.           for(k=0;k<=6;k++)
  192.           {
  193.           write_data(pay[k]);
  194.           delay(2);
  195.           }        
  196.          
  197.           write_com(0x80+9);
  198.           for(k=7;k<=13;k++)
  199.           {
  200.           write_data(pay[k]);
  201.           delay(2);
  202.           }        
  203.          
  204.            if(key2==0)
  205.                  {
  206.                  while(!key2);
  207.                  kkey2++;
  208.                  }

  209.           if(kkey2%2==0)
  210.           {
  211.           write_com(0x01);
  212.           delay(50);
  213.           break;
  214.          
  215.           }
  216.                               
  217.          };
  218.     }
  219.         
  220.         if((coin_set>coin_add) && (coin_set!=0))
  221.         {
  222.          write_com(0x01);
  223.          for(;;)
  224.          {
  225.           write_com(0x80+2);
  226.           for(k=0;k<=5;k++)
  227.           {
  228.           write_data(pladd[k]);
  229.           delay(2);
  230.           }        
  231.          
  232.           write_com(0x80+10);
  233.           for(k=6;k<=8;k++)
  234.           {
  235.           write_data(pladd[k]);
  236.           delay(2);
  237.           }                 
  238.         
  239.           coin_error=coin_set-coin_add;
  240.                           
  241.           i=coin_error/10;
  242.           j=coin_error%10;
  243.           write_com(0x80+0x40+6);
  244.           write_data(coin[i]);
  245.           write_com(0x80+0x40+7);
  246.           write_data(y[0]);
  247.           write_com(0x80+0x40+8);
  248.           write_data(coin[j]);
  249.           write_com(0x80+0x40+9);
  250.           write_data(y[1]);

  251.            if(key2==0)
  252.                  {
  253.                  while(!key2);
  254.                  kkey2++;
  255.                  }

  256.           if(kkey2%2==0)
  257.           {
  258.           write_com(0x01);
  259.           delay(50);
  260.           break;
  261.           }

  262.          };
  263.     }

  264.         if((coin_set<coin_add) && (coin_set!=0))
  265.         {
  266.          write_com(0x01);
  267.          for(;;)
  268.          {
  269.           write_com(0x80+2);
  270.           for(k=0;k<=5;k++)
  271.           {
  272.           write_data(pltake[k]);
  273.           delay(2);
  274.           }        
  275.          
  276.           write_com(0x80+10);
  277.           for(k=6;k<=9;k++)
  278.           {
  279.           write_data(pltake[k]);
  280.           delay(2);
  281.           }        
  282.          
  283.           coin_error=coin_add-coin_set;

  284.           i=coin_error/10;
  285.           j=coin_error%10;
  286.           write_com(0x80+0x40+6);
  287.           write_data(coin[i]);
  288.           write_com(0x80+0x40+7);
  289.           write_data(y[0]);
  290.           write_com(0x80+0x40+8);
  291.           write_data(coin[j]);
  292.           write_com(0x80+0x40+9);
  293.           write_data(y[1]);

  294.                 if(coin_error!=0)
  295.                 {
  296.                   angle3=25;
  297.                   delay(2000);
  298.               if(angle3>25)
  299.                   {
  300.                   angle3-=8;
  301.                   delay(8000);
  302. //          coin_set+=1;
  303.                   }
  304.                   if(angle3<33)
  305.                   {
  306.                   angle3+=8;
  307.           delay(8000);
  308.           coin_set+=1;
  309.                   }         
  310.                 }

  311.                 if(coin_error==0)
  312.                 {
  313.                 angle3=0;
  314.                 write_com(0x01);
  315.                 delay(50);
  316.                 for(;;)
  317.                 {
  318.                  write_com(0x80+1);
  319.              for(k=0;k<=6;k++)
  320.              {
  321.                    write_data(pay[k]);
  322.                    delay(2);
  323.                    }        
  324.          
  325.                    write_com(0x80+9);
  326.                    for(k=7;k<=13;k++)
  327.                  {
  328.                   write_data(pay[k]);
  329.                  delay(2);
  330.              }        

  331.                  if(key2==0)
  332.                   {
  333.                   while(!key2);
  334.                   kkey2++;
  335.                   }
  336.                
  337.                 if(kkey2%2==0)
  338.             {
  339.             write_com(0x01);
  340.             kkk=1;
  341.             delay(50);
  342.             break;
  343.             }


  344.                 };



  345.          
  346.                 }

  347.             if(key2==0)
  348.                  {
  349.                  while(!key2);
  350.                  kkey2++;
  351.                  }

  352.           if(kkey2%2==0)
  353.           {
  354.           coin_add=0;
  355.           coin_set=0;
  356.           kkey1=0;
  357.           delay(50);
  358.           break;  
  359.           }
  360.                      

  361.          };
  362.     }



  363.         }


  364.         
  365.         if((value==45|| value==44|| value==43)&& (ab==1|| ab==5|| ab==10) )
  366.         {
  367.          delay(2000);
  368.          if((value==45|| value==44|| value==43)&& (ab==1|| ab==5|| ab==10) )
  369.          {
  370.          ttff=1;
  371.          coin_add+=noww;        
  372.          noww=0;
  373.          ab=20;
  374.         }
  375.         }


  376.         if(value==34||value==33||value==32||value==41||value==40
  377.         ||value==39|| value==38|| value==37||value==28 ||
  378.          value==27|| value==26)

  379.         {
  380.         delay(3000);


  381.         if(value==34||value==33||value==32&&(ab==20))
  382.         {
  383.            delay(1000);
  384.          if(value==34||value==33||value==32&&(ab==20))
  385.          {
  386.          noww=5;
  387.          ab=5;

  388.          ttff=0;
  389.          write_com(0x80+12);
  390.          write_data(TF[ttff]);
  391.          delay(2);

  392.          g=noww/10;
  393.          h=noww%10;

  394.          write_com(0x80+0x40+11);
  395.          write_data(coin[g]);
  396.          delay(2);
  397.          write_com(0x80+0x40+13);
  398.          write_data(coin[h]);

  399.          angle2=50;
  400.          delay(3000);
  401.          angle2=0;
  402.          angle1=34;
  403.          delay(3000);
  404.          angle1=27;
  405.          delay(2000);
  406.          angle1=0;
  407.          
  408.          
  409.          
  410.          }
  411.         }

  412.         if(value==41||value==40&&(ab==20))
  413.         {
  414.          delay(1000);
  415.          if(value==41||value==40&&(ab==20))
  416.          {
  417.          noww=1;
  418.          ab=1;

  419.          ttff=0;
  420.          write_com(0x80+12);
  421.          write_data(TF[ttff]);
  422.          delay(2);

  423.          g=noww/10;
  424.          h=noww%10;

  425.          write_com(0x80+0x40+11);
  426.          write_data(coin[g]);
  427.          delay(2);
  428.          write_com(0x80+0x40+13);
  429.          write_data(coin[h]);

  430.          angle2=45;
  431.          delay(3000);
  432.          angle2=0;
  433.          angle1=34;
  434.          delay(3000);
  435.          angle1=27;
  436.          delay(2000);
  437.          angle1=0;
  438.         
  439.          
  440.          }
  441.         }

  442.         if(value==39|| value==38|| value==37&&(ab==20))
  443.         {
  444.          delay(1000);
  445.          if(value==39|| value==38|| value==37&&(ab==20))
  446.          {
  447.          noww=1;
  448.          ab=1;

  449.          ttff=0;
  450.          write_com(0x80+12);
  451.          write_data(TF[ttff]);
  452.          delay(2);

  453.          g=noww/10;
  454.          h=noww%10;

  455.          write_com(0x80+0x40+11);
  456.          write_data(coin[g]);
  457.          delay(2);
  458.          write_com(0x80+0x40+13);
  459.          write_data(coin[h]);

  460.          angle2=45;
  461.          delay(3000);
  462.          angle2=0;
  463.          angle1=34;
  464.          delay(3000);
  465.          angle1=27;
  466.          delay(2000);
  467.          angle1=0;
  468.         
  469.          }
  470.         }

  471.         if(value==28 || value==27 || value==26 &&(ab==20))
  472.         {
  473.         delay(1000);
  474.          if(value==28 || value==27 || value==26 &&(ab==20))
  475.          {
  476.          noww=10;
  477.          ab=10;

  478.          ttff=0;
  479.          write_com(0x80+12);
  480.          write_data(TF[ttff]);
  481.          delay(2);

  482.          g=noww/10;
  483.          h=noww%10;

  484.          write_com(0x80+0x40+11);
  485.          write_data(coin[g]);
  486.          delay(2);
  487.          write_com(0x80+0x40+13);
  488.          write_data(coin[h]);

  489.          angle2=55;
  490.          delay(3000);
  491.          angle2=0;
  492.          angle1=34;
  493.          delay(3000);
  494.          angle1=27;
  495.          delay(2000);
  496.          angle1=0;
  497.         
  498.          }
  499.         }
  500.   }
  501. //write_com(0x80+14);
  502. //write_data(coin[a]);
  503. //delay(2);                                         // 测试
  504. //write_com(0x80+15);
  505. //write_data(coin[b]);
  506. //delay(2);
  507. }

  508. void matrixkeyscan() {

  509. if(key1==0)
  510. {
  511. while(!key1);
  512. coin_set+=1;

  513. if(kkey1==100)
  514. {
  515. kkey1=0;
  516. }
  517. }

  518. if(key2==0 && coin_set!=0)
  519. {
  520. while(!key2);
  521. kkey2++;
  522. if(kkey2==100)
  523. {
  524. kkey2=0;
  525. }
  526. }

  527. if(key3==0)
  528. {
  529. while(!key3);
  530. coin_set+=5;
  531. }

  532. if(key4==0)
  533. {
  534. while(!key4);
  535. coin_set+=10;
  536. }

  537. if(key5==0)
  538. {
  539. while(!key5);
  540. coin_set=0;
  541. }


  542. }


  543. void init_timer()
  544. {
  545. TMOD=0X02;
  546. TH0=(65536-58)/256;                 //15时为20KHZ,50%占空比的方波
  547. TL0=(65536-58)%256;
  548. //TH1=(65536-50000)/256;
  549. //TL1=(65536-50000)%256;
  550. EA=1;
  551. ET0=1;
  552. TR0=1;
  553. //ET1=1;
  554. //TR1=1;
  555. }

  556. void main()
  557. {
  558. init_timer();
  559. init_ad();
  560. init_1602();
  561. pwm1=0;
  562. pwm2=0;
  563. pwm3=0;
  564. angle1=0;   //27-zhong         34-you
  565. angle2=0;                //60-you1        55-you2         50-you3   45-you4
  566. angle3=0;         //25-zuo         33-you

  567. welcome_led();

  568. while(1)
  569. {
  570. qu_ad();
  571. lcd_1602();
  572. matrixkeyscan();
  573. }

  574. }

  575. void  timer_0 () interrupt 1
  576. {

  577. TH0=(65536-58)/256;                 //15时为20KHZ,50%占空比的方波
  578. TL0=(65536-58)%256;

  579. if(set1<angle1)
  580. pwm1=1;
  581. else
  582. pwm1=0;
  583. set1++;

  584. if(set2<angle2)
  585. pwm2=1;
  586. else
  587. pwm2=0;
  588. set2++;

  589. if(set3<angle3)
  590. pwm3=1;
  591. else
  592. pwm3=0;
  593. set3++;

  594. if(set1>546) set1=0;    //145
  595. if(set2>546) set2=0;    //145
  596. if(set3>546) set3=0;    //145
  597. }

  598. //void  timer_1 () interrupt 3
  599. //{
  600. //
  601. // TH0=(65536-50000)/256;                 
  602. // TL0=(65536-50000)%256;
  603. // time1++;
  604. //
  605. // if(time1==20)
  606. // {
  607. //
  608. // time1=0;
  609. // }
  610. //
  611. //  
  612. //}
复制代码

全部资料51hei下载地址:
硬币识别.zip (3.75 MB, 下载次数: 112)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:398752 发表于 2019-7-28 21:03 | 只看该作者
楼主,你的电磁传感器是什么型号
回复

使用道具 举报

板凳
ID:414556 发表于 2019-11-10 14:02 | 只看该作者
楼主威武啊,是以电压的高低判断币的类型吗
回复

使用道具 举报

地板
ID:553945 发表于 2020-6-28 23:29 来自手机 | 只看该作者
同问,传感器用的什么型号
回复

使用道具 举报

5#
ID:416239 发表于 2020-6-29 07:17 | 只看该作者
是以什么方法去判断钱呢?
回复

使用道具 举报

6#
ID:1082059 发表于 2023-6-11 17:55 来自手机 | 只看该作者
要是有人能根据楼主的程序做个仿真图就好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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