}
voidSerial_Init(void)
{
//////串口初始化
SCON=0x50;///SCON:
serailmode1,8-bitUART,enableucvr
//TMOD|=0x21;//TMOD:
timer1,mode2,8-bitreload,timer0is16bitcounter
PCON=0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:
4800fosc=11.0592MHz
TH1=0xfd;//Baud:
2400fosc=11.0592MHz
//EA=1;下一句已经包含IE|=0x90,EA为IE中一位
//IE|=0x90;//EnableSerialInterrupt
TR1=1;//timer1run//TR1是TCON中的一位
ES=1;
ET1=0;
PS=1;
IT0=1;//边沿触发
EX0=1;//开INT0中断
PX0=1;
#if0
SCON=0x50;///SCON:
serailmode1,8-bitUART,enableucvr
TMOD|=0x21;//TMOD:
timer1,mode2,8-bitreload
PCON|=0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:
4800fosc=11.0592MHz
TH1=0xfd;//Baud:
2400fosc=11.0592MHz
//EA=1;下一句已经包含IE|=0x90,EA为IE中一位
IE|=0x90;//EnableSerialInterrupt
TR1=1;//timer1run//TR1是TCON中的一位
//TI=1;
#endif
}
voidstatus_init(void)
{
uchari;
for(i=0;i<4;i++){
SHFSDKB.plan[i]=0;//savetosector1;
SHFSDKB.now[i]=0;//savetosector2;
SHFSDKB.dachenlv[i]=0;
}
for(i=0;i<12;i++){SHFSDKB.systerm_time[i]=0;}
}
voidmain(void)
{
//Cpu_Init();//输出端口的初始化及相关变量的初始y化
Time_Init();
Ds3231_init();
IR_init();
//EEPROMinit();
Serial_Init();
EA=1;
//SendCharCom(0x55);//启动标志
status_init();
Delayms(100);
Delayms(100);
while
(1)
{
#if1
WDT_CONTR=0x3C;
TimerService();
EN485=0;
key_scan();
WDT_CONTR=0x3C;
//SwitchInput();
if((b_tick_flash==true)&&(MENULEVEL!
=0x00))//如果有红外按键输入激活菜单
{
WDT_CONTR=0x3C;
b_tick_flash=false;
Display_flash();
}
if(b_second_event==true)
{
b_second_event=false;
LED=~LED;
WDT_CONTR=0x3C;
if(MENULEVEL==0x00)
{
WDT_CONTR=0x3C;
display();
}
}
if(b_minute_event==true)
{
b_minute_event=false;
WDT_CONTR=0x3C;
}
if(b_clock_flash==true)
{
b_clock_flash=0;//20ms的周期
time_clock_counter++;
if(time_clock_counter>=25)//秒的指示灯,闪烁周期1s
{
time_clock_counter=0;
LEDSECOND=~LEDSECOND;
}
}
#endif
}
}
/*======================================*/
/*====主要是对一些输出端口的初始化=====*/
/*======================================*/
voidCpu_Init(void)
{
/*先对输出端口的初始化*/
P3M0=0x85;//(10000101)
P3M1=0x3a;//(00111010)
P2M0=0x00;//准双向口
P2M1=0x01;//准双向口P2^0==test
P1M0=0x00;//全部作为输入口
P1M1=0x00;
/*初始化端口*/
P3=0xff;
P2=0xff;
P1=0xff;
P0=0xff;
/*对系统变量的初始化,清楚中断标志*/
/*对串口发送中断清0*/
/*初始化看门狗*/
WDT_CONTR=0x3C;
/*其它的*/
PCON=0x00;
}
/*====================================================*/
/*===以下函数为对CPU端口的重新设置,以防干扰损坏===*/
voidCpu_re_set(void)
{
TMOD=0x21;//定时器0模式1,定时器1模式2
TH1=BPS9600;//TH1的值永远是1200BPS的值
/*以下为对SCON寄存器的重新设置*/
//SM0=0;
//SM1=1;
REN=0;
ES=0;
EA=1;
}
voidread_time3232d()
{
uchar*p,temp[7];
uchari;
p=Read_ds3231();//读出当前时钟数
WDT_CONTR=0x3C;
for(i=0;i<7;i++)temp[i]=*p++;
SHFSDKB.systerm_time[13]=temp[0]&0x0f;
SHFSDKB.systerm_time[12]=(temp[0]&0xf0)>>4;//秒钟,此工程没有秒不显示。
SHFSDKB.systerm_time[11]=temp[1]&0x0f;
SHFSDKB.systerm_time[10]=(temp[1]&0xf0)>>4;//分
SHFSDKB.systerm_time[9]=temp[2]&0x0f;
SHFSDKB.systerm_time[8]=(temp[2]&0x30)>>4;//时
SHFSDKB.systerm_time[7]=temp[4]&0x0f;
SHFSDKB.systerm_time[6]=(temp[4]&0x30)>>4;//日期
SHFSDKB.systerm_time[5]=temp[5]&0x0f;
SHFSDKB.systerm_time[4]=(temp[5]&0x10)>>4;//月份
WDT_CONTR=0x3C;
SHFSDKB.systerm_time[3]=temp[6]&0x0f;
SHFSDKB.systerm_time[2]=(temp[6]&0xf0)>>4;//年低二位
SHFSDKB.systerm_time[1]=0x00;
SHFSDKB.systerm_time[0]=0x02;//年高二位
}
voidreadSHFSD(void)//从EEPROM中读出保存的数据
{
xdatauchari;
uchartime_counter=0;
WDT_CONTR=0x3C;
read_time3232d();//读出当前时钟数
time_counter=SHFSDKB.systerm_time[12]*10+SHFSDKB.systerm_time[13];
/*if(time_counter!
=timesecond_changedis)
{
timesecond_changedis=time_counter;
LEDSECOND=~LEDSECOND;//秒的指示灯,闪烁周期2s
}*/
for(i=0;i<4;i++)
{
displayarray[i]=SHFSDKB.systerm_time[i+8];
}
}
/***************************************************************************/
/*DEMO3231.C*/
/***************************************************************************/
#include"stc12c5620ad.h"
#include"intrins.h"
#include"define.h"
#include"function.h"
#include"variable.h"
//uchartime_displaytemp[12];
externucharxdatadisplaytemp[32];
/****************************defines*******************************/
#defineADDRTC0xd0/*DS3231slaveaddress(write)*/
#defineACK0
#defineNACK1
/***********************FunctionPrototypes**************************/
voidstart();
voidstop();
uchari2cwrite(uchard);
uchari2cread(char);
/****************************functions******************************/
voidstart()/*---------Initiatestartcondition----------*/
{
SDA_3231=1;
SCL_3231=1;
SDA_3231=0;
}
voidstop()/*----------Initiatestopcondition-----------*/
{
SDA_3231=0;SDA_3231=0;
SCL_3231=1;SCL_3231=1;SDA_3231=1;
}
uchari2cwrite(uchard)/*-----------------------------*/
{
uchari;
SCL_3231=0;
for(i=0;i<8;i++)
{
if(d&0x80)
SDA_3231=1;/*Sendthemsbitsfirst*/
else
SDA_3231=0;
SCL_3231=0;
SCL_3231=1;
d=d<<1;/*doshiftheretoincreasesclhightime*/
SCL_3231=0;
}
SDA_3231=1;/*Releasethesdaline*/
SCL_3231=0;
SCL_3231=1;
i=SDA_3231;
//if(i)printf("Ackbitmissing%02X\n",(unsignedint)d);
SCL_3231=0;
return(i);
}
uchari2cread(charb)/*-----------------------------------*/
{
uchari,d;
d=0;
SDA_3231=1;/*Letgoofsdaline*/
SCL_3231=0;
for(i=0;i<8;i++)/*readthemsbfirst*/
{
SCL_3231=1;
d=d<<1;
d=d|(unsignedchar)SDA_3231;
SCL_3231=0;
}
SDA_3231=b;/*lowforack,highfornack*/
SCL_3231=1;
SCL_3231=0;
SDA_3231=1;/*Releasethesdaline*/
returnd;
}
/*--converttheupperandlowernibblesto2asciicharacters--*/
/*
voidhex2asc(ucharhex)
{
if(((hex&0xf0)>>4)<0x0a)
wr_dsp_dat(((hex&0xf0)>>4)+48);//prints0-9//
else
wr_dsp_dat(((hex&0xf0)>>4)+55);//printsA-F//
while((rd_dsp_ins()&0x80));
if((hex&0x0f)<0x0a)
wr_dsp_dat((hex&0x0f)+48);
else
wr_dsp_dat((hex&0x0f)+55);
while((rd_dsp_ins()&0x80));
}
//-------writesomebyte------------------------------//
voidwritebyte()
{
ucharAdd,Data;
printf("\nADDRESS(hex):
");//GetAddress&Data//
scanf("%bx",&Add);
printf("DATA(hex):
");
scanf("%bx",&Data);
start();
i2cwrite(ADDRTC);
i2cwrite(Add);
i2cwrite(Data);
stop();
}*/
voidModify_DS3231(void)/*-----settime&date;userdataentry------*/
/*Note:
NOerrorcheckingisdoneontheuserentries!
*/
{xdatauchardate[7],i;
WDT_CONTR=0x3C;
for(i=0;i<7;i++)
date[i]=displaytemp[i];
//starttomodifythedate;
start();
i2cwrite(ADDRTC);/*writeslaveaddress,write1339*/
i2cwrite(0x00);/*writeregisteraddress,1stclockregister*/
i2cwrite(date[SEC]);
i2cwrite(date[MIN]);
i2cwrite(date[HOUR]);
i2cwrite(date[DAY]);//一定要加上这条语句,