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

📄 ycj_jcfs2.c

📁 一款新型能识别钞票面值的验钞机程序
💻 C
字号:
/***************************************预处理程序***************************************/
#include<C:\WAVE6000\COMP51V6\REG51.h>
#define GW 0
#define SW 1
#define BW 2
#define uint unsigned int
#define uchar unsigned char
uint TIME,DFICLD_TIMER,XS_TIME,DFICLD_NUMBER,MOTOL_DELAY_TIME;
uchar RMB,PULSE_NUMBER;
uchar XS_TYPE=1;
bit DFICLD_BZ;
/****************************************************************************************/

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

/*************************************显示程序*******************************************/
void xs(uint data1,uchar 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中断一次*****/
        {uint RMB1;
         uint RMB2;
         uint RMB3;
         TIME++;
         XS_TIME++;
         DFICLD_TIMER++;
         MOTOL_DELAY_TIME++;
         RMB1=(RMB%10)%10;
         RMB2=(RMB/10)%10;
         RMB3=RMB/100;
         if(XS_TYPE==1)                             /*显示类型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)                        //显示类型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)                        //显示类型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_NUMBER++;}
/****************************************************************************************/

/*********************************外部中断1,用于磁信号脉冲测量***************************/
void DFICLD(void) interrupt 2
           {DFICLD_BZ=1;}
/****************************************************************************************/

/************************************初使化程序******************************************/
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*****/
             IT1=1;                                   /*设置外部中断1为脉冲触发方式1*****/
             IP=0x05;                                 /*设置外部中断0为高优先级别(01)****/
             IE=0x82;                                 /*开总中断允许位,定时计数器0中断**/
             TR0=1;                                   /*使定时器0启动********************/
            }
/****************************************************************************************/

/**************************************主程序********************************************/
void main(void)
         {uint j,i=0;
          uchar rmb_type;
          uchar ZB,WJ;                                /*定义真币标志位,钱未进标志位*****/
          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)                      /*如果按下清零按钮则币值清0********/
                       {TIME=0;
                        delay(100);
                        if(P1_1==1)
                          {RMB=0;
                           XS_TYPE=1;
                           break;
                          }
                       }
                     if(P1_4==0)                      /*当有钱进入时就可以检测了*********/
                       {
                        TIME=0;                       /*时间数清零***********************/
                        DFICLD_NUMBER=0;              /*磁信号脉冲数清零*****************/
                        P2_0=0;P2_1=0;P2_2=1;P2_3=1;  /*电机正转*************************/
                        DFICLD_TIMER=0;
                        while(1)
                             {if(DFICLD_TIMER>=20)    /*可以检测磁信号了*****************/
                                 IE=0x86;

                              if(DFICLD_BZ==1)        /*磁信号检测处理电路***************/
                                {
                                 IE=0x82;             /*关外部中断1**********************/
                                 for(j=0;j<200;j++)
                                    {if(P0_0==0||P0_1==0)
                                       i++;
                                    }
                                 if(i>40)
                                   {DFICLD_NUMBER++;  /*当满足条件时磁信号脉冲加1********/
                                    DFICLD_BZ=0;      /*磁信号标志位复位*****************/
                                    IE=0x86;          /*开外部中断1**********************/
                                   }
                                }

                              if((P1_2==0)&&(P1_3==0))/*当钱到了后端检测点时退出循环*****/
                                {delay(1);
                                 if((P1_2==0)&&(P1_3==0))
                                   {IE=0x87;
                                    break;
                                   }
                                }
                              if(TIME>=200)            /*当设定时间到时退出循环**********/
                                {WJ=1;                 /*钱未进标志位置位****************/
                                 break;
                                }
                             }
                        if(WJ)                         /*如果钱未进去,则初使化**********/
                          {P2_0=1;P2_1=1;P2_2=1;P2_3=1;/*电机停转************************/
                           XS_TYPE=2;                  /*使显示变为第二种显示方式********/
                           while(1)
                                {if(P1_4==1)
                                    break;
                                }
                           initial();
                           break;
                          }
                        while(1)                        /*当钱出LEN检测点时才停止循环****/
                             {if(DFICLD_BZ==1)
                                {
                                 IE=0x83;
                                 for(j=0;j<200;j++)
                                    {
                                    if(P0_0==0||P0_1==0) i++;
                                    }
                                 if(i>40)
                                   {DFICLD_NUMBER++;    /*只有当钱进去后才计数***********/
                                    DFICLD_BZ=0;
                                    IE=0x87;
                                   }
                                }

                              if((P1_2==1)&&(P1_3==1))
                                {delay(1);
                                 if((P1_2==1)&&(P1_3==1))
                                   {IE=0x82;
                                    break;
                                   }
                                }
                             }
/****************************************************************************************/


/****************************************************************************************/
                       if(P1_4==0)                     /*直到钱退出后才能再次检测********/
                          while(1)
                            {if(P1_4==1)
                                break;
                            }
                       if(ZB==2)                       /*如果钱的确是真的就将其安全送出**/
                         {MOTOL_DELAY_TIME=0;
                          XS_TYPE=1;                   /*使显示变为第一种显示方式********/
                          while(1)
                               {if(MOTOL_DELAY_TIME==10)
                                   break;
                               }
                         }
                       initial();                      /*程序初使化**********************/
                       }

                    }
              }
            }
/****************************************************************************************/

⌨️ 快捷键说明

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