电协考核工程报告
前言
这是当初加入实验室时考核工程的报告,顺便一起发上来,做的是联网可控的oled时钟。代码可见github[ALTdeveloper/ICEC_EnterTest: 电协考核 (github.com)]
摘要
本工程完成了电协考核题目中C题,以STC12C5A60S2作为主控,esp8266作为通信模块,ds1302作为时间掉电储存模块,以oled屏幕作为输出。可实现时间显示,正计时倒计时功能,掉电时间保存,无线更改时间。
关键词 时钟 无线 计时
项目内容
1.C51程序结构
库文件
#include <STC12C5A60S2.H>
#include "oled.h"
#include "Lazurit_eeC_rebulid1.h"
main()
|_oled初始化
|_等待8266授时
|_片上定时器初始化
while(1)
|_按键检测
|_按键一
|_正计时启动
|_按键二
|_倒计时初始化与启动
|_按键三
|_时间更改
Timer0_Routine()
|_计时
|_刷新oled时间区
Timer1_Routine()
|_正计时模式
|_时间增加
|_oled刷新
|_倒计时模式
|_时间减少
|_oled刷新
serial()
|_接收六个字符后更新时间
Lazurit_eeC_rebulid1.h
void UartInit(void)//串口初始化9600bps@11.0592MHz
void Timer0Init(void)//对定时器0初始化
void Timer1Init(void)//对定时器1初始化
void oled_flash(unsigned char work)//刷新oled
void oled_set_flash()//set状态下刷新oled
void countdown_reset(void)//倒计时初始化
void time_set(void)//时间设置
//OLED控制用函数
void OLED_WR_Byte(unsigned dat,unsigned cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(u8 x,u8 y,u8 no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
void Delay_50ms(unsigned int Del_50ms);
void Delay_1ms(unsigned int Del_1ms);
void fill_picture(unsigned char fill_Data);
void Picture();
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
void IIC_Wait_Ack();
//该库为oled商家提供,有部分函数没有在该项目使用,可优化减小程序尺寸
2.arduino程序结构
库文件
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <stdio.h>
#include <DS1302.h>
void setup()
|_ds1302初始化
|_io口初始化
|_串口调试和udp初始化
|_从ds1302读时间
|_串口发送给51
void loop()
|_等待udp
|_直接把时间给51
|_更新1302的时间
void udp2ds1302time(char udp_time[])
|_构造结构体,发送给ds1302
void time51_Init(void)
|_从模块获得时间结构体
|_拆分结构体组装成字符串
|_发送给51
void send_51time(int num[])
|_逐一发送字符给51
void time2anum(int time_num[], int target_num[])
|_把十位数转个位数
void setTime(void)
|_用结构体更新时间//该函数并没有启用
3.硬件接口
电木板子为手工走线,主要是为了调试起来比较方便,各模块不会乱七八糟的。
ds1302
电源 蜂鸣器
接口 接口
oled接口
初始化信号口
oled信号接口 串口
ds1302为5pin 最左侧vcc
电源接口 上侧vcc3.3v,下侧gnd
oled接口 上侧gnd
oled信号口 左侧scl右侧sda,对应51上p10和p11
蜂鸣器接口 上侧gnd,下侧接51上p00
初始化信号接口 接51的p17
串口 上侧为8266的rx下侧为8266的tx
操作手册
启动后等待8266连接WiFi,此时oled有提示。随后51将会被ds1302授时。按下按键1正计时启动,再次按下停止;按下按键2倒计时进入初始化,此时按下按键一倒计时时间增加,按下按键二倒计时时间减少(有防溢出功能),按下按键三开始倒计时,结束后蜂鸣器响,退出倒计时功能。按下按键三进入更改时间功能,此时按下按键一时间增加,按下按键二时间减少,可正常实现时间进位退位,按下按键三保存。
若想使用wifi更新时间功能,请向esp8266发送以下格式字符串
123456
代表 12时 34分 56秒
时间旁边的符号是专门画的,不是乱码,就是个装饰
异常操作可能导致的后果
1.不可在倒计时过程中启动正计时或倒计时功能,即按下按钮一、二,否则计时无法正常工作。
2.上述误操作可通过进入时间设置再退出解决
3.向8266发送错误格式的字符串将会导致51的时间显示错位,只能重启
4.请不要将vcc与gnd短接,核心板没有备份:)
后记
那块电木板子太小了,按钮没能集成上去,有点可惜。
不停的改了好多版本……版本控制是一件非常重要的事情