采用S7-200和4个LED数码管设计了显示小时和分钟的电路和控制程序。
# 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程序,你好好看看。