51單片機(jī)-溫度控制器設(shè)計(jì)詳解+電路+代碼
下面是EEPROM里面的數(shù)據(jù)儲(chǔ)存結(jié)構(gòu)[嘻嘻,圖畫(huà)得有點(diǎn)不好,技術(shù)問(wèn)題請(qǐng)見(jiàn)諒啦..]
本文引用地址:http://www.ex-cimer.com/article/201612/324239.htm首先從主控入口代碼處進(jìn)行分析:
#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; 代碼首先會(huì)從EEPROM里面讀取0x4E位里面的數(shù)據(jù)來(lái)和EEPROM起始數(shù)據(jù)位標(biāo)志進(jìn)行對(duì)比,判斷這個(gè)EEPROM的數(shù)據(jù)格式的正確性,由于沒(méi)有讓 主控芯片對(duì)每一個(gè)數(shù)據(jù)位進(jìn)行校驗(yàn),那么這就是一個(gè)簡(jiǎn)單的驗(yàn)證方法,要是對(duì)每一位數(shù)據(jù)都要進(jìn)行的驗(yàn)證的話得需要一個(gè)可靠,高效的算法,這樣雖 然安全,不過(guò)會(huì)對(duì)主控芯片初始化有一定的性能影響 判斷起始數(shù)據(jù)位失敗后,主控芯片會(huì)進(jìn)入到卡死狀態(tài)[見(jiàn)代碼 while(1); ,死循環(huán),處理器永遠(yuǎn)也跳不出這個(gè)循環(huán)到外面] 判斷起始數(shù)據(jù)位成功后,下一步就從EEPROM的0x4F位讀取出需要控制溫度的項(xiàng)目總數(shù),然后再按照這個(gè)項(xiàng)目總數(shù)來(lái)進(jìn)行數(shù)據(jù)位偏移來(lái)讀取將要 控制的溫度數(shù)值和警報(bào)控制端口,注意兩個(gè)控制數(shù)據(jù)結(jié)構(gòu)中間需要用一個(gè)NULL[即0x00]來(lái)隔開(kāi)來(lái),防止數(shù)據(jù)結(jié)構(gòu)被打亂 從EEPROM里面讀取完成數(shù)據(jù)后,主控芯片工作指示燈發(fā)光,開(kāi)始進(jìn)入溫度控制 主要代碼: while(1) { TempData=get_temp(); BitData=(TempData%1000/100)*10;//十位溫度。 BitData=(TempData%1000%100/10)+BitData;//個(gè)位溫度。 for(i=0;i { CtrlElec=(CtrlList[i].AlarmTemp>=BitData)?0:1; CtrlListPort=CtrlList[i].CtrlPort; CtrlPort(CtrlListPort,CtrlElec); //符合條件輸出底電,不符合輸出高電 delayb(100); } delayb(200); } 這個(gè)可不像SetTimer()一樣,用SetTimer()指定了的函數(shù)不需要加上while 循環(huán),僅且把上面的代碼當(dāng)作線程來(lái)看待,讓這個(gè)線程運(yùn)行的代碼段永遠(yuǎn) 都是這個(gè),假如線程的代碼一旦執(zhí)行完畢[也就是說(shuō)跳出了while 死循環(huán)],那么它就會(huì)關(guān)閉掉自己和釋放屬于自己的TLS[線程本地儲(chǔ)存] 先從DS18B02里面讀取出來(lái)溫度值,然后再對(duì)溫度進(jìn)行轉(zhuǎn)換,把轉(zhuǎn)換好的溫度再和從EEPROM里面讀取出來(lái)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行比較 一個(gè)溫度控制判斷周期約一秒[以12MHz來(lái)計(jì)算的話,應(yīng)該是略大于一秒而不會(huì)小于一秒].. 下面是溫度控制器的電路: 5V供電電路: 主控芯片及外圍器件電路: 電路中用繼電器來(lái)控制外部電路的開(kāi)閉,G[公共端] B[常閉端] K[常開(kāi)端] 就是讓繼電器控制外部電路的開(kāi)關(guān),5V電壓和P1^0端口是用來(lái)控制繼電器的G端和B,K端通路.原理如下
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論