高级会员
主题
回帖0
积分2052
阅读权限30
注册时间2010-1-23
最后登录1970-1-1
在线时间 小时
|
本帖最后由 adsl865 于 2011-8-27 11:24 编辑
用的是贴片的 STC89C52RC
- //DS1302管脚定义
- sbit T_CLK = P3^4; //ds1302_clk(时钟线)
- sbit T_IO = P3^5; //ds1302_dat(数据线)
- sbit T_RST = P3^6; //ds1302_Rst(复位线)
- sbit ACC0 = ACC^0;
- sbit ACC1 = ACC^1;
- sbit ACC2 = ACC^2;
- sbit ACC3 = ACC^3;
- sbit ACC4 = ACC^4;
- sbit ACC5 = ACC^5;
- sbit ACC6 = ACC^6;
- sbit ACC7 = ACC^7;
- #define uchar unsigned char
- #define uint unsigned int
- unsigned second,minute,hour,day,month,week,year;
- //时钟数据(7字节BCD码)格式为: 秒 分 时 日 月星期 年-----------------------------
- unsigned char idata Time[7];
- /*******************************************************************************************
- * 函数名: BCD2HEX
- * 功能描述: BCD码转换成十进制
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- unsigned char BCD2HEX(unsigned char BCDChar)
- {
- unsigned char temp;
- temp=(BCDChar/16*10+BCDChar%16);
- return temp;
- }
- /*******************************************************************************************
- * 函数名: HEX2BCD
- * 功能描述: 十进制转换成BCD码
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- unsigned char HEX2BCD(unsigned char HEXChar)
- {
- unsigned char temp;
- temp=(HEXChar/10*16+HEXChar%10);
- return temp;
- }
- /*******************************************************************************************
- * 函数名: WriteByteDS1302
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void WriteByteDS1302(unsigned char Data)
- {
- unsigned char i;
- ACC = Data;
- for(i=8; i>0; i--)
- {
- T_IO = ACC0;
- T_CLK = 1;
- T_CLK = 0;
- ACC = ACC >> 1;
- }
- }
- /*******************************************************************************************
- * 函数名: ReadByteDS1302
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- unsigned char ReadByteDS1302(void)
- {
- unsigned char i;
- for(i=8; i>0; i--)
- {
- ACC = ACC >>1;
- ACC7 = T_IO;
- T_CLK = 1;
- T_CLK = 0;
- }
- return(ACC);
- }
- /*******************************************************************************************
- * 函数名: WriteDS1302
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void WriteDS1302(unsigned char Addr,unsigned char Data)
- {
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- WriteByteDS1302(Addr);
- WriteByteDS1302(Data);
- T_CLK = 1;
- T_RST = 0;
- }
- /*******************************************************************************************
- * 函数名: ReadDS1302
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- unsigned char ReadDS1302(unsigned char Addr)
- {
- unsigned char Data;
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- WriteByteDS1302(Addr);
- Data = ReadByteDS1302();
- T_CLK = 1;
- T_RST = 0;
- return(Data);
- }
- /******************************************************************/
- /*******************************************************************************************
- * 函数名: Set
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- /*void Set(unsigned char sel,unsigned char selby)
- {
- unsigned char address,item;
- unsigned char max,min;
- if(sel==0) {address=0x80; max=59;min=0;} //秒
- if(sel==1) {address=0x82; max=59;min=0;} //分钟
- if(sel==2) {address=0x84; max=23;min=0;} //小时
- if(sel==3) {address=0x86; max=31;min=1;} //日
- if(sel==4) {address=0x88; max=12;min=1;} //月
- if(sel==5) {address=0x8a; max=7; min=1;} //星期
- if(sel==6) {address=0x8c; max=99;min=0;} //年
- if(sel==7) {address=0xc0; max=59;min=0;} //闹钟分钟
- if(sel==8) {address=0xc2; max=23;min=0;} //闹钟小时
- item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16;
- if (selby==0) item++; else item--;
- if(item>max) item=min;
- if(item<min) item=max;
- WriteDS1302(0x8e,0x00);
- WriteDS1302(address,item/10*16+item%10);
- WriteDS1302(0x90,0xa5);
- WriteDS1302(0x8e,0x80);
- }
- */
- /*******************************************************************************************
- * 函数名: SetTime
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- /*void SetTime(unsigned char *pClock)
- {
- unsigned char h;
- unsigned char Addr=0x80;
- WriteDS1302(0x8e,0x00);
- for(h=7; h>0; h--)
- {
- WriteDS1302(Addr,*pClock);
- pClock++;
- Addr+=2;
- }
- WriteDS1302(0x90,0xa5);
- WriteDS1302(0x8e,0x80);
- }*/
- /*******************************************************************************************
- * 函数名: ReadTime
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void ReadTime()
- {
- second = BCD2HEX(Time[0]=ReadDS1302(0x81));
- minute = BCD2HEX(Time[1]=ReadDS1302(0x83));
- hour = BCD2HEX(Time[2]=ReadDS1302(0x85));
- day = BCD2HEX(Time[3]=ReadDS1302(0x87));
- month = BCD2HEX(Time[4]=ReadDS1302(0x89));
- year = BCD2HEX(Time[5]=ReadDS1302(0x8d));
- week = BCD2HEX(Time[6]=ReadDS1302(0x8b));
- }
- /*******************************************************************************************
- * 函数名: WriteTime
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void WriteTime()
- {
- WriteDS1302(0x8e,0x00);
- WriteDS1302(0x80,0x00); //WriteDS1302(0x80,HEX2BCD(second));
- WriteDS1302(0x82,0x024); //WriteDS1302(0x82,HEX2BCD(minute));
- WriteDS1302(0x84,0x09); //WriteDS1302(0x84,HEX2BCD(hour));
- WriteDS1302(0x86,0x11); //WriteDS1302(0x86,HEX2BCD(day));
- WriteDS1302(0x88,0x07); //WriteDS1302(0x88,HEX2BCD(month));
- WriteDS1302(0x8A,0x2); //WriteDS1302(0x8A,HEX2BCD(week));
- WriteDS1302(0x8C,0x11); //WriteDS1302(0x8C,HEX2BCD(year));
- WriteDS1302(0x90,0xa5);
- WriteDS1302(0x8e,0x80);
- }
复制代码
-
- #include<reg52.h>
- #include<absacc.h>
- #include"zimo.h"
- #include"DS1302.h"
-
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char idata Dis[6];
- sbit ST=P0^0;
- sbit DS=P0^1;
- sbit SH=P0^2;
- /*******************************************************************************************
- * 函数名: Delay
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void Delay(unsigned int i)
- {
- unsigned int j;
- for(j=0;j<i;j++);
- }
- /*******************************************************************************************
- * 函数名:init
- * 功能描述:读取时间
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void init(void)
- {
- ReadTime();//读取时间
- //Delay(1000);
- Dis[0]=hour/10; //取小时的十位数
- Dis[1]=hour%10; //取小时的个位数
- Dis[2]=minute/10;//取分钟的十位数
- Dis[3]=minute%10;//取分钟的个位数
- Dis[4]=second/10;//取秒的十位数
- Dis[5]=second%10;//取秒的个位数
- }
- /*******************************************************************************************
- * 函数名: send_1
- * 功能描述:显示时,分,秒时595锁存数据
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void send_1(uchar temp)
- {
- uchar i;
- for (i=0;i<5;i++)
- {
- temp=temp<<1;
- DS=CY;
- SH=1;
- SH=0;
- }
- }
- /*******************************************************************************************
- * 函数名: mode_2 (显示时,分,秒)
- * 功能描述:静态显示小时,分钟,秒
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void mode_2(void)
- {
- uchar i,j,temp2;
- for(i=0;i<7;i++)
- {
- for(j=0;j<6;j++)
- {
- if(j==0||j==1||j==3)
- temp2=g_no[Dis[j]*7+i]; //加載小時的十位數和個位數,分钟的个位数
- else
- {
- if(j==2)
- {
- if(i==2||i==4) //加載分鍾的十位數和冒號
- temp2=(g_no[Dis[j]*7+i])>>1; //当到分的时候全部右移一位
- else
- temp2=((g_no[Dis[j]*7+i])>>1)|0X80; //加載分鍾的十位數,当到分的时候全部右移一位
- }
- if(j==4)
- {
- if(i==3||i==5) //加載秒的十位數和冒號
- temp2=(s_no[Dis[j]*7+i])>>1; //当到分的时候全部右移一位
- else
- temp2=((s_no[Dis[j]*7+i])>>1)|0X80; //加載秒的十位數,当到分的时候全部右移一位
- }
- if(j==5)
- {
- temp2=s_no[Dis[j]*7+i]; //加載秒的個位數
- }
- }
- send_1(temp2);
- }
- P2=0XFF; //消隐
- P2=P2^(1<<i);
- ST=1;
- Delay(170); //155
- ST=0;
- }
- }
- /*******************************************************************************************
- * 函数名: main
- * 功能描述:
- * 入口参数: 无
- * 出口参数: 无
- *******************************************************************************************/
- void main (void)
- {
- uint r;
- init();
- // Delay(5000);
- P2=0XFF;
- init();
- // WriteTime();
- while(1)
- {
- init();
- mode_2();
- }
- }
复制代码 |
|