搜索
您的当前位置:首页正文

ds1302实时电子时钟

来源:哗拓教育
#define uchar unsigned char

#define uint unsigned int #include #include

uchar inittime[7]={0x00,0x00,0x21,0x13,0x1,0x03,0x10}; //* 秒 分 时 日 月 星期 年 * 初始化后设置为:10年1月13日星期3 21点0分0秒 uchar id,msec,model,LedTime,d; bit a,b;

sbit RS=P0^0; sbit RW=P0^1;

sbit E=P0^2;

sbit system=P1^0; //模式

sbit TimerDown=P1^1; //时间加 sbit TimerUp=P1^2; //时间减 sbit Speaker=P1^3; //蜂鸣器 sbit LED=P1^4; //背光灯输出 sbit T_IO =P1^5; sbit T_CLK=P1^6; sbit T_RST=P1^7;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

void Set(uchar,uchar); //根据选择调整相应项目 void RTInputByte(uchar); //输入 1Byte */ uchar RTOutputByte(void); //输出 1Byte */

void W1302(uchar, uchar); //向DS1302写入一个字节 uchar R1302(uchar); //从DS1302读出一个字节 void Set1302(uchar * ); //设置时间

void Out_LCM(void);//屏幕显示 void model0(void); void model1(void);

void model2(void);

void model3(void);//显示输出 void model4(void); void model5(void);

void model6(void);

void id_case1_key(); //项目调整 void Modset(); //模式键处理 void void void void

systemsetup(void); //进入系统设置

timesetup(void); //时间设置 datesetup(void); //日期设置 alarmclockset(void); //闹铃设置

void lampsetup(void); //背光灯设置

void timereset(void); //时间清零

void lcd_init(void);//初始化设置 void lcd_com(uchar com);//写指令函数 void lcd_dat(uchar dat);//写数据函数

void lcd_char(uchar X, uchar Y, uchar Data);//按指定位置显示一个字符 void lcd_string(uchar X, uchar Y, uchar code *Data);//按指定位置显示一串字符

void delay_ms(uint i); void Delay5Ms(void); void Delay400Ms(void);

void KeySound(); void ClockSound();

void main(void) {

//延时函数

//按键音

//闹铃蜂鸣声 //主函数

Speaker=1;

//关闭蜂鸣器

//打开LED ,低电平有效,外接9012

LED=0; 驱动

Delay400Ms(); lcd_init(); TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; TR0=1; ET0=1; while(1) {

//启动等待,等LCM讲入工作状态 //LCM初始化 //16位定时

//50ms

if(TimerDown==0) //左移键按下后把背光灯打开

Delay5Ms(); if(TimerDown==0) { KeySound();

{

//蜂鸣声

LED=0; //打开背光灯

LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;} //取出背光灯时间并转换

为十进制数

} b=1; //模式键是否动作标志。为1时不动作,为0时动作。 Modset(); //调用模式键处理程序判断按键是否按下。

if(b==0) { KeySound(); //蜂鸣声 LED=0; //打开背光灯 systemsetup(); //进入系统设置模式

LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16; //取出背光灯时间并转换为十

进制数

}

if((LED==0)&&LedTime==0) //延时间是否到

LED=1; //关闭背光灯

if(R1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。

{ if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判断闹铃时间是否到, }

ClockSound();

//发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。

}

model0(); //输出显示屏幕 }

void Modset() //模式键处理 { if(system==0) {

Delay5Ms(); if(system==0)

while(system==0); KeySound(); a=0;msec=0;b=0;

{

}

//蜂鸣声

//a、msec为闪烁标志,按键有动作时清零,不闪烁。 //b为模式键确认动作。其它程判断b是否为零时来

确定模式键是否动作。

}

}

void systemsetup(void) { model=1;

while(model!=0)

Out_LCM();

if (TimerUp==0) //设置项目左移

Delay5Ms();

if(TimerUp==0) { a=0;msec=0;KeySound();//蜂鸣声 if(model--==1) //6种系统设置项目

model=6;

}

while(TimerUp==0);

{

//系统设置

{

} if (TimerDown==0) //设置项目右移 {

Delay5Ms(); if(TimerDown==0) {

a=0;msec=0;KeySound();//蜂鸣声 if(model++==6) model=1;

}

}

while(TimerDown==0);

b=1; //模式键是否动作标志。为1时不动作,为0时动作。

Modset(); //调用模式键处理程序判断按键是否按下。

if(b==0) { KeySound(); //蜂鸣声

switch(model) //进入进个项目设置

{

case 1: timesetup(); break; //时间设置 case 2: datesetup();break; //日期设置 case 3: alarmclockset();break;//闹铃设置 case 4:

lampsetup();break; //背光灯设置

case 5: timereset();break; //时间清零 case 6: model=0;break; //退出系统设置

}

}

}

}

void timesetup() //时间调整 { id=6;

while(model==1)

//model为1时进入时间调整

{

b=1;

Modset();

if(b==0) { KeySound(); //蜂鸣声

if(id++==9)

//6..9为时分秒调。

id=6;

} id_case1_key();

//调用按键处理

Out_LCM(); //显示输出

}

}

void datesetup() //对日期进行调整

.

{

id=1;

while(model==2)

b=1;

Modset(); if(b==0) {

KeySound(); if(id++==5)

//蜂鸣声

//1..5为年月日星期 exit

//model为2时进入日期调整

{ }

}

//模式键是否动作

id=1; }

id_case1_key(); //日期调整 Out_LCM(); //显示输出

void alarmclockset(void) {

id=12;

while(model==3)

b=1;

Modset(); if(b==0) {

//闹铃调整

//进入闹铃设置

{

//模式键是否动作

//蜂鸣声

KeySound();

if(R1302(0xc3)%16==0) { id=0;model++; } //0xc2为闹铃开关寄存器。当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置 else if(id++==15) id=12; } }

void lampsetup(void) //背光灯时间设置 { id=10; while(model==4)

//背光灯存储空间DS1302(0xc0) //model为3时进入背光灯调整

}

id_case1_key();

//12..15为闹铃开关和时间设置 exit

//调整

Out_LCM(); //显示输出

{

b=1;

Modset();

//模式键是否动作

if(b==0) { KeySound(); if(id++==11)

id=10;

//蜂鸣声

//10为背光灯 exit

} }

id_case1_key();

Out_LCM(); //显示输出

}

void timereset() //时间清零

{

Set1302(inittime); //清时间

W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻 model++; }

//对相应的项目进行加、减调整。 void id_case1_key() {

if (TimerUp==0) //增加 {

Delay5Ms();

if(TimerUp==0) { a=0;msec=0;KeySound(); 整

//按键处理

//蜂鸣声

if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调

{

}

else

model++; id=0;

//退出时间、日期设置

}

Set(id,1);

while(TimerUp==0);

} if (TimerDown==0) //减少 {

Delay5Ms();

if(TimerDown==0) { 调整

a=0;msec=0;KeySound(); //蜂鸣声

if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出

{

}

model++; id=0;

//退出时间、日期设置

else Set(id,0); }

//调用DS1302写入函数

}

while(TimerDown==0);

}

void timer_1(void) interrupt 1

//中断入口,闪烁

{

TH0=0x3c; //50ms定时 TL0=0xb0; if(msec++==10) {

} }

//根据选择调整相应项目并写入DS1302 void Set(uchar sel,uchar sel_1) {

uchar address,item;

uchar max,min;

if(sel==1) {address=0x8c; max=99;min=0;} //年 if(sel==2) {address=0x88; max=12;min=1;} //月 if(sel==3) {address=0x86; max=31;min=1;} //日 if(sel==4) {address=0x8a; max=7; min=1;} //星期 if(sel==6) {address=0x84; max=23;min=0;} //小时 if(sel==7) {address=0x82; max=59;min=0;} //分钟

if(sel==8) {address=0x80; max=59;min=0;} //秒

if(sel==10) {address=0xc0; max=59;min=0;} //背光时间,最长1分钟 if(sel==12) {address=0xc2; max=1;min=0;} //闹铃开关寄存器 if(sel==13) {address=0xc4; max=23;min=0;} //闹铃时寄存器 if(sel==14) {address=0xc6; max=59;min=0;} //闹铃分寄存器

//500ms

msec=0;a=~a; //闪烁标志反转 if(a==0) //1秒后背光时间减一秒。 LedTime--;

item=R1302(address+1)/16*10+R1302(address+1)%16; if (sel_1==0) item++; else item--; if(item>max) item=min; if(itemW1302(0x8e,0x00); //允许写操作

W1302(address,item/10*16+item%10); //写入DS1302 //转成BCD码 W1302(0x8e,0x80); //写保护,禁止写操作 }

void Out_LCM(void)//屏幕显示 { switch(model) { case 0: model0(); break; case 1: model1(); break; case 2: model2(); break; case 3: model3(); break; case 4: model4(); break;

case 5: model5(); break;

case 6: model6(); break; } }

void lcd_init(void)//初始化设置 { lcd_com(0x38);//显示模式设置 delay_ms(1);

lcd_com(0x01);//清楚屏幕 delay_ms(1);

lcd_com(0x0c);//光标关闭 delay_ms(1);

lcd_com(0x06);

}

void lcd_com(uchar com) //写指令函数 { RS=0; RW=0; P2=com; E=1;

delay_ms(1);

E=0;

//在不同的条件下显示不同的字符

}

void lcd_dat(uchar dat) //写数据函数 { RS=1;

RW=0; P2=dat; E=1;

delay_ms(1); E=0;

}

void lcd_char(uchar X, uchar Y, uchar Data)//按指定位置显示一个字符 { }

void lcd_string(uchar X, uchar Y, uchar code *Data)//按指定位置显示一串字符 {

uchar ListLength,j;

ListLength = strlen(Data); Y &= 0x01;

X &= 0x0F; //限制X不能大于15,Y不能大于1 if (X <= 0x0F) //X坐标应小于0xF {

for(j=0;jlcd_char(X, Y, Data[j]); //显示单个字符 X++; } } }

/***********************model为零时第一行显示时间,不为零时显示system setup******/ void model0()

{ lcd_string(0,0,\"Time\"); //显示固定字符串(Time) lcd_char(13,0,0x20); //不显示 lcd_char(4,0,0x20); //不显示

Y &= 0x01;

X &= 0x0F; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码

lcd_com(X); //这里不检测忙信号,发送地址码 lcd_dat(Data);

lcd_char(4,1,0x20); //不显示

lcd_char(15,1,0x20); //不显示

lcd_char(7,1,0x2f); //显示固定字符 \"/\" lcd_char(10,1,0x2f); //显示固定字符 \"/\" lcd_char(13,1,0x2f); //显示固定字符 \"/\"

lcd_string(0,1,\"Date\"); //显示固定字符串Date(日期) if(a==1) //冒号闪烁 {lcd_char(7,0,0x3a); lcd_char(10,0,0x3a);} else

{lcd_char(7,0,0x20); lcd_char(10,0,0x20);}

/*******************model为零时第二行显示日期,不为零显示设置项目*******/

lcd_char(5,1,R1302(0x8d)/16+0x30); //显示年

lcd_char(6,1,R1302(0x8d)%16+0x30);

lcd_char(8,1,R1302(0x89)/16+0x30); //显示月 lcd_char(9,1,R1302(0x89)%16+0x30);

lcd_char(11,1,R1302(0x87)/16+0x30); //显示日 lcd_char(12,1,R1302(0x87)%16+0x30);

lcd_char(14,1,R1302(0x8b)%16+0x30); //显示星期

lcd_char(5,0,R1302(0x85)/16+0x30); //显示小时 lcd_char(6,0,R1302(0x85)%16+0x30);

lcd_char(8,0,R1302(0x83)/16+0x30); //显示分钟 lcd_char(9,0,R1302(0x83)%16+0x30);

lcd_char(11,0,R1302(0x81)/16+0x30); //显示秒 lcd_char(12,0,R1302(0x81)%16+0x30); }

/*************************model

不为零时显示系统设置

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

//model为1时time闪烁,按下模式键后进入时间调

void model1() /*************************************判断***********************/

ID的值来显示项目

{ lcd_char(0,0,0x20); //不显示

lcd_char(1,0,0x20);

lcd_string(2,0,\"System Setup\"); //第一行显示system setup if(id==0) //为0时显示TIME date lalcak {lcd_char(9,1,0x20); //不显示

lcd_char(4,1,0x20); //不显示 lcd_char(15,1,0x20); //不显示

lcd_string(5,1,\"Date\"); //显示date lcd_string(10,1,\"Clock\");//显示clock

if(a==1)

{lcd_char(0,1,0x20); //不显示 lcd_char(1,1,0x20); //不显示 lcd_char(2,1,0x20); //不显示

lcd_char(3,1,0x20); //不显示

}

else lcd_string(0,1,\"Time\"); //显示time

}

else {

//id不为零进入时间调整项目

lcd_char(3,1,0x3a); //显示固定字符 \":\"

lcd_char(6,1,0x3a); //显示固定字符 \":\" lcd_char(9,1,0x20); //不显示 lcd_char(10,1,0x20); //不显示

lcd_char(0,1,0x20); //不显示

/****************************时显示闪烁控制********************/

if((id==6)&&(a==1))

//id为5时时闪烁

{ lcd_char(1,1,0x20); //不显示

lcd_char(2,1,0x20); //不显示 }

else {lcd_char(1,1,R1302(0x85)/16+0x30); //显示时

lcd_char(2,1,R1302(0x85)%16+0x30); }

/******************************分显示闪烁控制********************/

if((id==7)&&(a==1)) { lcd_char(4,1,0x20); //不显示 lcd_char(5,1,0x20); //不显示

//id为6时分闪烁

} else {lcd_char(4,1,R1302(0x83)/16+0x30); //显示分

lcd_char(5,1,R1302(0x83)%16+0x30);

}

/******************************秒显示闪烁控制********************/ if((id==8)&&(a==1)) //id为7时秒闪烁 { lcd_char(7,1,0x20); //不显示 lcd_char(8,1,0x20); //不显示 } else

{lcd_char(7,1,R1302(0x81)/16+0x30); //显示秒

lcd_char(8,1,R1302(0x81)%16+0x30); }

/*******************************Exit显示闪烁控制********************/ if((id==9)&&(a==1)) //id为8时exit闪烁 {lcd_char(11,1,0x20); //不显示 lcd_char(12,1,0x20); //不显示 lcd_char(13,1,0x20); //不显示 lcd_char(14,1,0x20); //不显示 }

else

lcd_string(11,1,\"Exit\");

//显示exit

} }

/***************************************modelo为2时date***********************************************/ void model2() { if(id==0)

{lcd_char(9,1,0x20); //不显示 lcd_char(4,1,0x20); //不显示 lcd_char(15,1,0x20); //不显示

lcd_string(0,1,\"Time\"); //显示time lcd_string(10,1,\"Clock\"); //显示clock if(a==1) {lcd_char(5,1,0x20); //不显示 lcd_char(6,1,0x20); //不显示 lcd_char(7,1,0x20); //不显示 lcd_char(8,1,0x20); //不显示 }

else

lcd_string(5,1,\"Date\"); //显示date

}

闪烁

/*****************************************************************************************************/ //id不为零时、进入日期调整

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

else

{ lcd_char(0,1,0x20); //不显示

lcd_char(11,1,0x20); //不显示

lcd_char(3,1,0x2f); //显示固定字符 \"/\"

lcd_char(6,1,0x2f); //显示固定字符 \"/\" lcd_char(9,1,0x2f); //显示固定字符 \"/\" /****************************年显示闪烁控制********************/

if((id==1)&&(a==1)) //id为1时年闪烁 { lcd_char(1,1,0x20); //不显示 lcd_char(2,1,0x20); //不显示

} else

{lcd_char(1,1,R1302(0x8d)/16+0x30); //显示年

lcd_char(2,1,R1302(0x8d)%16+0x30);

}

/***************************月闪烁控制************************/ if((id==2)&&(a==1)) //id为2时月闪烁

{ lcd_char(4,1,0x20); //不显示

lcd_char(5,1,0x20); //不显示 }

else

{lcd_char(4,1,R1302(0x89)/16+0x30); //显示月

lcd_char(5,1,R1302(0x89)%16+0x30);

}

/***************************日闪烁控制************************/

if((id==3)&&(a==1)) //id为2日闪烁 { lcd_char(7,1,0x20); //不显示 lcd_char(8,1,0x20); //不显示

}

else

{lcd_char(7,1,R1302(0x87)/16+0x30); //显示日

lcd_char(8,1,R1302(0x87)%16+0x30);

}

/***************************星期闪烁控制*********************************/ if((id==4)&&(a==1)) //id为2时星期闪烁

{

lcd_char(10,1,0x20); //不显示 } else

{lcd_char(10,1,R1302(0x8b)%16+0x30); //显示星期

}

/**************************exit闪烁控制*********************************/ if((id==5)&&(a==1)) //id为5时exit闪烁 }

{ lcd_char(12,1,0x20); //不显示 lcd_char(13,1,0x20); //不显示

lcd_char(14,1,0x20); //不显示

lcd_char(15,1,0x20); //不显示 }

else

lcd_string(12,1,\"Exit\"); //显示exit

}

/*********************************************************************************/ /*model为3时进入闹铃项目

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

void model3() {

if(id==0) {lcd_char(9,1,0x20); //不显示 lcd_char(4,1,0x20); //不显示 lcd_char(15,1,0x20); //不显示

lcd_string(0,1,\"Time\"); //显示time

lcd_string(5,1,\"Date\"); //显示date if(a==1) { lcd_char(10,1,0x20); //不显示 lcd_char(11,1,0x20); //不显示

lcd_char(12,1,0x20); //不显示 lcd_char(13,1,0x20); //不显示 lcd_char(14,1,0x20);

} else

lcd_string(10,1,\"Clock\"); //显示cloak }

/**************************id不为零进入闹铃设置显示********************/

else

{if(id==12) //闹铃开关显示

{lcd_string(0,1,\"ClockSet\"); //显示ClockSet

lcd_char(8,1,0x20); lcd_char(13,1,0x20); lcd_char(14,1,0x20);

/*****************************闹铃开关显示********************************/ if(a==1) //A为闪烁标志

{lcd_char(10,1,0x20); //不显示 lcd_char(11,1,0x20); //不显示

lcd_char(12,1,0x20); //不显示 lcd_char(13,1,0x20); //不显示 }

else {

if(R1302(0xc3)%16==0) //闹铃寄存器的值是否为零(关) {lcd_string(10,1,\"OFF\");}//显示OFF

else

{lcd_char(9,1,0x20); //不显示 lcd_char(12,1,0x20); //不显示

lcd_char(13,1,0x20); //不显示 lcd_char(14,1,0x20); //不显示

lcd_char(15,1,0x20); //不显示 lcd_string(10,1,\"ON\"); //显示ON } }

} else

{lcd_string(0,1,\"Clock\"); //显示clock

lcd_char(8,1,0x3a); //显示固定字符 \":\" lcd_char(5,1,0x20); //不显示

lcd_char(11,1,0x20); //不显示

/**************************闹铃时闪烁显示**********************/

if((id==13)&&(a==1)) {

lcd_char(6,1,0x20); lcd_char(7,1,0x20); }

else

{lcd_char(6,1,R1302(0xc5)/16+0x30); //显示闹铃时 lcd_char(7,1,R1302(0xc5)%16+0x30); //显示闹铃时 }

//闹铃时闪烁

/**************************闹铃分闪烁显示*******************/ if((id==14)&&(a==1)) //闹铃分闪烁

{lcd_char(9,1,0x20); //不显示 lcd_char(10,1,0x20); //不显示

} else

{lcd_char(9,1,R1302(0xc7)/16+0x30); //显示闹铃分

lcd_char(10,1,R1302(0xc7)%16+0x30); //显示闹铃分

}

/************************exit闪烁显示***********************/ if((id==15)&&(a==1))

//exie闪烁

{lcd_char(12,1,0x20); //不显示

lcd_char(13,1,0x20); //不显示 lcd_char(14,1,0x20); //不显示 lcd_char(15,1,0x20); //不显示 }

else

lcd_string(12,1,\"Exit\");

//显示exit

}

}

}

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

*****************************************/ void model4() { if(id==0)

//id为零未进入背光灯设置

{lcd_char(10,1,0x20); //不显示 lcd_char(11,1,0x20); //不显示 lcd_char(4,1,0x20); //不显示 lcd_string(5,1,\"Reset\"); //显示reset

lcd_string(12,1,\"Exit\"); //显示exit if(a==1)

{lcd_char(0,1,0x20); //不显示

lcd_char(1,1,0x20); //不显示 lcd_char(2,1,0x20); //不显示

lcd_char(3,1,0x20); //不显示

} else

lcd_string(0,1,\"Lamp\"); //显示lamp } else //id不为零(10)进入背光灯时间设置 {lcd_string(0,1,\"Lamp\"); //显示lamp

lcd_string(4,1,\"Set\"); //显示set

lcd_string(9,1,\"Sec\"); //显示sec 秒 lcd_string(12,1,\"Exit\"); //显示exit if((id==10)&&(a==1)) { lcd_char(7,1,0x20); //不显示 else

{

lcd_char(7,1,R1302(0xc1)/16+0x30); //读出背光灯延时时间

lcd_char(8,1,0x20);}

lcd_char(8,1,R1302(0xc1)%16+0x30); }

if((id==11)&&(a==1))

{

lcd_char(12,1,0x20); //不显示

lcd_char(13,1,0x20); //不显示 lcd_char(14,1,0x20); //不显示

lcd_char(15,1,0x20); //不显示 } }

}

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

时间*****************************************/ void model5() {

lcd_char(4,1,0x20); //不显示 lcd_char(10,1,0x20); //不显示 lcd_char(11,1,0x20); //不显示

lcd_string(0,1,\"Lamp\"); //显示lamp lcd_string(12,1,\"Exit\"); //显示exit if(a==1)

{ lcd_char(5,1,0x20); //不显示

lcd_char(6,1,0x20); //不显示 lcd_char(7,1,0x20); //不显示 lcd_char(8,1,0x20); //不显示 lcd_char(9,1,0x20);

}

else

lcd_string(5,1,\"Reset\"); //显示reset }

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

***********************************************/ void model6() {

归零退

设置

lcd_char(10,1,0x20); //不显示

lcd_char(11,1,0x20); //不显示

lcd_string(0,1,\"Lamp\"); //显示lamp lcd_string(5,1,\"Reset\"); //显示reset if(a==1) {lcd_char(12,1,0x20); //不显示 lcd_char(13,1,0x20); //不显示

lcd_char(14,1,0x20); //不显示 lcd_char(15,1,0x20); //不显示 }

else

lcd_string(12,1,\"Exit\"); //显示exit }

//********DS1302读写程序***************//

/******************************************************************** 函 数 名:RTInputByte()

功 能:实时时钟写入一字节

说 明:往DS1302写入1Byte数据 (内部函数) 入口参数:d 写入的数据 返 回 值:无

***********************************************************************/ void RTInputByte(uchar d) {

uchar i; ACC = d;

for(i=8; i>0; i--)

{

T_IO = ACC0; /*相当于汇编中的 RRC */ T_CLK = 1; T_CLK = 0;

ACC = ACC >> 1; } }

/******************************************************************** 函 数 名:RTOutputByte() 功 能:实时时钟读取一字节

说 明:从DS1302读取1Byte数据 (内部函数) 入口参数:无

返 回 值:ACC

设 计:zhaojunjie 日 期:2002-03-19 修 改: 日 期:

***********************************************************************/ uchar RTOutputByte(void)

{

uchar i;

for(i=8; i>0; i--) {

ACC = ACC >>1; /*相当于汇编中的 RRC */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0; }

return(ACC);

}

/******************************************************************** 函 数 名:W1302()

功 能:往DS1302写入数据

说 明:先写地址,后写命令/数据 (内部函数) 调 用:RTInputByte() , RTOutputByte()

入口参数:ucAddr: DS1302地址, ucData: 要写的数据 返 回 值:无

***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa) {

T_RST = 0; T_CLK = 0; T_RST = 1;

RTInputByte(ucAddr); /* 地址,命令 */

RTInputByte(ucDa); /* 写1Byte数据*/ T_CLK = 1;

T_RST = 0; }

/******************************************************************** 函 数 名:R1302()

功 能:读取DS1302某地址的数据

说 明:先写地址,后读命令/数据 (内部函数) 调 用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址 返 回 值:ucData :读取的数据

***********************************************************************/ uchar R1302(uchar ucAddr) {

uchar ucData; T_RST = 0;

T_CLK = 0; T_RST = 1;

RTInputByte(ucAddr); /* 地址,命令 */

ucData = RTOutputByte(); /* 读1Byte数据 */ T_CLK = 1; T_RST = 0; return(ucData); }

/******************************************************************** 函 数 名:Set1302()

功 能:设置初始时间

说 明:先写地址,后读命令/数据(寄存器多字节方式) 调 用:W1302()

入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 返 回 值:无

***********************************************************************/ void Set1302(uchar *pClock)

{

uchar i;

uchar ucAddr = 0x80;

W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/ for(i =7; i>0; i--)

{

W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */ pClock++; ucAddr +=2;

}

W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/ }

void delay_ms(uint i)//延时函数 { }

void Delay5Ms(void)//5ms延时 {

unsigned int TempCyc = 5552; while(TempCyc--); }

uint j,k; for(j=0;jfor(k=0;k<100;k++);

void Delay400Ms(void)//400ms延时 { uchar TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--);

}

}

void KeySound() { Speaker=0;

Delay5Ms();

Speaker=1;

}

void ClockSound() {

if(a==0)

{ Speaker=0; Delay5Ms(); Delay5Ms();

Delay5Ms(); Speaker=1;

} }

//按键音 //开蜂鸣声

//关蜂鸣声

//闹铃蜂鸣声

//开蜂鸣声

//关蜂鸣声

因篇幅问题不能全部显示,请点此查看更多更全内容

Top