采用S7-200和4个LED数码管设计了显示小时和分钟的电路和控制程序。

# include & ltreg52.h & gt//包含头文件,一般不需要更改。头文件包含特殊功能寄存器的定义。

# include & ltintrins.h & gt

sbit sck=p3^6;//时钟

sbit sda=p3^4;//数据

sbit rst = p3^5;// DS1302复位

sbit ls138a=p2^2;

sbit ls138b=p2^3;

sbit ls138c=p2^4;

位ReadRTC _ Flag//定义读取DS1302标志。

无符号字符l _ tmpdate[7];//={0,0,13,15,5,3,8};//太阳和月亮的分分秒秒纪念日08-05-15 12:00:00

无符号字符l _ tmp display[8];

code unsigned char write _ RTC _ address[7]= { 0x 80,0x82,0x84,0x86,0x88,0x8a,0x8c };//日月年的最低读写位,以秒为单位。

code unsigned char read _ RTC _ address[7]= { 0x 81,0x83,0x85,0x87,0x89,0x8b,0x8d };

代码无符号char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x 40 };

//* * *数码管0-9 '-'熄灭'表

/******************************************************************/

/*函数声明*/

/******************************************************************/

void Write_Ds1302_byte(无符号char temp);

void Write_Ds1302(无符号字符地址,无符号字符dat);

无符号字符Read_Ds1302(无符号字符地址);

void Read _ RTC(void);//读取RTC

void Set _ RTC(void);//设置RTC

void inittimer 0(void);//初始定时器0

/******************************************************************/

/*主函数*/

/******************************************************************/

无效总管(无效)

{

init timer 0();//初始化定时器0

set _ RTC();//写入时钟值。如果使用备用电池,就不需要每次开机都写了。这个程序应该被屏蔽。

while(1)

{

if(read RTC _ flag)//read RTC _ flag = = 1执行下面的语句。

{

read RTC _ Flag = 0;

read _ RTC();

l _ tmpdisplay[0]= l _ tmpdate[2]/16;//数据转换,因为我们用数码管0~9的显示来分隔数据。

l _ tmpdisplay[1]= l _ tmpdate[2]& amp;0x0f

l _ tmpdisplay[2]= 10;//添加“-”

l _ tmpdisplay[3]= l _ tmpdate[1]/16;

l _ tmpdisplay[4]= l _ tmpdate[1]& amp;0x0f

l _ tmpdisplay[5]= 10;

l _ tmpdisplay[6]= l _ tmpdate[0]/16;

l _ tmpdisplay[7]= l _ tmpdate[0]& amp;0x0f

}

}

}

/******************************************************************/

/*定时器0初始化*/

/******************************************************************/

void InitTIMER0(void)

{

TMOD | = 0x 01;//定时器设置16位

TH0 = 0xef//初始化值

TL0 = 0xf0

ET0 = 1;

TR0 = 1;

EA = 1;

}

/******************************************************************/

/*写入一个字节*/

/******************************************************************/

void Write_Ds1302_Byte(无符号字符温度)

{

无符号字符I;

for(I = 0;我& lt8;i++)//循环8次写入数据。

{

SCK = 0;

SDA = temp & amp0x 01;//每次传输的低字节数

temp & gt& gt=1;//向右移动一个位置

SCK = 1;

}

}

/******************************************************************/

/*写入DS1302 */

/******************************************************************/

void Write_Ds1302(无符号字符地址,无符号字符数据)

{

RST = 0;

_ nop _();

SCK = 0;

_ nop _();

RST = 1;

_ nop _();//开始

Write_Ds1302_Byte(地址);//发送地址

write _ ds 1302 _ Byte(dat);//发送数据

RST = 0;//简历

}

/******************************************************************/

/*读取DS1302数据*/

/******************************************************************/

无符号字符Read_Ds1302(无符号字符地址)

{

无符号字符I,temp = 0x00

RST = 0;

_ nop _();

_ nop _();

SCK = 0;

_ nop _();

_ nop _();

RST = 1;

_ nop _();

_ nop _();

Write_Ds1302_Byte(地址);

for(I = 0;我& lt8;i++)//读取数据8次。

{

中频(SDA)

temp | = 0x80//每次传输的低字节数

SCK = 0;

temp & gt& gt=1;//向右移动一个位置

_ nop _();

_ nop _();

_ nop _();

SCK = 1;

}

RST = 0;

_ nop _();//下面是DS1302复位的建立时间。

_ nop _();

RST = 0;

SCK = 0;

_ nop _();

_ nop _();

_ nop _();

_ nop _();

SCK = 1;

_ nop _();

_ nop _();

SDA = 0;

_ nop _();

_ nop _();

SDA = 1;

_ nop _();

_ nop _();

返回(临时);//返回

}

/******************************************************************/

/*读取时钟数据*/

/******************************************************************/

void Read _ RTC(void)//读取日历

{

无符号字符I,* p;

p = read _ rtc _地址;//地址传递

for(I = 0;我& lt7;i++)//分钟7次读取秒分钟日月周年

{

l _ tmpdate[I]= Read _ ds 1302(* p);//将l_tmpdate[i]的编号写入地址Read_Ds1302。

p++;

}

}

/******************************************************************/

/*设置时钟数据*/

/******************************************************************/

void Set _ RTC(void)//设置日历。

{

无符号char i,*p,tmp

for(I = 0;我& lt7;I++){ //BCD处理

tmp = l _ tmpdate[I]/10;

l _ tmpdate[I]= l _ tmpdate[I]% 10;

l _ tmpdate[I]= l _ tmpdate[I]+tmp * 16;

}

Write_Ds1302(0x8E,0x 00);

p =写_ rtc _地址;//地址

for(I = 0;我& lt7;I++)//秒写7次,日月周年。

{

Write_Ds1302(*p,l _ tmpdate[I]);

p++;

}

Write_Ds1302(0x8E,0x 80);

}

/******************************************************************/

/*定时器中断功能*/

/******************************************************************/

void tim(void)中断1使用1

//中断,用于数码管扫描。

{

静态无符号字符I,num

TH0 = 0xf5

TL0 = 0xe0

P0 = table[l _ tmp display[I]];//查找表方法获取要显示的数字的数字段。

开关(一)

{

案例0:ls 138 a = 0;ls 138 b = 0;ls 138 c = 0;打破;

案例1:ls 138 a = 1;ls 138 b = 0;ls 138 c = 0;打破;

情况二:ls 138 a = 0;ls 138 b = 1;ls 138 c = 0;打破;

案例三:ls 138 a = 1;ls 138 b = 1;ls 138 c = 0;打破;

情况四:ls 138 a = 0;ls 138 b = 0;ls 138 c = 1;打破;

案例五:ls 138 a = 1;ls 138 b = 0;ls 138 c = 1;打破;

案例6:ls 138 a = 0;ls 138 b = 1;ls 138 c = 1;打破;

案例7:ls 138 a = 1;ls 138 b = 1;ls 138 c = 1;打破;

}

i++;

如果(i==8)

{

I = 0;

num++;

If(10==num) //定期读取1302的数据。时间间隔可以调整

{

read RTC _ Flag = 1;//使用标志位进行判断

num = 0;

}

}

}

这是DS1302显示时间的C程序,你好好看看。