⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ycj_ls.c

📁 一款新型能识别钞票面值的验钞机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************该程序仅适用于电机电压9V,其检测时间为0.875s*****************/
        /*******(如果是5V则检测时间1.55s,如果是12V则检测时间0.665s)******/
#include<C:\WAVE6000\COMP51V6\REG51.h>
#define GW 0
#define SW 1
#define BW 2
unsigned int TIME=0;                             /*各全局变量置初值*/
unsigned int DFICLD_TIMER=0;
unsigned int RMB=0;
unsigned int XS_TIME=0;
unsigned int XS_TYPE=1;
unsigned int PULSE_NUMBER=0;
unsigned int PULSE_NUMBER1=0;
unsigned int DFICLD_NUMBER=0;
unsigned int MOTOL_DELAY_TIME;
bit DFICLD_BZ=0;


void delay(long int s)                            /*延时函数*/
          {
           long int j;
           for(j=0;j<s;j++);
          }

void xs(unsigned int data1,unsigned char adr)     /*在相应位显示相应的数字*/
     {
        switch(data1)                             /*数据(编码)*/
              {case 0:data1=0x02;break;
               case 1:data1=0x9e;break;
               case 2:data1=0x24;break;
               case 3:data1=0x0c;break;
               case 4:data1=0x98;break;
               case 5:data1=0x48;break;
               case 6:data1=0x40;break;
               case 7:data1=0x1e;break;
               case 8:data1=0x00;break;
               case 9:data1=0x08;break;
               default :break;
              }
        switch(adr)                               /*地址*/
              {case 0:P2_4=0;P2_5=1;P2_6=1;break;
               case 1:P2_4=1;P2_5=0;P2_6=1;break;
               case 2:P2_4=1;P2_5=1;P2_6=0;break;
               default :break;
              }
        P1_6=0;
        SBUF=data1;
        while(!TI){}                               /*当八位数字全都移进去后就锁存*/
        P1_6=1;
        TI=0;
       }
void xscx(void) interrupt 1                        /*定时器中断服务程序每5mS中断一次*/
        {unsigned int RMB1;
         unsigned int RMB2;
         unsigned int RMB3;
         TIME++;
         XS_TIME++;
         DFICLD_TIMER++;
         MOTOL_DELAY_TIME++;
         RMB1=(RMB%10)%10;
         RMB2=(RMB/10)%10;
         RMB3=RMB/100;
         if(XS_TYPE==1)
           {P0_3=0;P0_4=1;
            xs(RMB1,GW);                            /*在个位上显示数字*/
            delay(10);xs(0xff,GW);                  /*延时期间始终显示该数字,之后消隐数字*/
            xs(RMB2,SW);                            /*在十位上显示数字*/
            delay(10);xs(0xff,SW);                  /*延时期间始终显示该数字,之后消隐数字*/
            xs(RMB3,BW);                            /*在百位上显示数字*/
            delay(10);xs(0xff,BW);                  /*延时期间始终显示该数字,之后消隐数字*/
            TH0=0xec;TL0=0x78;TR0=1;                /*重装初值并启动定时器0*/
           }
         else if(XS_TYPE==2)
                {if(XS_TIME>60)
                    XS_TIME=0;
                 if((XS_TIME>0)&&(XS_TIME<=59))
                   {P0_3=1;P0_4=0;
                    xs(RMB1,GW);
                    delay(10);xs(0xff,GW);
                    xs(RMB2,SW);
                    delay(10);xs(0xff,SW);
                    xs(RMB3,BW);
                    delay(10);xs(0xff,BW);
                    TH0=0xec;TL0=0x78;TR0=1;
                   }
                 else if((XS_TIME>59)&&(XS_TIME<=60))
                        P0_3=1;P0_4=1;
                }
         else if(XS_TYPE==3)
                {if(XS_TIME>60)
                    XS_TIME=0;
                 if((XS_TIME>0)&&(XS_TIME<=59))
                   {P0_3=0;P0_4=0;
                    xs(RMB1,GW);
                    delay(10);xs(0xff,GW);
                    xs(RMB2,SW);
                    delay(10);xs(0xff,SW);
                    xs(RMB3,BW);
                    delay(10);xs(0xff,BW);
                    TH0=0xec;TL0=0x78;TR0=1;
                   }
                 else if((XS_TIME>59)&&(XS_TIME<=60))
                        {P0_3=1;P0_4=1;}
                }
        }

void PULSE(void) interrupt 0                          /*脉冲数测量*/
          {PULSE_NUMBER1++;}

void DFICLD(void) interrupt 2                         /*磁信号脉冲数测量*/
           {DFICLD_BZ=1;
            //DFICLD_NUMBER++;
           }

void initial(void)
            {TIME=0;P1_6=0;
             P2_0=1;P2_1=1;P2_2=1;P2_3=1;             /*电机停转*/
             TH0=0xec;                                //使溢出时间为5ms,实验出来的数字,
             TL0=0x78;                                //这样才没有闪烁感,同时速度也合适
             TMOD=0x01;                               /*定时/计数器0工作方式为16位定时器*/
             SCON=0x00;                               /*设置串行口中断为工作方式0(八位同步移位寄存器)*/
             IT0=1;                                   /*设置外部中断0为脉冲触发方式1,(电平触发方式为0)*/
             IT1=1;                                   /*设置外部中断1为脉冲触发方式1,(电平触发方式为0)*/
             IP=0x05;                                 /*设置外部中断0为高优先级别(01)*/
             IE=0x82;                                 /*开总中断允许位,定时计数器0中断允许位*/
             TR0=1;                                   /*使定时器0启动*/
            }

void main(void)
         {int j,i=0;           
          int rmb_type;
          char ZB,WJ;                                 /*定义真币标志位,钱未进标志位*/
          char esw=0;
          initial();                                  /*程序初始化*/

          RMB=0;                                      /*人民币数清零*/
/***********************************开机测试程序***************************************/
          XS_TYPE=3;                                  /*使显示变为第三种显示方式*/
          P2_0=1;P2_1=1;P2_2=0;P2_3=0;                /*电机反转*/
          TIME=0;
          while(1)
               {if(TIME>=100)
                  break;
               }
          P2_0=0;P2_1=0;P2_2=1;P2_3=1;                /*电机正转*/
          TIME=0;
          while(1)
               {if(TIME>=150)
                  break;
               }
          XS_TYPE=1;                                  /*使显示变为第一种显示方式*/
          P0_3=1;
          P0_4=1;
/**************************************************************************************/
          initial();                                  /*程序初始化*/
          while(1){
               while(1)
                    {ZB=1;WJ=0;                       /*真币标志位置位,钱未进标志位复位*/
	             if(P1_1==0)
                       {TIME=0;
                        delay(100);
                        while(1)
                             {if(P1_1==1)
                                {RMB=0;
                                 XS_TYPE=1;
                                 break;
                                }
                              if(TIME>=300)
                                {RMB=0;
                                 esw=1;
                                 break;
                                }
                             }
                       }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -