1302时钟显示加按键调节
ds1302的12864液晶按键可调显示实时时钟程序(word文档良心出品)
一.绪言1.在信息显示技术中,人们发现了信息数字化的重要作用和意义。
数字化的信息更加准确,同一性,更易传输和识别。
很多信息可以直接由数字表示,从而数字化信息显示又成为信息显示的又一个重要内容。
又从数字化显示发展到字符显示,它把人类特有的语言文字用于显示,这种显示与数字显示合在一起用途更广用量更大。
在这同时,人们还希望用图形和图像进行显示,且显示的内容为五彩缤纷,并且可以实时活动和具有三维立体效果。
这些在二十世纪尾声时都已经陆续实现。
LCD的计算机器,半导体发光数码管显示(LED)的汽车计价器,商场的大屏幕广告。
这零零总总的各类显示正为你做着各种各样的服务,相信在不久的将来显示技术的发展将会为人类做出更大的贡献。
Ds1302时钟芯片现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。
这些电路的接口简单、价格低廉、使用方便,被广泛地采用。
本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用普通32.768kHz晶振。
(一)设计任务本课题采用ds1302的时钟芯片为主要的的设计来源,采用显示是1cd1602的图形点阵液晶显示。
,(二)提出方案及方案论证在设计中,我主要是考虑ds1302的时间显示问题,因为网上也有ds1302的读写和显示程序,但是至于怎样才能显示详细信息,我提出了两个方案,一个是LCD1602来显示,一个是LCD12864,其中1602是个字符型的点阵,而1CD12864是个图形的点阵,相比之下12864能够更好显示数据,而CPU都采用89C52的单片机(三)原理说明:原理其实很简单,LCD12864的各种指令先进行宏定义和ds1302的读写指令也进行宏定义,从ds1302的读出数据显示在lcd上(二)程序流程图(三)C51程序设计,重要的代码要有注释。
可用按键修改时间的DS1302时钟显示程序
write_data(table1[num]);
}
/**************************显示欢迎界面函数*************************************/
void displaystar(void)
delay(500);大约延时500ms
**************************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay20ms(void) //3*i*j+2*i=3*100*60+2*100=20000μs=20ms;
{
uchar i;
write_com(0x80);
for(i=0;i<16;i++)
write_data(table2[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_data(table3[i]);
}
/***************************显示时间、日期子函数*********************************/
if(s1num!=0&&s4num==0)//按键1按下*次且s4再次之前未曾按过(按键按下时,时间修改函数)
DS1302数码管电子闹钟程序
/*****************************************************///DS1302+数码管+3个独立按键//// 精确定时/////*****************************************************/ /****************************************************************/// 利用ds1302精确定时,同时按键可调时间。
//// 每操作一次时钟,都会有蜂鸣器响大约200ms,以提示操作。
///***************************************************************/#include<reg52.h>#include"ds1302.h"uchar code tab[]={ 0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/} ;//共阴码char clock1[3]={0};int i,j=0,flag1=0;void delay(uint xms){uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void init()//初始化{//RST=0;//SCLK=0;//write_1302(0x80,0x00);//写控制字,允许写//write_1302(0x90,0x00);//禁止涡流充电TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void display(uchar miaog,uchar miaos,uchar feng,uchar fens,uchar shig,uchar shis)//数码管动态显示{P2=0x7f;P0=tab[miaog];delay(5);P2=0xbf;P0=tab[miaos];delay(5);P2=0xdf;P0=0xc0;delay(5);P2=0xef;P0=tab[feng];delay(5);P2=0xf7;P0=tab[fens];delay(5);P2=0xfb;P0=0xc0;delay(5);P2=0xfd;P0=tab[shig];delay(5);P2=0xfe;P0=tab[shis];delay(5);}write_sfm(uchar miao,uchar fen,uchar shi) //写入到数码管{uchar miaog,miaos,feng,fens,shig,shis;miaog=miao%10;miaos=miao/10;feng=fen%10;fens=fen/10;shig=shi%10;shis=shi/10;display(miaog,miaos,feng,fens,shig,shis);}void didi() //发声程序{buzzer=0;delay(50);buzzer=1;}void keyscan()//按键扫描程序{uchar temp;if(key1==0) //功能键{if(key1==0){while(!key1);key1n=key1n++;if(key1n==5)key1n=1;switch(key1n){case 1://didi();temp=(miao)/10*16+(miao)%10;//将秒转化成bcd码,没这句秒就变化,不知为什么write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp); //时钟暂停write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();break;case 3 ://didi();break;case 4 ://didi();temp=miao/10*16+miao%10;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x00|temp);//时钟开始write_1302 (0x8e,0x80); //允许写保护break;}}}if(key4==0) //闹钟键{if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;while(keyn){EA=0; //闹钟键if(key4==0)if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;}write_sfm(clock1[2],clock1[1],clock1[0]);if(keyn==1) //时修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[0]--;if(clock1[0]<0)clock1[0]=24;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[0]++;if(clock1[0]>24)clock1[0]=0;}}}if(keyn==2) //分修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[1]--;if(clock1[1]<0)clock1[1]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[1]++;if(clock1[1]>59)clock1[1]=0;}}}if(keyn==3) //秒修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[2]--;if(clock1[2]<0)clock1[2]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[2]++;if(clock1[2]>59)clock1[2]=0;}}}}} EA=1;}if(key1n!=0) //当按下功能键key1,按以下才有用{if(key2==0) //加键{delay(3);if(key2==0){while(!key2);switch(key1n){case 1 : //didi(); //秒temp=(miao+1)/10*16+(miao+1)%10;if(miao==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 : // didi(); //分temp=(fen+1)/10*16+(fen+1)%10;if(fen==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 :// didi();temp=(shi+1)/10*16+(shi+1)%10; //时if(shi==23)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}if(key3==0) //减键{delay(3);if(key3==0){while(!key3);switch(key1n){case 1 ://didi();temp=(miao-1)/10*16+(miao-1)%10; //秒if(miao==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();temp=(fen-1)/10*16+(fen-1)%10; //分if(fen==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 ://didi();temp=(shi-1)/10*16+(shi-1)%10; //时if(shi==0)temp=35;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}}//write_1302(0x80,miao|0x80);//miao++;/* if(key2==0){if(key2==0){while(!key2);write_1302(0x80,miao|0x00);//打开1302振荡器}}*/}void main(){init();//buzzer=0;//miao=20;//fen=10;//shi=23;while(1){miao = BCD_Decimal(read_1302(0x81));fen = BCD_Decimal(read_1302(0x83));shi = BCD_Decimal(read_1302(0x85));keyscan();if((miao==clock1[2])&&(fen==clock1[1])&&(shi==clock1[0])) {flag1=1;for(i=0;i<10;i++)didi();}if(j==100) for(i=0;i<10;i++) didi();if(j==200) {for(i=0;i<10;i++)didi();flag1=0;j=0;}}}void tiemr0() interrupt 1{if(flag1) j++;TH0=(65536-50000)/256;TL0=(65536-50000)%256;write_sfm(miao,fen,shi); }。
51单片机万年历实验DS1302可按键设置时钟
*选择设置加 1。
* 注意
:
*******************************************************************************
/
#include<reg51.h> #include"lcd.h" #include"ds1302.h"
sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3;
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{ if(K1==0)
//检测按键 K1 是否按下
{ Delay10ms(); //消除抖动
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下是 主文件 main.c 的内容
void Int0Configuration();
void LcdDisplay();
unsigned char SetState,SetPlace; void Delay10ms(void); //误差 0us
/******************************************************************************
DS1302时钟+1602显示+独立键盘控制
temp>>=1; //右移一位
}
SCLK=1;
CE=0;
SDA=0;
return temp; //返回
}
void DS1302_Write(uchar address,uchar dat)
{
uchar i;
CE=0;
}
}
if(date==3) //星期三
{
for(num=8;num<11;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);
}
}
if(date==4) //星期四
uchar year=1,month=1,day=1,hour=1,min=1,sec=1;
uchar K1num=0;
//声明延时函数毫秒级
void delay1ms(uint ms);
/*******************************************************************************************
DS1302_Write(0x8c,year); //年
DS1302_Write(0x8e,0x80); //写保护开
}
void DS1302_initR()
{
sec=DS1302_Read(0x81); //读秒数据
min=DS1302_Read(0x83); //读分钟数据
/***********************************/
/* 延时程序 */
基于ds1302的数字时钟两个按键控制
基于ds1302的数字时钟两个按键控制调整显示年月日时间以及定时,仿真图和程序如下,仅供参考。
K1是方式调整键,不按是0方式调秒,有10种方式,自己试吧,右下角显示的是第几种方式。
K2是调整键,K3没用到。
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//uchar data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};uchar hour,min,sec,nian=1,yue=1,zhou=1,ri=1,x,m,n;sbit k1=P3^4;sbit k2=P3^5;//sbit miao=P3^6;sbit rst=P1^2;sbit sck=P1^1;sbit io=P1^0;sbit fm=P1^7;/*函数声明:*/void write_ds1302_byte(uchar dat);void write_ds1302(uchar add,uchar dat);uchar read_ds1302(uchar add);void read_rtc();void set_rtc();void display();void delay(int n);void show();void fmzz();/******************************************************************************************************************************************************/sbit E=P2^2; //1602使能引脚sbit RW=P2^1; //1602读写引脚sbit RS=P2^0; //1602数据/命令选择引脚/********************************************************************* 名称 : Delay_1ms()* 功能 : 延时子程序,延时时间为 1ms * x* 输入 : x (延时一毫秒的个数)* 输出 : 无***********************************************************************/ void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}/********************************************************************* 名称 : delay()* 功能 : 延时,延时时间大概为5US。
DS1302时钟+按键
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD************************************************************
/* */
/* ---2007-7-30 */
unsigned char TimeString[9];
}SYSTEMTIME; //定义的时间类型
SYSTEMTIME CurrentTime;
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
sbit Up = P1^1; //加法按钮
sbit Down = P1^2; //减法按钮
sbit out = P1^3; //立刻跳出调整模式按钮
sbit DQ = P1^4; //温度传送数据IO口
char done,count,temp,flag,up_flag,down_flag;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
sbit Set = P1^0; //模式切换键
unsigned char Minute;
unsigned char Hour;
DS1302+1602+键盘调整+闹钟
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义的的4个键盘sbit s1=P3^0;//时钟功能键sbit s2=P3^1;//加键sbit s3=P3^2;//减键sbit s4=P3^6;//确认键sbit s5=P3^3;//闹钟功能键sbit dula=P2^6;//数码管操作sbit wela=P2^7;sbit lcden=P2^5;//液晶操作sbit lcdrs=P1^0;sbit lcdrw=P1^1;sbit rd=P3^7;//为了分离出3个独立键盘sbit FM=P2^3;//蜂鸣器口sbit ACC0=ACC^0; //累加器喂ACC 这是位定义sbit ACC7=ACC^7;sbit sclk=P2^1;//DS1302操作sbit data1=P2^0;sbit rst=P2^4;uchar s1num,flag1,flag2,s5num;int miao,shi,fen,nian,yue,ri,week,afen,ashi;int x1,x2;uchar code table1[]="SUN";//星期字表uchar code table2[]="MON";uchar code table3[]="TUE";uchar code table4[]="WED";uchar code table5[]="THU";uchar code table6[]="FRI";uchar code table7[]="SAT";void delayms(uint xms)//延时函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void di()//蜂鸣器函数{delayms(100);FM=1;}void cmg88()//关数码管函数{dula=1;P0=0x00;dula=0;}void write_(uchar )//液晶写命令函数{lcdrs=0;lcden=0;P0=;delayms(5);lcden=1;delayms(5);lcden=0;}void write_date(uchar date)//液晶写数据函数{lcden=0;P0=date;delayms(5);lcden=1;delayms(5);lcden=0;}void Write1302(uchar dat)//向1302写一个字节数据{uchar i;ACC=dat;for(i=8;i>0;i--){data1=ACC0;sclk=1;sclk=0;ACC=ACC>>1;}}void WriteSet1302(uchar Cmd,uchar dat)//根据命令,向1302写一个字节数据{rst=0;_nop_();sclk=0;_nop_();rst=1;delayms(2);Write1302(Cmd);Write1302(dat);sclk=1;rst=0;}uchar Read1302()//向1302读一个字节数据{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=data1;sclk=1;sclk=0;}return(ACC);}uchar ReadSet1302(uchar Cmd)//根据命令,向1302读一个字节数据{uchar dat;rst=0;sclk=0;rst=1;Write1302(Cmd);dat=Read1302();sclk=1;rst=0;return(dat);}void inital_1302() //初始化DS1302函数{WriteSet1302(0x8e,0x00);//禁止写保护WriteSet1302(0x90,0xaa);//定义充电WriteSet1302(0x80,0x45);//秒WriteSet1302(0x84,0x18);// 时WriteSet1302(0x82,0x47);// 分WriteSet1302(0x8c,0x16);//年WriteSet1302(0x88,0x05);//月WriteSet1302(0x86,0x23);//日WriteSet1302(0x8a,0x01);//星期WriteSet1302(0xc0,0x07); //闹钟小时初始化WriteSet1302(0xfc,0x30); //闹钟分钟初始化WriteSet1302(0x8e,0x80);//开写保护}void write_sfm(uchar add,uchar dat)//时分秒函数{uchar gw,sw;gw=dat%16;sw=dat/16;write_(0x80+0x40+add);write_date(sw+0x30);write_date(gw+0x30);}void write_nyr(uchar add,uchar dat)//年月日函数{uchar gw,sw;gw=dat%16;sw=dat/16;write_(0x80+add);write_date(sw+0x30);write_date(gw+0x30);}void write_week(uchar xq)//写星期函数uchar x;write_(0x80+12); switch(xq){case 1:for(x=0;x<3;x++){write_date(table1[x]); }break;case 2:for(x=0;x<3;x++){write_date(table2[x]); }break;case 3:for(x=0;x<3;x++){write_date(table3[x]); }break;case 4:for(x=0;x<3;x++)write_date(table4[x]); }break;case 5:for(x=0;x<3;x++){write_date(table5[x]); }break;case 6:for(x=0;x<3;x++){write_date(table6[x]); }break;case 7:for(x=0;x<3;x++){write_date(table7[x]); }break;}write_(0x80+12);}void init()//初始化操作{flag1=0;flag2=0;rd=0;dula=0;wela=0;lcdrw=0;lcden=0;fen=0;miao=0;shi=0;week=0;nian=0;yue=0;ri=0;s1num=0;s5num=0;write_(0x38);write_(0x0c);write_(0x06);write_(0x01);write_(0x80+1);//在液晶上写一些固定的数write_date('2');write_date('0');delayms(5);write_(0x80+5);//在液晶上写一些固定的数write_date('-');delayms(5);write_(0x80+8);write_date('-');delayms(5);write_(0x80+0x40+3);//时间部分的两个冒号write_date(':');delayms(5);write_(0x80+0x40+6);write_date(':');delayms(5);write_(0x80+0x40+12);write_date(':');delayms(5);}void keyscan()//键盘扫描操作{if(s1==0&&s5num==0)//时钟功能键并且闹钟不处于调整状态{delayms(5);if(s1==0&&s5num==0){s1num++;flag1=1;while(!s1);di();switch(s1num){case 1:write_(0x80+0x40+8);write_(0x0f);//光标闪烁break;case 2:write_(0x80+0x40+5);break;case 3:write_(0x80+0x40+2);break;case 4:write_(0x80+14);break;case 5:write_(0x80+10);break;case 6:write_(0x80+7);break;case 7:write_(0x80+4);break;case 8:flag1=0;s1num=0;write_(0x0c);WriteSet1302(0x8e,0x00); //第八次按时钟功能键后,把调整了的所有数据当前状态存入到DS1302中WriteSet1302(0x80,miao);WriteSet1302(0x84,shi);WriteSet1302(0x82,fen);WriteSet1302(0x8a,week);WriteSet1302(0x8c,nian);WriteSet1302(0x88,yue);WriteSet1302(0x86,ri);WriteSet1302(0x8e,0x80);break;}}}if(s1num!=0&&s5num==0)//时钟加键{if(s2==0){delayms(5);if(s2==0){while(!s2);di();switch(s1num){case 1:x1=miao%16;x2=miao/16;x1++;if(x1==10){x1=0;x2++;if(x2>=6)x2=0;}miao=x1+x2*16; write_sfm(7,miao); write_(0x80+0x40+8); break;case 2:x1=fen%16;x2=fen/16;x1++;if(x1==10){x1=0;x2++;if(x2>=6)x2=0;}fen=x1+x2*16; write_sfm(4,fen); write_(0x80+0x40+5);case 3:x1=shi%16;x2=shi/16;x1++;if(x1==10){x1=0;x2++;}if(x2>=2&&x1>=4){x1=0;x2=0;}shi=x1+x2*16;write_sfm(1,shi); write_(0x80+0x40+2); break;case 4:x1=(week)%10;x2=(week)/10;x1++;x1=1;week=x2*16+x1; write_week(week); write_(0x80+14); break;case 5:x1=ri%16;x2=ri/16;x1++;if(x1==10){x1=0;x2++;}if(x2==3&&x1==2) {x1=0;x2=0;}ri=x1+x2*16; write_nyr(9,ri); write_(0x80+10); break;case 6:x1=yue%16;x2=yue/16;x1++;if(x2==1&&x1==3) {x1=1;x2=0;}if(x1==10){x1=0;x2++;}yue=x1+x2*16;write_nyr(6,yue); write_(0x80+7); break;case 7:x1=nian%16;x2=nian/16;x1++;if((x2==9)&&(x1==10))x1=0;x2=0;}if(x1==10){x2++;x1=0;}nian=x1+x2*16;write_nyr(3,nian);write_(0x80+4);break;}}}if(s3==0)//时钟减键{delayms(5);if(s3==0){while(!s3);di();switch(s1num)case 1:x1=miao%16;x2=miao/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1)x2=5;}miao=x1+x2*16; write_sfm(7,miao); write_(0x80+0x40+8); break;case 2:x1=fen%16;x2=fen/16;x1--;if(x1==-1){x1=9;x2--;x2=5;}fen=x1+x2*16; write_sfm(4,fen); write_(0x80+0x40+5); break;case 3:x1=shi%16;x2=shi/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1){x1=3;x2=2;}}shi=x1+x2*16;write_sfm(1,shi); write_(0x80+0x40+2);case 4:x1=(week)%10;x2=(week)/10;x1--;if(x1==0)x1=7;week=x2*16+x1; write_week(week); write_(0x80+14); break;case 5:x1=ri%16;x2=ri/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1){x1=1;x2=3;}ri=x1+x2*16;write_nyr(9,ri);write_(0x80+10); break;case 6:x1=yue%16;x2=yue/16;x1--;if((x2==1)&&(x1==-1)) {x1=9;x2--;}if((x2==0)&&(x1==0)) {x1=2;x2=1;}yue=x1+x2*16;write_nyr(6,yue); write_(0x80+7); break;case 7:x1=nian%16;x2=nian/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1){x1=9;x2=9;}}nian=x1+x2*16;write_nyr(3,nian);write_(0x80+4);break;}}}}if(s1num!=0||s5num!=0)//表示时钟或者闹钟处于调整状态if(s4==0)//确定状态的按键{delayms(5);if(s4==0){if(s1num!=0)//表示时钟处于调整状态{while(!s4);//确定键被按下di();WriteSet1302(0x8e,0x00); //按了确认键后,把调整了的所有数据当前状态存入到DS1302中WriteSet1302(0x80,miao);WriteSet1302(0x84,shi);WriteSet1302(0x82,fen);WriteSet1302(0x8a,week);WriteSet1302(0x8c,nian);WriteSet1302(0x88,yue);WriteSet1302(0x86,ri);WriteSet1302(0x8e,0x80);flag1=0;write_(0x0c);s1num=0;}if(s5num!=0)//表示闹钟处于调整状态while(!s4);di();WriteSet1302(0x8e,0x00); //调整闹钟,不能让时钟暂停,故没把时钟数据写入DS1302中WriteSet1302(0xc0,ashi);//把闹钟数据写入DS1302中WriteSet1302(0xfc,afen);WriteSet1302(0x8e,0x80);flag2=0;s5num=0;write_(0x0c);}}}}if(s5==0&&s1num==0)//闹钟功能键并且时钟不处于调整状态{delayms(5);if(s5==0&&s1num==0){s5num++;flag2=1;while(!s5);di();{write_(0x80+0x40+14);write_(0x0f);}if(s5num==2){write_(0x80+0x40+11);}if(s5num==3){s5num=0;flag2=0;WriteSet1302(0x8e,0x00);WriteSet1302(0xfc,afen);WriteSet1302(0xc0,ashi);WriteSet1302(0x8e,0x80);write_(0x0c);}}}if(s5num!=0&&s1num==0)//只有闹钟处于调整状态{if(s2==0)//闹钟加键{if(s2==0){while(!s2);di();if(s5num==1){x1=afen%16;x2=afen/16;x1++;if(x1==10){x1=0;x2++;if(x2>=6)x2=0;}afen=x1+x2*16;write_sfm(13,afen); write_(0x80+0x40+14); }if(s5num==2){x1=ashi%16;x2=ashi/16;x1++;if(x2>=2&&x1>=4){x1=0;x2=0;}if(x1==10){x1=0;x2++;}ashi=x1+x2*16;write_sfm(10,ashi);write_(0x80+0x40+11);}}}}if(s3==0)//闹钟减键{delayms(5);if(s3==0){while(!s3);di();if(s5num==1){x1=afen%16;x2=afen/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1)x2=5;}afen=x1+x2*16;write_sfm(13,afen); write_(0x80+0x40+14); }if(s5num==2){x1=ashi%16;x2=ashi/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1){x1=3;x2=2;}}ashi=x1+x2*16;write_sfm(10,ashi);write_(0x80+0x40+11);}}}}void laba(){if((shi==ashi)&&(fen==afen)&&(miao<=60&&miao>=0)){di();}}void main()//主函数{init();//大初始化cmg88();//关数码管函数inital_1302();//DS1302赋初值的初始化ashi=ReadSet1302(0xc1);//从DS1302读出数据afen=ReadSet1302(0xfd);write_sfm(10,ashi);//读出数据送给液晶显示write_sfm(13,afen);while(1){keyscan();laba();if(flag1==0&&flag2==0)//经过一系列调整后,最终继续满足这个条件{//从DS1302读数据miao=ReadSet1302(0x81);//秒fen=ReadSet1302(0x83);//分shi=ReadSet1302(0x85);//时ri=ReadSet1302(0x87);//日yue=ReadSet1302(0x89);//月week=ReadSet1302(0x8b);//星期nian=ReadSet1302(0x8d);//年write_sfm(7,miao);//把它们送液晶显示write_sfm(4,fen);write_sfm(1,shi);write_nyr(9,ri);write_nyr(6,yue);write_nyr(3,nian);write_week(week);}} }。
DS1302实时时钟可调
write(0x84,0x15);
write(0x86,0x24);
write(0x88,0x07);
write(0x8a,0x07);
write(0x8c,0x11);
}
void read1302(uchar *p)
{
uchar i,k;
case 6: sendaddr(1,5);write_com(0x0d);break; //日闪烁
case 7: sendaddr(3,2);write_com(0x0d);break; //星期闪烁
}
if(!K2)
{
delay(20);
if(!K2) //加
case 5: date=read(0x89);nowdate=date+1;
if((nowdate&0x0f)>9)nowdate=nowdate+6;
if(nowdate==0x13)nowdate=1;
write(0x80,0x80);write(0x88,nowdate);break;//月
}
switch(chang)
{
case 0: write_com(0x0c);display();break;//没有按键时保持不变
case 1: sendaddr(2,0);write_com(0x0d);break; //按第一次时闪烁
case 2: sendaddr(2,2);write_com(0x0d);break; //第二次分闪烁
write_com(0x8a);
switch(table1[5]%16)
1302调时时钟
;******************************************;调时时钟,利用1302实现;P3.4为状态按键,初始化为正常状态,连续按下分别为调时、分、年、月、日;调节按下P3.5为加一,P3.6为减一,分别为调时、分、年、月、日;******************************************rs bit p1.2rw bit p1.3e bit p1.4dio bit p2.6clk bit p2.5rst bit p2.7miao equ 30h ;为秒,分,时,日,月,周,年,分配储存单元fen equ 31hshi equ 32hday equ 33hyue equ 34hzhou equ 35hnian equ 36hbcd equ 37hABC equ 38hhex equ 40hBIAOZHI EQU 41HCOUNT EQU 42Horg 0000hljmp startorg 0030h;****初始化时间****************************start: mov sp,#60hmov shi,#0FH ;初始化数据mov fen,#58Hmov miao,#55mov day,#10mov yue,#3mov zhou,#3mov nian,#99HMOV BIAOZHI,#0;********************初始化lcd1602************************************* mov e,#0mov p2,#0f0h ;关数码管MOV P0,#01H ;清屏并光标复位LCALL WR_CODE ;调用写入命令子程序MOV P0,#02H ;光标回车LCALL WR_CODE ;调用写入命令子程序MOV P0,#038H ;5x7的点阵字符LCALL WR_CODE ;调用写入命令子程序MOV P0,#06H ; ;光标右移LCALL WR_CODE ;调用写入命令子程序MOV P0,#0cH ;开显示,光标闪烁LCALL WR_CODE ;调用写入命令子程序lcall set1302 ;调用设置1302子程序lcall r_ram ;调用读1302数据的子程序lcall xianshi;******************************************;主程序;******************************************main: LJMP BIAOZHZ2: LJMP PANDZ1: lcall r_ram ;调用读1302子程序lcall xianshi ;调用显示程序ljmp MAIN ;构成循环;******************************************;判断调节的是时、分、年、月、日;****************************************** PAND: MOV A,BIAOZHICJNE A,#0,A1LJMP Z1A1: CJNE A,#1,A2MOV COUNT,SHIMOV 78H,#24HMOV 77H,#23HLJMP PANJIANA2: CJNE A,#2,A3MOV COUNT,FENMOV 78H,#5AH ;从50加10到5AHMOV 77H,#59HLJMP PANJIANA3: CJNE A,#3,A4MOV COUNT,NIANMOV 78H,#100HMOV 77H,#99HLJMP PANJIANA4: CJNE A,#4,A5MOV COUNT,YUEMOV 78H,#13HMOV 77H,#12HLJMP PANJIANA5: CJNE A,#5,A6A6: MOV COUNT,DAYLCALL PANDAYLJMP PANJIAN;******************************************;按不同的月数调节每月的天数;****************************************** PANDAY:MOV A,YUECJNE A,#02H,FF1MOV 78H,#29H ;2月天数为28天MOV 77H,#28HLJMP FAN2FF1: CJNE A,#04H,FF2 ;4、6、9、11月天数为30天MOV 78H,#31HMOV 77H,#30HLJMP FAN2FF2: CJNE A,#06H,FF3MOV 78H,#31HMOV 77H,#30HLJMP FAN2FF3: CJNE A,#09H,FF4MOV 78H,#31HMOV 77H,#30HLJMP FAN2FF4: CJNE A,#11H,FF5MOV 78H,#31HMOV 77H,#30HLJMP FAN2FF5: MOV 78H,#32H ;1,3,5,7,8,10,12月天数为31天MOV 77H,#31HFAN2:RET;******************************************;选择COUNT值给时、分、年、月、日;******************************************AA1: MOV A,BIAOZHICJNE A,#1,AA7MOV SHI,COUNTLJMP AA2AA7: CJNE A,#2,AA3MOV FEN,COUNTLJMP AA2AA3: CJNE A,#3,AA4MOV NIAN,COUNTLJMP AA2AA4: CJNE A,#4,AA5MOV YUE,COUNTLJMP AA2AA5: CJNE A,#5,AA6AA6: MOV DAY,COUNTAA2: LCALL SET1302LJMP Z1;****************************************** ;调节时,按下P3.5为加一,P3.6为减一;****************************************** PANJIAN:JNB P3.5,D1JNB P3.6,D2LJMP Z1D1: LCALL DELAY10JNB P3.5,D3LJMP Z1D3: JB P3.5,D4LJMP D3D4:INC COUNTMOV A,COUNTCJNE A,78H,D7MOV COUNT,#0D7: LJMP AA1D2: LCALL DELAY10JNB P3.6,D5LJMP Z1D5: JB P3.6,D6LJMP D5D6:MOV A,COUNTCJNE A,#00H,D8MOV COUNT,77HLJMP AA1D8: MOV BCD,COUNTLCALL PANDEC COUNTLJMP AA1;******************************************;判断减一时,若COUNT值是*0H时,COUNT值转化为*AH ;******************************************PAN: mov a,BCDmov b,#16div ab ;a中放置十位,b中放置个位MOV A,BCJNE A,#00H,CC1MOV A,COUNTCLR CSUBB A,#6MOV COUNT,ACPL P1.0CC1:RET;******************************************;标示位,通过调节P3.4,判断调节的是时、分、年、月、日;****************************************** BIAOZH: JNB P3.4,X1LJMP Z2X1: LCALL DELAY10JNB P3.4,X2LJMP Z2X2: JB P3.4,X3LJMP X2X3: INC BIAOZHI;MOV P3,BIAOZHIMOV A,BIAOZHICJNE A,#6,B1MOV BIAOZHI,#0B1: LJMP Z2;******************************************;将时、分、年、月、日数值送入1302中;******************************************set1302:clr rstclr clknopnopsetb rst ;为读写做好时序准备mov b,#8eh ;写控制命令字地址lcall w_bit ;调用写字节指令mov b,#00h ;写操作前wp=0 ,数据lcall w_bit ;调用写字节指令setb clknopnopclr rst ;写完后禁止写mov r0,#miao ;内存中的秒首地址mov r1,#80h ;1302中秒首地址mov r7,#7 ;写入7个数据,秒,分。
18B20温度加ds1302时钟数码管显示,三按钮控制设置
}
}
if(shezhi==2)//分钟设置
{
if(sb2==0)//加控制
{
delay(30);
if(sb2==0)
{
x5=0;
a1=(shijian[1]&0x7f)>>4;
a2=shijian[1]&0x0f;
}
void wendu()//温度读取时序
{
unsigned char x,y,w,e,r;
fuwei();
wdxiesj(0xcc);
wdxiesj(0x44);
delay(1);
fuwei();
wdxiesj(0xcc);
wdxiesj(0xbe);
w=wddsj();//温度高四位,
{
uchar i;
rst=0;
write_1302(0x8e);
write_1302(0x00);
rst=0;
write_1302(0x90);
write_1302(0x5a);
rst=0;
write_1302(0xbe);
for(i=0;i<7;i++)
write_1302(shijian[i]);//时间写入
TR0=1;
}
void xianshi1()//小时显示
{
if(((shijian[2]&0x7f)>>4)!=0) shuma((shijian[2]&0x7f)>>4,0x7f);
shuma(shijian[2]&0x0f,0xbf);
DS1302万年历+温度显示+调时
DS1302_IO=ACC0;
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
return;
}
/***********************************************************************
write_data('A');
break;
case 7: write_data('S');
write_data('U');
write_data('N');
break;
}
}
/********************************************************************
}
/***********************************************************************
函数功能:读DS1302地址子程序
入口参数:add
出口参数:timedata
************************************************************************/
month=read_ds1302(0x89); //月
year=read_ds1302(0x8d); //年
}
/********************************************************************
星期显示函数
DS1302时钟程序详解
DS1302 时钟程序详解ds1302 时钟程序详解:DS1302 的控制字如图2 所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302 中,位6 如果为0,则表示存取日历时钟数据,为1 表示存取RAM 数据;位5 至位1 指示操作单元的地址;最低有效位(位0)如为0 表示要进行写操作,为1 表示进行读操作,控制字节总是从最低位开始输出。
2.3 数据输入输出(I/O)在控制指令字输入后的下一个SCLK 时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0 开始。
同样,在紧跟8 位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位到高位7。
2.4 DS1302 的寄存器DS1302 有12 个寄存器,其中有7 个寄存器与日历、时钟相关,存放的数据位为BCD 码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302 与RAM 相关的寄存器分为两类:一类是单个RAM 单元,共31 个,每个单元组态为一个8 位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM 寄存器,此方式下可一次性读写所有的RAM 的31 个字节,命令控制字为FEH(写)、FFH(读)。
ds1302 程序流程图3.2 DS1302 实时时间流程图4 示出DS1302 的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302 的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM 数据;D5~D1 指定输入或输出的特定寄存器; 最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
DS1302时钟 数码管显示
shi--; shi=shi/10*16+shi%10;
//转为 16 进制
if(shi==-1)
shi=0x23;
write_1302(write_shi,shi);
read_sf();
}
}
}
}
void main()
{
// init_1302();
while(1)
{
read_sf();
keyscan();
fen=0x00;
write_1302(write_fen,fen); //写入 1302
read_sf();
//读出时间,然后显示
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
while(!s2)
display(shi,fen,miao); //加上这句,按键按下就不会闪
fen--;
knum++; if(knum==1)
//分闪烁
{ write_1302(0x8e,0x00);
//保护取消
write_1302(write_miao,0x80);
}
if(knum==3)
//时钟启动
{
knum=0;
write_1302(write_miao,0x00);
write_1302(0x8e,0x80); //保护启动
W=0x02; D=dd[shi%10]; delay(5); D=0XFF; } else
//位选 //段选
//消隐 //小数点闪烁
//消隐
{ W=0x02; D=d[shi%10]; delay(5); D=0XFF;
DS1302可调时钟
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define Write_Protect 0x8e //写保护#define OutPut P1 //显示输出sbit DU=P0^1; //数码管段选sbit WE=P0^0; //数码管位选sbit CE=P0^2; //复位端口定义在P0.2引脚sbit IO=P0^3; //数据输出端定义在P0.4引脚sbit SCLK=P0^4; //时钟输出端口定义在P0.3引脚sbit key=P2^0; //时间调节控制键sbit key1=P2^1; //每按一次位加一sbit key2=P2^2; //每按一次位减一sbit key3=P2^3; //显示切换uchar code Wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选数据uchar code Duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; //0--9共阴代码code uchar Waddr[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; /*寄存器写地址*/code uchar Raddr[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; /*寄存器读地址*/uchar timeset[]={0x01,0x02,0x03,0x04,0x05,0x00,0x01}; /*设置初始时间*/uchar time_buf[7]; /*存读到的时间*/ uchar time_disp[7];uchar dispdat[8]; /*存储显示值的*/uchar Btdis=0,k=0,z; /*显示状态,按键变量*/ bit btx,btx1,btx2,btx3,bt1,bt2,bt3; /*按键响应*/bit Btread; /*读时间标志*//*==================================================函数功能:延时n 毫秒入口参数:n====================================================*/void delaynms(uchar n){uchar i,j;for(i=n;i>0;i--)for(j=125;j>0;j--);}/*=============================================函数功能:根据命令字,向1302写一个字节数据入口参数:addr,存储命令字;d,存储待写的数据==============================================*/ void Ds1302_Write_Byte(unsigned char addr, unsigned char d){unsigned char i;CE=1;//写入目标地址:addraddr = addr & 0xFE; //最低位置零for (i = 0; i < 8; i ++){if (addr & 0x01){IO=1;}else{IO=0;}SCLK=1;SCLK=0;addr = addr >> 1;}//写入数据:dfor (i = 0; i < 8; i ++){if (d & 0x01){IO=1;}else{IO=0;}SCLK=1;SCLK=0;d = d >> 1;}CE=0; //停止DS1302总线}/*================================================= 从DS1302读出一字节数据==================================================*/ uchar Ds1302_Read_Byte(unsigned char addr){unsigned char i;unsigned char temp;CE=1;//写入目标地址:addraddr = addr | 0x01; //最低位置高for (i = 0; i < 8; i ++){if (addr & 0x01){IO=1;}else{IO=0;}SCLK=1;SCLK=0;addr = addr >> 1;}//输出数据:tempfor (i = 0; i < 8; i ++){temp = temp >> 1;if (IO){temp |= 0x80;}else{temp &= 0x7F;}SCLK=1;SCLK=0;}CE=0; //停止DS1302总线return temp;}/*===================================================函数功能:向1302日历时钟芯片写入一个字节的数据入口参数:dat====================================================*/void Write1302(uchar dat){uchar i;SCLK=0;for(i=0;i<8;i++){IO=dat&0x01;SCLK=1;SCLK=0;dat=dat>>1;}}/*=====================================================函数功能:根据命令字,从1302读取一个字节的数据入口参数:Cmd返回参数:dat======================================================*/uchar Readset1302(uchar Cmd){uchar dat;CE=0;SCLK=0;CE=1;Write1302(Cmd);SCLK=1;CE=0;return dat;}/*================================================向DS1302写入时钟数据===================================================*/void Ds1302_Write_Time(void){unsigned char i,tmp;uchar flag;flag=Readset1302(0x81);if(flag&0x80) //判断时钟芯片是否停止,为1时时钟停止{ //掉电保存for(i=0;i<7;i++) //BCD处理{tmp=timeset[i]/10;//timeset[]={0x01,0x02,0x03,0x04,0x05,0x06,0x01}time_buf[i]=timeset[i]%10; //time_buf[7]time_buf[i]=time_buf[i]+tmp*16;}Ds1302_Write_Byte(0x8e,0x00); //关闭写保护Ds1302_Write_Byte(Waddr[6],time_buf[6]); //周Ds1302_Write_Byte(Waddr[5],time_buf[0]); //年Ds1302_Write_Byte(Waddr[4],time_buf[1]); //月Ds1302_Write_Byte(Waddr[3],time_buf[2]); //日Ds1302_Write_Byte(Waddr[2],time_buf[3]); //时Ds1302_Write_Byte(Waddr[1],time_buf[4]); //分Ds1302_Write_Byte(Waddr[0],time_buf[5]); //秒Ds1302_Write_Byte(0x8e,0x80); //打开写保护}}/*===============================================从DS1302读出时钟数据=================================================*/void Ds1302_Read_Time(void){unsigned char i,tmp;// Ds1302_Write_Byte(0x8e,0x00); //关闭写保护time_buf[0]=Ds1302_Read_Byte(Raddr[5]); //年time_buf[1]=Ds1302_Read_Byte(Raddr[4]); //月time_buf[2]=Ds1302_Read_Byte(Raddr[3]); //日time_buf[3]=Ds1302_Read_Byte(Raddr[2]); //时time_buf[4]=Ds1302_Read_Byte(Raddr[1]); //分time_buf[5]=(Ds1302_Read_Byte(Raddr[0]))&0x7F; //秒time_buf[6]=Ds1302_Read_Byte(Raddr[6]); //周// Ds1302_Write_Byte(0x8e,0x80); //打开写保护for(i=0;i<8;i++) //BCD处理{tmp=time_buf[i]/16; //time_buf[]={年,月,日,时,分,秒,周}time_buf[i]=time_buf[i]%16;time_disp[i]=time_buf[i]+tmp*10;}}/*======================================================DS1302初始化===================================================*/void Ds1302_Init(void){CE=0; //RST脚置低SCLK=0; //SCK脚置低Ds1302_Write_Byte(0x80,0x00);}/*====================================================函数名:时分秒显示子程序==函数功能:将从DS1302读到的数据在8位共阴数码管上显示==返回参数:===================================================*/ void display(){uchar i;if(Btdis==0){if(bt2==0){dispdat[0]=Duan[time_disp[3]/10]; //时dispdat[1]=Duan[time_disp[3]%10];}else{dispdat[0]=0x00;dispdat[1]=0x00;}dispdat[2]=0x40; //"-"if(bt3==0){dispdat[3]=Duan[time_disp[4]/10]; //分dispdat[4]=Duan[time_disp[4]%10];}else{dispdat[3]=0x00;dispdat[4]=0x00;}dispdat[5]=0x40;dispdat[6]=Duan[time_disp[5]/10]; //秒dispdat[7]=Duan[time_disp[5]%10];}if(Btdis==1){if(bt1==0){dispdat[0]=Duan[time_disp[0]/10]; //年dispdat[1]=Duan[time_disp[0]%10];}else{dispdat[0]=0x00;dispdat[1]=0x00;}dispdat[2]=0x40; //"-"if(bt2==0){dispdat[3]=Duan[time_disp[1]/10]; //月dispdat[4]=Duan[time_disp[1]%10];}else{dispdat[3]=0x00;dispdat[4]=0x00;}dispdat[5]=0x40;if(bt3==0){dispdat[6]=Duan[time_disp[2]/10]; //日dispdat[7]=Duan[time_disp[2]%10];}else{dispdat[6]=0x00;dispdat[7]=0x00;}}if(Btdis==2){dispdat[0]=0x40;if(bt1==0){dispdat[1]=Duan[time_disp[6]%10]; //周}else{dispdat[1]=0x00;}dispdat[2]=0x40; //"-"dispdat[3]=0x40;dispdat[4]=0x40;dispdat[5]=0x40;dispdat[6]=Duan[time_disp[5]/10];dispdat[7]=Duan[time_disp[5]%10];if(dispdat[1]==7){dispdat[1]=0x7f;}}for(i=0;i<8;i++){OutPut=dispdat[i];DU=1;DU=0;OutPut=Wei[i]; //Wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} WE=1;WE=0;delaynms(1);OutPut=0xff;WE=1;WE=0;}}/*====================================================函数名:按键==函数功能:显示模式,调时模式==返回参数:===================================================*/void keyscan(){display();if(!key){if(btx==0){if(!key){btx=1;k++;}}/*================================================= k=1时,调整年份,key1为加,key2为减==================================================*/ while(k==1){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[0]<99){time_disp[0]++;}else{time_disp[0]=0;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[0]>0){time_disp[0]--;}else{time_disp[0]=99;}}}}else{btx2=0;}}/*================================================= k=2时,调整月份,key1为加,key2为减==================================================*/ while(k==2){Btdis=1;display();if(!key){if(btx==0){if(!key)btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[1]<12){time_disp[1]++;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>29){time_disp[2]=29;}}else if(time_disp[2]>28){time_disp[2]=28;}}}else{time_disp[1]=1;}}}}elsebtx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[1]>1){time_disp[1]--;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>29){time_disp[2]=29;}}else if(time_disp[2]>28){time_disp[2]=28;}}}else{time_disp[1]=12;}}}}else{btx2=0;}}/*================================================= k=3时,调整天,key1为加,key2为减==================================================*/while(k==3){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]<29){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[2]<28){time_disp[2]++;}{time_disp[2]=1;}}else if(time_disp[1]<8){if(time_disp[1]%2==0) //小于8月的月份除以2的余数为0则为小月{if(time_disp[2]<30){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[1]%2==1) //小于8月的月份除以2的余数为1则为大月{if(time_disp[2]<31){time_disp[2]++;}else{time_disp[2]=1;}}}else if(time_disp[1]>7){if(time_disp[1]%2==0){if(time_disp[2]<31){time_disp[2]++;}else{time_disp[2]=1;}else if(time_disp[1]%2==1){if(time_disp[2]<30){time_disp[2]++;}else{time_disp[2]=1;}}}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=29;}}else if(time_disp[2]>1){time_disp[2]--;else{time_disp[2]=28;}}else if(time_disp[1]<8){if(time_disp[1]%2==0){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=30;}}else if(time_disp[1]%2==1){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=31;}}}else if(time_disp[1]>7){if(time_disp[1]%2==0){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=31;}}else if(time_disp[1]%2==1){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=30;}}}}}}else{btx2=0;}}/*================================================= k=4时,调整星期,key1为加,key2为减==================================================*/ while(k==4){Btdis=2;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[6]<7){time_disp[6]++;}else{time_disp[6]=1;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[6]>1){time_disp[6]--;}else{time_disp[6]=7;}}}}else{btx2=0;}}/*================================================= k=5时,调整小时,key1为加,key2为减==================================================*/ while(k==5){Btdis=0;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[3]<23){time_disp[3]++;}else{time_disp[3]=0;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[3]>0){time_disp[3]--;}else{time_disp[3]=23;}}}}else{btx2=0;}}/*================================================= k=6时,调整分钟,key1为加,key2为减==================================================*/ while(k==6){Btdis=0;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[4]<59){time_disp[4]++;}else{time_disp[4]=0;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[4]>0){time_disp[4]--;}else{time_disp[4]=59;}}}}else{btx2=0;}}/*====================================================== k=7把调整后的数据转换成16进制写入1302=======================================================*/ while(k==7){uchar tmp;uchar i;for(i=0;i<7;i++){timeset[i]=time_disp[i];}//将调整后的时候写入DS1302for(i=0;i<7;i++) //BCD处理{tmp=timeset[i]/10;//timeset[]={0x01,0x02,0x03,0x04,0x05,0x06,0x01}time_buf[i]=timeset[i]%10; //time_buf[7]time_buf[i]=time_buf[i]+tmp*16;}Ds1302_Write_Byte(0x8e,0x00); //关闭写保护Ds1302_Write_Byte(Waddr[6],time_buf[6]); //周Ds1302_Write_Byte(Waddr[5],time_buf[0]); //年Ds1302_Write_Byte(Waddr[4],time_buf[1]); //月Ds1302_Write_Byte(Waddr[3],time_buf[2]); //日Ds1302_Write_Byte(Waddr[2],time_buf[3]); //时Ds1302_Write_Byte(Waddr[1],time_buf[4]); //分Ds1302_Write_Byte(Waddr[0],time_buf[5]); //秒Ds1302_Write_Byte(0x8e,0x80); //打开写保护k=0;}}else{btx=0;}/*====================================================== key3为显示切换键,形成时分秒与年月日以及星期之前的切换=======================================================*/ if(!key3){if(btx3==0){if(!key3){btx3=1;if(Btdis<2){Btdis++;}else{Btdis=0;}}}}else{btx3=0;}}/*====================================================函数名:调整时间时,调整部分闪烁==函数功能:==返回参数:===================================================*/ void tiaoshidisplay(){if(z==15){z=0;switch(k){case 1:bt1=~bt1;break; //年case 2:bt2=~bt2;bt1=0;break; //月case 3:bt3=~bt3;bt2=0;break; //日case 4:bt1=~bt1;bt3=0;break; //周case 5:bt2=~bt2;bt1=0;break; //时case 6:bt3=~bt3;bt2=0;break; //分default:bt3=0;break;}}}/*================================================== ==函数名:定时器1子程序==函数功能:1S读一次时间==返回参数:===================================================*/ void Timer0() interrupt 1 using 1{uchar t;TH0=(65536-20000)/256; //给定初值TL0=(65536-20000)%256;if(t<49){t++;z++;tiaoshidisplay();}else{t=0;Btread=0;}}/*================================================== ==函数名:主函数==函数功能:==返回参数:===================================================*/ main(){TMOD=0x01; //使用模式1,16位定时器TH0=(65536-20000)/256; //给定初值TL0=(65536-20000)%256;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开Ds1302_Init();Ds1302_Write_Time();while(1){keyscan();if(Btread==0){Btread=1;Ds1302_Read_Time();}display();}}。
ds1302(含时间及日期调整)
add a,#1
da a
cjne a,#8,cr4
mov day,#1
call set_sj_disp
jmp N2
cr4:mov day,a
call set_sj_disp
jmp N2
tz5:cjne a,#5,tz6 ;r5=5,日调整
f2 bit 20h.2 ;数码管3、4位闪烁
f3 bit 20h.3 ;数码管5、6位闪烁
f4 bit 20h.4 ;数码管7、8位闪烁
k1 bit p3.5 ;时间/日期选择调整
k2 bit p3.6 ;调整加1
k3 bit p3.7 ;显示日期
setb et0 ;开定时器0中断
mov r5,#0ffh ;调整计数初值
mov sec,#00h
mov min,#00h
mov hr,#00h
int_: CLR RST ;DS1302复位
; 2 0 1 1 - 0 9 - 1 7 6
;50h 51h 52h 53h 54h 55h 56h 57h 存放时间的段显示码
; 1 2 - 0 0 - 0 0
;***************************************************************Q653417094**********
; ____________________________________________________________________________________
;30h 31h 32h 33h 34h 35h 36h 37h 38h 39h 3ah 3bh 日期预显示数的段码存放单元
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char year_h,year_l,month_h,month_l,day_h,day_l,hour_h,hour_l,min_h,min_l,sec_h,sec_l,date=1;
uchar year=1,month=1,day=1,hour=1,min=1,sec=1;
day=DS1302_Read(0x87); //读日数据
month=DS1302_Read(0x89); //读月数据
year=DS1302_Read(0x8d); //读年数据
}
void delay1ms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
case 2:LCD_writecom(0x80+0x40+8);
break;
case 3:LCD_writecom(0x80+0x40+5);
break;
case 4:LCD_writecom(0x80+14);
_nop_();
SDA=address&0x01; //每次传输低字节
address>>=1; //右移一位
SCLK=1;
_nop_();
}
for (i=0;i<8;i++) //循环8次 写入数据
}
void DS1302_initR()
{
sec=DS1302_Read(0x81); //读秒数据
min=DS1302_Read(0x83); //读分钟数据
hour=DS1302_Read(0x85); //读小时数据
date=DS1302_Read(0x8b); //读星期数据
DS1302_Write(0x8e,0x00);
switch(K1num)
{
case 1:LCD_writecom(0x80+0x40+11);
LCD_writecom(0x0f);
k=1;
break;
{
LCD_writedat(table3[num]);
delay1ms(2);
}
}
if(date==3)
{
for(num=8;num<11;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);
sbit LCD_EN = P3^4;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
bit k=0;
uchar code table1[]={" 20 - - "};
uchar code table2[]={" : : "};
DS1302_Write(0x86,day); //日
DS1302_Write(0x88,month); //月
DS1302_Write(0x8a,date); //周
DS1302_Write(0x8c,year); //年
DS1302_Write(0x8e,0x80); //写保护开
{ // : :
uchar num;
init();
LCD_writecom(0x80);
for(num=0;num<12;num++)
{
LCD_writedat(table1[num]);
delay1ms(2);
{
char shi,ge;
shi=date/16;
ge=date%16;
LCD_writecom(0x80+0x40+add);
LCD_writedat(0x30+shi);
LCD_writedat(0x30+ge);
}
void write_nyrx(uchar add,char date)
sbit LCD_RS = P3^5;
sbit LCD_RW = P3^3;
LCD_writecom(0x06); //输入方式设置(数据读写操作后AC自动加1;数据读写操作后画面不移动)
LCD_writecom(0x0C); //显示开关控制(开显示,关光标,关闪烁)
LCD_writecom(0x01); //清屏
}
void display1() //初始化屏幕 格式: 20 - -
;
}
uchar DS1302_Read(uchar address)
{
uchar i,temp=0x00;
CE=0;
SDA=1;
SCLK=0;
CE=1;
for (i=0;i<8;i++) //循环8次 写入地址数据
{
SCLK=0;
#include<reg52.h>
#include<intrins.h>
#include"18B20.c"
#define uchar unsigned char
#define uint unsigned int
sbit CE=P2^5;
sbit SDA=P2^6;
sbit SCLK=P2^4;
for(j=110;j>0;j--);
}
void LCD_writecom(uchar com)
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=1;
delay1ms(2);
P0=com;
LCD_EN=0;
delay1ms(2);
}
void LCD_writedat(uchar dat)
{
LCD_writedat(table3[num]);
delay1ms(2);
}
}
if(date==6)
{
for(num=20;num<23;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);
for (i=0;i<7;i++) //循环8次 读取数据
{
SCLK=0;
if(SDA)
temp|=0x80; //每次传输低字节
SCLK=1;
temp>>=1; //右移一位
}
SCLK=1;
CE=0;
SDA=0;
return temp;
}
}
if(date==7)
{
for(num=24;num<27;num++)
{
LCD_writedat(table3[num]);
1ms(2);
}
}
}
void write_sfm(uchar add,char date)
void DS1302_initW()
{
DS1302_Write(0x8e,0x00); //写保护关
DS1302_Write(0x80,sec); //秒
DS1302_Write(0x82,min); //分
DS1302_Write(0x84,hour); //时
{
char shi,ge;
shi=date/16;
ge=date%16;
LCD_writecom(0x80+add);
LCD_writedat(0x30+shi);
LCD_writedat(0x30+ge);
}
void display3()
{
if(k==0)
}
LCD_writecom(0x80+0x40);
for(num=0;num<15;num++)
{
LCD_writedat(table2[num]);
delay1ms(2);
}
}
void display2(uchar date)
{
uchar num;
LCD_writecom(0x80+12);
{
DS1302_initR();
write_sfm(10,sec);
write_sfm(7,min);
write_sfm(4,hour);
write_nyrx(3,year);
write_nyrx(6,month);
write_nyrx(9,day);
if(date==1)
{
for(num=0;num<3;num++)
{
LCD_writedat(table3[num]);
delay1ms(2);
}
}
if(date==2)
{
for(num=4;num<7;num++)
SDA=address&0x01; //每次传输低字节
address>>=1; //右移一位
SCLK=1;
}
delay1ms(1);
if(SDA)
temp|=0x80; //每次传输低字节