功能描述
带周定时功能
编程模式
编程功能说明
1.编程功能简单来说就是一天内的每一个小时可以单独设置温度和加热的模式.
2.加热模式分为全功率模式,半功率模式,防霜冻模式,关闭加热模式.
每一个时间点的模式通过下图的格子显示出来.
功能实现
1.如何储存?
模式的储存
由于这款产品的单片机RAM容量只有256字节,又要带WIFI控制,于是只能用省空间的办法来完成咯.
已知加热模式有四个,分别是:全功率模式,半功率模式,防霜冻模式,关闭加热模式。那我们可不可以用一个字节里面的高2位来表示呢?答案是当然可以。我们可以列一个表格来说明。
00xxxxxx | 01xxxxxx | 10xxxxxx | 11xxxxxx |
---|---|---|---|
关闭加热 | 防霜冻模式 | 半功率模式 | 全功率模式 |
通过上述的表格我们可以知道加热模式可以用高两位来表示。
加热温度的储存
已知用户设置的加热温度为5度到50度,用二进制来表示就是 101- 110010 ,好,又知道了用户可设定最高温度的二进制为110010 ,它用了6位,刚好加上模式的2位就够8位了,也就是一个字节。
xx000101 | xx110010 |
---|---|
最低温度 →→→→→ | 最高温度 |
2.程序实现
通过上面的思路,我们知道了一小时的状态情况可以用一个字节取表示,那一天呢是不是24,换句话来说一天的状态要用24字节来储存,那一个星期呢,247等于168字节。但是这对于只有256字节RAM的渣渣单片机来说实在是太大了。于是我们只能够用外挂EEPROM的方式来储存一个星期的数据,单片机上我们只要处理好一天的数据就可以了。其他6天的数据我们可以通过读取EEPROM的方式来实现。3.程序代码
1.先新建一个数组 PROG_DATA
unsigned char PROG_DATA[25]; //PROG数据 前2位存模式 后6位存温度
2.新建一个支持0-24小时温度设置的子程序
void SET_PROG_TEMP_ONE_DATA(unsigned char TIME,unsigned char TEMPERATURE) //TIME为小时 TEMPERATURE为温度 { unsigned char TEMP_DATA; TEMP_DATA=(PROG_DATA[TIME]&0b11000000); PROG_DATA[TIME]=TEMP_DATA|TEMPERATURE; }
3.新建一个支持设置0-24小时模式的子程序
/***************************** 函数名称:SET_PROG_ONE_DATA() 函数功能:一个时的温度时间处理 值传递:无 返回值:无 MODE 0=空 1=防霜冻 2=半功率 3=全功率 0-50 ***************************/ void SET_PROG_MODE_ONE_DATA(unsigned char TIME,unsigned char MODE) { unsigned char TEMP_DATA; TEMP_DATA=PROG_DATA[TIME]&0b00111111; //分离出来 PROG_DATA[TIME]=(MODE<<6)|TEMP_DATA; //结合 /*//显示函数 switch ((PROG_DATA[TIME]>>6)&0xff) { case 0: UPPER_BAR_ON_OR_OFF(TIME,0); DOWNER_BAR_ON_OR_OFF(TIME,0) ; break; case 1: UPPER_BAR_ON_OR_OFF(TIME,0); DOWNER_BAR_ON_OR_OFF(TIME,1) ; break; case 2: UPPER_BAR_ON_OR_OFF(TIME,1); DOWNER_BAR_ON_OR_OFF(TIME,0) ; break; case 3: UPPER_BAR_ON_OR_OFF(TIME,1); DOWNER_BAR_ON_OR_OFF(TIME,1) ; break; default: break; } */ }
4.新建读取加热模式和读取温度函数
///输入时间返回温度 unsigned char GET_PROG_ONE_TEMPERATURE(unsigned char TIME) { if((PROG_DATA[TIME]&0b00111111)==0) { return 28; } else { return (PROG_DATA[TIME]&0b00111111); } } ///输入时间返回加热模式 unsigned char GET_PROG_ONE_MODE(unsigned char TIME) { return (PROG_DATA[TIME]&0b11000000)>>6; }
5.显示函数
void POST_DAT_TO_LCD() { unsigned char ttt; for (ttt=0; ttt<=24; ttt++) { switch ((PROG_DATA[ttt]>>6)&0xff) { case 0: UPPER_BAR_ON_OR_OFF(ttt,0); DOWNER_BAR_ON_OR_OFF(ttt,0) ; break; case 1: UPPER_BAR_ON_OR_OFF(ttt,0); DOWNER_BAR_ON_OR_OFF(ttt,1) ; break; case 2: UPPER_BAR_ON_OR_OFF(ttt,1); DOWNER_BAR_ON_OR_OFF(ttt,0) ; break; case 3: UPPER_BAR_ON_OR_OFF(ttt,1); DOWNER_BAR_ON_OR_OFF(ttt,1) ; break; default: break; } } }