51單片機-溫度控制器設(shè)計詳解+電路+代碼
單片機通過引腳輸出 1 0來實現(xiàn)控制外圍電路,以P1^0[P1端口的第1位引腳]為例,當(dāng)P1^0輸出1的時候,引腳會產(chǎn)生一個5V的高電平.當(dāng)P1^0輸出0的時候,引腳會產(chǎn)生一個0V的低電平
注:繼電器原理圖來自百度百科->http://baike.baidu.com/view/39560.htm繼電器原理:當(dāng)控制電路兩端有電流通過時,電和金屬發(fā)生電磁感應(yīng),使得銜鐵被磁力吸引而控制工作電路的開關(guān)
實物圖和電路原理圖基本一致,這個大家不用擔(dān)心
下面是main.c 文件: #define EEPROM_StartAddr 0x4E typedef struct EEPROM_DataList//EEPROM數(shù)據(jù)結(jié)構(gòu) uint get_temp(); void CtrlPort(int PortCode,int Ctrl); sbit Beep=P3^4; // 測試用,可略 sbit CtrlPort1=P1^0; CTRL_TOTAL ListTotal; LED=1; if (BitData!=EEPROM_StartFlag){while(1);} // 卡住它,不要讓它重新運行 while(1) void CtrlPort(int PortCode,int Ctrl)//控制P1.0-P1-7
#include
#define uchar unsigned char
#define uint unsigned int
#define EEPROM_StartFlag 0xB0
/*
#define EEPROM_EndFlag 0xC0
#define EEPROM_EndAddr 0x4E+2+24 //8個數(shù)據(jù)總數(shù)x3個數(shù)據(jù)位
//EEPROM_EndAddr=0x4E+2+8x03 每個數(shù)據(jù)占3字節(jié)(兩個主要數(shù)據(jù)和一個NULL),0x49系獲得數(shù)據(jù)項目總數(shù)
*/
typedef int CTRL_TOTAL;//列表總項目
{
int AlarmTemp;//報警溫度
int CtrlPort; //控制端口
} CTRL_DATALIST;
void tmpchange(void);
void delayb(uint count);
void init();
void write_add(uchar address,uchar date);
uchar read_add(uchar address);
sbit LED=P2^7;
sbit CtrlPort2=P1^1;
sbit CtrlPort3=P1^2;
sbit CtrlPort4=P1^3;
sbit CtrlPort5=P1^4;
sbit CtrlPort6=P1^5;
sbit CtrlPort7=P1^6;
sbit CtrlPort8=P1^7;
CTRL_DATALIST CtrlList[8];
void delayb(uint count) ;
void main()
{
int BitData; // EEPROM位數(shù)據(jù)緩存
int i;// 計數(shù)循環(huán)變量
int TempData;// 當(dāng)前溫度值
int CtrlListPort;// 將要控制的引腳
int CtrlElec;// 將要控制的引腳輸出電平
init();
BitData=read_add(EEPROM_StartAddr);
// 關(guān)于EEPROM獲取數(shù)據(jù)信息可以從同文件夾中圖片有指導(dǎo)
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);
}
tmpchange();
for(i=0;i<=7;i++) CtrlPort(i,1);//輸出高電位
LED=0;//工作指示燈開啟
{
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);
}
}
{
switch(PortCode)
{
case 1: CtrlPort1=Ctrl;
case 2: CtrlPort2=Ctrl;
case 3: CtrlPort3=Ctrl;
case 4: CtrlPort4=Ctrl;
case 5: CtrlPort5=Ctrl;
case 6: CtrlPort6=Ctrl;
case 7: CtrlPort7=Ctrl;
case 8: CtrlPort8=Ctrl;
}
}
評論