基于stm8的ds1302模块千万别把数据写在第3个区,不然卡就锁住了,只能写在第2个区
电路原理图如下:
stm8单片机源码:
/* Includes ------------------------------------------------------------------*/
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "stm8s_clk.h"
#include "intrinsics.h"
#include "stm8s_uart1.h"
#include "uart.h"
#include "rc522.h"
#include "string.h"
#include "IWDG.h"
#include "tim2.h"
#include "1602i2c.h"
void Delay(u32 nCount);
extern u8 RxBuffer[RxBufferSize];
extern u8 UART_RX_NUM;
extern int time2;
extern int tim2test;
extern int tim2test1;
unsigned char CT[2];//卡类型
unsigned char SN[4]; //卡号
unsigned char M1UID[8]={0x2e,0x55,0,0,0,0,0,0};//读卡器向上发送,读到卡后自动发
extern unsigned char controlflag;//接收到控制LED beep指令标志 01表示收到
extern unsigned char sendflag;//发送标志 =1表示还未发送过 =0表示已经发送一次 等待回复 如果超时重新发送
unsigned char write[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};
unsigned char read[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
extern unsigned char receive[8];
u8 read_flag=0;//读卡标志位 1;读到卡 0;还没读到卡
u8 time_flag=0;//超时标志 0;未超时 1:超时
//unsigned char key[6] = {0x19,0x84,0x07,0x15,0x76,0x14};
unsigned char key[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
int sum=0;
//unsigned char key[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
/* Private macro -------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
#define BufferSize (countof(Tx_Buffer)-1)
/* Private variables ---------------------------------------------------------*/
u8 Tx_Buffer[] = "请刷卡";
u8 Rx_Buffer[BufferSize];
u32 FLASH_ID ;
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void cardNo2String(u8 *cardNo, u8 *str);
/* Private functions ---------------------------------------------------------*/
#define ReadWriteAddr 3 //读写扇区
void SN_UID(void)
{
unsigned int tempUID;
M1UID[2]=SN[0];
M1UID[3]=SN[1];
M1UID[4]=SN[2];
M1UID[5]=SN[3];
tempUID=M1UID[1]+M1UID[2]+M1UID[3]+M1UID[4]+M1UID[5];
M1UID[6]=tempUID&0x00ff;
M1UID[7]=tempUID>>8;
}
void rxfromPIC(void)
{
u8 i;
sum=receive[1]+receive[2]+receive[3]+receive[4]+receive[5];
if((receive[0]==0x7e)&&(receive[1]==0x55)&&(receive[6]==(sum&0x00ff))&&(receive[7]==(sum&0xff00)>>8))
{
read_flag=0;
if(receive[2]==0x01)
{
}
else if(receive[2]!=0x01)
{
}
if(receive[3]==0x01)
{
}
else if(receive[3]!=0x01)
{
}
if(receive[4]==0x01)
{
}
receive[0]=0x7e;
UART1_SendString(receive, 8);
for(i=2;i<8;i++)
{
M1UID[i]=0;
}
tim2test1=0;//启动计时
}
for(i=0;i<8;i++)
{
receive[i]=0;
}
if(tim2test1>5000)//超时全部关闭
{
tim2test1=0;
// GPIO_HIGH(GPIOD, GPIO_PIN_3);
// GPIO_HIGH(GPIOD, GPIO_PIN_7);
// GPIO_LOW(GPIOD, GPIO_PIN_2);
}
}
void main(void)
{
unsigned char status;
/*设置内部时钟16M为主时钟*/
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);
status = memcmp(read,write,16);//清0
InitRc522();//rc522初始化
sendflag=1;
I2C1602_Configuration();
init1602_i2c();
__enable_interrupt();//开启总中断
//////////////
write[0] =1;//
write[1] =3;//
write[2] =2;//
write[3] =6;//
write[4] =7;//
write[5] =7;//
write[6] =6;//
write[7] =0;//
write[8] =2;//
write[9] =8;//
write[10] =5;//
///////////////// 要写入的值,最多16个///////
while(1)
{
status = PcdRequest(PICC_REQALL,CT); // 扫描卡
status= PcdAnticoll(SN);
//防冲撞
rxfromPIC();
if (status==MI_OK)
{
SN_UID();
status = PcdSelect(SN); //选择要操作的卡
if (status==MI_OK)
{
if( MI_OK == PcdAuthState(0x61,ReadWriteAddr,key,SN) ) //验证A密码
{
// status = PcdWrite(2,write);//写入M1卡第2块块数据
status = PcdRead(2,read);//读取M1卡第2块块数据
if(MI_OK == status)
{
zl_i2c(0x80);
sj_i2c(0x30+ read[0]);
sj_i2c(0x30+ read[1]);
sj_i2c(0x30+ read[2]);
sj_i2c(0x30+ read[3]);
sj_i2c(0x30+ read[4]);
sj_i2c(0x30+ read[5]);
sj_i2c(0x30+ read[6]);
sj_i2c(0x30+ read[7]);
sj_i2c(0x30+ read[8]);
sj_i2c(0x30+ read[9]);
sj_i2c(0x30+ read[10]);
}
}
}
}
}
}
void Delay(u32 nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void Hex2String(u8 hex,u8 *str)
{
str[0] = (hex / 100) + '0';
str[1] = (hex % 100 / 10) + '0';
str[2] = (hex % 10) + '0';
}
void cardNo2String(u8 *cardNo, u8 *str)
{
u8 Count = 0;
for(Count = 0; Count < 4; Count++)
{
Hex2String(cardNo[Count], str + Count * 4);
if(Count == 3)
{
str[15] = 'n';
}
else
{
str[Count * 4 + 3] = ':';
}
……………………
上一篇:stm8 唯一ID号加密方法.思路
下一篇:STM8L151G sx1276-LoRa测试程序
推荐阅读
史海拾趣
为了进一步提升公司的竞争力和市场份额,Babcock积极寻求与国际知名企业的合作。通过与这些企业的技术交流和项目合作,Babcock不仅引进了先进的技术和管理经验,还成功打开了国际市场的大门。随着业务的不断拓展,公司的规模和影响力也逐渐扩大。
随着半导体行业的竞争加剧,价格战和技术更新速度不断加快。CSDC面临着巨大的市场压力。为了应对这些挑战,公司决定调整战略,专注于高端市场的开发。通过加大研发投入,提升产品质量和性能,CSDC逐渐在高端市场站稳了脚跟,实现了业务的稳步增长。
随着技术的不断成熟,Daco开始积极寻求市场拓展。公司首先与几家知名的电子设备制造商建立了合作关系,为其提供定制的半导体解决方案。同时,Daco也积极参与国际半导体展览和交流活动,与全球的行业同仁建立了广泛的联系。通过不断的市场拓展和战略合作,Daco的产品逐渐进入了全球市场,公司的知名度和影响力也得到了显著提升。
为了进一步扩大市场份额,达晶微积极拓展国际市场。公司在深圳、上海、苏州、台湾、青岛、长沙、韩国、北美等地设立了销售办事处,与当地企业建立了紧密的合作关系。同时,达晶微还积极寻求与国际知名企业的合作机会,通过引进先进技术和管理经验,不断提升自身实力。
在电子行业的激烈竞争中,DAESAN公司也曾遭遇过困境。一次严重的金融危机让公司的资金链几乎断裂,许多项目被迫中断。然而,DAESAN公司并没有放弃,他们积极寻求外部支持,同时加强内部管理,降低成本,提高效率。在困境中,公司不断总结经验教训,优化经营策略。最终,他们成功度过了危机,实现了逆境中的成长。
内容简介: 双面板布线技巧 模拟和数字布线的基本相似之处及差别 寄生元件危害最大的情况 AD 转换器的精度和分辨率增加时使用的布线技巧 如何使用工具确定与电路布线有关问题 传感系统的布线 对于电流回路,需要注意如下基本事项 1. 如果 ...… 查看全部问答∨ |
|
欢迎讨论 一个LED的N种玩法(一)——让LED闪起来https://bbs.eeworld.com.cn/viewthread.php?tid=103121 一个LED的N种玩法(二)——渐变https://bbs.eeworld.com.cn/viewthread.php?tid=103168 一个LED的 ...… 查看全部问答∨ |
|
我在调一块usb声卡,枚举的时候set config之后为什么会set idle,然后stall pid,哪位帮忙看一下问题出在哪儿好吗,多谢。下面是用bus hound抓的包。 21.0 CTL 21 01 00 02 00 08 02 00 & ...… 查看全部问答∨ |
|
小弟刚接触WINCE系统想知道在Xp操作系统下面用C#开发的程序打包安装到WINCE下有什么问题吗.兼容性有要求吗? 比如说我用的SQL SERVER数据库和C#来开发的程序,可以安装到WINCE里面吗?是不是在WINCE里面也要安装Sql ...… 查看全部问答∨ |
今天开始搭了个板子,板子是电源板,上面有高频变压器2个,瓷珠和电感8个。调试OK,给板子写程序,总是不顺,报错现象如: An error occoured: "Could not write target memory" Messages: Mass Erase... Program... 还有滴:联接不了目标 ...… 查看全部问答∨ |
void UART3Init(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RC ...… 查看全部问答∨ |