main.c文件
#include <STC15F2K60S2.H>
#include "onewire.h"
#include "ds1302.h"
#define Latch(x,y) {P0=y;P2=x;P2=0;}
unsigned char code smgduan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0xc1};
unsigned char smg_1[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char relay,key_val=0,interface=0,TP=23,count_key,count_led;
unsigned char hor1,min1,sec1,hor,min,sec,L1,L2,L3;
unsigned int tempr,count_temp,count_relay;
bit jiemian=0,mode=0,relay_time;
void Display()
{
static unsigned char dspcom=0;
Latch(0xc0,0);
Latch(0xe0,smg_1[dspcom]);
Latch(0xc0,1<<dspcom);
if(++dspcom==8)dspcom=0;
}
void Key_Scan()
{
static unsigned char state=0;
unsigned char key_x=0,key_y=0;
P3=0x0f;P4=0x00;
if(!P30)key_x=3;
else if(!P31)key_x=2;
else if(!P32)key_x=1;
else if(!P33)key_x=0;
P3=0xf0;P4=0xff;
if(!P34)key_y=4;
else if(!P35)key_y=3;
else if(!P42)key_y=2;
else if(!P44)key_y=1;
key_val=key_x+key_y*4;
switch(state)
{
case 0:if(key_val!=0)state=1;break;
case 1:if(key_val!=0)
{
state=2;
switch(key_val)
{
case 12:
if(interface==0)interface=1;
else if(interface==1)interface=2;
else if(interface==2)interface=0;
break;
case 13:mode=~mode;break;
case 16:
if(interface==2)
{
if(TP>=99)TP=10;
else TP++;
}
break;
case 17:
if(interface==2)
{
if(TP<=10)TP=99;
else TP--;
}
break;
}
}else if(key_val==0)state=0;break;
case 2:if(key_val==0)state=0;break;
}
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初始值
TH0 = 0xD1; //设置定时初始值
ET0=1;EA=1;
TR0 = 1; //定时器0开始计时
}
void Timer0() interrupt 1
{
Display();
if(relay)
{
if(++count_led<100)L3=1;
else{L3=0;if(count_led>=200)count_led=0;}
}
if(key_val)
{
if(key_val==17)
{
if(interface==1){if(jiemian==0)jiemian=1;}
}
}
else if(!key_val)
{
if(interface==1){if(jiemian==1)jiemian=0;}
}
if(relay_time)
{
if(++count_relay>=5000)
{
count_relay=0;
relay_time=0;
relay=0;
L1=0;
}
}
Latch(0xa0,relay*16);
Latch(0x80,~(L1+L2*2+L3*4));
++count_temp;
++count_key;
}
void InitSystem()
{
char i=0;
Latch(0xc0,0);
Latch(0xa0,0);
Latch(0x80,0xff);
Set_Time(23,59,55);
Timer0Init();
for(i=0;i<70;i++){tempr=Read_Tempr()*10+0.5;}
}
void main()
{
InitSystem();
while(1)
{
if(count_key>=10)
{
count_key=0;
Key_Scan();
}
if(count_temp>749)
{
count_temp=0;
tempr=Read_Tempr()*10+0.5;
}
if(TH0<0xf0)
{
sec1=Read_Ds1302_Byte(0x81);
min1=Read_Ds1302_Byte(0x83);
hor1=Read_Ds1302_Byte(0x85);
hor=(hor1/16)*10+hor1%16;
min=(min1/16)*10+min1%16;
sec=(sec1/16)*10+sec1%16;
}
if(interface==0)
{
smg_1[0]=smgduan[12];
smg_1[1]=smgduan[1];
smg_1[5]=smgduan[tempr/100];
smg_1[6]=smgduan[tempr%100/10]&0x7f;
smg_1[7]=smgduan[tempr%10];
}
if(interface==1)
{
smg_1[0]=smgduan[12];
smg_1[1]=smgduan[2];
if(jiemian==0)
{
smg_1[3]=smgduan[hor/10];
smg_1[4]=smgduan[hor%10];
smg_1[5]=smgduan[10];
smg_1[6]=smgduan[min/10];
smg_1[7]=smgduan[min%10];
}
else if(jiemian==1)
{
smg_1[3]=smgduan[min/10];
smg_1[4]=smgduan[min%10];
smg_1[5]=smgduan[10];
smg_1[6]=smgduan[sec/10];
smg_1[7]=smgduan[sec%10];
}
}
if(interface==2)
{
smg_1[0]=smgduan[12];
smg_1[1]=smgduan[3];
smg_1[2]=smg_1[3]=smg_1[4]=smg_1[5]=smgduan[11];
smg_1[6]=smgduan[TP/10];
smg_1[7]=smgduan[TP%10];
}
if(mode==0)
{
L2=1;
if(tempr>TP*10)relay=1;
else {relay=0;L3=0;}
if(min==0 && sec==0){relay_time=1;L1=1;}
}
else if(mode==1)
{
L2=0;
if(relay_time==0){relay=0;L3=0;L1=0;}
if(min==0 && sec==0){relay=1;relay_time=1;L1=1;}
}
}
}
onewire.c文件
#include "onewire.h"
#include "reg52.h"
sbit DQ = P1^4;
//եПŚҿғʱگ˽
void Delay_OneWire(unsigned int t)
{
t*=11;
while(t--);
}
//եПдәط
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//եПׁәط
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20Եʼۯ
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
float Read_Tempr()
{
float temp;
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=(high<<8|low)*0.0625;
return temp;
}
onewire.h文件
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
float Read_Tempr();
#endif
ds1302.c文件
#include "ds1302.h"
#include <reg52.h>
#include <intrins.h>
sbit SCK = P1^7;
sbit SDA = P2^3;
sbit RST = P1^3;
//д×Ö½Ú
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//ÏòDS1302¼Ä´æÆ÷дÈëÊý¾Ý
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//´ÓDS1302¼Ä´æÆ÷¶Á³öÊý¾Ý
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
void Set_Time(unsigned char hor,min,sec)
{
Write_Ds1302_Byte(0x8e,0);
Write_Ds1302_Byte(0x80,(sec/10)*16+sec%10);
Write_Ds1302_Byte(0x82,(min/10)*16+min%10);
Write_Ds1302_Byte(0x84,(hor/10)*16+hor%10);
Write_Ds1302_Byte(0x8e,0x80);
}
ds1302..h文件
#ifndef __DS1302_H
#define __DS1302_H
void Set_Time(unsigned char hor,min,sec);
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif