数字钟模块化 C程序Word下载.docx
《数字钟模块化 C程序Word下载.docx》由会员分享,可在线阅读,更多相关《数字钟模块化 C程序Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
0x39,0x5e,0x79,0x71,0x00};
ucharcodeduan[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//带小数点
voiddelay_1ms(uintz)
{
uchari,j;
for(i=z;
i>
0;
i--)
for(j=110;
j>
j--);
}
voiddelay(uintz)
while(z--);
voiddelay8(void)
_nop_();
_nop_();
voidt0init(void)
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
/////////////////////////////////////////////////////
///////////////ds18b20///////////////////////////////////
#ifndef__DS18B20_H__
#define__DS18B20_H__
#include"
dingyi.h"
sbitdq=P3^3;
uintd;
voidinit_ds18b20(void)//ds12b20的初始化
ucharn;
dq=1;
delay(8);
dq=0;
delay(80);
n=dq;
delay(4);
voidwrite_ds18b20_byte(uchardat)//ds18b20写一个字节
uchari;
for(i=0;
i<
8;
i++)
{
dq=0;
dq=dat&
0x01;
dat>
>
=1;
}
ucharread_ds18b20_byte(void)//ds18b20读一个字节
uchari,value;
value>
if(dq)
value=value|0x80;
returnvalue;
uintrtc_ds18b20(void)//ds18b20的处理函数
uinta,b,c;
init_ds18b20();
write_ds18b20_byte(0xcc);
//跳过ROM
write_ds18b20_byte(0x44);
//启动
delay(300);
write_ds18b20_byte(0xbe);
a=read_ds18b20_byte();
//低八位
b=read_ds18b20_byte();
//高八位
c=a&
0x0f;
c=c*0.625;
b<
<
=4;
b+=(a&
0xf0)>
4;
b=b*10+c;
returnb;
voiddisplay_ds18b20()
d=rtc_ds18b20();
wx=1;
P1=wu[2];
wx=0;
dx=1;
P1=du[d/100];
dx=0;
delay_1ms
(2);
P1=0xff;
delay(200);
P1=wu[3];
P1=duan[(d/10)%10];
delay(100);
P1=wu[4];
P1=du[d%10];
delay_1ms(3);
P1=wu[5];
P1=du[12];
delay_1ms(4);
//////////////////////////////////////////////////////////////
//////////ds1302///////////////////////////////////////
#ifndef__DS1302_H__
#define__DS1302_H__
#include"
sbitsck1302=P0^0;
sbitio1302=P0^1;
sbitrst1302=P0^2;
//输入信号,在读、写数据期间,必须为高
sbitdx=P2^0;
//段选
sbitwx=P2^1;
//位选
ucharzhou[8];
ucharsfm[8];
//没小数点
ucharsfm1[8];
//有小数点
ucharrqi[8];
uchartime_data[7]={11,6,3,5,11,6,30};
//年周月日时分秒
ucharwrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
ucharread_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchart1;
voidwrite_ds1302_byte(uchardat)//单字节写
sck1302=0;
io1302=dat&
dat=dat>
1;
sck1302=1;
}
voidwrite_ds1302(ucharadd,uchardat)//多字节写
rst1302=0;
rst1302=1;
write_ds1302_byte(add);
//写地址
write_ds1302_byte(dat);
//写数据
io1302=1;
ucharread_ds1302(ucharadd)//多字节读
//写一个地址
value=value>
if(io1302)
voidset_stc(void)//数据转换
7;
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
write_ds1302(0x8e,0x00);
//去除写保护
write_ds1302(write_add[i],time_data[i]);
write_ds1302(0x8e,0x80);
//加上写保护
voidread_rtc(void)//一下读取时间、日期、星期
time_data[i]=read_ds1302(read_add[i]);
voidtime_pros(void)//把16进制转换成十进制
sfm[7]=time_data[6]%16;
sfm[6]=time_data[6]/16;
sfm[5]=16;
sfm[4]=time_data[5]%16;
sfm[3]=time_data[5]/16;
sfm[2]=16;
sfm[1]=time_data[4]%16;
sfm[0]=time_data[4]/16;
sfm1[7]=time_data[6]%16;
sfm1[6]=time_data[6]/16;
sfm1[5]=19;
sfm1[4]=time_data[5]%16;
sfm1[3]=time_data[5]/16;
sfm1[2]=19;
sfm1[1]=time_data[4]%16;
sfm1[0]=time_data[4]/16;
rqi[7]=time_data[3]%16;
rqi[6]=time_data[3]/16;
rqi[5]=17;
rqi[4]=time_data[2]%16;
rqi[3]=time_data[2]/16;
rqi[2]=17;
rqi[1]=time_data[0]%16;
rqi[0]=time_data[0]/16;
zhou[7]=17;
zhou[6]=17;
zhou[5]=17;
zhou[4]=time_data[1]%16;
zhou[3]=17;
zhou[2]=17;
zhou[1]=17;
zhou[0]=17;
voiddisplay_sfm(void)//显示时分秒
{
if(t1<
=18)//没小数点
wx=1;
P1=wu[i];
wx=0;
dx=1;
P1=du[sfm[i]];
dx=0;
}
else//有小数点
P1=du[sfm1[i]];
if(t1==20)
t1=0;
voiddisplay_rqi(void)//显示日期
wx=1;
P1=du[rqi[i]];
dx=1;
dx=0;
voiddisplay_zhou(void)//显示星期
P1=du[zhou[i]];
////////////////////////////////////////////////////
////////////////主函数、、///////////////////////////
ds1302.h"
ds18b20.h"
sbitp07=P0^7;
uintt;
voidmain()
t0init();
//set_stc();
p07=1;
while
(1)
read_rtc();
time_pros();
if(t/100==0)
display_sfm();
}
if(t/100==1)
{
display_zhou();
if(t/100==2)
display_rqi();
if(t/100==3)
{
display_ds18b20();
if(t/100==4)
t=0;
voidt0()interrupt1
t++;
t1++;