51单片机-温度控制器设计详解+电路+代码
下面是EEPROM里面的数据储存结构[嘻嘻,图画得有点不好,技术问题请见谅啦..]
本文引用地址:https://www.eepw.com.cn/article/201612/324239.htm首先从主控入口代码处进行分析:
#define EEPROM_StartAddr 0x4E
#define EEPROM_StartFlag 0xB0
LED=1;
BitData=read_add(EEPROM_StartAddr);
if (BitData!=EEPROM_StartFlag) while(1);
ListTotal=read_add(EEPROM_StartAddr+1);
for(i=0;i { CtrlList[i].AlarmTemp=read_add((EEPROM_StartAddr+2)+i*3); CtrlList[i].CtrlPort =read_add((EEPROM_StartAddr+2)+i*3+1); } LED=0; 代码首先会从EEPROM里面读取0x4E位里面的数据来和EEPROM起始数据位标志进行对比,判断这个EEPROM的数据格式的正确性,由于没有让 主控芯片对每一个数据位进行校验,那么这就是一个简单的验证方法,要是对每一位数据都要进行的验证的话得需要一个可靠,高效的算法,这样虽 然安全,不过会对主控芯片初始化有一定的性能影响 判断起始数据位失败后,主控芯片会进入到卡死状态[见代码 while(1); ,死循环,处理器永远也跳不出这个循环到外面] 判断起始数据位成功后,下一步就从EEPROM的0x4F位读取出需要控制温度的项目总数,然后再按照这个项目总数来进行数据位偏移来读取将要 控制的温度数值和警报控制端口,注意两个控制数据结构中间需要用一个NULL[即0x00]来隔开来,防止数据结构被打乱 从EEPROM里面读取完成数据后,主控芯片工作指示灯发光,开始进入温度控制 主要代码: while(1) { TempData=get_temp(); BitData=(TempData%1000/100)*10;//十位温度。 BitData=(TempData%1000%100/10)+BitData;//个位温度。 for(i=0;i { CtrlElec=(CtrlList[i].AlarmTemp>=BitData)?0:1; CtrlListPort=CtrlList[i].CtrlPort; CtrlPort(CtrlListPort,CtrlElec); //符合条件输出底电,不符合输出高电 delayb(100); } delayb(200); } 这个可不像SetTimer()一样,用SetTimer()指定了的函数不需要加上while 循环,仅且把上面的代码当作线程来看待,让这个线程运行的代码段永远 都是这个,假如线程的代码一旦执行完毕[也就是说跳出了while 死循环],那么它就会关闭掉自己和释放属于自己的TLS[线程本地储存] 先从DS18B02里面读取出来温度值,然后再对温度进行转换,把转换好的温度再和从EEPROM里面读取出来的数据结构进行比较 一个温度控制判断周期约一秒[以12MHz来计算的话,应该是略大于一秒而不会小于一秒].. 下面是温度控制器的电路: 5V供电电路: 主控芯片及外围器件电路: 电路中用继电器来控制外部电路的开闭,G[公共端] B[常闭端] K[常开端] 就是让继电器控制外部电路的开关,5V电压和P1^0端口是用来控制继电器的G端和B,K端通路.原理如下
评论