这次主要写的是对硬件的一些了解与大体思路,也算是笔记吧。
文末有资料与源代码的下载地址。也有视频演示地址。
本实验的硬件材料为:
STM32f103C8T6最小系统,共阴数码管,74HC595芯片,JQ5600语音模块,0.5W8R喇叭,ESP8266-01SWIFI模块,ds1307模块,按键。
软件为:keil5。
实验目的是做一个可以通过WIFI自动校时+语音报时可调时钟,并且每次掉电之后还会自动计时保证在掉电和没有WiFi的时候也能准确的显示时间。
STM32f103C8T6最小系统包含3个通用16位定时器;
2个IIC接口(支持SMBus/PMBus);
3个USART接口(使能USART2和USART3时钟不同于USART1),满足本实验的要求。
本次实验使用了两个0.56英寸的4位数码管(型号05641A)和一个0.8英寸的4位带时钟数码管(型号8402AS),对应引脚图如下:
两个0.56英寸的4位数码管用来显示WiFi连接情况、星期、月份和日期,0.8英寸的4位带时钟数码管用来显示时间。有两位数码管没有用到。
如果你需要控制一位数码管,那么你需要控制8个不同的引脚输出不同的高低电平来让每一段高亮或者暗,硬件上很占资源;从软件程序上来看,要让这么一位数码管显示不同的数字字母就要给8个GPIO分别GPIO_Setbit()和GPIO_Resetbit(),更别说还要控制总共12位数码管,那这个时候就可以用74HC595这个串行输入并行输出的移位缓存器了。
74hc595内部有锁存器显示,所以显示很稳定,亮度高,无频闪,成本低(我买的几毛钱一个还包邮),比用三极管控制的节约成本,减少IO口占用,电路简单,利于集成化、模块化,且可以无限级联扩展。
我这里采用的是3块74HC595芯片级联来控制总共12位数码管,总共才占用6个IO口。
先看74HC595芯片引脚图:
下面是我的连接图:
时钟数码管的7、8引脚分别接地和IO口。
如果需要进一步控制亮度的话就把13 脚引出用PWM的方法进行亮度控制(网上查的,因为我已经焊好就没有试验了)。
JQ6500是一个提供串口的MP3芯片,完美的集成了MP3、WMV的硬解码 。同时软件支持TF卡驱动,支持电脑直接更新spi flash的内容,支持 FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及调节播放等功能,无需繁琐的底层操作,使用方便,稳定可靠,成本低。
我是事先准备好的报时语音内容,再通过电脑直接更新spi flash的内容。另外并联了两个0.5W8R的喇叭。
引脚图:
连接图:
串口连接方式:
ESP8266-01S是wifi串口模块,功能简单来讲就是:从wifi接收到数据,串口输出;从串口接收数据,wifi输出数据。
ESP8266-01S一般默认的波特率为115200。刚刚买来的一般也是刷好了AT固件的(如需深入了解请自行查找资料),直接用就可以了。
设置好波特率就可以用串口发送AT指令来获取网络时间了(想具体了解ESP8266-01SAT指令和网络时间可以自行查找资料,这里不再赘述)。
1.使用串口发送指令AT+CWMODE=1设置模块Wi-Fi应用模式为Station模式;
2.发送指令AT+RST重启模块使应用模式更改生效;
3.发送指令AT+CWJAP =”ssid”,”pwd”连接AP;
4.发送指令AT+CIPMUX=0设置模块为单路连接模式,模块默认为单路连接模式;
5.发送指令AT+CIPSTART=”TCP”,”api.k780.com”,80 与服务器建立TCP连接 ;
6.发送指令AT+CIPMODE=1设置模块传输模式为透传模式;
7.发送指令AT+CIPSEND开启透传模式向服务器发送数据,模块收到此指令后先换行后返回“>”;
8.接下来就只需要发送 GET http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1\r\n,就能获取到北京时间的年月日星期时间。
**退出透传模式只要发送+++,不用发送新行(程序里面不用加\r\n)
写程序时值得注意的是 \" 才是" ,\\才是反斜杠。
接线图:
为了保证在掉电或WiFi信号不好以及没有WiFi时能够准确的显示时间,我采用ds1307来计时,并读取ds1307的数据显示。
DS1307是低功耗、提供IIC接口、日历和时钟数据、按BCD码存取的时钟/日历芯片。它提供秒、分、小时、星期、日期、月和年等时钟日历数据,并具有闰年补偿功能。计年上限2100。AM/PM 标志位决定时钟工作于24小时或12小时模式。芯片有一个内置的电源感应电路,具有掉电检测和电池切换功能。
只需要接VCC、GND、IIC四个引脚即可使用。要注意刚拿到ds1307模块要进行初始化才能正常使用(我的ds1307模块是这样)。
四个按键的一端分别与4个IO口相连,另一端接地,配置为“上拉输入”方式,按键松开时为高电平,按键按下时为低电平。
第一个按键的功能:选择要调那一位数据(星期、月份、日期、小时、分钟),按下后会闪烁选择的数据。
第二个按键的功能:没按下第一个按键前的功能是WiFi模块初始化,如果WiFi模块出现死机或其他情况可以进行初始化;当按下第一个按键之后是对应闪烁的数据加一。
第三个按键的功能:没按下第一个按键前的功能是选着连接哪一个WiFi(以防万一我设置了两个WiFi可以连接),当按下之后第一和第二个按键是选择连那个WiFi(当然WiFi是事先设置好的);当按下第一个按键之后是对应闪烁的数据减一。
第四个按键的功能:没按下第一个按键前的功能是自动校时(按下自动校时);当按下第一个按键之后是退出选择。
时钟基本实现所想功能,当然加一些判断就可以实现闹钟功能,我就没做了。
还有就是一直有个bug我不能理解:
每次用完WiFi就要关闭串口中断,不然就进入hard_fault死循环,通过keil的软件仿真我也没找出具体原因!!!也希望有大佬可以发现问题可以告诉我。
下面附上资料与源代码(两个链接下载的资料都一样):
1、https://download.csdn.net/download/cmlwt_ybz/12430148(博客下载链接)
2、 链接:https://pan.baidu.com/s/1olrRmViq3eXtS-jxKEi77A(网盘下载链接)
提取码:pxlq
视频演示地址:https://www.bilibili.com/video/BV1JZ4y1p7qp