/
#include
#define uchar unsigned char #define uint unsigned int
sbit beep=P3^5;
sbit ds1302_RST=P2^5; sbit ds1302_IO=P2^6; sbit ds1302_SCLK=P2^7;
sbit ACC0=ACC^0; sbit ACC7=ACC^7;
void init();
void delay_50us(uint t); void display();
uchar read_Byte();
void write_Byte(uchar tdata);
void write_data_ds1302(uchar taddr,uchar tdata); uchar read_data_ds1302(uchar taddr); void set_ds1302(uchar *P1302); void get_ds1302() ;
void init_ds1302();
uchar code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0xbf}; uchar initial_time[]={0x00,0x00,0x12};
// 秒 分 时 日 月uchar data now_time[3];
/******************************************/ /* 主函数 */ /******************************************/ void main() {
init();
周 年
init_ds1302();
set_ds1302(initial_time); while(1) {
get_ds1302(); display(); } }
/******************************************/ /* 延时子程序 */ /******************************************/ void delay_50us(uint t) {
uchar j; for(;t>0;t--)
for(j=19;j>0;j--); }
/******************************************/ /* 初始化子程序 */ /******************************************/ void init() {
P0=0xff; P2=0xff; P1=0x00; }
/******************************************/ /* 数码管显示子程序 */ /******************************************/ void display() {
uchar i; P1=0x01;
i=now_time[0]; //显示秒个 P0=table[i]; delay_50us(20);
P1=0x02;
i=now_time[0]/16; //显示秒十 P0=table[i]; delay_50us(20);
P1=0x04;
P0=table[10];//显示\ delay_50us(20);
P1=0x08;
i=now_time[1]; //显示分个 P0=table[i]; delay_50us(20);
P1=0x10;
i=now_time[1]/16; //显示分十 P0=table[i]; delay_50us(20);
P1=0x20;
P0=table[10]; //显示\ delay_50us(20);
P1=0x40;
i=now_time[2]; //显示时个 P0=table[i]; delay_50us(20);
P1=0x80;
i=now_time[2]/16; //显示时十 P0=table[i]; delay_50us(10); }
/*ds1302模块部分*/
/******************************************/ /* 读数据 */ /******************************************/ uchar read_Byte() {
uchar i;
for(i=8;i>0;i--) {
ACC=ACC>>1;
ACC7=ds1302_IO;//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿 ds1302_SCLK=1;
ds1302_SCLK=0;//产生下降沿输出一位数据 }
return(ACC); }
/******************************************/ /* 写字节 */ /******************************************/ void write_Byte(uchar tdata) {
uchar i; ACC=tdata; for(i=8;i>0;i--) {
ds1302_IO=ACC0; ds1302_SCLK=1;
ds1302_SCLK=0;//产生上升沿输入数据 ACC=ACC>>1; } }
/******************************************/ /* 写数据 */ /******************************************/ void write_data_ds1302(uchar taddr,uchar tdata)

