|
PCB圖
SCH圖
北方由于冬季較長,太陽能幾乎處于廢棄狀態(tài),于是自己用MCU作了這款簡易自動加熱熱控制器,本款加熱器還可以做其他方面如水溫,室內(nèi)測溫,各種家電設(shè)備測溫,測溫范圍0-100。很實用。
源程序更新:
太陽能熱水器智能控制,它以89C52單片機(jī)為核心,配合電阻型4檔水位傳感器、負(fù)溫度系數(shù)NTC熱敏電阻溫度傳感器、8255A擴(kuò)展鍵盤和顯示器件、驅(qū)動電路(電磁閥、電加熱、報警)等外圍器件, 完成對太陽能熱水器容器內(nèi)的水位、水溫測量、顯示等
全部源碼下載:
太陽能熱水器智能控制系統(tǒng)程序.rar
(2.84 KB, 下載次數(shù): 208)
2016-4-10 22:46 上傳
點擊文件名下載附件
以下是部分程序預(yù)覽:
- //太陽能熱水器智能控制系統(tǒng)程序:
- //定義頭文件和各個輸入管腳以及變量聲明
- #include <reg52.h>
- #include <absacc.h>
- #include <stdio.h>
- #include <intrins.h>
- #define uint unsigned int//定義變量類型名
- #define uchar unsigned char
- /*定義8255a字符型字位口*/
- #define DIGPORT XBYTE[0x1FFF]//PA口地址,位選碼地址
- #define WORDPORT XBYTE[0X3FFF]//PB口地址,斷選碼地址
- #define CCOM XBYTE[0X7FFFF]//控制字寄存器地址
- #define KPORT XBYTE[0X5FFF]//PC口,鍵盤掃描地址
- //DS1302_RST=1//定義DS1302時鐘芯片引腳操作
- #define Set_DS1302_RST DS1302_RST=1
- //DS1302_RST=0
- #define Clr_DS1302_RST DS1302_RST=0
- //DS1302_SDA=1
- #define Set_DS1302_SDA DS1302_SDA=1
- //DS1302_SDA=0
- #define Clr_DS1302_SDA DS1302_SDA=0
- //DS1302_SCLK=1
- #define Set_DS1302_SCLK DS1302_SCLK=1
- //DS1302_SCLK=0
- #define Clr_DS1302_SCLK DS1302_SCLK=0
- //定義讀時間控制字
- #define DS1302_SEC_Reg 0x80
- #define DS1302_MIN_Reg 0x82
- #define DS1302_HR_Reg 0x84
- #define DS1302_DATE_Reg 0x86
- #define DS1302_MONTH_Reg 0x88
- #define DS1302_DAY_Reg 0x8a
- #define DS1302_YEAR_Reg 0x8c
- #define DS1302_CONTROL_Reg 0x8e
- #define DS1302_CHARGER_Reg 0x90
- #define DS1302_CLKBURST_Reg 0xbe
- //全局變量
- //為了方便,我把個位和十位分開了
- uchar year1=0x88;
- uchar year0=0x88;
- uchar month=0x88;
- uchar date=0x88;
- uchar day=0x88;
- uchar hour=0x88;
- uchar minute=0x88;
- uchar second=0x88;
- /*定義P1口各管腳*/
- sbit L0=P2^0;
- sbit L1=P2^1;
- sbit L2=P2^2;
- sbit L3=P2^3;
- sbit K0=P2^4;
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- sbit Hig=P1^4;
- sbit DS1302_SDA=P1^5;//定義DS1302時鐘引腳與單片機(jī)引腳的連接
- sbit DS1302_SCLK=P1^6;
- sbit DS1302_RST=P1^7;
- /*聲明調(diào)用函數(shù)*/
- void inital(void);
- void timer1_svr(void);
- void display(void);
- void delay(uchar j);
- void DS1302_Write(uchar reg,uchar dat);
- uchar DS1302_Read(uchar reg);
- void DS1302_Init(void);
- void ReadTime(void);
- void WtTmCr();
- void LvRead();
- void TmRead();
- void key(void);
- uchar kbscan(void);
- void DS1302(void);
- void int0_int(void);
- void int1_int(void);
- /*定義調(diào)用存儲單元*/
- /*顯示緩沖區(qū)(依次為高位低位)*/
- uchar BUFFER[3]={0,0,0};
- uchar WTLV;//水位值
- uchar TMP;//水溫值
- uchar WTLVSET;//水位設(shè)定值
- uchar TMPSET;//水溫設(shè)定值
- uchar buf[4]={0,0,0,0};
- /*數(shù)碼管顯示編碼"0"-"9","A","-"*/
- uchar code TABLE[]={0x7B,0x30,0xEA,0xF8,0xB1,0xD9,0xDB,0x70,0xFB,0xF9,0xF3,0x80};
- main()
- {
- inital();//初始化中斷、定時器、I/O口
- kbscan();//鍵盤掃描
- key();//鍵盤處理
- TmRead();//讀取溫度
- LvRead();//讀取水位
- DS1302();//讀取時間
- display();//顯示
- }
- void inital()
- {
- P1_0= P1_1= P1_2=K0=0;//初始化外部驅(qū)動口
- DS1302_Init();
- EA=1;//開外部中斷
- IT0=1;//外部中斷下降沿觸發(fā)
- EX0=1;//允許外部中斷0
- Hig=1;P1.3輸出高電平
- TMOD=0x11;定時器工作于方式1
- TH1=0X8A;//定時器1賦初值
- TL1=0XD0;
- ET1=1;定時器1開定時中斷
- TR1=1;//開啟定時器1
- CCOM=0X80;//初始化8255A,送控制字,工作方式0
-
- }
- uchar kbscan(void)
- {
- uchar recode;
- if((KPORT&0X0F)!=0X0F) //若有鍵按下
- {
- delay(2); //延時抖動
-
- if((KPORT&0X0F)!=0X0F)
- {
- recode=KPORT;
- return(recode);
- }
- }
- else
- return(0);
- }
- void key(void)
- {
- uchar key;
- key=kbscan();
- delay(2);
- if(key==0x01)
- {
-
- P1_1=1;//上水
-
- }
- if(key==0x02) //設(shè)置水位
- {
- if(WTLVSET==4)
- WTLVSET=0;
- else
- WTLVSET+=WTLVSET;
- BUFFER[0]=WTLVSET;//顯示設(shè)置水位
- display();
-
- }
- if(key==0x04)//電加熱
- {
- P1_0=1;
- }
- if(key==0x08)//設(shè)置溫度
- {
- if(TMPSET>=80)
- TMPSET=30;
- else
- TMPSET=TMPSET+10;//增加十度
- BUFFER[0]=TMPSET; 顯示設(shè)置水溫
- display();
- }
- }
- void timer1_svr() interrupt 1
- {
- TH1=0X8A;//重新給定時器1賦值
- TL1=0XD0;
- Hig=!Hig;//充放電變換
- if(Hig)//充電開始時啟動定時器0
- {
- TL0=TH0=0X00;//定時器0賦初值0
- TR0=1;//啟動定時器0
- }
- }
- void int0_int(void) interrupt 0//外部中斷0,測水位
- {
- EX0=0;
- EX1=1;
- TR0=0;
- buf[0]=TL0;
- buf[1]=TH0;
- }
- void int1_int(void) interrupt 2//外部中斷1,測水溫
- {
- EX1=0;
- EX0=1;
- TR0=0;
- buf[2]=TL0;
- buf[3]=TH0;
- }
- void TmRead()//水溫值處理
- {
- uint val;
- val=buf[3]*256+buf[2];
- if(val<7549)
- TMP=97-int(val*8/1000);
- else
- if(val<20000)
- TMP=50-int(val/1000);
- else
- TMP=30-int(val*5/10000);
-
- }
- void LvRead()//水位值處理
- {
- if(buf[1]>60)
- {
- WTLV=1;//
- L3=0;L2=1;L1=1;L0=1;
- }
- else if(buf[1]>45)
- {
- WTLV=2;
- L3=1;L2=0;L1=1;L0=1;
- }
- else if(buf[1]>36)
- {
- WTLV=3;
- L3=1;L2=1;L1=0;L0=1;
- }
- else
- {
- WTLV=4;
- L3=1;L2=1;L1=1;L0=0;
- }
- }
- void WtTmCr()//水位、水溫控制
- {
- if(WTLV==4)
- P1_1=0;
- if(WTLV==1)
- P1_1=1;
- if(TMP>=TMPSET)
- P1_0=0;
- if(TMP<TMPSET&&hour==0x19)
- P1_0=1;
- }
- void display(void)
- {
- uchar i; //顯示緩沖區(qū)首址
- uchar delay; //顯示延時
- uchar disp; //顯示內(nèi)容
- uchar digit; //定義數(shù)碼管顯示位
- digit=0x0200;
- for(i=2;i>=0;i--)
- {
- if(BUFFER[i]>100) disp=BUFFER[i]%10+10;//顯示高位
- else disp=BUFFER[i]%10;
- DIGPORT=digit;
- WORDPORT=TABLE[disp];
- for(delay=0;delay<=200;delay++);
- digit=digit>>1;//顯示低位
- disp=BUFFER[i]/10;
- DIGPORT=digit;
- WORDPORT=TABLE[disp];
- for(delay=0;delay<=200;delay++);
- digit=digit>>1;
- }
- }
-
- void delay(uchar j)//延時程序
- {
- uchar a,b;
- for(a=0;a<j;a++)
- for(b=0;b<200;b++)
- ;
- }
- void DS1302()//時間程序
- {
- ReadTime();
- BUFFER[1]=second;
- BUFFER[2]=hour;
- }
- void DS1302_Write(uchar reg,uchar dat)//寫入時間
- {
- uchar i;
- Clr_DS1302_RST;
- _nop_();
- _nop_();
- Clr_DS1302_SCLK;
- _nop_();
- _nop_();
- Set_DS1302_RST;
- _nop_();
- _nop_();
- for(i=8;i>0;i--)
- {
- if(reg&0x01) Set_DS1302_SDA;
- else Clr_DS1302_SDA;
- _nop_();
- _nop_();
- Set_DS1302_SCLK;
- _nop_();
- _nop_();
- Clr_DS1302_SCLK;
- _nop_();
- _nop_();
- reg>>=1;
- }
- for(i=8;i>0;i--)
- {
- if(dat&0x01) Set_DS1302_SDA;
- else Clr_DS1302_SDA;
- _nop_();
- _nop_();
- Set_DS1302_SCLK;
- _nop_();
- _nop_();
- Clr_DS1302_SCLK;
- _nop_();
- _nop_();
- dat>>=1;
- }
- Clr_DS1302_RST;
- _nop_();
- _nop_();
- }
- uchar DS1302_Read(uchar reg)//讀取時間
- {
- uchar dat=0,i;
- Clr_DS1302_RST;
- _nop_();
- _nop_();
- Clr_DS1302_SCLK;
- _nop_();
- _nop_();
- Set_DS1302_RST;
- _nop_();
- _nop_();
- for(i=8;i>0;i--)
- {
- if(reg&0x01) Set_DS1302_SDA;
- else Clr_DS1302_SDA;
- _nop_();
- _nop_();
- Set_DS1302_SCLK;
- _nop_();
- _nop_();
- Clr_DS1302_SCLK;
- _nop_();
- _nop_();
- reg>>=1;
- }
-
- for(i=8;i>0;i--)
- {
- dat>>=1;
- if(DS1302_SDA) dat|=0x80;
- Set_DS1302_SCLK;
- _nop_();
- _nop_();
- Clr_DS1302_SCLK;
- _nop_();
- _nop_();
- }
- Clr_DS1302_RST;
- _nop_();
- _nop_();
- return(dat);
- }
- void DS1302_Init(void)//初始化DS1302
- {
- DS1302_Write(DS1302_CONTROL_Reg,0x00);//關(guān)閉寫保護(hù)
- DS1302_Write(DS1302_SEC_Reg,0x80);//暫停
- DS1302_Write(DS1302_CHARGER_Reg,0xa9);//涓流充電
- DS1302_Write(DS1302_YEAR_Reg,0x04); //年
- DS1302_Write(DS1302_MONTH_Reg,0x12); //月
- DS1302_Write(DS1302_DATE_Reg,0x09); //日
- DS1302_Write(DS1302_DAY_Reg,0x04); //周
- DS1302_Write(DS1302_HR_Reg,0x10); //時
- DS1302_Write(DS1302_MIN_Reg,0x25); //分
- DS1302_Write(DS1302_SEC_Reg,0x00); //秒
- DS1302_Write(DS1302_CONTROL_Reg,0x80);//打開寫保護(hù)
- }
- void ReadTime(void)//讀取時間
- {
- uchar dat;
- dat=DS1302_Read(DS1302_YEAR_Reg);//年
- year0=dat&0x0f;
- year1=dat>>4;
- dat=DS1302_Read(DS1302_MONTH_Reg);//月
- month=dat;
- dat=DS1302_Read(DS1302_DATE_Reg);//日
- date=dat;
- dat=DS1302_Read(DS1302_DAY_Reg);//周
- day=dat;
- dat=DS1302_Read(DS1302_HR_Reg);//時
- hour=dat;
- dat=DS1302_Read(DS1302_MIN_Reg);//分
- minute=dat;
- dat=DS1302_Read(DS1302_SEC_Reg);//秒
- second=dat;
- }
復(fù)制代碼
|
評分
-
查看全部評分
|