久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機水卡充值扣費系統 RC522+S50卡源程序
[打印本頁]
作者:
xianxianhh
時間:
2019-8-15 10:48
標題:
51單片機水卡充值扣費系統 RC522+S50卡源程序
本設計包括兩個終端,包括負責水卡充值(可選擇金額)的充值終端和每次刷卡扣費兩元的付費終端。制作成品時建議兩個終端做在一塊板子上,用跳帽切換兩個51單片機的電源。
主控芯片51單片機
射頻模塊RC522
射頻卡M1卡S50
以下是付費終端的程序,其他詳見附件
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"
#include<intrins.h> //函數處理頭文件
#include<string.h> //字符串處理頭文件
#include<stdio.h> // 輸入輸出函數頭文件
unsigned char code data1[16] = {0x00,0x00,0x00,0x00,0xff,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0xFE,0x01,0xFE};
//M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
//4字節金額(低字節在前)+4字節金額取反+4字節金額+1字節塊地址+1字節塊地址取反+1字節塊地址+1字節塊地址取反
unsigned char data2[4] = {0x00,0x00,0x00,0x00};//存值減值金額
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //密碼
unsigned char TYPE_DATA[2]; //類型
unsigned char ID_DATA[4]; //ID地址
unsigned char value_DATA[4]; //卡里面的值
unsigned char g_ucTempbuf[20]; //卡號
unsigned char code dis0[] = {"S50"};
unsigned char code dis1[] = {"S70"};
unsigned char code dis2[] = {"X"};
unsigned char code dis3[] = {"44"};
unsigned char code dis4[] = {"ID:"};
unsigned char code dis5[] = {"RMB:"};
unsigned char code dis6[] = {"0123456789ABCDEF"};
unsigned int tt=0,a=2,b,falg_pro; //falg_pro聲音提示標志
void main( )
{
unsigned char status;
InitializeSystem( ); //初始化
PcdReset(); //復位RC522
PcdAntennaOff(); //關閉天線
PcdAntennaOn(); //開啟天線
data2[1]=a/256;
data2[0]=a%256;
while ( 1 )
{
status = PcdRequest(PICC_REQALL, g_ucTempbuf); //返回卡片類型#define PICC_REQIDL 0x26 尋天線區內未進入休眠狀態
if(status!= MI_OK) //讀不到卡,顯示清0;
{
TYPE_DATA[0]=0;
TYPE_DATA[1]=0;
ID_DATA[0]=0;
ID_DATA[1]=0;
ID_DATA[2]=0;
ID_DATA[3]=0;
value_DATA[0]=0;
value_DATA[1]=0;
value_DATA[2]=0;
value_DATA[3]=0;
falg_pro=0;
b=0;
}
if (status == MI_OK)
{
TYPE_DATA[0]=g_ucTempbuf[0];
TYPE_DATA[1]=g_ucTempbuf[1];
status = PcdAnticoll(g_ucTempbuf); //防沖撞 ,返回卡片ID號 4字節
if (status == MI_OK)
{
status = PcdSelect(g_ucTempbuf); //選定卡片 ,輸入卡片ID號
if (status == MI_OK)
{
if(falg_pro==0)//聲音提示標志
{
falg_pro=1;
pro();
}
ID_DATA[0]=g_ucTempbuf[0];
ID_DATA[1]=g_ucTempbuf[1];
ID_DATA[2]=g_ucTempbuf[2];
ID_DATA[3]=g_ucTempbuf[3];
init_k();//初始化卡
writek();//寫卡
readk();
}
}
}
LCD1206();//顯示處理
PcdHalt();//命令卡片進入休眠狀態
}
}
/////////////////////////////////////////////////////////////////////
//系統初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
fmq=0; //fmp喇叭
fmq=1;
lcd_init(); // 初始化LCD
Delay(1);
}
void Delay(unsigned int time)
{
unsigned int i,k ;
for(i=0;i<150;i++)
for(k=0;k<time;k++)
_nop_();
}
void Delay2(unsigned int time2)
{
unsigned int i,k ;
for(i=0;i<5;i++)
for(k=0;k<time2;k++)
_nop_();
}
////////////////////////顯示處理函數////////////////////////////////
bit lcd_bz() // 測試LCD忙碌狀態
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(unsigned char cmd)// 寫入指令數據到LCD
{
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
return 0;
}
lcd_pos(unsigned char pos)
{ //設定顯示位置
lcd_wcmd(pos | 0x80);
return 0;
}
lcd_wdat(unsigned char dat)
{ //寫入字符顯示數據到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
return 0;
}
lcd_init() //LCD初始化設定
{
lcd_wcmd(0x38); //
Delay(1);
lcd_wcmd(0x0c); //
Delay(1);
lcd_wcmd(0x06); //
Delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內容
Delay(1);
return 0;
}
LCD1206()
{
unsigned char i;
lcd_pos(0x01); // 設置顯示位置為第一行的第0個字符
i = 0;
switch(TYPE_DATA[0])
{
case 0x04:
lcd_wdat(dis0[0]); //dis0[] = {"S50"};
lcd_wdat(dis0[1]);
lcd_wdat(dis0[2]);
break;
case 0x02:
lcd_wdat(dis1[0]); //dis1[] = {"S70"};
lcd_wdat(dis1[1]);
lcd_wdat(dis1[2]);
break;
case 0x08: //dis2[] = {"X"};
lcd_wdat(dis2[0]);
break;
case 0x44:
lcd_wdat(dis3[0]); //dis3[] = {"44"};
lcd_wdat(dis3[1]);
break;
}
lcd_pos(0x05); // 設置顯示位置為第一行的第5個字符
lcd_wdat(dis4[0]); //dis4[] = {"ID:"};
lcd_wdat(dis4[1]);
lcd_wdat(dis4[2]);
lcd_pos(0x08); // 設置顯示位置為第一行的第5個字符
lcd_wdat(dis6[ID_DATA[0]/16]); //dis6[] = {"0123456789ABCDEF"};
lcd_wdat(dis6[ID_DATA[0]%16]);
lcd_wdat(dis6[ID_DATA[1]/16]);
lcd_wdat(dis6[ID_DATA[1]%16]);
lcd_wdat(dis6[ID_DATA[2]/16]);
lcd_wdat(dis6[ID_DATA[2]%16]);
lcd_wdat(dis6[ID_DATA[3]/16]);
lcd_wdat(dis6[ID_DATA[3]%16]);
lcd_pos(0x40); // 設置顯示位置為第二行第二個字符
lcd_wdat(dis5[0]); //dis5[] = {"RMB:"};
lcd_wdat(dis5[1]);
lcd_wdat(dis5[2]);//
lcd_wdat(dis5[3]);// 人民幣
lcd_wdat(dis6[0]);
lcd_wdat(dis6[2]);
lcd_pos(0x47); // 設置顯示位置為第二行第二個字符
lcd_wdat(dis5[0]);
lcd_wdat(dis5[1]);
lcd_wdat(dis5[2]);//
lcd_wdat(dis5[3]);// 人民幣
lcd_pos(0x4b);
lcd_wdat(dis6[b/10000]);
lcd_wdat(dis6[b%10000/1000]);
lcd_wdat(dis6[b%10000%1000/100]);
lcd_wdat(dis6[b%10000%1000%100/10]);
lcd_wdat(dis6[b%10000%1000%100%10]);
return 0;
}
void pro()
{
fmq=0;
TMOD=0x11;//設置定時器0為工作方式1
TH0=(65536-50000)/256;//給定時器裝初值 高八位
TL0=(65536-50000)%256;//給定時器裝初值 低八位
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
}
void time0() interrupt 1// 中斷服務子程序 聲音時間一致
{
TH0=(65536-50000)/256;//給定時器裝初值 高八位
TL0=(65536-50000)%256;//給定時器裝初值 低八位
tt++;
if(tt==3)
{
tt=0;
fmq=1;
EA=0; //關總中斷
ET0=0; //關定時器0中斷
TR0=0; //關定時器0
}
}
void readk()//讀卡
{
unsigned char status;
status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
if (status == MI_OK) //驗證密碼
{
status = PcdRead(1, g_ucTempbuf);//讀塊地址“1”的數據,返回值存在 g_ucTempbuf
if (status == MI_OK)
{
value_DATA[0]=g_ucTempbuf[0];
value_DATA[1]=g_ucTempbuf[1];
value_DATA[2]=g_ucTempbuf[2];
value_DATA[3]=g_ucTempbuf[3];
b=value_DATA[0]+value_DATA[1]*256;
}
}
}
void writek()//寫卡 存值或減值
{
unsigned char status;
status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
if (status == MI_OK) //驗證密碼
{
if(1) //扣款
{
if(b>1)
{
status = PcdValue(PICC_DECREMENT,1,data2);//扣款存值命令,錢包地址,金額 低位在前 PICC_INCREMENT 充值
if (status == MI_OK)
{
pro();
}
status = PcdBakValue(1, 2); //備份錢包 “1”源地址“2”目標地址
Delay(1000);
b=b-2;
}
else
{
unsigned int x;
for(x=1;x<4000;x++)
{
fmq=1;
Delay2(1);
fmq=0;
}
}
}
}
}
void init_k()//初始化卡
{
unsigned char status;
if(key1==0) //充值
{
status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
if (status == MI_OK) //驗證密碼
{
status = PcdWrite(1, data1);//4字節金額(低字節在前)+4字節金額取反+4字節金額+1字節塊地址+1字節塊地址取反+1字節塊地址+1字節塊地址取反
if (status == MI_OK)
{
pro();
}
}
}
}
復制代碼
全部程序51hei下載地址:
注冊程序.rar
(90.98 KB, 下載次數: 84)
2019-8-15 10:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
刷卡程序.rar
(88.79 KB, 下載次數: 106)
2019-8-15 10:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
youluping520
時間:
2020-10-13 09:23
這個程序最多能注冊多少個會員?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
热久久性
|
亚洲欧美激情精品一区二区
|
国产资源在线播放
|
国产精品成人一区二区三区
|
色综合色综合
|
欧美 日韩 国产 成人 在线 91
|
91文字幕巨乱亚洲香蕉
|
亚洲精品综合
|
欧美黄色片
|
久久久成人网
|
国产精品无码久久久久
|
久久不卡日韩美女
|
精品国产一区二区三区免费
|
一区二区av在线
|
久久久久久亚洲精品不卡
|
四虎影视在线
|
一区二区三区视频在线观看
|
亚洲欧美日韩在线
|
成人黄色在线
|
超碰导航
|
国产高清在线精品一区二区三区
|
午夜综合
|
免费成年网站
|
成人久久久
|
国产精品一区二区欧美黑人喷潮水
|
伦理二区
|
久久a久久
|
日韩精品久久久久
|
久久高清
|
欧美精品一区二区蜜桃
|
欧美四虎
|
欧美在线日韩
|
人人看人人射
|
国产电影一区二区在线观看
|
91久久综合
|
中文字幕免费视频
|
啪啪免费网站
|
97国产精品视频人人做人人爱
|
欧美午夜一区
|
久久五月婷
|
在线观看成人
|