这个项目其实很基础,用到的单片机知识你在开发版上几乎都能看见、Flask也比较基础(主要就是负责转发信息、接口回复)。但是由于只有关键代码有注释、或者你只是单片机初学者,建议从阅读我的AT89C51单片机制作密码锁一文开始,密码锁真的是个打基础的好东西,可以更加有兴趣的学习起来。所以如果你是初学python 的话,建议先看我另一篇有关于pygame模块写一个2D迷宫游戏的列子,你能学到库的调用查询、类的使用、以及一些小技巧。
这份代码可以二次使用的地方很多,很多代码都是我以前写过直接copy过来的。你能从中找到很多需要的模块式代码,比如在后台管理功能中:xls读取生成,简单爬虫,文件下载上传,sql对象快速生成,时间格式的前后端交互技巧,登录密匙的生成重置小技巧等等…
我有写一篇专门的文章介绍->传送门
void SysInit(void)
{
PcdReset(); //复位RC522
PcdAntennaOff(); //关天线
PcdAntennaOn(); //开天线
M500PcdConfigISOType('A'); //寻卡模式
}
这个接口相对简单,如果使用过红外线模块的同学,代码基本都可以复用。
参照MLX90614官方给出的实例代码,照葫芦画瓢。咋们拿上来直接用!
特别强调member_read函数,大家可以自己写一写,因为写法并不固定.。
//************函数声明*****************************************
void Init_IIC();
void start_bit(); //MLX90614 发起始位子程序
void stop_bit(); //MLX90614 发结束位子程序
uchar rx_byte(void); //MLX90614 接收字节子程序
void send_bit(void); //MLX90614 发送位子程序
void tx_byte(uchar dat_byte); //MLX90614 接收字节子程序
void receive_bit(void); //MLX90614 接收位子程序
void delay(uint N); //延时程序
uint memread(void); //读温度数据
void delay1ms(uint c) //误差 0us
{
unsigned char a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void Init_IIC(void)
{
SCL=1;SDA=1;_nop_();
_nop_();_nop_();_nop_();
SCL=0;
delay(1000);
SCL=1;
}
//************************************
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//---------发送一个字节---------
void tx_byte(uchar dat_byte)
{
char i,n,dat;
n = Nack_counter;
TX_again:
dat = dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
bit_out = 1;
else
bit_out = 0;
send_bit();
dat = dat<<1;
}
receive_bit();
if(bit_in==1)
{
stop_bit();
if(n!=0)
{n--;goto Repeat;}
else
goto exit;
}
else
goto exit;
Repeat:
start_bit();
goto TX_again;
exit: ;
}
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==0)
SDA = 0;
else
SDA = 1;
_nop_();
SCL = 1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL = 0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//----------接收一个字节--------
uchar rx_byte(void)
{
uchar i,dat;
dat = 0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//----------接收一个位----------
void receive_bit(void)
{
SDA = 1;
bit_in = 1;
SCL = 1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in = SDA;
_nop_();
SCL = 0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//------------延时--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
_nop_();
}
//------------------------------
//------------------------------
uint memread(void)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x07); //Send Command
//------------
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
temp1[0] = DataH;
temp1[1] = DataL;
return(DataH*256+DataL);
}
当然我也写有一篇相关文章->有关于ETH-01串口以太网模块的使用详情
原理是:单片机一端通过串口发送数据给网络模块,网络模块另一端连接着上位机(占用某一个端口),tcp协议下是监听模式(我有一篇关于python做监听的文章以供参考,使用python做一个简单的WiFi连接监视),后端服务器时刻监听是否有数据通过这个端口发送过来。
/*
* UART初始化
* 波特率:9600
*/
void UART_init(void)
{
//PCON &= 0x7F; //波特率不倍速
SCON = 0x50; // 10位uart,允许串行接受
TMOD = 0x20; //T1工作模式2 8位自动重装
TH1 = 0xfd;
TL1 = 0xfd; //比特率9600
TR1 = 1; //启动T1定时器
SM0 = 0;
SM1 = 1; //串口工作方式1 10位异步
REN = 1; //串口允许接收
EA = 1; //开总中断
ES = 1; //串口中断打开
}
/*
* UART 发送一字节
*/
void UART_send_byte(unsigned char dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
/*
* UART 发送字符串
*/
void UART_send_string(unsigned char *buf)
{
while (*buf != '\0')
{
UART_send_byte(*buf++);
}
}
void SysInit(void)
{
PcdReset(); //复位RC522
PcdAntennaOff(); //关天线
PcdAntennaOn(); //开天线
M500PcdConfigISOType('A'); //寻卡模式
}
void UART() interrupt 4
{
if(RI) //检测是否接收完成
{
num = SBUF; //num 取出接收缓存器的值 ,判断打卡是否成功
//P1 = SBUF;
if(num == 0){
LCD1602_Dis_Str(1,0,"you are failed");
beep = 0;
delay1ms(1200);
beep = 1;//蜂鸣器发出滴提示音
}
RI = 0;
//SBUF = num;
//while(!TI);
//TI = 0;
}
}
main()
{
unsigned int Tem,account;// 存温度
UART_init(); //串口初始化
//Init_ST7920(); //LCD12864初始化
Init_LCD1602(); //1602初始化
SysInit(); //RC522初始化
// 初始化iic
Init_IIC();
while(1)
{
// 测温
Tem = memread();
temp1[0] = Tem/256;
temp1[1] = Tem%256;
//Tem = 0x27AD;
display(Tem);
//LCD1602_Dis_Str(1,0,temperature);
LCD1602_Dis_OneChar(1,0,temperature[0]);
LCD1602_Dis_OneChar(2,0,temperature[1]);
LCD1602_Dis_OneChar(3,0,temperature[2]);
LCD1602_Dis_OneChar(4,0,temperature[3]);
LCD1602_Dis_OneChar(5,0,temperature[4]);
LCD1602_Dis_Str(1,1,"clipe card");
if (PcdRequest(0x52, Temp) == MI_OK)
{
beep = 0;
if (PcdAnticoll(UID) == MI_OK)
{
//开始发送
//UART_send_byte(UID[0]);
//UART_send_byte(UID[1]);
//UART_send_byte(UID[2]);
//UART_send_byte(UID[3]);
u16ToString(UID,str,4);
//UART_send_string(str);
LCD1602_Dis_Str(1,1,str);
//u16ToString(temp1,tempStr,2);
for(account=0;account<8;account++){
Assic[account] = str[account];
}
u16ToString(temp1,str,2);
Assic[8] = '&';
Assic[9] = str[0];
Assic[10] = str[1];
Assic[11] = str[2];
Assic[12] = str[3];
UART_send_string(Assic);
//UART_send_string(str);
//UART_send_string(temperature);
}
if (PcdSelect(UID) == MI_OK)
{
//UART_send_byte(0x67);
}
}
delay1ms(900);
beep = 1;//蜂鸣器发出滴提示音
}
}
后端这一块,用过Flask的同学应该蛮熟悉的。简单的接受GET、POST请求,存库取库并不复杂,没有相关基础的同学,也别着急。
我是这么推荐的:1. 先弄懂怎么写一个请求(也推荐一个有意思项目,快速爬取千张高清壁纸);2. flask是一个框架,我们用的不深,所以上手起来难度并不大。
有一份flask最小框架的代码提供给大家参考:github
码云