本設(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é)果顯示出來。
單片機(jī)源程序如下:
- #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時(shí)為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時(shí)為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;
- // }
- //
- //
- //}
復(fù)制代碼
全部資料51hei下載地址:
硬幣識別.zip
(3.75 MB, 下載次數(shù): 114)
2019-6-23 13:28 上傳
點(diǎn)擊文件名下載附件
文檔+電路+程序
|