数字钟模块化 C程序.docx
- 文档编号:5837112
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:14
- 大小:16.56KB
数字钟模块化 C程序.docx
《数字钟模块化 C程序.docx》由会员分享,可在线阅读,更多相关《数字钟模块化 C程序.docx(14页珍藏版)》请在冰豆网上搜索。
数字钟模块化C程序
//////////定义///////////////////////////////////
#ifndef_DINGYI_H__
#define_DINGYI_H__
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineGONYANG//选择共阳数码
//#defineGONYIN//选择共阴数码管
#ifdefGONYANG
//ucharcodewu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//带小数点
ucharwu[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};///用于自己买的单片机、、共阳
ucharcodedu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xff,0xbf,0x7f,0xf6};//16全灭、17中间一行、18点、19上下两行
ucharcodeduan[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0---9
#endif
#ifdefGONYIN
ucharcodewu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharcodedu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
ucharcodeduan[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点
#endif
voiddelay_1ms(uintz)
{
uchari,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay(uintz)
{
while(z--);
}
voiddelay8(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
voidt0init(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
#endif
/////////////////////////////////////////////////////
///////////////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);
dq=1;
delay(8);
n=dq;
delay(4);
}
voidwrite_ds18b20_byte(uchardat)//ds18b20写一个字节
{
uchari;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay(4);
dq=1;
dat>>=1;
}
delay(4);
}
ucharread_ds18b20_byte(void)//ds18b20读一个字节
{
uchari,value;
for(i=0;i<8;i++)
{
dq=0;
value>>=1;
dq=1;
if(dq)
value=value|0x80;
delay(4);
}
returnvalue;
}
uintrtc_ds18b20(void)//ds18b20的处理函数
{
uinta,b,c;
init_ds18b20();
write_ds18b20_byte(0xcc);//跳过ROM
write_ds18b20_byte(0x44);//启动
delay(300);
init_ds18b20();
write_ds18b20_byte(0xcc);
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);
wx=1;
P1=wu[3];
wx=0;
dx=1;
P1=duan[(d/10)%10];
dx=0;
delay_1ms
(2);
P1=0xff;
delay(100);
wx=1;
P1=wu[4];
wx=0;
dx=1;
P1=du[d%10];
dx=0;
delay_1ms(3);
P1=0xff;
delay(100);
wx=1;
P1=wu[5];
wx=0;
dx=1;
P1=du[12];
dx=0;
delay_1ms(4);
dx=1;
P1=0xff;
dx=0;
}
#endif
//////////////////////////////////////////////////////////////
//////////ds1302///////////////////////////////////////
#ifndef__DS1302_H__
#define__DS1302_H__
#include"dingyi.h"
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)//单字节写
{
uchari;
for(i=0;i<8;i++)
{
sck1302=0;
io1302=dat&0x01;
dat=dat>>1;
sck1302=1;
}
}
voidwrite_ds1302(ucharadd,uchardat)//多字节写
{
rst1302=0;
_nop_();
sck1302=0;
_nop_();
rst1302=1;
_nop_();
write_ds1302_byte(add);//写地址
write_ds1302_byte(dat);//写数据
rst1302=0;
_nop_();
io1302=1;
sck1302=1;
}
ucharread_ds1302(ucharadd)//多字节读
{
uchari,value;
rst1302=0;
_nop_();
sck1302=0;
_nop_();
rst1302=1;
_nop_();
write_ds1302_byte(add);//写一个地址
for(i=0;i<8;i++)
{
value=value>>1;
sck1302=0;
if(io1302)
value=value|0x80;
sck1302=1;
}
rst1302=0;
_nop_();
sck1302=0;
_nop_();
sck1302=1;
io1302=1;
returnvalue;
}
voidset_stc(void)//数据转换
{
uchari,j;
for(i=0;i<7;i++)
{
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80);//加上写保护
}
voidread_rtc(void)//一下读取时间、日期、星期
{
uchari;
for(i=0;i<7;i++)
{
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)//显示时分秒
{
uchari;
for(i=0;i<8;i++)
{
if(t1<=18)//没小数点
{
wx=1;
P1=wu[i];
wx=0;
dx=1;
P1=du[sfm[i]];
dx=0;
delay_1ms(3);
dx=1;
P1=0xff;
dx=0;
}
else//有小数点
{
wx=1;
P1=wu[i];
wx=0;
dx=1;
P1=du[sfm1[i]];
dx=0;
delay_1ms(3);
dx=1;
P1=0xff;
dx=0;
if(t1==20)
t1=0;
}
}
}
voiddisplay_rqi(void)//显示日期
{
uchari;
for(i=0;i<8;i++)
{
wx=1;
P1=wu[i];
wx=0;
dx=1;
P1=du[rqi[i]];
dx=0;
delay_1ms(3);
dx=1;
P1=0xff;
dx=0;
}
}
voiddisplay_zhou(void)//显示星期
{
uchari;
for(i=0;i<8;i++)
{
wx=1;
P1=wu[i];
wx=0;
dx=1;
P1=du[zhou[i]];
dx=0;
delay_1ms(3);
dx=1;
P1=0xff;
dx=0;
}
}
#endif
////////////////////////////////////////////////////
////////////////主函数、、///////////////////////////
#include"dingyi.h"
#include"ds1302.h"
#include"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();
t1=0;
}
if(t/100==4)
t=0;
}
}
voidt0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
t1++;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字钟模块化 C程序 数字 模块化 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)