📄 验钞机程序.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_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*****/
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -