|
为什么要用单片机模拟ID卡,详见老站帖子 http://bbs.mydigit.cn/read.php?tid=2144071
最近公司淡季,比较闲,就又翻出之前没有弄好的小玩意加以优化。本次优化主要有以下几点:
1.小型迷你化,之前做的个傻大笨粗,外观丑到不忍直视
2.屏幕显示id卡号,或者显示如:home work 等等方面记忆的单词
3.多卡合一,实现多个门禁只需要带一张卡就可以开
成品图如下:
主要功能及特点:
1.主控使用smt8s003 VK1088B段码屏驱动芯片,8位段码屏,纽扣电池供电
2.单按键实现停机模式唤醒及开机模式下多卡之间切换
3.理论上可以内置N张ID卡,实现多卡合一
原理图:
PCB
打板归来,现在DIY真的方便,打板都不要钱包邮,之前用热转印 PCB,东西做得傻大 现在做PCB就可以做的很精巧,在次感谢嘉立创和捷配。
焊接好元件,最头痛的就是线圈问题,钥匙扣里面的线圈大小刚好,就是线圈线太细了,一不小心就弄断报废了。
调试程序如下:
- /* Includes ------------------------------------------------------------------*/
- #include "stm8s.h"
- #include "stm8s_clk.h"
- #include "intrinsics.h"
- #include "stm8s_wwdg.h"
- #include "stm8s_gpio.h"
- #include "STM8_DELAY.h"
- #include "key.h"
- #include "tim1.h"
- #include "id_drive.h"
- #include "vk1088b.h"
- bool fPowerOn_flag = FALSE; //ID卡状态 默认进入停机模式 也必须要先进入停机模式,因为进入停机模式前会开启总中断,如先进入开机模式 总中断无法打开 TIM1无法进入中断
- bool cont = FALSE; //当进入开机模式后,会初始化时钟,ID线圈引脚,TIM1定时器,此状态标志是为了防止在whlie循环中一直初始化定时器而无法进入定时器中断,让在开机状态下初始化只运行一次
- //uint8_t COUNTERINIT=0x7f;
- //uint8_t WINDOW=0x47;
- extern uint8_t sendcont; //在定时器中发送一次卡号累加一次,目的是为了实现发送N次卡号后进入停机模式节能
- /************************************************
- 系统时钟初始化函数
- *************************************************/
- void Clk_Init(void)
- {
- CLK_DeInit();//复位时钟寄存器
- CLK_HSICmd(ENABLE);//使能内部高速时钟
- CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//配置内部高速时钟(时钟分频器:1分频),系统时钟16MHz 系统时钟必须16M 慢了之后定时器中断还没处理完又进中断了
- CLK_ClockSecuritySystemEnable();//开启时钟安全系统
- }
- /************************************************
- 窗口看门狗初始化函数
- *************************************************/
- //void MWWDG_Init(void)
- //{
- // WWDG_Init(COUNTERINIT, WINDOW);//COUNTERINIT = 0x7f,WINDOW = 0x77
- //}
- /************************************************
- 喂狗函数
- *************************************************/
- //void Free_WWDG(void)
- //{
- // uint8_t CounterValue;
- // CounterValue = (uint8_t)(WWDG_GetCounter() & 0x7F);
- //
- // /*
- // * 判断是否小于所设置的窗口上限值
- // * 只有小于窗口上限值才能清零
- // */
- // if(CounterValue < WINDOW){
- // WWDG_SetCounter(COUNTERINIT);
- // }
- //
- //}
- void Halt_OffDevice(void)
- {
-
- //停机前关闭不需要的功能模块的时钟
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1,DISABLE);
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC,DISABLE);
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2,DISABLE);
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU,DISABLE);
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,DISABLE);
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1,DISABLE);
- CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI,DISABLE);
-
-
- //对于IO口的设置,对于外设是高电平工作的,那么设置成
- //推挽输出低,对于是低电平工作的那么设置成推挽输出高
-
-
-
-
- GPIO_Init(GPIOC,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW);//ID_DRIVE
- GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW); //LCD_VCC
- GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW); //LCD_GND
-
- GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW); //IVK1088B_CS
- GPIO_Init(GPIOC,GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_SLOW); //IVK1088B_WR
- GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_SLOW); //IVK1088B_DAT
-
-
-
- InPut_Init();
- __enable_interrupt();
- }
- void System_Init(void)
- {
-
- Clk_Init();
-
- ID_DRIVE_Init();//线圈输出引脚初始化
- Tim1_Init();//线圈载波频率初始化
-
- }
- int main(void)
- {
-
-
-
- Clk_Init();//系统时钟初始化函数
-
-
- while (1){
-
- if(fPowerOn_flag == FALSE){
- Halt_OffDevice();//停机前关闭不需要的外设
- halt();//进入停机模式
-
- }
-
- if(fPowerOn_flag){
-
- if(cont == FALSE){
- System_Init();
- cont = TRUE;
- }
- if(cont){
- if(sendcont == 100){
- cont=FALSE;
- sendcont=0;
- fPowerOn_flag = FALSE;
- }
- }
-
- }
- }
-
- }
复制代码
组装成品: PCB做成这个形状也主要是为装进这个壳子里
更新:stm8s单片机模拟ID卡(125khz) 15卡合一,蓝牙连接安卓管理端(附全部源码)
https://www.mydigit.cn/thread-494109-1-1.html
程序和PCB源文件如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|