程序.docx
《程序.docx》由会员分享,可在线阅读,更多相关《程序.docx(18页珍藏版)》请在冰点文库上搜索。
程序
#include
//#include
#include
#include
#include
/*DS12887地址定义*/
#defineDS12887_SECXBYTE[0x7f00]
#defineDS12887_SEC_AXBYTE[0x7f01]
#defineDS12887_MINXBYTE[0x7f02]
#defineDS12887_MIN_AXBYTE[0x7f03]
#defineDS12887_HOURXBYTE[0x7f04]
#defineDS12887_HOUR_AXBYTE[0x7f05]
#defineDS12887_WEEKXBYTE[0x7f06]
#defineDS12887_DATEXBYTE[0x7f07]
#defineDS12887_MONTHXBYTE[0x7f08]
#defineDS12887_YEARXBYTE[0x7f09]
#defineDS12887_AXBYTE[0x7f0A]
#defineDS12887_BXBYTE[0x7f0B]
#defineDS12887_CXBYTE[0x7f0C]
#defineDS12887_DXBYTE[0x7f0D]
#defineucharunsignedchar
#defineuintunsignedint
/*端口定义*/
sbitkey2=P1^5;
sbitkey3=P1^6;
sbitkey4=P1^7;
sbitkey_down=P3^3;
sbitP3_5=P3^5;
/*doubletpture0;*/
uinttpture;
ucharkey;
ucharposition;
uchart1_num;
ucharn;
/*ucharRES;*/
uchart,j,tp;
/*doubleRES1;
/*doubleRES0;*/
/*doubleR2=2.5;
/*doubleu=3.0;*/
uchartime_memory1[8];/*用于存储年月日*/
uchartime_memory2[8];/*用于存储时分秒*/
uchartime_memory3[8];/*用于存储温度*/
/*uinttemp[10];*/
ucharmov_left;
uintcount_num=0;/*频率*/
voidds12887_start();
voidds12887_read();
voidds12887_write();
voiddisplay_conver();
voiddisplay_led();
voiddelay_50us(uint);
voidkey_option();
ucharcodetable[12]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1F,0x01,0x09,0xff,0x00};
struct
{
ucharyear;
ucharmonth;
uchardate;
ucharweek;
ucharhour;
ucharmin;
ucharsec;
}now_time;/*当前时间参数*/
voidmain()
{
position=0;/*不闪烁状态*/
key=2;/*初始显示温度*/
t1_num=0;
n=0;
/*for(tp=0;tp<10;tp++)
{
temp[tp]=0;
}
tp=0;*/
/*RES0=10.0;*/
/*tpture0=25.0;*/
P3_5=0;/*屏蔽湿度采集,选通温度采集*/
TMOD=0x15;/*T1定时,T0计数*/
SCON=0x00;/*串口使用方式0*/
ds12887_start();
EX0=1;/*INT0开启*/
IT0=1;
ds12887_read();
EA=1;
while
(1)
{
if(key==2&&ET1==0)
{
TH0=TL0=0;
TH1=0x3c;
TL1=0xb0;
ET1=1;
TR1=1;
TR0=1;
}
display_conver();
display_led();
}
}
/*DS12887初始化函数*/
voidds12887_start(void)
{
DS12887_A=0x20;/*设定晶振开始工作*/
ACC=DS12887_C;
ACC=DS12887_D;
DS12887_B=0x92;
DS12887_SEC=0x00;DS12887_MIN=0x00;DS12887_HOUR=0x12;DS12887_WEEK=0x02;
DS12887_DATE=0x11;DS12887_MONTH=7;DS12887_YEAR=7;
DS12887_B=0x12;/*24小时制,BCD码输出,更新中断允许,芯片工作*/
}
/*DS12887读设置函数*/
voidds12887_read(void)
{
/*DS12887_B=DS12887_B|0x80;/*禁止更新数据*/
now_time.sec=DS12887_SEC;
now_time.min=DS12887_MIN;
now_time.hour=DS12887_HOUR;
now_time.week=DS12887_WEEK;
now_time.date=DS12887_DATE;
now_time.month=DS12887_MONTH;
now_time.year=DS12887_YEAR;
/*DS12887_B=DS12887_B&0x7f;/*允许更新数据*/
}
/*DS12887写设置函数*/
voidds12887_write(void)
{
/*DS12887_B=DS12887_B|0x80;/*禁止更新数据*/
DS12887_SEC=now_time.sec;
DS12887_MIN=now_time.min;
DS12887_HOUR=now_time.hour;
DS12887_WEEK=now_time.week;
DS12887_DATE=now_time.date;
DS12887_MONTH=now_time.month;
DS12887_YEAR=now_time.year;
/*DS12887_B=DS12887_B&0x7f;/*允许更新数据*/
}
/*数据转换与显示程序*/
voiddisplay_conver(void)
{
time_memory1[0]=2;
time_memory1[1]=0;
time_memory1[2]=now_time.year/16;
time_memory1[3]=now_time.year%16;
time_memory1[4]=now_time.month/16;
time_memory1[5]=now_time.month%16;
time_memory1[6]=now_time.date/16;
time_memory1[7]=now_time.date%16;
time_memory2[0]=now_time.hour/16;
time_memory2[1]=now_time.hour%16;
time_memory2[2]=now_time.min/16;
time_memory2[3]=now_time.min%16;
time_memory2[4]=now_time.sec/16;
time_memory2[5]=now_time.sec%16;
time_memory2[6]=10;
time_memory2[7]=now_time.week%16;
}
voiddisplay_led(void)
{
uchari;
mov_left=0xfe;/*每次左移选通一位*/
switch(key)/*年月日、时分秒、温度之间的切换*/
{
case0:
for(i=0;i<8;i++)
{
/*P1=mov_left;*/
if(i+1==position||i+2==position)/*闪烁功能实现程序*/
{
n++;
if(n==7||n==8)
{
P1=mov_left;
if(n==8)
{
n=0;
}
}
elseP1=0xff;
}
elseP1=mov_left;
SBUF=table[time_memory1[i]];
delay_50us(10);
/*while(TI==0);*/
TI=0;/*数据发送完毕*/
mov_left=mov_left*2;
mov_left=mov_left|0x01;
if(key_down==0)/*有键按下时执行程序*/
{
delay_50us(200);
if(key_down==0)
{
key_option();
key_down=1;
while(key_down==0);
}
}
}break;
case1:
for(i=0;i<8;i++)
{
/*P1=mov_left;*/
if(i+1==position||i+2==position)
{
n++;
if(n==7||n==8)
{
P1=mov_left;
if(n==8)
{
n=0;
}
}
elseP1=0xff;
}
elseP1=mov_left;
SBUF=table[time_memory2[i]];
delay_50us(10);
/*while(TI==0);*/
TI=0;
if(key_down==0)
{
delay_50us(200);
if(key_down==0)
{
key_option();
key_down=1;
while(key_down==0);
}
}
mov_left=mov_left*2;
mov_left=mov_left|0x01;
}break;
case2:
for(i=0;i<8;i++)
{
/*P1=mov_left;*/
if(i+1==position||i+2==position)
{
n++;
if(n==7||n==8)
{
P1=mov_left;
if(n==8)
{
n=0;
}
}
elseP1=0xff;
}
elseP1=mov_left;
SBUF=table[time_memory3[i]];
t=10;
for(;t>0;t--)
for(j=19;j>0;j--);
/*delay_50us(10);*/
TI=0;
if(key_down==0)
{
delay_50us(200);
if(key_down==0)
{
key_option();
key_down=1;
while(key_down==0);
}
}
mov_left=mov_left*2;
mov_left=mov_left|0x01;
}break;
default:
return;
}
}
voidint0_update(void)interrupt0using2/*DS12887时钟芯片1秒更新中断*/
{
ds12887_read();
ACC=DS12887_C;
}
/*按键的选择程序*/
voidkey_option(void)
{
ucharm=0;
if(key2==0)
{
key=(key+1)%3;
}
if(key3==0&&(key==0||key==1))
{
position=(position+2)%10;/*更改需要修改的位*/
}
if(key4==0)/*修改数据程序*/
{
if(key==0)
{
switch(position)
{
case4:
now_time.year=now_time.year+1;
m=now_time.year;
if(m==0x9a)
{
now_time.year=0;
}
elseif(m==0x0a||m==0x1a||m==0x2a||m==0x3a||m==0x4a||m==0x5a||m==0x6a||m==0x7a||m==0x8a)
{
now_time.year=now_time.year+6;
}
ds12887_write();
break;
case6:
now_time.month=now_time.month+1;
m=now_time.month;
if(m==0x13)
{
now_time.month=1;
}
elseif(m==0x0a)
{
now_time.month=now_time.month+6;
}
ds12887_write();
break;
case8:
now_time.date=now_time.date+1;
m=now_time.date;
if(m==0x32)
{
now_time.date=1;
}
elseif(m==0x0a||m==0x1a||m==0x2a)
{
now_time.date=now_time.date+6;
}
ds12887_write();
break;
default:
return;
}
}
elseif(key==1)
{
switch(position)
{
case2:
now_time.hour=now_time.hour+1;
m=now_time.hour;
if(m==0x24)
{
now_time.hour=0;
}
elseif(m==0x0a||m==0x1a)
{
now_time.hour=now_time.hour+6;
}
ds12887_write();
break;
case4:
now_time.min=now_time.min+1;
m=now_time.min;
if(m==0x5a)
{
now_time.min=0;
}
elseif(m==0x0a||m==0x1a||m==0x2a||m==0x3a||m==0x4a)
{
now_time.min=now_time.min+6;
}
ds12887_write();
break;
case6:
now_time.sec=now_time.sec+1;
m=now_time.sec;
if(m==0x5a)
{
now_time.sec=0;
}
elseif(m==0x0a||m==0x1a||m==0x2a||m==0x3a||m==0x4a)
{
now_time.sec=now_time.sec+6;
}
ds12887_write();
break;
case8:
now_time.week=now_time.week+1;
m=now_time.week;
if(m==8)
{
now_time.week=1;
}
ds12887_write();
break;
default:
return;
}
}
}
}
/*1秒定时器中断,采集温度*/
voidt1_wendu(void)interrupt3using3
{
TR0=0;
TR1=0;
P3_5=0;
t1_num++;
if(t1_num==10)
{
t1_num=0;
count_num=TH0*256+TL0;
tpture=(count_num-495)/8+28;
/*temp[tp++]=count_num;*/
/*RES=100000/(count_num*7)-5;*/
/*RES1=1.0/(count_num*7.0e-5)-2.0*R2;*/
/*tpture=46.34-1.88*RES1;*/
/*tpture=45-17*RES/9;*/
/*tpture=log(RES1/RES0)/log(2.71828)*u+1/tpture0;
tpture=1/tpture-273.15;
/*tpture=tpture*100;*/
/*for(tp=0;abs(tpture-tp)<1;tp++);*/
/*time_memory3[4]=tpture%10;
time_memory3[7]=tpture/10;
time_memory3[7]=time_memory3[3]%10;
time_memory3[6]=11;
time_memory3[5]=tpture/100;
time_memory3[5]=time_memory3[1]%10;
time_memory3[4]=tpture/1000;*/
time_memory3[1]=tpture%10;
time_memory3[0]=tpture/10;
TH0=TL0=0;
}
TH1=0x3c;
TL1=0xb0;
TR0=1;
TR1=1;
}
/*延时程序:
t*50us*/
voiddelay_50us(uintt)
{
ucharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}