#include<reg51.h>
#include<ds1302.c>
unsigned char month,year,date,sec,min,hour,i,f,d;
unsigned char cp1,cp2,cp3;
sbit P1_0 = P1^0;
code unsigned char seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
bit conv;
void get_ds1302_time(void)
{
d = read_ds1302_add(0x81);
sec = BCD_DEC_conv(d);
d = read_ds1302_add(0x83);
min = BCD_DEC_conv(d);
d = read_ds1302_add(0x85);
hour = BCD_DEC_conv(d);
d = read_ds1302_add(0x87);
date = BCD_DEC_conv(d);
d = read_ds1302_add(0x89);
month = BCD_DEC_conv(d);
d = read_ds1302_add(0x8d);
year = BCD_DEC_conv(d);
}
void time0_isr(void) interrupt 1
{
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
cp1++;
if(cp1 >= 250)
{
cp1 = 0;
f = ~f;
cp2++;
if(cp2 >= 5)
{
cp2 = 0;
conv = !conv;
}
}
if(conv == 1)
{
P0 = 0xff;
switch(cp3)
{
case 0: P1_0 = 0;P0 = 0x01;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[sec%10];break;
case 1:
P1_0 = 0;P0 = 0x02;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[sec/10];break;
case 2:
P1_0 = 0;P0 = 0x04;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[min%10] & (0x7f | f);break;
case 3:
P1_0 = 0;P0 = 0x08;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[min/10];break;
case 4:
P1_0 = 0;P0 = 0x10;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[hour%10] & (0x7f | f);break;
case 5:
P1_0 = 0;P0 = 0x20;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[hour/10];break;
case 6:
P1_0 = 0;P0 = 0x40;P1_0 = 1;P1_0 = 0;
P0 = 0xbf;break;
case 7:
P1_0 = 0;P0 = 0x80;P1_0 = 1;P1_0 = 0;
P0 = 0xbf;break;
}
}
else
{
P0 = 0xff;
switch(cp3)
{
case 0:
P1_0 = 0;P0 = 0x01;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[date%10];break;
case 1:
P1_0 = 0;P0 = 0x02;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[date/10];break;
case 2:
P1_0 = 0;P0 = 0x04;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[month%10] & (0x7f | f);break;
case 3:
P1_0 = 0;P0 = 0x08;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[month/10];break;
case 4:
P1_0 = 0;P0 = 0x10;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[year%10] & (0x7f | f);break;
case 5:
P1_0 = 0;P0 = 0x20;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[year/10];break;
case 6:
P1_0 = 0;P0 = 0x40;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[0];break;
case 7:
P1_0 = 0;P0 = 0x80;P1_0 = 1;P1_0 = 0;
P0 = seven_seg[2];break;
}
}
cp3++;
if(cp3 >= 8)cp3 = 0;
}
void timer0_init(void)
{
TMOD = 0x01;
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void main(void)
{
uchar i = 13;
i = DEC_BCD_conv(i);
write_ds1302_add_dat(0x8e,0x00);
write_ds1302_add_dat(0x80,0x30);
write_ds1302_add_dat(0x82,i);
write_ds1302_add_dat(0x84,0x11);
write_ds1302_add_dat(0x86,0x28);
write_ds1302_add_dat(0x88,0x05);
write_ds1302_add_dat(0x8a,0x03);
write_ds1302_add_dat(0x8c,0x24);
write_ds1302_add_dat(0x8e,0x80);
timer0_init();
while(1)
{
get_ds1302_time();
}
}
#include <reg51.h>
#define uchar unsigned char //把 unsigned char 宏定义为 uchar
#define uint unsigned int //把 unsigned int 宏定义为 uint
sbit rst = P3^4; //定义复位/片选线接P3.4
sbit scl = P3^7; //定义串行时钟引脚接P3.7
sbit sda = P3^5; //定义串行数据输入输出端接P3.5
/*对DS1302初始化*/
void ds1302_init(void)
{
rst = 0;
scl = 0;
rst = 1;
}
/*对DS1302写1字节函数*/
void write_ds1302_onebyte(unsigned char dat)
{
unsigned char i;
for(i = 0;i < 8;i++)
{
sda = (bit)(dat & 0x01);
scl = 0;
scl = 1;
dat = dat >> 1;
}
}
/*从DS1302读一字节函数*/
uchar read_ds1302_onebyte(void)
{
unsigned char i,dat;
for(i = 0;i < 8;i++)
{
scl = 1;
scl = 0;
dat = dat >> 1;
if(sda)dat = dat | 0x80;
}
return(dat);
}
/*对DS1302的某一地址写一字节函数*/
void write_ds1302_add_dat(unsigned char add,unsigned char dat)
{
ds1302_init();
write_ds1302_onebyte(add);
write_ds1302_onebyte(dat);
scl = 1;
rst = 0;
}
/*从DS1302的某一地址读一字节函数*/
uchar read_ds1302_add(unsigned char add)
{
unsigned char dat_temp;
ds1302_init();
write_ds1302_onebyte(add);
dat_temp = read_ds1302_onebyte();
scl = 1;
rst = 0;
return(dat_temp);
}
/*8421BCD码到十进制转换*/
uchar BCD_DEC_conv(unsigned char x)
{
unsigned char dec;
dec = 0x0f & x;
x = x >> 4;
dec = dec + x * 10;
return(dec);
}
uchar DEC_BCD_conv(unsigned char x)
{
unsigned char bcd;
bcd = x % 10;
x = x / 10;
x = x << 4;
bcd = bcd | x ;
return(bcd);
}
【无标题】
最新推荐文章于 2024-08-11 22:34:14 发布