本设计基于51内核的单片机的高识别率硬币识别装置,主要应用于各公共营业场所,如各超市,自动售货机,公共交通等。它应该能完成一角(分新版旧版),五角,一元硬币的识别,并高效率筛选假币,游戏币并将识别情况实时显示等功能,同时具有精度高、功耗低、抗干扰能力强等特点。
本文主要从硬件和软件两部分来设计整个系统和功能的实现。硬件方面:为满足对硬币高识别率的要求,采用8位单片机、电磁传感器、激光传感器、LCD12864。系统的核心是基于51内核单片机,以模块化的设计方法将装置的硬件按功能分为几大模块进行设计,分别为:电源模块、电磁传感器模块、激光传感器模块、显示模块、滤波放大模块、A/D转换、控制模块。电源模块为系统提供电源,电磁传感器形成涡流效应,实现对真假硬币的鉴别,激光传感器检测硬币的有无和硬币大小的直径信息,利用芯片内部A/D转换电路把模拟量转换成数字量,控制模块是利用舵机来控制对硬币的筛选,显示模块是将硬币真伪和交易过程和找零结果显示出来。
单片机源程序如下:
- #include <stc12c5410ad.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit pwm1=P3^2;
- sbit pwm2=P3^3;
- sbit pwm3=P3^4;
- sbit lcden=P1^3;
- sbit lcdrs=P1^4;
- sbit key2=P1^0;
- sbit key1=P1^2;
- sbit key3=P1^5;
- sbit key4=P1^6;
- sbit key5=P1^7;
- uint set1,set2,set3,angle1,angle2,angle3,value,
- time1,a,b,date,coin_count=-1,coin_error,ttff=1,
- coin_add,coin_set,key,temp,noww,ab,kkey1,kkey2,kkey3,kkey4,
- c,d,e,f,g,h,i,j,kkk;
- float dat;
- uchar code sett[]="set:";
- uchar code add[]="add:";
- uchar code y[]=".Y";
- uchar code now[]={"N:"};
- uchar code TF[]={"TF"};
- uchar code coin[]={"0123456789"};
- uchar code success[]={"success"};
- uchar code error[]={"+-"};
- uchar code pay[]={"paymentsuccess"};
- uchar code pladd[]={"pleaseadd"};
- uchar code pltake[]={"pleasetake"};
- uchar code welcome[]={"xinxi1138ZhengXin"};
- uint coins[4];
- void matrixkeyscan();
- void delay(uint i)
- {
- uint x,y;
- for(x=i;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)
- {
- lcdrs=0;
- P2=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(uchar date)
- {
- lcdrs=1;
- P2=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init_1602()
- {
- lcden=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- }
-
- void init_ad()
- {
- ADC_CONTR|=0x89;
- delay(5);
- P1M0=0x02;
- P1M1=0x02;
- ADC_DATA=0;
- ADC_CONTR|=0Xe1;
- }
- void qu_ad()
- {
- ADC_CONTR|=0X08;
- delay(1);
- while(ADC_CONTR&0x10==0);
- {
- ADC_CONTR&=0Xe9;
- }
- dat=ADC_DATA;
- dat=(5*dat)/256;
- delay(5);
- dat+=0.05;
- dat*=10;
- date=dat;
- value=date;
- a=date/10;
- b=date%10;
- }
- void welcome_led()
- {
- uchar i;
- write_com(0x80+2);
- for(i=0;i<7;i++)
- {
- write_data(welcome[i]);
- delay(2);
- }
- write_com(0x80+10);
- for(i=7;i<9;i++)
- {
- write_data(welcome[i]);
- delay(2);
- }
- write_com(0x80+0x40+3);
- for(i=9;i<14;i++)
- {
- write_data(welcome[i]);
- delay(2);
- }
- write_com(0x80+0x40+9);
- for(i=14;i<17;i++)
- {
- write_data(welcome[i]);
- delay(2);
- }
- delay(15000);
- write_com(0x01);
- }
- void lcd_1602()
- {
-
- uint k;
- write_com(0x80);
- for(k=0;k<=3;k++)
- {
- write_data(sett[k]);
- delay(2);
- }
- write_com(0x80+0x40+0);
- for(k=0;k<=3;k++)
- {
- write_data(add[k]);
- delay(2);
- }
- write_com(0x80+5);
- write_data(y[0]);
- delay(2);
- write_com(0x80+7);
- write_data(y[1]);
- delay(2);
- write_com(0x80+0x40+5);
- write_data(y[0]);
- delay(2);
- write_com(0x80+0x40+7);
- write_data(y[1]);
- delay(2);
- write_com(0x80+0x40+9);
- for(k=0;k<=1;k++)
- {
- write_data(now[k]);
- delay(2);
- }
- write_com(0x80+0x40+12);
- write_data(y[0]);
- delay(2);
- write_com(0x80+0x40+14);
- write_data(y[1]);
- write_com(0x80+4);
- write_data(coin[c]);
- write_com(0x80+6);
- write_data(coin[d]);
- c=coin_set/10;
- d=coin_set%10;
- write_com(0x80+0x40+4);
- write_data(coin[e]);
- write_com(0x80+0x40+6);
- write_data(coin[f]);
- e=coin_add/10;
- f=coin_add%10;
- write_com(0x80+0x40+11);
- write_data(coin[g]);
- delay(2);
- write_com(0x80+0x40+13);
- write_data(coin[h]);
- g=noww/10;
- h=noww%10;
- write_com(0x80+12);
- write_data(TF[ttff]);
- delay(2);
- if(kkey2%2==1)
- {
- if((coin_set==coin_add) && (coin_set!=0))
- {
- write_com(0x01);
- for(;;)
- {
- write_com(0x80+1);
- for(k=0;k<=6;k++)
- {
- write_data(pay[k]);
- delay(2);
- }
-
- write_com(0x80+9);
- for(k=7;k<=13;k++)
- {
- write_data(pay[k]);
- delay(2);
- }
-
- if(key2==0)
- {
- while(!key2);
- kkey2++;
- }
- if(kkey2%2==0)
- {
- write_com(0x01);
- delay(50);
- break;
-
- }
-
- };
- }
-
- if((coin_set>coin_add) && (coin_set!=0))
- {
- write_com(0x01);
- for(;;)
- {
- write_com(0x80+2);
- for(k=0;k<=5;k++)
- {
- write_data(pladd[k]);
- delay(2);
- }
-
- write_com(0x80+10);
- for(k=6;k<=8;k++)
- {
- write_data(pladd[k]);
- delay(2);
- }
-
- coin_error=coin_set-coin_add;
-
- i=coin_error/10;
- j=coin_error%10;
- write_com(0x80+0x40+6);
- write_data(coin[i]);
- write_com(0x80+0x40+7);
- write_data(y[0]);
- write_com(0x80+0x40+8);
- write_data(coin[j]);
- write_com(0x80+0x40+9);
- write_data(y[1]);
- if(key2==0)
- {
- while(!key2);
- kkey2++;
- }
- if(kkey2%2==0)
- {
- write_com(0x01);
- delay(50);
- break;
- }
- };
- }
- if((coin_set<coin_add) && (coin_set!=0))
- {
- write_com(0x01);
- for(;;)
- {
- write_com(0x80+2);
- for(k=0;k<=5;k++)
- {
- write_data(pltake[k]);
- delay(2);
- }
-
- write_com(0x80+10);
- for(k=6;k<=9;k++)
- {
- write_data(pltake[k]);
- delay(2);
- }
-
- coin_error=coin_add-coin_set;
- i=coin_error/10;
- j=coin_error%10;
- write_com(0x80+0x40+6);
- write_data(coin[i]);
- write_com(0x80+0x40+7);
- write_data(y[0]);
- write_com(0x80+0x40+8);
- write_data(coin[j]);
- write_com(0x80+0x40+9);
- write_data(y[1]);
- if(coin_error!=0)
- {
- angle3=25;
- delay(2000);
- if(angle3>25)
- {
- angle3-=8;
- delay(8000);
- // coin_set+=1;
- }
- if(angle3<33)
- {
- angle3+=8;
- delay(8000);
- coin_set+=1;
- }
- }
- if(coin_error==0)
- {
- angle3=0;
- write_com(0x01);
- delay(50);
- for(;;)
- {
- write_com(0x80+1);
- for(k=0;k<=6;k++)
- {
- write_data(pay[k]);
- delay(2);
- }
-
- write_com(0x80+9);
- for(k=7;k<=13;k++)
- {
- write_data(pay[k]);
- delay(2);
- }
- if(key2==0)
- {
- while(!key2);
- kkey2++;
- }
-
- if(kkey2%2==0)
- {
- write_com(0x01);
- kkk=1;
- delay(50);
- break;
- }
- };
-
- }
- if(key2==0)
- {
- while(!key2);
- kkey2++;
- }
- if(kkey2%2==0)
- {
- coin_add=0;
- coin_set=0;
- kkey1=0;
- delay(50);
- break;
- }
-
- };
- }
- }
-
- if((value==45|| value==44|| value==43)&& (ab==1|| ab==5|| ab==10) )
- {
- delay(2000);
- if((value==45|| value==44|| value==43)&& (ab==1|| ab==5|| ab==10) )
- {
- ttff=1;
- coin_add+=noww;
- noww=0;
- ab=20;
- }
- }
- if(value==34||value==33||value==32||value==41||value==40
- ||value==39|| value==38|| value==37||value==28 ||
- value==27|| value==26)
- {
- delay(3000);
- if(value==34||value==33||value==32&&(ab==20))
- {
- delay(1000);
- if(value==34||value==33||value==32&&(ab==20))
- {
- noww=5;
- ab=5;
- ttff=0;
- write_com(0x80+12);
- write_data(TF[ttff]);
- delay(2);
- g=noww/10;
- h=noww%10;
- write_com(0x80+0x40+11);
- write_data(coin[g]);
- delay(2);
- write_com(0x80+0x40+13);
- write_data(coin[h]);
-
- angle2=50;
- delay(3000);
- angle2=0;
- angle1=34;
- delay(3000);
- angle1=27;
- delay(2000);
- angle1=0;
-
-
-
- }
- }
- if(value==41||value==40&&(ab==20))
- {
- delay(1000);
- if(value==41||value==40&&(ab==20))
- {
- noww=1;
- ab=1;
- ttff=0;
- write_com(0x80+12);
- write_data(TF[ttff]);
- delay(2);
- g=noww/10;
- h=noww%10;
- write_com(0x80+0x40+11);
- write_data(coin[g]);
- delay(2);
- write_com(0x80+0x40+13);
- write_data(coin[h]);
- angle2=45;
- delay(3000);
- angle2=0;
- angle1=34;
- delay(3000);
- angle1=27;
- delay(2000);
- angle1=0;
-
-
- }
- }
- if(value==39|| value==38|| value==37&&(ab==20))
- {
- delay(1000);
- if(value==39|| value==38|| value==37&&(ab==20))
- {
- noww=1;
- ab=1;
- ttff=0;
- write_com(0x80+12);
- write_data(TF[ttff]);
- delay(2);
- g=noww/10;
- h=noww%10;
- write_com(0x80+0x40+11);
- write_data(coin[g]);
- delay(2);
- write_com(0x80+0x40+13);
- write_data(coin[h]);
- angle2=45;
- delay(3000);
- angle2=0;
- angle1=34;
- delay(3000);
- angle1=27;
- delay(2000);
- angle1=0;
-
- }
- }
- if(value==28 || value==27 || value==26 &&(ab==20))
- {
- delay(1000);
- if(value==28 || value==27 || value==26 &&(ab==20))
- {
- noww=10;
- ab=10;
- ttff=0;
- write_com(0x80+12);
- write_data(TF[ttff]);
- delay(2);
- g=noww/10;
- h=noww%10;
- write_com(0x80+0x40+11);
- write_data(coin[g]);
- delay(2);
- write_com(0x80+0x40+13);
- write_data(coin[h]);
- angle2=55;
- delay(3000);
- angle2=0;
- angle1=34;
- delay(3000);
- angle1=27;
- delay(2000);
- angle1=0;
-
- }
- }
- }
- //write_com(0x80+14);
- //write_data(coin[a]);
- //delay(2); // 测试
- //write_com(0x80+15);
- //write_data(coin[b]);
- //delay(2);
- }
- void matrixkeyscan() {
-
- if(key1==0)
- {
- while(!key1);
- coin_set+=1;
- if(kkey1==100)
- {
- kkey1=0;
- }
- }
- if(key2==0 && coin_set!=0)
- {
- while(!key2);
- kkey2++;
- if(kkey2==100)
- {
- kkey2=0;
- }
- }
- if(key3==0)
- {
- while(!key3);
- coin_set+=5;
- }
- if(key4==0)
- {
- while(!key4);
- coin_set+=10;
- }
- if(key5==0)
- {
- while(!key5);
- coin_set=0;
- }
- }
- void init_timer()
- {
- TMOD=0X02;
- TH0=(65536-58)/256; //15时为20KHZ,50%占空比的方波
- TL0=(65536-58)%256;
- //TH1=(65536-50000)/256;
- //TL1=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- //ET1=1;
- //TR1=1;
- }
- void main()
- {
- init_timer();
- init_ad();
- init_1602();
- pwm1=0;
- pwm2=0;
- pwm3=0;
- angle1=0; //27-zhong 34-you
- angle2=0; //60-you1 55-you2 50-you3 45-you4
- angle3=0; //25-zuo 33-you
- welcome_led();
- while(1)
- {
- qu_ad();
- lcd_1602();
- matrixkeyscan();
- }
- }
- void timer_0 () interrupt 1
- {
- TH0=(65536-58)/256; //15时为20KHZ,50%占空比的方波
- TL0=(65536-58)%256;
- if(set1<angle1)
- pwm1=1;
- else
- pwm1=0;
- set1++;
- if(set2<angle2)
- pwm2=1;
- else
- pwm2=0;
- set2++;
- if(set3<angle3)
- pwm3=1;
- else
- pwm3=0;
- set3++;
- if(set1>546) set1=0; //145
- if(set2>546) set2=0; //145
- if(set3>546) set3=0; //145
- }
- //void timer_1 () interrupt 3
- //{
- //
- // TH0=(65536-50000)/256;
- // TL0=(65536-50000)%256;
- // time1++;
- //
- // if(time1==20)
- // {
- //
- // time1=0;
- // }
- //
- //
- //}
复制代码
全部资料51hei下载地址:
硬币识别.zip
(3.75 MB, 下载次数: 114)
|