基于树莓派的智能安全门(单片机)
基于树莓派的智能安全门(单片机)
原文链接:
.html
先用单片机+薄膜键盘做密码键盘的输入,通过串口把获取到的按键值发给树莓派去识别和操作。这里用了#号键作为密码输入结束的确定键。单片机程序和树莓派程序调通后,打印外壳,焊板子(因为体积关系不可能直接塞个直插封装的单片机下去,所以就买了比较方便焊接体积又相对小的DIP封装的单片机,这里用了STC15系列的单片机,可以省掉晶振的焊接)
单片机读键盘数据的代码如下(单片机使用的是STC15W404AS型号)
#include "STC15W404AS.h"
#include <intrins.h>#define key_port P1 //键盘接口定义
sbit key_port_0=key_port^0;
sbit key_port_1=key_port^1;
sbit key_port_2=key_port^2;
sbit key_port_3=key_port^3;
sbit BEEP=P5^5; //蜂鸣器sbit OPEN=P5^4; //开门按键
/*******************************
STC15W404单片机一毫秒延时函数
*******************************/
void delay_ms(unsigned int ms)
{unsigned char i, j;while(--ms){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}
}
/**************************串口发送一个字符
**************************/
void com_send_dat( unsigned char dat)
{SBUF=dat;while (TI== 0);TI= 0 ;
}void init_com(void) //T2_9600bps@11.0592MHz
{SCON = 0x50;AUXR |= 0x01;AUXR |= 0x04;T2L = 0xE0;T2H = 0xFE;AUXR |= 0x10;
}
/**************************键盘扫描函数
**************************/
unsigned char keyscan(void)
{unsigned char key,i;unsigned char code key_table[16]={0xeb,0x77,0x7b,0x7d,0xb7,0xbb,0xbd,0xd7,0xdb,0xdd,0x7e,0xbe,0xde,0xee,0xe7,0xed};key=0xFF; //输出初始化值key_port=0x0f; //确定行列位置if(key_port==0x0f) return(255); //无键按下返回0delay_ms(5); //调用延时函数 ,目的是去前沿键抖。if(key_port==0x0f) return(255); //再次判断。目的是确保检测正确else{for(i=0;i<4;i++) //以下为经典的计算键值(判断闭合键所在的位置){key_port=_cror_(0x7f,i);if(key_port_0==0) break;if(key_port_1==0) break;if(key_port_2==0) break;if(key_port_3==0) break;}key=key_port; //取得键值for(;key_port!=0x0f;key_port=0x0f); //等待键松开,目的是去后沿键抖for(i=0;key_table[i]!=key && i<16;i++); //查表取key的值0-Fkey=i;return(key); //带键值返回主调函数}
}/**************************键盘扫描测试主函数
**************************/
void main(void)
{unsigned char key,nok;init_com(); //串口初始化nok=0;while(1){key=keyscan();if(key!=0xff){BEEP=0;com_send_dat(key+0x30);delay_ms(20);BEEP=1;}if(OPEN==0) //如果从里面按下了开关则发送一个字符串{com_send_dat('Y');com_send_dat('E');com_send_dat('S');com_send_dat('O');com_send_dat('P');com_send_dat('E');com_send_dat('N');while(!OPEN);delay_ms(10);}}
}
单片机控制开门的代码
#include <STC12C5A60S2.h>#include <intrins.h>sbit IN1=P1^0; //霍尔传感器1
sbit IN2=P1^1; //霍尔传感器2
sbit OUT=P2^0; //门控制sbit RELAY=P2^1; //继电器
bit OFLAG = 0; //状态标记void Delay100ms(unsigned int t) //@11.0592MHz
{unsigned char i, j, k;while(--t){//_nop_();//_nop_();i = 5;j = 52;k = 195;do{do{while (--k);} while (--j);} while (--i);}
}void main(void){unsigned char i;P1M0=0xff; //高阻输入P1M1=0xff;//P2M0=0x00; //推挽输出//P2M1=0xff;IN1=1;IN2=1;OUT=1;RELAY=1;while(1){if(IN1==0 && OFLAG==0){OUT=0; //开门OFLAG=1; //标志一下现在状态是开门for(i=0;i<9;i++){RELAY=0;Delay100ms(3);RELAY=1;Delay100ms(3);}RELAY=1;OUT=1;}else if(IN2==0){OFLAG=0;}}
}
电路图如下:
最新文章
- 什么内网和外网
- uniapp权限(Android权限)
- 程序员的情感修养 —— 专访“非诚勿扰”牵手成功男嘉宾程序员石川
- 【转】解决shiro的Principal属性动态修改无效问题
- 动态改变shiro的Principal属性
- 一篇不错的关于VSS的入门介绍
- 解答:为什么要搭建企业论坛?如何快速搭建?
- 2009奥巴马的秋季开学演讲稿
- Hashtable简述
- SpringSecurity原理:探究SpringSecurity运作流程
- CLion 插件
- Matlab中interp2和interpn的差异
- pip执行指令后报语法错误sys.stderr.write(f”ERROR: {exc}”)解决办法
- int.TryParse 方法
- (Python)异常处理try...except、raise
- 数据挖掘——机器学习
- 2022年执法资格刑侦执法考试多选题专项训练题及答案