?? 太陽(yáng)能熱水器智能控制系統(tǒng)程序.txt
字號(hào):
//太陽(yáng)能熱水器智能控制系統(tǒng)程序:
//定義頭文件和各個(gè)輸入管腳以及變量聲明
#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時(shí)鐘芯片引腳操作
#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
//定義讀時(shí)間控制字
#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
//全局變量
//為了方便,我把個(gè)位和十位分開(kāi)了
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時(shí)鐘引腳與單片機(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)用存儲(chǔ)單元*/
/*顯示緩沖區(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();//初始化中斷、定時(shí)器、I/O口
kbscan();//鍵盤掃描
key();//鍵盤處理
TmRead();//讀取溫度
LvRead();//讀取水位
DS1302();//讀取時(shí)間
display();//顯示
}
void inital()
{
P1_0= P1_1= P1_2=K0=0;//初始化外部驅(qū)動(dòng)口
DS1302_Init();
EA=1;//開(kāi)外部中斷
IT0=1;//外部中斷下降沿觸發(fā)
EX0=1;//允許外部中斷0
Hig=1;P1.3輸出高電平
TMOD=0x11;定時(shí)器工作于方式1
TH1=0X8A;//定時(shí)器1賦初值
TL1=0XD0;
ET1=1;定時(shí)器1開(kāi)定時(shí)中斷
TR1=1;//開(kāi)啟定時(shí)器1
CCOM=0X80;//初始化8255A,送控制字,工作方式0
}
uchar kbscan(void)
{
uchar recode;
if((KPORT&0X0F)!=0X0F) //若有鍵按下
{
delay(2); //延時(shí)抖動(dòng)
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;//重新給定時(shí)器1賦值
TL1=0XD0;
Hig=!Hig;//充放電變換
if(Hig)//充電開(kāi)始時(shí)啟動(dòng)定時(shí)器0
{
TL0=TH0=0X00;//定時(shí)器0賦初值0
TR0=1;//啟動(dòng)定時(shí)器0
}
}
void int0_int(void) interrupt 0//外部中斷0,測(cè)水位
{
EX0=0;
EX1=1;
TR0=0;
buf[0]=TL0;
buf[1]=TH0;
}
void int1_int(void) interrupt 2//外部中斷1,測(cè)水溫
{
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; //顯示延時(shí)
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)//延時(shí)程序
{
uchar a,b;
for(a=0;a<j;a++)
for(b=0;b<200;b++)
;
}
void DS1302()//時(shí)間程序
{
ReadTime();
BUFFER[1]=second;
BUFFER[2]=hour;
}
void DS1302_Write(uchar reg,uchar dat)//寫入時(shí)間
{
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)//讀取時(shí)間
{
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); //時(shí)
DS1302_Write(DS1302_MIN_Reg,0x25); //分
DS1302_Write(DS1302_SEC_Reg,0x00); //秒
DS1302_Write(DS1302_CONTROL_Reg,0x80);//打開(kāi)寫保護(hù)
}
void ReadTime(void)//讀取時(shí)間
{
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);//時(shí)
hour=dat;
dat=DS1302_Read(DS1302_MIN_Reg);//分
minute=dat;
dat=DS1302_Read(DS1302_SEC_Reg);//秒
second=dat;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -