1,在指纹模块和DS1302时间模块基础上添加了DHT11温湿度检测功能,水位检测模块,继电器控制的加湿功能。
2,供电是通过DC5V供电给单片机
3,指纹模块通过AMS1117降压模块供电5V-3.3V,通过串口和单片机通信。
4,DS1302也是需要通过3.3V供电,时间功能可以通过单片机自带的计时器编写代码完成
5,DHT11的3引脚可以滞空,并且数据传输引脚可以不用加上拉电阻。
资料内涵视频+代码+原理图
实物图
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
资料内涵原理图+代码+运行视频
最后欢迎加入技术交流群:938456660可以与我交流
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include "buzz.h"
- #include "key.h"
- #include "uart.h"
- #include "delay.h"
- #include "FPM10A.h"
- #include "lcd_1602.h"
- #include "ds1302.h"
- sbit Data=P1^3;
- sbit beep=P2^7;
- sbit LED=P3^7;
- sbit jiashi=P1^4;
- sbit JDQ=P3^6;
- sbit SHUI=P3^4;
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- char DisplayData[16]=" - : : ";
- char DisplayData1[16]="Humi: %Temp: C";
- int wendu=0,shidu=0,cishu=0;
- void DHT11_delay_us(uchar n);
- void DHT11_delay_ms(uint z);
- void DHT11_start(void);
- u8 DHT11_rec_byte(void);
- void DHT11_receive(void);
- void datapros()
- {
- Ds1302ReadTime(); //反馈时间TIME
- DisplayData[1] = TIME[4]/16+0x30;
- DisplayData[2] = (int)(TIME[4]&0x0f)+0x30; //月
- DisplayData[4] = TIME[3]/16+0x30;
- DisplayData[5] = (int)(TIME[3]&0x0f)+0x30; //日
-
- DisplayData[7] = TIME[2]/16+0x30; //时
- DisplayData[8] = (int)(TIME[2]&0x0f)+0x30;
-
- DisplayData[10] = TIME[1]/16+0x30; //分
- DisplayData[11] = (int)(TIME[1]&0x0f)+0x30;
-
- DisplayData[13] = TIME[0]/16+0x30; //秒
- DisplayData[14] = (int)(TIME[0]&0x0f)+0x30;
- }
- void main()
- {
- u8 i;
- LCD1602_Init(); //初始化液晶
- Uart_Init(); //初始化串口
- Key_Init(); //初始化按键
- LED=0;
- while(1)
- {
- if(KEY_ENTER==0) //检测按键K1是否按下
- {
- Delay_Ms(10); //消除抖动 一般大约10ms
- if(KEY_ENTER==0) //再次判断按键是否按下
- {
- cishu++;
- while(!KEY_ENTER); //检测按键是否松开
- }
- }
-
- //----------------------------时间功能模块------------------------------------
- if(cishu==1)
- {
- LCD1602_Display(0x80,"Fingerprint Test",0,16); //液晶开机显示界面
- datapros(); //数据处理函数
- LCD1602_WriteCMD(0x80+0x40);
- for(i=0;i<16;i++)
- {
- LCD1602_WriteDAT(DisplayData[i]);
- }
- }
-
- //---------------------------指纹模块功能------------------------------------
- if(cishu==2)
- {
- Delay_Ms(200); //延时500MS,等待指纹模块复位
- Device_Check(); //校对指纹模块是否接入正确,液晶做出相应的提示
- Delay_Ms(1000); //对接成功界面停留一定时间
- while(1)
- {
- if(KEY_ENTER==0) //检测按键K1是否按下
- {
- Delay_Ms(10); //消除抖动 一般大约10ms
- if(KEY_ENTER==0) //再次判断按键是否按下
- {
- cishu++;
- while(!KEY_ENTER); //检测按键是否松开
- }
- }
- //--------------------------温湿度功能模块------------------------------------
- if(cishu==3)
- {
- while(1)
- {
- DHT11_receive();
- LCD1602_WriteCMD(0x01);
- LCD1602_WriteCMD(0x80);
- for(i=0;i<16;i++)
- {
- LCD1602_WriteDAT(DisplayData1[i]);
- }
- LCD1602_Display(0xc0,"H:70L:20H:30L:30",0,16);
- Delay_Ms(100);
- if(wendu<30)
- {
- LED=0;
- beep=~beep; //蜂鸣器声音很小
- Delay_Ms(200);
- LED=1;
- }
- else
- {
- LED=0;
- beep=0;
- }
- if(shidu<20)
- {
- if(SHUI==1){JDQ=1;}
- }
- else
- {
- JDQ=0;
- }
- }
- }
-
- //--------------------进入主功能界面------------------------------------
- LCD1602_Display(0x80," search finger ",0,16); //第一排显示搜索指纹
- LCD1602_Display(0xc0," Add delete",0,16); //添加和删除指纹
- if(local_date==0)
- {
- LCD1602_Display(0x80, " *",0,2);
- LCD1602_Display(0xc0, " ",0,2);
- LCD1602_Display(0xc0+8," ",0,2);
- }
- else if(local_date==1)
- {
- LCD1602_Display(0x80, " ",0,2);
- LCD1602_Display(0xc0, " *",0,2);
- LCD1602_Display(0xc0+8," ",0,2);
- }
- else if(local_date==2)
- {
- LCD1602_Display(0x80, " ",0,2);
- LCD1602_Display(0xc0, " ",0,2);
- LCD1602_Display(0xc0+8," *",0,2);
- }
- //确认键
- if(KEY_OK == 0)
- {
- while(KEY_OK == 0);//等待松开按键
- switch(local_date)
- {
- case 0: //搜索指纹
- FPM10A_Find_Fingerprint();
- break;
-
- case 1: //添加指纹
- FPM10A_Add_Fingerprint();
- break;
-
- case 2: //清空指纹
- FPM10A_Delete_All_Fingerprint();
- break;
- }
- }
- //切换键
- if(KEY_DOWN == 0)
- {
- while(KEY_DOWN == 0); //等待松开按键
- if(local_date<=2)
- {
- local_date++;
- if(local_date==3)
- local_date=0;
- }
- }
- Delay_Ms(100); //延时判断100MS检测一次
- }
- }
- }
- }
- void DHT11_delay_us(uchar n)//延迟函数
- {
- while(--n);
- }
- void DHT11_delay_ms(uint z)//延迟函数
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()//开始
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20);
- Data=1;
- DHT11_delay_us(30);
- }
- u8 DHT11_rec_byte()
- {
- uchar i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!Data);
- DHT11_delay_us(8);
- dat<<=1;
- if(Data==1)
- dat+=1;
- while(Data);
- }
- return dat;
- }
- void DHT11_receive()
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0); //等待数据
- DHT11_delay_us(40); //延时80us
- R_H=DHT11_rec_byte(); //湿度高位
- R_L=DHT11_rec_byte(); //湿度低位
- T_H=DHT11_rec_byte(); //温度高位
- T_L=DHT11_rec_byte(); //温度低位
- revise=DHT11_rec_byte(); //获取数据
- DHT11_delay_us(25); //延时
- if((R_H+R_L+T_H+T_L)==revise) //校验
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- shidu=RH;
- wendu=TH;
- DisplayData1[5]=shidu/10+0x30;
- DisplayData1[6]=shidu%10+0x30;
- DisplayData1[13]=wendu/10+0x30;
- DisplayData1[14]=wendu%10+0x30;
- }
- }
复制代码
代码+PCB+原理图:
原理图+代码+视频.rar
(7.27 MB, 下载次数: 145)
|