在网上看到您的设计成果-单片机+LCD1602+DS18B20+DS1302电子钟,同志我想看看您的原理图和程序,谢谢

在网上看到您的设计成果-单片机+LCD1602+DS18B20+DS1302电子钟,同志我想看看您的原理图和程序,谢谢,第1张

/============================================================

1602液晶显示DS1302时钟

=============================================================/

#include <AT89x51h>

#include <stringh>

#include < intrinsh >

#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;

#define LCM_RW P2_1 //定义引脚

#define LCM_RS P2_0

#define LCM_E P2_2

#define LCM_Data P0

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

#define uchar unsigned char

sbit T_CLK=P1^0;

sbit T_IO =P1^1;

sbit T_RST=P1^2;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

sbit LED=P1^4; //背光灯输出 (因本实验板无此功能 所以此项功能用P14LED灯作为指示)

sbit system=P3^2; //模式 对应实验板K1按键

sbit TimerUp=P3^3; //时间减 对应实验板K2按键

sbit TimerDown=P3^4; //时间加 对应实验板K3按键

sbit BEEP=P3^6; //蜂鸣器

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 KeySound(); //按键音

void ClockSound(); //闹铃蜂鸣声

uchar id,msec,model,LedTime,d;

bit a,b; //闪烁标志位

uchar inittime[7]={0x50,0x59,0x23,0x24,0x07,0x05,0x09}; //初始化后设置为:09年7月24日星期5 23点59分50秒

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 WriteDataLCM(uchar WDLCM);

void WriteCommandLCM(uchar WCLCM,BuysC);

uchar ReadStatusLCM(void);

void LCMInit(void);

void OutputInformation(uchar X, uchar Y, uchar DData);

void DisplayListChar(uchar X, uchar Y, uchar code DData);

void Delay5Ms(void);

void Delay400Ms(void);

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

uchar code systemp[]={"Systemsetup"}; //字符串输出(系统设定)

uchar code TIMER[]={"Time"}; //字符串输出(时间)

uchar code DATE[]={"Date"}; //字符串输出(日期)

uchar code alarmclock[]={"Clock"}; //字符串输出(闹铃)

uchar code lamp[]={"Lamp"}; //字符串输出(背光灯)

uchar code reset[]={"Reset"}; //字符串输出(时间归零)

uchar code exit[]={"Exit"}; //字符串输出(退出)

uchar code set[]={"Set"}; //字符串输出(设置)

uchar code sec[]={"sec"}; //字符串输出(秒)

uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置)

uchar code ClockOn[]={"ON"}; //字符串输出(ON)

uchar code ClockOff[]={"OFF"}; //字符串输出(OFF)

void timesetup(void); //时间设置

void datesetup(void); //日期设置

void alarmclockset(void); //闹铃设置

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

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

//

void delay1(int ms)

{

unsigned char y ;

while(ms--)

{

for(y = 0 ; y<250 ; y++)

{

_nop_() ;

_nop_() ;

_nop_() ;

_nop_() ;

}

}

}

/ 延时子程序/

void delay11(uchar x)

{ uchar j;

while((x--)!=0)

{ for(j=0;j<125;j++)

{;}

}

}

//--------------------------------------------------

//--------------------------------------------------

void delay0(uchar x) //x014MS

{

unsigned char i;

while(x--)

{

for (i = 0; i<13; i++) {}

}

}

//

void beep() //蜂鸣器响一声函数

{

unsigned char i;

for (i=0;i<100;i++)

{

delay0(4);

BEEP=!BEEP; //BEEP取反

}

BEEP=1; //关闭蜂鸣器

delay11(250); //延时

}

void main(void)

{

LED=0; //打开LED ,低电平有效,外接9012驱动

Delay400Ms(); //启动等待,等LCM讲入工作状态

Delay400Ms();

LCMInit(); //LCM初始化

TMOD=0x01; //16位定时

TH0=0x3c; //50ms

TL0=0xb0;

EA=1;

TR0=1;

ET0=1;

while(1)

{

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

{Delay5Ms();

if(TimerDown==0)

{KeySound(); //蜂鸣声

LED=0; //打开背光灯

LedTime=R1302(0xc1)/1610+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数

}

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

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

if(b==0)

{

KeySound(); //蜂鸣声

LED=0; //打开背光灯

systemsetup(); //进入系统设置模式

LedTime=R1302(0xc1)/1610+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 KeySound() //按键音

{

beep(); //开蜂鸣声

}

void ClockSound() //闹铃蜂鸣声

{

if(a==0)

{

beep();

}

}

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) //69为时分秒调。

id=6;

}

id_case1_key(); //调用按键处理

Out_LCM(); //显示输出

}

}

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

{

id=1;

while(model==2) //model为2时进入日期调整

{b=1;

Modset(); //模式键是否动作

if(b==0)

{KeySound(); //蜂鸣声

if(id++==5) //15为年月日星期 exit

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) //1215为闹铃开关和时间设置 exit

id=12;

}

id_case1_key(); //调整

Out_LCM(); //显示输出

}

}

void lampsetup(void) //背光灯时间设置

{id=10; //背光灯存储空间DS1302(0xc0)

while(model==4) //model为3时进入背光灯调整

{b=1;

Modset(); //模式键是否动作

if(b==0)

{KeySound(); //蜂鸣声

if(id++==11) //10为背光灯 exit

id=10;

}

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时按下加、减键将退出调整

{ model++; //退出时间、日期设置

id=0;

}

else

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) //500ms

{msec=0;a=~a; //闪烁标志反转

if(a==0) //1秒后背光时间减一秒。

LedTime--;

}

}

//根据选择调整相应项目并写入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;} //闹铃分寄存器

item=R1302(address+1)/1610+R1302(address+1)%16;

if (sel_1==0) item++; else item--;

if(item>max) item=min;

if(item<min) item=max;

W1302(0x8e,0x00); //允许写 *** 作

W1302(address,item/1016+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;

}

}

/model为零时第一行显示时间,不为零时显示system setup/

void model0()

{

DisplayListChar(0,0,TIMER); //显示固定字符串(Time)

OutputInformation(13,0,0x20); //不显示

OutputInformation(4,0,0x20); //不显示

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

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

OutputInformation(7,1,0x2f); //显示固定字符 "/"

OutputInformation(10,1,0x2f); //显示固定字符 "/"

OutputInformation(13,1,0x2f); //显示固定字符 "/"

DisplayListChar(0,1,DATE); //显示固定字符串Date(日期)

if(a==1) //冒号闪烁

{OutputInformation(7,0,0x3a); OutputInformation(10,0,0x3a);}

else

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

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

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

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

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

OutputInformation(9,1,R1302(0x89)%16+0x30);

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

OutputInformation(12,1,R1302(0x87)%16+0x30);

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

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

OutputInformation(6,0,R1302(0x85)%16+0x30);

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

OutputInformation(9,0,R1302(0x83)%16+0x30);

OutputInformation(11,0,R1302(0x81)/16+0x30); //显示秒

OutputInformation(12,0,R1302(0x81)%16+0x30);

}

/model不为零时显示系统设置/

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

void model1()

/判断ID的值来显示项目/

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

OutputInformation(1,0,0x20);

DisplayListChar(2,0,systemp); //第一行显示system setup

if(id==0) //为0时显示TIME date lalcak

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

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

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

DisplayListChar(5,1,DATE); //显示date

DisplayListChar(10,1,alarmclock);//显示lalcak

if(a==1)

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

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

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

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

}

else

DisplayListChar(0,1,TIMER); //显示time

}

else

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

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

OutputInformation(6,1,0x3a); //显示固定字符 ":"

OutputInformation(9,1,0x20); //不显示

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

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

设置一个标志位Read_Flag就可以了,如下:

Read_BurstRam(&Read_Flag,1); //读时钟ram

if(Read_Flag != 1)

{

Write_Data(0x90,0xaa); //定义充电

Write_BurstClock(Cur_Time); //初始化时钟

Write_BurstRam(&Clock_Flag,1); //写时钟ram

Write_Data(0x8e,0x80); //打开写保护

}

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit SCK=P3^6;

sbit SDA=P3^4;

sbit RST=P3^5;// DS1302复位

sbit set=P3^0;//定义按键端口

sbit s1=P3^1;

sbit s2=P3^2;

sbit s3=P3^3;

/液晶口定义/

sbit RS=P2^4;//RS为数据/指令选择1/0

sbit RW=P2^5;//读写

sbit E=P2^6;//E为使能信号

bit flag;//是否读取时间的标志位

uchar setn=0;//复位键、增加键、减少键按下次数

uchar code time0[]="DATE: - - ";

uchar code time1[]="TIME: : : ";

uchar l_tmpdate[7]={0,55,16,22,8,6,9};//秒分时日月周年// 可随时更改

uchar code write_add[7]={0x80,0x82,0x84,0x86,

0x88,0x8a,0x8c}; //秒分时日月周年 写的寄存器地址

uchar code read_add[7]={0x81,0x83,0x85,0x87,

0x89,0x8b,0x8d}; //秒分时日月周年 读的寄存器地址

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d

,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管 0-9加'-'熄灭表

void delay(uint z)

{

while(--z);

}

void write_com(uchar com)//液晶写命令函数

{

RS=0;//写命令使能

RW=0;//写

delay(5000);

/在高脉冲下命令输入/

E=0;

P0=com;

delay(500);

E=1;

delay(500);

E=0;

}

void write_data(uchar dat)//液晶写数据函数

{

RS=1;//写数据使能

RW=0;

delay(5000);

/在高脉冲下数据输入/

E=0;

P0=dat;

delay(500);

E=1;

delay(500);

E=0;

}

void init()//液晶初始化

{

uchar num;

E=0;

write_com(0x38);//显示模式设置

delay(500);

write_com(0x38);

delay(500);

write_com(0x38);

write_com(0x08);//显示关闭

delay(500);

write_com(0x01);//显示清屏

write_com(0x06);//光标移动设置整屏不移动

write_com(0x0c);//屏幕开、光标不闪(0)不显示(0)

delay(500);

write_com(0x80);

for(num=0;num<16;num++)

{

write_data(time0[num]);

delay(5);

}

write_com(0x80+0x40);

for(num=0;num<13;num++)

{

write_data(time1[num]);

delay(5);

}

}

void Write_Ds1302_Byte(uchar temp) //写一个字节

{

uchar i;

for (i=0;i<8;i++) //循环8次写入数据

{

SCK=0;

SDA=temp&0x01; //每次传输低字节

temp>>=1; //右移一位

SCK=1;

}

}

//

void Write_Ds1302(uchar add,uchar dat )//向寄存器写数据

{

RST=0;

_nop_();

SCK=0;

_nop_();

RST=1;//启动

_nop_();

Write_Ds1302_Byte(add); //发送地址

Write_Ds1302_Byte(dat); //发送数据

RST=0; //恢复

}

uchar Read_Ds1302_Byte()//读一个字节

{

uchar i,temp=0x00;

for (i=0;i<8;i++) //循环8次 读取数据

{

if(SDA)

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

SCK=0;

temp>>=1; //右移一位

SCK=1;

}

return(temp);

}

uchar Read_Ds1302(uchar address )//从寄存器读数据

{

uchar date;

RST=0;

_nop_();

SCK=0;

_nop_();

RST=1;

_nop_();

Write_Ds1302_Byte(address);

date=Read_Ds1302_Byte();

RST=0;

_nop_(); //以下为DS1302复位的稳定时间

RST=0;

SCK=0;

_nop_();

SCK=1;

_nop_();

SDA=0;

_nop_();

SDA=1;

_nop_();

return (date);

}

//

void Read_RTC(void) //读取日历

{

uchar i,p;

p=read_add; //读的地址传递

for(i=0;i<7;i++) //分7次读取 秒分时日月周年

{

l_tmpdate[i]=Read_Ds1302(p);

p++;

}

}

//

void Set_RTC(void) //设定日历

{

uchar i,p,tmp;

for(i=0;i<7;i++)

{ //BCD处理,将十六进制转换成十进制

tmp=l_tmpdate[i]/10;

l_tmpdate[i]=l_tmpdate[i]%10;

l_tmpdate[i]=l_tmpdate[i]+tmp16;

}

Write_Ds1302(0x8E,0X00);//关闭写保护

p=write_add;//传要写的寄存器地址

for(i=0;i<7;i++) //7次写入秒分时日月周年

{

Write_Ds1302(p,l_tmpdate[i]);

p++;

}

Write_Ds1302(0x8E,0x80);//打开写保护

}

void write_lcd()

{

static uchar i,temp[2];

switch(i)

{

case 0: write_com(0x80+0x40+0x0b);break;//秒

case 1: write_com(0x80+0x40+8);break;//分

case 2: write_com(0x80+0x40+5);break;//时

case 3: write_com(0x80+0x0b);break;//日

case 4: write_com(0x80+8);break;//月

case 5: write_com(0x80+0x0e);break;//星期

case 6: write_com(0x80+5);break;//年

}

temp[0]=l_tmpdate[i]/16;//数据的转换

temp[1]=l_tmpdate[i]&0x0f;

write_data(0x30+temp[0]);

write_data(0x30+temp[1]);

i++;

if(i==7)

i=0;

}

uchar change(uchar x)//十进制转换成十六进制

{

uchar tep,y;

y=x;

tep=y/16;

y=y%16;

y=y+tep10;

return y;

}

void keyscan()

{

uchar tem[2],tp,Flag;//存储要更改的时间数据

if(set==0)

{

flag=1;//时间停止

delay(500);//去键盘按下抖动

if(set==0)

{

delay(500);

while(!set);

delay(500);//去键盘抬起时抖动

while(!set);

delay(500);

setn++;

if(setn==1)

{

write_com(0x80+0x40+12);//将光标移动到秒个位

write_com(0x0f);//显示光标并且闪烁

}

if(setn==2)

{

write_com(0x80+0x40+9);//将光标移动到分个位

write_com(0x0f);//显示光标并且闪烁

}

if(setn==3)

{

write_com(0x80+0x40+6);//将光标移动到时个位

write_com(0x0f);//显示光标并且闪烁

}

if(setn==4)

{

write_com(0x80+15);

write_com(0x0f);

}

if(setn==5)

{

write_com(0x80+12);

write_com(0x0f);

}

if(setn==6)

{

write_com(0x80+9);

write_com(0x0f);

}

if(setn==7)

{

write_com(0x80+6);

write_com(0x0f);

}

if(setn==8)

{

setn=0;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[0],l_tmpdate[0]);

Write_Ds1302(0x8E,0x80);//打开写保护

flag=0;//时钟正常运行

write_com(0x0c);//光标停止闪烁

}

}

}

if(setn!=0)//更改时间

{

if(s1==0)//增加时间

{

delay(5000);

if(s1==0)

{

while(!s1);

delay(5000);//去键盘抬起时抖动

while(!s1);

if(setn==1)

{

l_tmpdate[0]=change(l_tmpdate[0]);

l_tmpdate[0]++;

if(l_tmpdate[0]>=60)

l_tmpdate[0]=0;

{

tp=l_tmpdate[0]/10;

l_tmpdate[0]=l_tmpdate[0]%10;

l_tmpdate[0]=l_tmpdate[0]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[0],l_tmpdate[0]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+0x40+11);

tem[0]=l_tmpdate[0]/16;//数据的转换

tem[1]=l_tmpdate[0]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+0x40+12);

Flag=1;

}

if(setn==2)

{ l_tmpdate[1]=change(l_tmpdate[1]);

l_tmpdate[1]++;

if(l_tmpdate[1]==60)

l_tmpdate[1]=0;

{

tp=l_tmpdate[1]/10;

l_tmpdate[1]=l_tmpdate[1]%10;

l_tmpdate[1]=l_tmpdate[1]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[1],l_tmpdate[1]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+0x40+8);

tem[0]=l_tmpdate[1]/16;//数据的转换

tem[1]=l_tmpdate[1]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+0x40+9);

}

if(setn==3)

{ l_tmpdate[2]=change(l_tmpdate[2]);

l_tmpdate[2]++;

if(l_tmpdate[2]>=24)

l_tmpdate[2]=0;

{

tp=l_tmpdate[2]/10;

l_tmpdate[2]=l_tmpdate[2]%10;

l_tmpdate[2]=l_tmpdate[2]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[2],l_tmpdate[2]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+0x40+5);

tem[0]=l_tmpdate[2]/16;//数据的转换

tem[1]=l_tmpdate[2]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+0x40+6);

}

if(setn==4)

{

l_tmpdate[5]=change(l_tmpdate[5]);

l_tmpdate[5]++;

if(l_tmpdate[5]==8)

l_tmpdate[5]=1;

{

tp=l_tmpdate[5]/10;

l_tmpdate[5]=l_tmpdate[5]%10;

l_tmpdate[5]=l_tmpdate[5]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[5],l_tmpdate[5]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+14);

tem[0]=l_tmpdate[5]/16;//数据的转换

tem[1]=l_tmpdate[5]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+15);

}

if(setn==5)

{

l_tmpdate[3]=change(l_tmpdate[3]);

l_tmpdate[3]++;

if(l_tmpdate[3]==32)

l_tmpdate[3]=0;

{

tp=l_tmpdate[3]/10;

l_tmpdate[3]=l_tmpdate[3]%10;

l_tmpdate[3]=l_tmpdate[3]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[3],l_tmpdate[3]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+11);

tem[0]=l_tmpdate[3]/16;//数据的转换

tem[1]=l_tmpdate[3]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+12);

}

if(setn==6)

{

l_tmpdate[4]=change(l_tmpdate[4]);

l_tmpdate[4]++;

if(l_tmpdate[4]==13)

l_tmpdate[4]=0;

write_com(0x80+8);

{

tp=l_tmpdate[4]/10;

l_tmpdate[4]=l_tmpdate[4]%10;

l_tmpdate[4]=l_tmpdate[4]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[4],l_tmpdate[4]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

tem[0]=l_tmpdate[4]/16;//数据的转换

tem[1]=l_tmpdate[4]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+9);

}

if(setn==7)

{

l_tmpdate[6]=change(l_tmpdate[6]);

l_tmpdate[6]++;

if(l_tmpdate[6]==100)

l_tmpdate[6]=0;

write_com(0x80+5);

{

tp=l_tmpdate[6]/10;

l_tmpdate[6]=l_tmpdate[6]%10;

l_tmpdate[6]=l_tmpdate[6]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[6],l_tmpdate[6]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

tem[0]=l_tmpdate[6]/16;//数据的转换

tem[1]=l_tmpdate[6]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+6);

}

}

}

if(s2==0)//减少时间

{

delay(5000);

if(s2==0)

{

while(!s2);

delay(5000);//去键盘抬起时抖动

while(!s2);

if(setn==1)

{

l_tmpdate[0]=change(l_tmpdate[0]);

if(l_tmpdate[0]!=0)

l_tmpdate[0]--;

if(l_tmpdate[0]==0)

l_tmpdate[0]=59;

{

tp=l_tmpdate[0]/10;

l_tmpdate[0]=l_tmpdate[0]%10;

l_tmpdate[0]=l_tmpdate[0]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[0],l_tmpdate[0]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+0x40+11);

tem[0]=l_tmpdate[0]/16;//数据的转换

tem[1]=l_tmpdate[0]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+0x40+12);

}

if(setn==2)

{

l_tmpdate[1]=change(l_tmpdate[1]);

if(l_tmpdate[1]!=0)

l_tmpdate[1]--;

if(l_tmpdate[1]==0)

l_tmpdate[1]=59;

{

tp=l_tmpdate[1]/10;

l_tmpdate[1]=l_tmpdate[1]%10;

l_tmpdate[1]=l_tmpdate[1]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[1],l_tmpdate[1]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+0x40+8);

tem[0]=l_tmpdate[1]/16;//数据的转换

tem[1]=l_tmpdate[1]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+0x40+9);

}

if(setn==3)

{ l_tmpdate[2]=change(l_tmpdate[2]);

if(l_tmpdate[2]!=0)

l_tmpdate[2]--;

if(l_tmpdate[2]==0)

l_tmpdate[2]=23;

{

tp=l_tmpdate[2]/10;

l_tmpdate[2]=l_tmpdate[2]%10;

l_tmpdate[2]=l_tmpdate[2]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[2],l_tmpdate[2]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+0x40+5);

tem[0]=l_tmpdate[2]/16;//数据的转换

tem[1]=l_tmpdate[2]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+0x40+6);

}

if(setn==4)

{

l_tmpdate[5]=change(l_tmpdate[5]);

if(l_tmpdate[5]!=0)

l_tmpdate[5]--;

if(l_tmpdate[5]==0)

l_tmpdate[5]=7;

{

tp=l_tmpdate[5]/10;

l_tmpdate[5]=l_tmpdate[5]%10;

l_tmpdate[5]=l_tmpdate[5]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[5],l_tmpdate[5]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+14);

tem[0]=l_tmpdate[5]/16;//数据的转换

tem[1]=l_tmpdate[5]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+15);

}

if(setn==5)

{

l_tmpdate[3]=change(l_tmpdate[3]);

if(l_tmpdate[3]!=0)

l_tmpdate[3]--;

if(l_tmpdate[3]==0)

l_tmpdate[3]=31;

{

tp=l_tmpdate[3]/10;

l_tmpdate[3]=l_tmpdate[3]%10;

l_tmpdate[3]=l_tmpdate[3]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[3],l_tmpdate[3]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

write_com(0x80+11);

tem[0]=l_tmpdate[3]/16;//数据的转换

tem[1]=l_tmpdate[3]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+12);

}

if(setn==6)

{

l_tmpdate[4]=change(l_tmpdate[4]);

if(l_tmpdate[4]!=0)

l_tmpdate[4]--;

if(l_tmpdate[4]==0)

l_tmpdate[4]=12;

write_com(0x80+8);

{

tp=l_tmpdate[4]/10;

l_tmpdate[4]=l_tmpdate[4]%10;

l_tmpdate[4]=l_tmpdate[4]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[4],l_tmpdate[4]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

tem[0]=l_tmpdate[4]/16;//数据的转换

tem[1]=l_tmpdate[4]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+9);

}

if(setn==7)

{

l_tmpdate[6]=change(l_tmpdate[6]);

if(l_tmpdate[6]!=0)

l_tmpdate[6]--;

if(l_tmpdate[6]==0)

l_tmpdate[6]=99;

write_com(0x80+5);

{

tp=l_tmpdate[6]/10;

l_tmpdate[6]=l_tmpdate[6]%10;

l_tmpdate[6]=l_tmpdate[6]+tp16;

Write_Ds1302(0x8E,0X00);//关闭写保护

Write_Ds1302(write_add[6],l_tmpdate[6]);

Write_Ds1302(0x8E,0x80);//打开写保护

}

tem[0]=l_tmpdate[6]/16;//数据的转换

tem[1]=l_tmpdate[6]&0x0f;

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

write_com(0x80+6);

}

}

}

}

}

//

void main(void)

{

//Set_RTC();//在第一次使用时给ds1302赋初值

init();

while(1)

{

if(flag==0)

{

Read_RTC();

write_lcd();

}

keyscan();

}

}

以上就是关于在网上看到您的设计成果-单片机+LCD1602+DS18B20+DS1302电子钟,同志我想看看您的原理图和程序,谢谢全部的内容,包括:在网上看到您的设计成果-单片机+LCD1602+DS18B20+DS1302电子钟,同志我想看看您的原理图和程序,谢谢、ds1302 写时钟程序 怎么实现掉电后1302继续计时,下次上电后时间和实际时间一样,给个具体的程序写法、ds1302时钟保护程序怎么写,如果能加调时,闹钟功能就更好了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10165034.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存