📄 ycj_ls.c
字号:
/********************该程序仅适用于电机电压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 + -