/******************************************************************************** * 普中科技--------------------------------------------------------------------------------* 实 验 名 : DS1302时钟显示试验* 实验说明 : 数码管显示时钟信息* 连接方式 : 见连接图* 注 意 : *******************************************************************************/#include #include"ds1302.h"//--定义使用的IO--//#define GPIO_DIG P0#define GPIO_PLACE P2 //位选***it beep=P3^5;***it K1=P3^0;***it K2=P3^1;***it K3=P3^2; //--定义全局变量--//unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制//--定义全局变量--//unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char DisplayData[8];//用来存放要显示的8位数的值//--声明全局变量--//void DigDisplay();void set_rtc(); void Delay10ms(unsigned int c);/****************** ************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){ Ds1302Init(); while(1) { Ds1302Readtime(); set_rtc(); DisplayData[0] = DIG_CODE[TIME[2]/16]; //时 DisplayData[1] = DIG_CODE[TIME[2]&0x0f]; DisplayData[2] = 0x40; DisplayData[3] = DIG_CODE[TIME[1]/16]; //分 DisplayData[4] = DIG_CODE[TIME[1]&0x0f]; DisplayData[5] = 0x40; DisplayData[6] = DIG_CODE[TIME[0]/16]; //秒 DisplayData[7] = DIG_CODE[TIME[0]&0x0f]; DigDisplay(); if((DisplayData[0]==0x06)&&(DisplayData[1]==0x5b)&&(DisplayData[2]==0x40)&&(DisplayData[3]=0x3f)&&(DisplayData[4]==0x3f)&&(DisplayData[5]==0x40)&&(DisplayData[6]==0x06)&&(DisplayData[7]==0x3f)) {beep=~beep; } } }/******************************************************************************** 函 数 名 : DigDisplay* 函数功能 : 使用数码管显示* 输 入 : 无* 输 出 : 无*******************************************************************************/void DigDisplay(){ unsigned char i; unsigned int j; for(i=0; i<8; i++) { switch(i) //位选,选择点亮的数码管, { case(0): GPIO_PLACE=DIG_PLACE[0]; break;//显示第0位 case(1): GPIO_PLACE=DIG_PLACE[1]; break;//显示第1位 case(2): GPIO_PLACE=DIG_PLACE[2]; break;//显示第2位 case(3): GPIO_PLACE=DIG_PLACE[3]; break;//显示第3位 case(4): GPIO_PLACE=DIG_PLACE[4]; break;//显示第4位 case(5): GPIO_PLACE=DIG_PLACE[5]; break;//显示第5位 case(6): GPIO_PLACE=DIG_PLACE[6]; break;//显示第6位 case(7): GPIO_PLACE=DIG_PLACE[7]; break;//显示第7位 }// //发送位选 GPIO_DIG=DisplayData[i];//发送段码 j=50; //扫描间隔时间设定 while(j--); GPIO_DIG=0x00;//消隐 }} void set_rtc(){ if (K1!=0xff)Delay10ms(50); if (K1!=0xff) { //TIME[2]=(TIME[2]>>4)*10+(TIME[2]&0x0f); TIME[2]++; if (TIME[2]==24) TIME[2]=0; //TIME[2]=((TIME[2]/10)<<4)+(TIME[2]%10); Ds1302Write(0x84, TIME[2]); } if (K2!=0xff) Delay10ms(50); if (K2!=0xff) { //TIME[1]=(TIME[1]>>4)*10+(TIME[1]&0x0f); TIME[1]++; if (TIME[1]==60) TIME[1]=0; // TIME[1]=((TIME[1]/10)<<4)+(TIME[1]%10); Ds1302Write(0x82, TIME[1]); } if (K3!=0xff) Delay10ms(50); if (K3!=0xff) { // TIME[0]=(TIME[0]>>4)*10+(TIME[0]&0x0f); TIME[0]++; if (TIME[0]==60) TIME[0]=0; // TIME[0]=((TIME[0]/10)<<4)+(TIME[0]%10); Ds1302Write(0x80,TIME[0]); }} void Delay10ms(unsigned int c) //误差 0us{ unsigned char a, b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } }#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时钟初始化2013年1月1日星期二12点00分00秒。---////---存储顺序是秒分时日月周年,存储格式是用BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/******************************************************************************** 函 数 名 : 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]); } }
0
|
|
|
|