电协考核工程报告


电协考核工程报告

前言

这是当初加入实验室时考核工程的报告,顺便一起发上来,做的是联网可控的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短接,核心板没有备份:)

后记

那块电木板子太小了,按钮没能集成上去,有点可惜。

不停的改了好多版本……版本控制是一件非常重要的事情


  目录