# include "reg52.h"
# include "math.h"
#include<intrins.h>
# define uchar unsigned char
# define uint unsigned int
//寫(xiě)eeprom存儲(chǔ)中
sbit scl=P1^1;
sbit sda=P1^2;
sbit DQ = P3^0; //溫度輸入口
sbit DQ2 = P3^1; //溫度輸入口
sbit kmbj=P1^4; //開(kāi)門(mén)報(bào)警燈入口
sbit motordc=P3^5; //直流電機(jī)入口
sbit hghlgt=P3^6; //溫度高于設(shè)定值入口
sbit motorout=P3^7;
sbit setlclgt=P3^2; //設(shè)置提示燈入口
sbit setldlgt=P1^6; //設(shè)置提示燈入口
sbit addlgt=P3^3; //溫度加燈入口
sbit sublgt=P3^4; //溫度減燈入口
sbit syslgt=P1^7; //系統(tǒng)工作提示燈
sbit setbtn=P1^0; //設(shè)置按鍵入口
sbit addbtn=P1^1; //溫度加按鍵入口
sbit subbtn=P1^2; //溫度減按鍵入口
sbit opndr=P1^3; //開(kāi)門(mén)開(kāi)關(guān)
sbit opndrspk=P1^5; //18度報(bào)警
uchar data temp_data[2]={0x00, 0x00,}; //讀出溫度暫存
uchar temp_buff[3]={0x00,0x00,0x00};
uchar disp_buff[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a}; //顯示緩沖單元
uint tt=0,tt2=0,tm=0,cjtm=0,flag_cj=0,open=0,ccount=0;
char lcsetvalue=0,ldsetvalue=0;
uchar code TABLE[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //共陽(yáng)極 0-9的代碼
uchar code codeseat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar flag_set=1,flag_temp=1,flag_opendr=0,flag_kmbj=0,flag_hbj=0;
void delay(uint j)
{
uint i;
for(i=0;i<=j;i++);
}
/*****************溫度設(shè)定函數(shù)*************************/
void temp_set(void)
{
syslgt=1;
while(flag_set) //設(shè)定冷藏室溫度和冷凍室溫度
{
if(flag_temp)
{
setbtn=1;
if(!setbtn)
{ while(!setbtn)
{ setbtn=1;setlclgt=0; }//等待鍵的釋放
flag_temp++;
if(flag_temp==2)
{ setlclgt=0;setldlgt=1;}
if(flag_temp==3)
{setlclgt=1;addlgt=1;sublgt=1;setldlgt=0;}
if(flag_temp==4)
{flag_temp=1;setlclgt=1;setldlgt=1;addlgt=1;sublgt=1;syslgt=0;flag_set=0;}
tm=0;
disp_buff[0]=10; disp_buff[1]=10;
disp_buff[2]=10; disp_buff[3]=10;
}
}
if(flag_temp==2) //開(kāi)始冷藏室溫度加或者減
{
addbtn=1;
if(!addbtn)
{ while(!addbtn)
{ addbtn=1;addlgt=0;sublgt=1;}//等待鍵的釋放
lcsetvalue++;
if(lcsetvalue>=60)
lcsetvalue=60;
if(lcsetvalue<0)
disp_buff[0]=11;
else
disp_buff[0]=10;
disp_buff[1]=abs(lcsetvalue)/10;
disp_buff[2]=abs(lcsetvalue)%10;
disp_buff[3]=0;
if(!disp_buff[1]) {disp_buff[1]=10;}
}
subbtn=1;
if(!subbtn)
{ while(!subbtn)
{ subbtn=1;sublgt=0;addlgt=1;}//等待鍵的釋放
lcsetvalue--;
if(lcsetvalue<0)
disp_buff[0]=11;
else
disp_buff[0]=10;
disp_buff[1]=abs(lcsetvalue)/10;
disp_buff[2]=abs(lcsetvalue)%10;
disp_buff[3]=0;
if(!disp_buff[1]) {disp_buff[1]=10;}
}
}
if(flag_temp==3) //開(kāi)始冷凍室溫度加或者減
{
addbtn=1;
if(!addbtn)
{ while(!addbtn)
{ addbtn=1;addlgt=0;sublgt=1;}//等待鍵的釋放
ldsetvalue++;
if(ldsetvalue>=60)
ldsetvalue=60;
if(ldsetvalue<0)
disp_buff[0]=11;
else
disp_buff[0]=10;
disp_buff[1]=abs(ldsetvalue)/10;
disp_buff[2]=abs(ldsetvalue)%10;
disp_buff[3]=0;
if(!disp_buff[1]) {disp_buff[1]=10;}
}
subbtn=1;
if(!subbtn)
{ while(!subbtn)
{ subbtn=1;sublgt=0;addlgt=1;}//等待鍵的釋放
ldsetvalue--;
if(ldsetvalue<0)
disp_buff[0]=11;
else
disp_buff[0]=10;
disp_buff[1]=abs(ldsetvalue)/10;
disp_buff[2]=abs(ldsetvalue)%10;
disp_buff[3]=0;
if(!disp_buff[1]) {disp_buff[1]=10;}
}
}
}
}
/********************************計(jì)算溫度子函數(shù)**********************************************/
void temp_work(void)
{
disp_buff[0]=10;
if(temp_data[1]>127)
{temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0])+1;disp_buff[0]=11;} //負(fù)溫度求補(bǔ)碼
tt=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
disp_buff[1]=tt/10;
disp_buff[2]=tt%10;
disp_buff[3]=0;
if(!disp_buff[1])
disp_buff[1]=10;
}
/*******************************DS復(fù)位函數(shù)******************************/
void ow_reset2(void)
{
uchar presence=1;
while(presence)
{
while(presence)
{
DQ2=1; //DQ復(fù)位
DQ2=0; //單片機(jī)將DQ拉低
delay(50); //延時(shí)550毫秒
DQ2=1; //拉高總線
delay(6);
presence=DQ2; //如果=0則初始化成功 =1則初始化失敗
}
delay(45);
presence=~DQ2;
}
DQ2=1;
}
/*****************************DS寫(xiě)命令函數(shù)*********************************/
void write_byte2(uchar dat) //向1-WIRE總線上寫(xiě)一字節(jié)
{
uchar i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ2 = 0 ;
DQ2 = dat&0x01 ;
delay(7) ; //0時(shí)序延時(shí)至少60US
DQ2 = 1 ;
dat>>=1 ;
}
}
/*******************************DS讀一字節(jié)函數(shù)****************************************************/
uchar read_byte2(void)
{
uchar i = 0 ;
uchar dat = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ2 = 0 ; // 給脈沖信號(hào)
dat >>= 1 ;
DQ2 = 1 ; // 給脈沖信號(hào)
if(DQ2)
dat |= 0x80 ;
delay(7) ;
}
return (dat) ;
}
/*******************************DS復(fù)位函數(shù)******************************/
void ow_reset(void)
{
uchar presence=1;
while(presence)
{
while(presence)
{
DQ=1; //DQ復(fù)位
DQ=0; //單片機(jī)將DQ拉低
delay(50); //延時(shí)550毫秒
DQ=1; //拉高總線
delay(6);
presence=DQ; //如果=0則初始化成功 =1則初始化失敗
}
delay(45);
presence=~DQ;
}
DQ=1;
}
/*****************************DS寫(xiě)命令函數(shù)*********************************/
void write_byte(uchar dat) //向1-WIRE總線上寫(xiě)一字節(jié)
{
uchar i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
delay(7) ; //0時(shí)序延時(shí)至少60US
DQ = 1 ;
dat>>=1 ;
}
}
/*******************************DS讀一字節(jié)函數(shù)****************************************************/
uchar read_byte(void)
{
uchar i = 0 ;
uchar dat = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ; // 給脈沖信號(hào)
dat >>= 1 ;
DQ = 1 ; // 給脈沖信號(hào)
if(DQ)
dat |= 0x80 ;
delay(7) ;
}
return (dat) ;
}
/******************************讀出溫度函數(shù)*************************************************/
void read_temp(void)
{
ow_reset();
write_byte(0xcc);//skip ROM
write_byte(0x44);// 啟動(dòng)溫度轉(zhuǎn)換
ow_reset();
write_byte(0xcc);
write_byte(0xbe); //讀取溫度寄存器
temp_data[0]=read_byte(); //溫度低8位
temp_data[1]=read_byte(); //溫度高8位
}
/*****************第二個(gè)ds18b20處理函數(shù)******************/
/******************************讀出溫度函數(shù)*************************************************/
void read_temp2(void)
{
ow_reset2();
write_byte2(0xcc);//skip ROM
write_byte2(0x44);// 啟動(dòng)溫度轉(zhuǎn)換
ow_reset2();
write_byte2(0xcc);
write_byte2(0xbe); //讀取溫度寄存器
temp_data[0]=read_byte2(); //溫度低8位
temp_data[1]=read_byte2(); //溫度高8位
}
/********************************計(jì)算溫度子函數(shù)**********************************************/
void temp_work2(void)
{
disp_buff[4]=10;
if(temp_data[1]>127)
{temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0])+1;disp_buff[4]=11;} //負(fù)溫度求補(bǔ)碼
tt2=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
disp_buff[5]=tt2/10;
disp_buff[6]=tt2%10;
disp_buff[7]=0;
if(!disp_buff[5])
disp_buff[5]=10;
}
/**********eeprom函數(shù)******************/
////////延時(shí)//////////////////////////////////
void flash()
{ ; ; }
void x24c02_init() //24c02初始化子程序
{
scl=1; //拉高
flash(); //延時(shí)
sda=1;
flash();//同上
}
void start() //啟動(dòng)I2C總線
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
void stop() //停止I2C總線
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(uchar j) //寫(xiě)一個(gè)字節(jié)
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}
scl=0;
flash();
sda=1;
flash();
}
char readx() //讀一個(gè)字節(jié)
{
char i,j,k=0;
scl=0;
flash();
sda=1;
for (i=0;i<8;i++)
{
flash();
scl=1;
flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;
}
flash();
return(k);
}
void clock() //I2C總線時(shí)鐘,在此作第個(gè)時(shí)鐘
{
scl=1;
flash();
while (sda==1);//如果SDA為0即收到應(yīng)答則跳過(guò),為1則等應(yīng)答
scl=0;
flash();
}
////////從24c02的地址address中讀取一個(gè)字節(jié)數(shù)據(jù)/////
char x24c02_read(uchar address)
{
char i;
start();
writex(0xa0);
clock();//第9個(gè)時(shí)鐘
writex(address);//選中24C02
clock();
start();
writex(0xa1); //選中24C02中的存儲(chǔ)器地址
clock();
i=readx();
stop();
delay(10);
return(i);
}
void x24c02_write(char address,char info)
{
EA=0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA=1;
delay(50);
}
/*******************************主函數(shù)**********************************************************/
void main (void)
{
char i,num1,num2;
TMOD=0x11; //定時(shí)器0設(shè)置方式1,定時(shí)器1設(shè)置方式1
TH0=0xf4; //定時(shí)3ms 為了計(jì)數(shù)值顯示的需要
TL0=0x48;
TH1=0xbf; //定時(shí)16.6ms 為了計(jì)數(shù)值顯示的需要
TL1=0x28;
EA=1; //開(kāi)總中斷
ET0=1; //定時(shí)器中斷使能
ET1=1;
TR0=1; //啟動(dòng)定時(shí)器0
TR1=1;
P2=0x00;
kmbj=0;
motordc=0;
hghlgt=0;
setlclgt =0;
syslgt=1;
opndrspk=0;
主程序略。