这个51单片机电路里边,需求用到:
下面是EEPROM里边的数据贮存结构[嘻嘻,图像得有点欠好,技术问题请见谅啦..]
首先从主控进口代码处进行剖析:
#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端通路.原理如下