📄 xiugai.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
#define WriteDeviceAddress 0xae //define 21C02 Read address in IIC
#define ReadDviceAddress 0xaf //define 21C02 Write address in IIC
#define READ_JMY5xx 0xA1 //define IC Card Read address in IIC
#define WRITE_JMY5xx 0xA0 //define IC Card Write address in IIC
#define SUCCESS 0
#define NO_USER 0 //机器初始为无用户处于等待状态
#define USED 1 //有卡且为用户卡,机器的有用户状态
//***HD7279A指令******
#define CMD_RESET 0xa4
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
//*变量及I/O口定义*
sbit cs=P1^2;
sbit clk=P1^1;
sbit dat=P1^0;
sbit key=P3^3;
sbit SCL=P1^5;
sbit SDA=P1^6;
sbit P1_4=P1^4; //控制继电器
sbit P3_2=P3^2; //RF模块自动寻卡时候的选通信号
bit flag = NO_USER; //机器初始状态标志位(无用户)
uchar code ComReadBlock2[]={0x0a,0x21,0x00,0x02,0xff,0xff,0xff,0xff,0xff,0xff}; //Read Block2;
uchar idata ComWriteBlock2[25] = {0x1a,0x22,0x00,0x02,0xff,0xff, 0xff, 0xff, 0xff,0xff,
0,2,0,5,4,6};
uchar code FengM[] = {0x03, 0x14, 0x2F} ;
uchar idata money[5];
uchar idata water[4];
uchar idata USERID[9]; //存储当前用户4位卡号及5位卡内余额
uchar idata moneypkh[2];
uchar idata Key[6];
uchar idata WriteBuffer[30];
uchar idata MissID[20];//掉电的卡号 //注意:MISSID[9]和MISSID[19]分别为掉电标志位
bit MissIDFlag; //设立一个总的掉电标志位,有掉电则为真,无掉电为假
bit MissIDStop; //当五组掉电写满时,机器不能运行
uchar i,k,xian,wei;
uint g;
uint j;
ulong water_value;
uint waterperkwh;
uint moneyperkwh;
ulong b;
ulong time; //三分钟延时的计数标志
ulong v;
ulong f; //掉电写ram的时间标志
signed long money_value; //卡上的余额
signed long c; //
void long_delay(void); //长延时
void short_delay(void); //短暂延时
void delay10ms(uchar); //延时十秒
void write7279(uchar,uchar); //写入到HD7279
void send_byte(uchar); //发送一个字节
void DisplayErrorCard(void); //display error card
void Write24c02(uchar ch,uchar address); //write data into 24c02
uchar Read24c02(uchar address); //read data from 24c02
uchar receive_byte(void); //接收一个字节
uchar JMY_TRANS(uchar idata *cTransceiveData); //
void DisplayCard(void);
//初始化计数器0**中断初始化
void clock0_initial() reentrant using 0 //初始化计数器0
{
TR0=0;
TMOD=0x05; //设置计数器0工作在计数状态,模式1
TCON=0x00;
TH0=0xff; //设置的计数初值(65506),每30个外部脉冲溢出
TL0=0xfa;
IE=0x82; //打开计数器0中断允许,开启中断
TR0=1; //启动计数器0
water_value=0; //每次用户使完后在下一个用户进入中断钱,水值清0
PT0=1; //定时/计数器0高优先级
}
//初始化定时器1
void clock1_initial() reentrant using 0 //初始化定时器1
{
TMOD=0x01; //设置定时器1工作在定时状态,模式1
TCON=0x00;
TH1=0x27; //延时60ms
TL1=0xfc;
IE=0x88; //中断允许
TR1=1; //启动定时器1
time=0;
}
//*****主函数
void main()
{
uchar idata cTransBuffer[30];
//uchar idata WriteBuffer[30];
//uchar idata MissID[20];//掉电的卡号 //注意:MISSID[9]和MISSID[19]分别为掉电标志位
//bit MissIDFlag; //设立一个总的掉电标志位,有掉电则为真,无掉电为假
//bit MissIDStop; //当五组掉电写满时,机器不能运行
time=0;
f=0;
g=0;
send_byte(CMD_RESET);
water_value=0;
P1_4=1; //关继电器
v=10*Read24c02(4)+Read24c02(5); //xx度电需要扣的钱数
for(i=0;i<=5;i++)
{
Key[i]=Read24c02(i+6); //读用户卡密码
}
for(i=0;i<=3;i++)
{
water[i]=Read24c02(i); //读水
}
//读掉电标志位
MissID[10]=Read24c02(30);
MissID[11]=Read24c02(40);
MissID[12]=Read24c02(50);
MissID[13]=Read24c02(60);
MissID[14]=Read24c02(70);
MissID[15]=Read24c02(80);
MissID[16]=Read24c02(90);
MissID[17]=Read24c02(100);
MissID[18]=Read24c02(110);
MissID[19]=Read24c02(120);
///
MissIDFlag=MissID[10]||MissID[11]||MissID[12]||MissID[13]||MissID[14]||MissID[15]||MissID[16]||MissID[17]||MissID[18]||MissID[19];
MissIDStop=MissID[10]&&MissID[11]&&MissID[12]&&MissID[13]&&MissID[14]&&MissID[15]&&MissID[16]&&MissID[17]&&MissID[18]&&MissID[19];
////////////////////////////////////////////
while(1)
{
/////第一组
if(MissID[10]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+21);
}
Write24c02(1,30); //掉电标志位有掉电则为1
}
}
/////第二组
else if(MissID[11]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+31);
}
Write24c02(1,40); //掉电标志位有掉电则为1
}
}
/////第三组
else if(MissID[12]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+41);
}
Write24c02(1,50); //掉电标志位有掉电则为1
}
}
//////第四组
else if(MissID[13]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+51);
}
Write24c02(1,60); //掉电标志位有掉电则为1
}
}
/////第五组
else if(MissID[14]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+61);
}
Write24c02(1,70); //掉电标志位有掉电则为1
}
}
/////第6
else if(MissID[15]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+71);
}
Write24c02(1,80); //掉电标志位有掉电则为1
}
}
/////第7
else if(MissID[16]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+81);
}
Write24c02(1,90); //掉电标志位有掉电则为1
}
}
/////第8
else if(MissID[17]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+91);
}
Write24c02(1,100); //掉电标志位有掉电则为1
}
}
/////第9
else if(MissID[18]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+101);
}
Write24c02(1,110); //掉电标志位有掉电则为1
}
}
/////第10
else if(MissID[19]==0)
{
if(f==2||g==1)
{
f=0;
g=0;
for(i=0;i<=8;i++)
{
Write24c02(USERID[i],i+111);
}
Write24c02(1,120); //掉电标志位有掉电则为1
}
}
///////////////////////////////////////////////
if(flag==NO_USER&&time>18000)
{
ET1=0; //关闭定时器1中断
time=0;
memcpy(cTransBuffer,FengM,sizeof(FengM)); //设置蜂鸣器
JMY_TRANS(cTransBuffer);
P1_4=1; //关继电器
}
if(flag==USED)
{
if(money_value<0)
{
P1_4=1; //关继电器
IE=0x00; //关所有中断
flag=NO_USER;
send_byte(CMD_RESET);
for(i=0;i<3;i++)
{
write7279(DECODE0+i,0);
write7279(SEGON,23);
}
delay10ms(60);
send_byte(CMD_RESET);
memcpy(cTransBuffer,FengM,sizeof(FengM)); //设置蜂鸣器
JMY_TRANS(cTransBuffer);
if(MissID[10]==0)
Write24c02(0,30); //复位掉电标志位
else if(MissID[11]==0)
Write24c02(0,40); //复位掉电标志位
else if(MissID[12]==0)
Write24c02(0,50); //复位掉电标志位
else if(MissID[13]==0)
Write24c02(0,60); //复位掉电标志位
else if(MissID[14]==0)
Write24c02(0,70); //复位掉电标志位
else if(MissID[15]==0)
Write24c02(0,80); //复位掉电标志位
else if(MissID[16]==0)
Write24c02(0,90); //复位掉电标志位
else if(MissID[17]==0)
Write24c02(0,100); //复位掉电标志位
else if(MissID[18]==0)
Write24c02(0,110); //复位掉电标志位
else if(MissID[19]==0)
Write24c02(0,120); //复位掉电标志位
}
}
while(P3_2==0) //不断的检测是否有卡,有卡则执行以下程序
{
ET1=0; //关闭定时器1中断
time=0;
memcpy(cTransBuffer,ComReadBlock2,sizeof(ComReadBlock2)); //Read block2
JMY_TRANS(cTransBuffer);
//在这里需要添加加密解密程序
//if(cStatus==0&&cTransBuffer[1]==ComReadBlock2[1])
if(flag == NO_USER) //判断标志位确定机器状态
{
if(cTransBuffer[2]==0x01&& cTransBuffer[3]==0x02&&cTransBuffer[4]==0x03&&cTransBuffer[5]==0x04)
{
P1_4=1; //关继电器
for(i=0;i<=11;i++)
{
Write24c02(cTransBuffer[i+6],i); //write cTransBuffer into 24c02 0-11 adress
}
for(i=0;i<=5;i++)
{
Key[i]=Read24c02(i+6);
}
/*
Write24c02(0,30);
Write24c02(0,40);
Write24c02(0,50);
Write24c02(0,60);
Write24c02(0,70);
Write24c02(0,80);
Write24c02(0,90);
Write24c02(0,100);
Write24c02(0,110);
Write24c02(0,120);*/
continue;
}
else if(cTransBuffer[2]==Key[0]&&cTransBuffer[3]==Key[1]&&cTransBuffer[4]==Key[2]&&cTransBuffer[5]==Key[3]&&cTransBuffer[6]==Key[4]&&cTransBuffer[7]==Key[5])
{
////////////////掉电回刷部分
if(MissIDFlag==1) //先判断总掉电标志位
{
///////////////////第一组
if(MissID[10]==1)
{
for(i=0;i<=8;i++)
{
MissID[i]=Read24c02(i+21);
}
if(MissID[0]==cTransBuffer[8]&&MissID[1]==cTransBuffer[9]&&MissID[2]==cTransBuffer[10]&&MissID[3]==cTransBuffer[11])
{
for(i=0;i<=8;i++)
{
ComWriteBlock2[i+16]=MissID[i];
}
memcpy(WriteBuffer,ComWriteBlock2,sizeof(ComWriteBlock2)); //写卡的块2
JMY_TRANS(WriteBuffer);
MissID[10]=0;
Write24c02(0,30); //复位掉电标志位
DisplayCard(); //回刷显示子函数
delay10ms(1000);
send_byte(CMD_RESET);
break;
}
}
///////////////////第2组
if(MissID[11]==1)
{
for(i=0;i<=8;i++)
{
MissID[i]=Read24c02(i+31);
}
if(MissID[0]==cTransBuffer[8]&&MissID[1]==cTransBuffer[9]&&MissID[2]==cTransBuffer[10]&&MissID[3]==cTransBuffer[11])
{
for(i=0;i<=8;i++)
{
ComWriteBlock2[i+16]=MissID[i];
}
memcpy(WriteBuffer,ComWriteBlock2,sizeof(ComWriteBlock2)); //写卡的块2
JMY_TRANS(WriteBuffer);
MissID[11]=0;
Write24c02(0,40); //复位掉电标志位
DisplayCard();
delay10ms(1000);
send_byte(CMD_RESET);
break;
}
}
///////////////////第3
if(MissID[12]==1)
{
for(i=0;i<=8;i++)
{
MissID[i]=Read24c02(i+41);
}
if(MissID[0]==cTransBuffer[8]&&MissID[1]==cTransBuffer[9]&&MissID[2]==cTransBuffer[10]&&MissID[3]==cTransBuffer[11])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -