52单片机制作打卡考勤+测温一体系统(含后端管理平台)

52单片机制作打卡考勤+测温一体系统(含后端管理平台)

技术要求

  1. python+flask+tcp基础(管理系统后端代码)
  2. angular(管理系统前端代码)
  3. C基础(单片机代码,主要涉及:iic,tcp,lcd1602总线,串口,中断)
  4. 数据库MySQL

!如果你是直接运行代码,不要忘记先建数据库哦。

代码整体包含以下部分:

  1. MFRC522射频模块调用;
  2. MLX90614测温模块调用;
  3. 52单片机串口的调用;
  4. ETH-01串口以太网模块(基于TCP协议)的使用;
  5. flask+mysql打造后端服务器;
  6. angular前端。
另外的一些小建议!!!!

这个项目其实很基础,用到的单片机知识你在开发版上几乎都能看见Flask也比较基础(主要就是负责转发信息、接口回复)。但是由于只有关键代码有注释、或者你只是单片机初学者,建议从阅读我的AT89C51单片机制作密码锁一文开始,密码锁真的是个打基础的好东西,可以更加有兴趣的学习起来。所以如果你是初学python 的话,建议先看我另一篇有关于pygame模块写一个2D迷宫游戏的列子,你能学到库的调用查询、类的使用、以及一些小技巧。
这份代码可以二次使用的地方很多,很多代码都是我以前写过直接copy过来的。你能从中找到很多需要的模块式代码,比如在后台管理功能中:xls读取生成,简单爬虫,文件下载上传,sql对象快速生成,时间格式的前后端交互技巧,登录密匙的生成重置小技巧等等…

单片机部分(我按照模块来陈述,也方便大家循序渐进)

MFRC522射频模块

我有写一篇专门的文章介绍->传送门

 
void SysInit(void)
{
    
    PcdReset();				//复位RC522
    PcdAntennaOff(); 	 	//关天线 		
    PcdAntennaOn();  		//开天线
	M500PcdConfigISOType('A'); //寻卡模式
}

MLX90614测温模块调(相关手册后续发上来,资料在学校)

这个接口相对简单,如果使用过红外线模块的同学,代码基本都可以复用。
参照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协议)

当然我也写有一篇相关文章->有关于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;
	}
}

1602或者是12864的使用就不赘述了,读者可以看看购买的开发板提供的代码、或者尝试的实例代码。

主程序

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
52单片机制作打卡考勤+测温一体系统(含后端管理平台)_第1张图片

最后展示,管理端页面(python+flask+angular)

52单片机制作打卡考勤+测温一体系统(含后端管理平台)_第2张图片

单片机部分的代码

码云

你可能感兴趣的:(python,单片机,#,flask,python,单片机,数据库,angular2,mysql)