- #ifndef _DELAY1MS_H
- #define _DELAY1MS_H
- //包含头文件//
- void delay1ms(unsigned int i);
- #endif
- ///////////////////////////////////////////////////////////
- #include "delay1ms.h"
- void delay1ms(unsigned int i)
- {
- while(i--);
- }
- ///////////////////////////////////////////////////
- #ifndef __KEY_H_
- #define __EKY_H_
- #include <reg52.h>
- void key_prc();
- sbit k1=P2^5;
- sbit k2=P2^6;
- sbit k3=P2^7;
- #endif
- //////////////////////////////////
- #include "key.h"
- #include "delay1ms.h"
- #include"ds1302.h"
- #include"display.h"
- unsigned char M;
- void key_prc()//K1,K2,K3,K4按键代码
- {
- if(k1==0)
- {
- M++;
- TR0=1;
- delay1ms(100);
- while(!k1)
- {
- Display();
- }
- if(M==4)
- {
- TR0=0;
- M=0;
- }
-
- }
- if(M!=0)
- {
-
- switch(M)
- {
- case (1):
- {
- if(k2==0)
- {
- delay1ms(10);
- if(k2==0)
- {
- TIME[2]=(TIME[2]/16*10)+(TIME[2]%16);//转化为十进制
- TIME[2]++;
- if(TIME[2]==24)
- TIME[2]=0;
- }
- TIME[2]=((TIME[2]/10)<<4)+(TIME[2]%10);//十制数转16进制,(TIME[2]/10)<<4)|(TIME[2]%10),若23TIME[2]/10=2,2-->0010,左移4位0010 0000,3-->0000 0011,0010 0000 |0000 0011=0011 0011,其中“+”与“|”运算结果一样的
- Ds1302Write(0x8E,0X00);//打开写保护
-
- Ds1302Write(0x84,TIME[2]);//写入时数据
-
- Ds1302Write(0x8E,0x80);//关闭写保护
- while(!k2)
- {
- Display();
- }
-
-
- }
- if(k3==0)
- {
- delay1ms(10);
- if(k3==0)
- {
- TIME[2]=(TIME[2]/16*10)+(TIME[2]%16);
- if(TIME[2]==0)
- TIME[2]=24;
- }
- TIME[2]--;
- TIME[2]=((TIME[2]/10)<<4)+(TIME[2]%10);
- Ds1302Write(0x8E,0X00);
-
- Ds1302Write(0x84,TIME[2]);
-
- Ds1302Write(0x8E,0x80);
- while(!k3)
- {
- Display();
- }
-
- }
- // if(k4==0)
- // {
- // delay1ms(10);
- // if(k4==0)
- // {
- // TR0=0;
- // M=0;
- // flag=0;
- //
- //
- // }
- // }
- }
- break;
- case (2):
- {
- if(k2==0)
- {
- delay1ms(10);
- if(k2==0)
- {
- TIME[1]=(TIME[1]/16*10)+(TIME[1]%16);
- TIME[1]++;
- if(TIME[1]==60)
- TIME[1]=0;
- }
- TIME[1]=((TIME[1]/10)<<4)+(TIME[1]%10);
- Ds1302Write(0x8E,0X00);
-
- Ds1302Write(0x82,TIME[1]);
-
- Ds1302Write(0x8E,0x80);
- while(!k2)
- {
- Display();
- }
-
- }
- if(k3==0)
- {
- delay1ms(10);
- if(k3==0)
- {
- TIME[1]=(TIME[1]/16*10)+(TIME[1]%16);
- if(TIME[1]==0)
- TIME[1]=60;
- }
- TIME[1]--;
- TIME[1]=((TIME[1]/10)<<4)+(TIME[1]%10);
- Ds1302Write(0x8E,0X00);
-
- Ds1302Write(0x82,TIME[1]);
-
- Ds1302Write(0x8E,0x80);
- while(!k3)
- {
- Display();
- }
-
-
- }
- // if(k4==0)
- // {
- // delay1ms(10);
- // if(k4==0)
- // {
- // TR0=0;
- // M=0;
- // flag=0;
- //
- //
- // }
- // }
- }
- break;
- case (3):
- {
- if(k2==0)
- {
- delay1ms(10);
- if(k2==0)
- {
- TIME[0]=(TIME[0]/16*10)+(TIME[0]%16);
- TIME[0]++;
- if(TIME[0]==60)
- TIME[0]=0;
- }
- TIME[0]=((TIME[0]/10)<<4)+(TIME[0]%10);
- Ds1302Write(0x8E,0X00);
-
- Ds1302Write(0x80,TIME[0]);
-
- Ds1302Write(0x8E,0x80);
- while(!k2)
- {
- Display();
- }
-
- }
- if(k3==0)
- {
- delay1ms(10);
- if(k3==0)
- {
- TIME[0]=(TIME[0]/16*10)+(TIME[0]%16);
- if(TIME[0]==0)
- TIME[0]=60;
- }
- TIME[0]--;
- TIME[0]=((TIME[0]/10)<<4)+(TIME[0]%10);
- Ds1302Write(0x8E,0X00);
-
- Ds1302Write(0x80,TIME[0]);
-
- Ds1302Write(0x8E,0x80);
- while(!k3)
- {
- Display();
- }
-
-
- }
- // if(k4==0)
- // {
- // delay1ms(10);
- // if(k4==0)
- // {
- // TR0=0;
- // M=0;
- // flag=0;
- //
- //
- // }
- // }
- }
- break;
- }
- }
- }
- /////////////////////////////////////////////////////
- #ifndef __DISPLAY_H_
- #define __DISPLAY_H_
- #include <reg52.h>
- extern unsigned char DisplayData[8];
- extern bit flag;
- extern unsigned char M;
- //sbit LSA=P2^7;
- //sbit LSB=P2^6;
- //sbit LSC=P2^5;
- void Display();
- //void Displayflag();
-
- #endif
- ////////////////////////////////////////////////////////
- #include "display.h"
- #include "delay1ms.h"
- #include "key.h"
- unsigned char i;
- unsigned char code weidata[8]={0x00,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0};
- void Display()
- {
- if(flag==0 | M==0)
- {
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管
- {
- case(0):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第0位
- case(1):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第1位
- case(2):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
- case(3):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第3位
- case(4):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第4位
- case(5):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第5位
- case(6):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第6位
- case(7):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第7位
- }
- P1=DisplayData[i];//发送数据
- delay1ms(200); //间隔一段时间扫描
- P1=0x00;//消隐
-
- }
- }
- else
- {
- if(M==1)
- {
- for(i=2;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(2):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
- case(3):
- P0 &=0x0f;P0 |=weidata[i];break;//显示第3位
- case(4):
- P0 &=0x0f;P0 |=weidata[i];//显示第4位
- case(5):
- P0 &=0x0f;P0 |=weidata[i];//显示第5位
- case(6):
- P0 &=0x0f;P0 |=weidata[i];//显示第6位
- case(7):
- P0 &=0x0f;P0 |=weidata[i];break;//显示第7位
- }
- P1=DisplayData[i];//发送数据
- delay1ms(100); //间隔一段时间扫描
- P1=0x00;//消隐
- }
- }
- if(M==2)
- {
- for(i=0;i<3;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第0位
- case(1):
- P0 &=0x0f;P0 |=weidata[i];break;//显示第1位
- case(2):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
- }
- P1=DisplayData[i];//发送数据
- delay1ms(100); //间隔一段时间扫描
- P1=0x00;//消隐
- }
- for(i=5;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(5):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第5位
- case(6):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第6位
- case(7):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第7位
- }
- P1=DisplayData[i];//发送数据
- delay1ms(100); //间隔一段时间扫描
- P1=0x00;//消隐
- }
- }
- if(M==3)
- {
- for(i=0;i<6;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第0位
- case(1):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第1位
- case(2):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
- case(3):
- P0 &=0x0f;P0 |=weidata[i];break;//显示第3位
- case(4):
- P0 &=0x0f;P0 |=weidata[i];break;//显示第4位
- case(5):
- P0 &=0x0f;P0 |=weidata[i]; break;//显示第5位
- }
- P1=DisplayData[i];//发送数据
- delay1ms(100); //间隔一段时间扫描
- P1=0x00;//消隐
- }
- }
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- #ifndef __DS1302_H_
- #define __DS1302_H_
- //---包含头文件---//
- #include<reg52.h>
- #include<intrins.h>
- //---重定义关键词---//
- #ifndef uchar
- #define uchar unsigned char
- #endif
- #ifndef uint
- #define uint unsigned int
- #endif
- //---定义ds1302使用的IO口---//
- sbit DSIO=P3^1;
- sbit RST=P3^0;
- sbit SCLK=P3^2;
- //sbit DSIO=P3^4;
- //sbit RST=P3^5;
- //sbit SCLK=P3^6;
- //---定义全局函数---//
- void Ds1302Write(uchar addr, uchar dat);
- uchar Ds1302Read(uchar addr);
- void Ds1302Init();
- void Ds1302ReadTime();
- //---加入全局变量--//
- extern uchar TIME[7]; //加入全局变量
- #endif
- /////////////////////////////////////////////////////////////////////
- #include"ds1302.h"
- //---DS1302写入和读取时分秒的地址命令---//
- //---秒分时日月周年 最低位读写位;-------//
- uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- //---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
- //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
- uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};
- /*******************************************************************************
- * 函 数 名 : Ds1302Write
- * 函数功能 : 向DS1302命令(地址+数据)
- * 输 入 : addr,dat
- * 输 出 : 无
- *******************************************************************************/
- void Ds1302Write(uchar addr, uchar dat)
- {
- uchar n;
- RST = 0;
- _nop_();
- SCLK = 0;//先将SCLK置低电平。
- _nop_();
- RST = 1; //然后将RST(CE)置高电平。
- _nop_();
- for (n=0; n<8; n++)//开始传送八位地址命令
- {
- DSIO = addr & 0x01;//数据从低位开始传送
- addr >>= 1;
- SCLK = 1;//数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;
- _nop_();
- }
- for (n=0; n<8; n++)//写入8位数据
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1;//数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;
- _nop_();
- }
-
- RST = 0;//传送数据结束
- _nop_();
- }
- /*******************************************************************************
- * 函 数 名 : Ds1302Read
- * 函数功能 : 读取一个地址的数据
- * 输 入 : addr
- * 输 出 : dat
- *******************************************************************************/
- uchar Ds1302Read(uchar addr)
- {
- uchar n,dat,dat1;
- RST = 0;
- _nop_();
- SCLK = 0;//先将SCLK置低电平。
- _nop_();
- RST = 1;//然后将RST(CE)置高电平。
- _nop_();
- for(n=0; n<8; n++)//开始传送八位地址命令
- {
- DSIO = addr & 0x01;//数据从低位开始传送
- addr >>= 1;
- SCLK = 1;//数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;//DS1302下降沿时,放置数据
- _nop_();
- }
- _nop_();
- for(n=0; n<8; n++)//读取8位数据
- {
- dat1 = DSIO;//从最低位开始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0;//DS1302下降沿时,放置数据
- _nop_();
- }
- RST = 0;
- _nop_(); //以下为DS1302复位的稳定时间,必须的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- /*******************************************************************************
- * 函 数 名 : Ds1302Init
- * 函数功能 : 初始化DS1302.
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Ds1302Init()
- {
- uchar n;
- Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
- for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
- {
- Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
- }
- Ds1302Write(0x8E,0x80); //打开写保护功能
- }
- /*******************************************************************************
- * 函 数 名 : Ds1302ReadTime
- * 函数功能 : 读取时钟信息
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Ds1302ReadTime()
- {
- uchar n;
- for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
- {
- TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
- }
-
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////
- #include "ds1302.h"
- #include "display.h"
- #include "key.h"
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- unsigned char DisplayData[8];
- char num=0;
- u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- bit flag=0;
- u16 t;
- void datapros();
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- Ds1302Init(); //第一次初始化后就可以注释该条语句,这样下次重启就不会再次初始化了
- TMOD=0X01;
- TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- EA=1;
- ET0=1;
- while(1)
- {
- datapros(); //数据处理函数
- Display();//数码管显示函数
- key_prc();
- }
- }
- void datapros()
- {
- Ds1302ReadTime();
- DisplayData[0] = smgduan[TIME[2]/16]; //时
- DisplayData[1] = smgduan[TIME[2]&0x0f];
- DisplayData[2] = 0x40;
- DisplayData[3] = smgduan[TIME[1]/16]; //分
- DisplayData[4] = smgduan[TIME[1]&0x0f];
- DisplayData[5] = 0x40;
- DisplayData[6] = smgduan[TIME[0]/16]; //秒
- DisplayData[7] = smgduan[TIME[0]&0x0f];
- }
- void timer0() interrupt 1 //定时器1中断函数代码
- {
-
- TH0=(65536-46080)/256;//定时50ms
- TL0=(65536-46080)%256;
- t ++;
- if(t==5)//0.25秒=0.25秒
- {
- t=0;
- flag=~flag;
- }
-
- }
复制代码 |