找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5540|回復(fù): 6
收起左側(cè)

51單片機(jī)硬幣識別系統(tǒng)設(shè)計(jì)(文檔+電路+程序)

[復(fù)制鏈接]
ID:568925 發(fā)表于 2019-6-23 13:28 | 顯示全部樓層 |閱讀模式
本設(shè)計(jì)基于51內(nèi)核的單片機(jī)的高識別率硬幣識別裝置,主要應(yīng)用于各公共營業(yè)場所,如各超市,自動售貨機(jī),公共交通等。它應(yīng)該能完成一角(分新版舊版),五角,一元硬幣的識別,并高效率篩選假幣,游戲幣并將識別情況實(shí)時(shí)顯示等功能,同時(shí)具有精度高、功耗低、抗干擾能力強(qiáng)等特點(diǎn)。  

本文主要從硬件和軟件兩部分來設(shè)計(jì)整個(gè)系統(tǒng)和功能的實(shí)現(xiàn)。硬件方面:為滿足對硬幣高識別率的要求,采用8位單片機(jī)、電磁傳感器、激光傳感器、LCD12864。系統(tǒng)的核心是基于51內(nèi)核單片機(jī),以模塊化的設(shè)計(jì)方法將裝置的硬件按功能分為幾大模塊進(jìn)行設(shè)計(jì),分別為:電源模塊、電磁傳感器模塊、激光傳感器模塊、顯示模塊、濾波放大模塊、A/D轉(zhuǎn)換、控制模塊。電源模塊為系統(tǒng)提供電源,電磁傳感器形成渦流效應(yīng),實(shí)現(xiàn)對真假硬幣的鑒別,激光傳感器檢測硬幣的有無和硬幣大小的直徑信息,利用芯片內(nèi)部A/D轉(zhuǎn)換電路把模擬量轉(zhuǎn)換成數(shù)字量,控制模塊是利用舵機(jī)來控制對硬幣的篩選,顯示模塊是將硬幣真?zhèn)魏徒灰走^程和找零結(jié)果顯示出來。

捕獲.PNG

1.PNG
2.PNG
3.PNG

單片機(jī)源程序如下:
  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時(shí)為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時(shí)為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. //}
復(fù)制代碼

全部資料51hei下載地址:
硬幣識別.zip (3.75 MB, 下載次數(shù): 114)

回復(fù)

使用道具 舉報(bào)

ID:398752 發(fā)表于 2019-7-28 21:03 | 顯示全部樓層
樓主,你的電磁傳感器是什么型號
回復(fù)

使用道具 舉報(bào)

ID:414556 發(fā)表于 2019-11-10 14:02 | 顯示全部樓層
樓主威武啊,是以電壓的高低判斷幣的類型嗎
回復(fù)

使用道具 舉報(bào)

ID:553945 發(fā)表于 2020-6-28 23:29 來自手機(jī) | 顯示全部樓層
同問,傳感器用的什么型號
回復(fù)

使用道具 舉報(bào)

ID:416239 發(fā)表于 2020-6-29 07:17 | 顯示全部樓層
是以什么方法去判斷錢呢?
回復(fù)

使用道具 舉報(bào)

ID:1082059 發(fā)表于 2023-6-11 17:55 來自手機(jī) | 顯示全部樓層
要是有人能根據(jù)樓主的程序做個(gè)仿真圖就好了
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表