目录:
注:本文仅用于学习分享,分享自己DIY红外进出门提醒计数器+语音+RTC[第一次发CSDN[后期整理],若有不妥之处,请指正,感谢]
用到的工具有:
- 程序 IAR编译器环境
- altium designer 原理图
- altium designer PCB
实现的小功能有:
①能通过外部两个红外对管记人数并在OLED上显示 粗略计数人数
②能通过外部两个红外对 判断人进入或出去,并发出语音提示
ag:人进门:[语音]欢迎光临;人出门:[语音]谢谢惠顾
③语音整点报时
④OLED上显示实时时间包括:年-月-日-星期-时-分-秒
总体设计
1.基础硬件DIY设计
2.单片机程序设计
3.效果展示
1.基础硬件DIY设计
电路硬件:
[MCU]STM8S003P
[外部RTC]PCF8563
[语音模块]MY2490
[屏幕]0.96寸12864 OLED
1)整体原理图
2)外部RTC[PCF8563]电路
PCF8563芯片为IIC通信,SDA[5]与SCL[6]引脚需要上拉
RTC模块 多接一纽扣电池[3.0V],当整机断电时,纽扣电池为其提供电源,保证时钟还在运行。当单片机供上电时,读取数据为实时的时间,保证了断电时间还在继续运行。
3)PCB电路
4)3D_PCB
- TOP层
- BOTTOM层
2.单片机程序设计
1)PCF8563 I2C通信程序
//pcf8563.c [PCF8563 I2C通信]
#include "pbdata.h"
u8 time_buf[7];
typedef struct Time //时间信息 结构体全局变量
{
u8 year;
u8 month;
u8 week;
u8 day;
u8 hour;
u8 minite;
u8 second;
};
void PCF8563_WriteByte(u8 addr,u8 dt)
{
I2C_Start();//启动信号
I2C_Send_Byte(PCF8563_ADDRESS);
I2C_Wait_Ack();
I2C_Send_Byte((u8)(addr));
I2C_Wait_Ack();
I2C_Send_Byte(dt);
I2C_Wait_Ack();
I2C_Stop();
}
void PCF8563_SetTime(void)//PCF8563初始化设定初始时间
{
struct Time TIME={
0x18,0x10,0x06,0x21,0x21,0x53,0x30};//设置时间: 年->月->周->日->时->分->秒
//定义时间寄存器地址
PCF8563_WriteByte(0x02,TIME.second);
PCF8563_WriteByte(0x03,TIME.minite);
PCF8563_WriteByte(0x04,TIME.hour);
PCF8563_WriteByte(0x05,TIME.day);
PCF8563_WriteByte(0x06,TIME.week);
PCF8563_WriteByte(0x07,TIME.month);
PCF8563_WriteByte(0x08,TIME.year);
}
void PCF8563_GetTime(u8 *buf)//得到时间数据包
{
I2C_Start();
I2C_Send_Byte(PCF8563_ADDRESS);
I2C_Wait_Ack();
I2C_Send_Byte(0x02);
I2C_Wait_Ack();
I2C_Start();
I2C_Send_Byte(PCF8563_ADDRESS+1);//A3
I2C_Wait_Ack();
buf[0]=I2C_Read_Byte(