|
51hei.png (13.8 KB, 下載次數(shù): 55)
下載附件
2020-11-29 03:21 上傳
程序:
- #include "reg52.h"
- #include "lcd.h"
- unsigned char Rec_Buffer[4];
- #define DELAY_IIC_TIME 60
- #define TRUE 1
- #define FALSE 0
- sbit SCL=P1^0; //時鐘線
- sbit SDA=P1^1; //數(shù)據(jù)線
- unsigned int money;
- bit err_flag;
- //PC發(fā)送的命令
- #define CardID_Addr 0x00 //卡號 地址 00~02
- #define Password_Addr 0x0a //密碼 0a~0d
- #define Money_Addr 0x0f //金額 0f~10
- #define COM_RD_CARD 0x45 //上位機發(fā)的讀卡命令
- #define COM_WR_CARD 0x67 //上位機發(fā)的寫卡命令
- #define COM_ADD_MONEY 0xab //上位機發(fā)的充錢命令
- #define COM_DEC_MONEY 0x89 //上位機發(fā)的扣錢命令
- #define COM_WR_ERROR 0xdd //出錯
- #define FLAG_RD_OK 0x12 //上傳的數(shù)據(jù),表示讀卡完畢
- #define FLAG_WR_OK 0x34 //上傳的數(shù)據(jù),表示寫卡完畢
- #define FLAG_RD_ER 0x56 //上傳的數(shù)據(jù),表示讀卡錯誤
- #define FLAG_WR_ER 0x78 //上傳的數(shù)據(jù),表示寫卡錯誤
- #define FLAG_NO_MONEY 0x9a //卡上金額不足
- #define FLAG_FULL_MONEY 0xbc //卡上金額過多
- #define adr_mon_h 0x0f //錢的高位地址
- #define adr_mon_l 0x10
- unsigned char Card_num[]={"ID: "};
- unsigned char Money_num[]={"MONEY: . "};
- bit Check_Acknowledge(void);
- void I2C_Start(void);
- void I2C_Stop(void);
- unsigned char Read_One_Byte(unsigned char);
- unsigned char ReadI2CByte(void);
- void Send_0(void);
- void Send_1(void);
- void WriteI2CByte(unsigned char) ;
- void Write_One_Byte(unsigned char,unsigned char);
- /********** Function Definition 函數(shù)定義 ************/
- void DELAY_IIC(unsigned int t)
- {
- while(t!=0)
- t--;
- }
- void I2C_Start(void)
- {
- SDA=1;
- SCL=1;
- DELAY_IIC(DELAY_IIC_TIME);
- SDA=0;
- DELAY_IIC(DELAY_IIC_TIME);
- SCL=0;
- DELAY_IIC(DELAY_IIC_TIME);
- }
- void I2C_Stop(void)
- {
- SDA=0;
- SCL=1;
- DELAY_IIC(DELAY_IIC_TIME);
- SDA=1;
- DELAY_IIC(DELAY_IIC_TIME);
- SCL=0;
- DELAY_IIC(DELAY_IIC_TIME);
- }
- void Send_0(void)
- {
- SDA=0;
- SCL=1;
- DELAY_IIC(DELAY_IIC_TIME);
- SCL=0;
- DELAY_IIC(DELAY_IIC_TIME);
- }
- void Send_1(void)
- {
- SDA=1;
- SCL=1;
- DELAY_IIC(DELAY_IIC_TIME);
- SCL=0;
- DELAY_IIC(DELAY_IIC_TIME);
- }
- bit Check_Acknowledge(void)
- {
- SDA=1;
- SCL=1;
- DELAY_IIC(DELAY_IIC_TIME/2);
- F0=SDA;
- DELAY_IIC(DELAY_IIC_TIME/2);
- SCL=0;
- DELAY_IIC(DELAY_IIC_TIME);
- if(F0==1)
- return FALSE;
- return TRUE;
- }
- void WriteI2CByte(unsigned char b)
- {
- char i;
- for(i=0;i<8;i++)
- if((b<<i)&0x80)
- Send_1();
- else
- Send_0();
- }
- unsigned char ReadI2CByte(void)
- {
- unsigned char b=0,i;
- for(i=0;i<8;i++)
- {
- SDA=1;
- SCL=1;
- DELAY_IIC(10);
- F0=SDA;
- DELAY_IIC(10);
- SCL=0;
- if(F0==1)
- {
- b=b<<1;
- b=b|0x01;
- }
- else
- b=b<<1;
- }
- return b;
- }
- /**********以下為讀寫24c02的函數(shù)**********/
- void Write_One_Byte(unsigned char addr,unsigned char thedata)
- {
- bit acktemp=1;
- I2C_Start();
- WriteI2CByte(0xa0);
- acktemp=Check_Acknowledge();
- WriteI2CByte(addr);
- acktemp=Check_Acknowledge();
- WriteI2CByte(thedata);
- acktemp=Check_Acknowledge();
- I2C_Stop();
- }
- unsigned char Read_One_Byte(unsigned char addr)
- {
- bit acktemp=1;
- unsigned char mydata;
- I2C_Start();
- WriteI2CByte(0xa0);
- acktemp=Check_Acknowledge();
- WriteI2CByte(addr);
- acktemp=Check_Acknowledge();
- I2C_Start();
- WriteI2CByte(0xa1);
- acktemp=Check_Acknowledge();
- mydata=ReadI2CByte();
- acktemp=Check_Acknowledge();
- return mydata;
- I2C_Stop();
- }
- char Num2Char(unsigned char ch)
- {
- if(ch<=9)
- return (ch+'0');
- else return (ch-10+'a');
- }
- void System_Init(void)
- {
- TMOD=0x21; //串行口初始化
- TH1=0xfd;TL1=0xfd; //設定波特率 9600
- PCON=0x00;
- TR1=1; //啟動T1
- SCON=0x50; //串行口工作在方式1,并允許接收
- EA=1;
- ES=1;
- }
- void main(void)
- {
- System_Init(); //初始化
- LCD_Init();
- while(1)
- {
- //////////////此代碼用來測試IIC讀寫/////////////////
- #ifdef _IIC_DUBG
- Write_One_Byte(0,2); //ADD0 寫入數(shù)據(jù)2
- Write_One_Byte(1,7); //ADD1 寫入數(shù)據(jù)3
- LCD_Wr_Char(0,0,Read_One_Byte(0)+'0'); //讀取24C02 并在LM016顯示
- LCD_Wr_Char(1,0,Read_One_Byte(1)+'0');
- #endif
- //////////////////IIC測試結束//////////////////////////
- Money_num[6]=((money/10000)%10)+'0';
- Money_num[7]=((money/1000)%10)+'0';
- Money_num[8]=((money/100)%10)+'0';
- Money_num[9]=((money/10)%10)+'0';
- Money_num[11]=(money%10)+'0';
- LCD_Wr_String(0,0,Card_num);
- LCD_Wr_String(0,1,Money_num);
- }
- }
- //IC卡讀和寫子程序,中斷
- void rxdata(void) interrupt 4 using 0
- {
- unsigned char i,j;
- unsigned char rdbuf[20]; //讀取卡中的數(shù)據(jù)緩沖
- unsigned char RxBuf[20]; //讀取串口數(shù)據(jù)緩沖
- EA=0;
- for(i=0;i<2;i++) ////讀取命令,第一個字節(jié)為命令字節(jié),第二個字節(jié)為在第二個字節(jié)之后還有多少個字節(jié)
- {
- while(!RI);
- RI=0;
- RxBuf[i]=SBUF;
- }
- if(RxBuf[1]!=0) //如果字節(jié)數(shù)不是0,則繼續(xù)讀取剩余的數(shù)據(jù)
- {
- for(i=0;i<RxBuf[1];i++)
- {
- while(!RI);
- RI=0;
- RxBuf[2+i]=SBUF;
- }
- }
- if(RxBuf[0]==COM_RD_CARD) //讀卡命令
- {
- err_flag=0;
- rdbuf[0]=Read_One_Byte(CardID_Addr); //讀卡中的ID號
- rdbuf[1]=Read_One_Byte(CardID_Addr+1);
- rdbuf[2]=Read_One_Byte(CardID_Addr+2);
- rdbuf[3]=Read_One_Byte(CardID_Addr+3);
- rdbuf[4]=Read_One_Byte(CardID_Addr+4);
- rdbuf[5]=Read_One_Byte(Money_Addr);
- rdbuf[6]=Read_One_Byte(Money_Addr+1);
- SBUF= COM_RD_CARD; //發(fā)送讀卡命令返回PC
- while(!TI);
- TI=0;
- for(j=0;j<7;j++) //發(fā)送卡數(shù)據(jù)返回PC
- {
- SBUF=rdbuf[j];
- while(!TI);
- TI=0;
- }
- Card_num[3]=(rdbuf[0]>>4) +'0';
- Card_num[4]=(rdbuf[0]&0x0f) +'0';
- Card_num[5]=(rdbuf[1]>>4) + '0';
- Card_num[6]=(rdbuf[1]&0x0f) + '0';
- Card_num[7]=(rdbuf[2]>>4) + '0';
- Card_num[8]=(rdbuf[2]&0x0f) + '0';
- Card_num[9]=(rdbuf[3]>>4) + '0';
- Card_num[10]=(rdbuf[3]&0x0f) + '0';
- Card_num[11]=(rdbuf[4]>>4) + '0';
- Card_num[12]=(rdbuf[4]&0x0f) + '0';
-
- money=rdbuf[5]*256+rdbuf[6];
- }
- else if(RxBuf[0]==COM_WR_CARD) //寫卡命令
- {
- err_flag=0;
- Write_One_Byte(CardID_Addr,RxBuf[2]); //寫卡號
- Write_One_Byte(CardID_Addr+1,RxBuf[3]);
- Write_One_Byte(CardID_Addr+2,RxBuf[4]);
- Write_One_Byte(CardID_Addr+3,RxBuf[5]);
- Write_One_Byte(CardID_Addr+4,RxBuf[6]);
- Write_One_Byte(Money_Addr,RxBuf[7]);
- Write_One_Byte(Money_Addr+1,RxBuf[8]);
- SBUF=COM_WR_CARD;while(!TI);TI=0;
- SBUF=COM_WR_CARD;while(!TI);TI=0;
- SBUF=COM_WR_CARD;while(!TI);TI=0;
- /*if((Read_One_Byte(CardID_Addr)!=RxBuf[2])
- ||(Read_One_Byte(CardID_Addr+1)!=RxBuf[3])
- ||(Read_One_Byte(CardID_Addr+2)!=RxBuf[4])
- ||(Read_One_Byte(CardID_Addr+3)!=RxBuf[5])
- ||(Read_One_Byte(CardID_Addr+4)!=RxBuf[6]))
- err_flag=1;
- if(!err_flag)
- {
- SBUF=COM_WR_CARD;while(!TI);TI=0;
- SBUF=COM_WR_CARD;while(!TI);TI=0;
- SBUF=COM_WR_CARD;while(!TI);TI=0;
- SBUF=COM_WR_CARD;while(!TI);TI=0;
- }
- else
- {
- SBUF=COM_WR_ERROR;
- while(!TI);
- TI=0;
- } */
- }
- else if(RxBuf[0]==COM_ADD_MONEY) //充錢命令
- {
- err_flag=0;
- money=Read_One_Byte(Money_Addr)*256+Read_One_Byte(Money_Addr+1);
- money += (RxBuf[7]*256 + RxBuf[8]);
- if( Read_One_Byte(Money_Addr)!=(money/256)
- || Read_One_Byte(Money_Addr+1)!=(money%256))
- err_flag=1;
- if(!err_flag)
- {
- SBUF=COM_ADD_MONEY;
- while(!TI);
- TI=0;
- }else
- {
- SBUF=COM_WR_ERROR;
- while(!TI);
- TI=0;
- }
- }
- else if(RxBuf[0]==COM_DEC_MONEY)
- {
- err_flag=0;
- money=Read_One_Byte(Money_Addr)*256+Read_One_Byte(Money_Addr+1);
- money -= (RxBuf[7]*256 + RxBuf[8]);
- Write_One_Byte(Money_Addr,money/256);
- Write_One_Byte(Money_Addr+1,money%256);
- if( Read_One_Byte(Money_Addr)!=(money/256)
- || Read_One_Byte(Money_Addr+1)!=(money%256))
- err_flag=1;
- if(!err_flag)
- {
- SBUF=COM_DEC_MONEY;
- while(!TI);
- TI=0;
- }else
- {
- SBUF=COM_WR_ERROR;
- while(!TI);
- TI=0;
- }
- }
- EA=1;
- }
復制代碼
|
-
-
IC Card.zip
2020-11-18 11:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
3.18 MB, 下載次數(shù): 16, 下載積分: 黑幣 -5
-
-
MCU.zip
2020-11-18 11:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
111.31 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5
|