- #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;
- }
-
- }
復制代碼 |