问答

DS1302的问题 时间加到79年再加就变成00年,00年再减就变成19年。求解啊!!哪位大侠帮帮忙啊!!急!!

提问者:chailang11372013-08-22 00:00

最佳答案

你的程序没问题吧?先排除软件上的问题,1302的时间格式是BCD码的,你的是否正确,还有1302国产的片子水货比较多,之前连续用了几块都有问题,时间走得太慢比正常的慢一倍,换了块片子就好了。 这是我验证通过的程序 sbit SCLK = P3^3; sbit IO = P3^5; sbit RST = P3^4; sbit ACC_0 = ACC^0; sbit ACC_7 = ACC^7; //秒 分 时 日 月 星期 年 unsigned char idata init_time[] = {0x00, 0x00, 0x20, 0x01, 0x01, 0x05, 0x10}; unsigned char idata now_time[7]; unsigned char time_reload_flag = 0; //是否进行时间设置标志位 unsigned char idata YearNum[2]; unsigned char idata MonthNum[2]; unsigned char idata DayNum[2]; unsigned char idata WeekNum[1]; unsigned char idata HourNum[2]; unsigned char idata MinuteNum[2]; unsigned char idata SecondNum[2]; //函数功能: DS1302时间处理函数,将键盘输入的时间转换成DS1302的格式 //入口参数: 无 //出口参数: 无 void Time_Process(void) { init_time[6] = YearNum[1] * 16 + YearNum[0]; // DS1302的时间格式为16进制 init_time[5] = WeekNum[0]; init_time[4] = MonthNum[1] * 16 + MonthNum[0]; init_time[3] = DayNum[1] * 16 + DayNum[0]; init_time[2] = HourNum[1] * 16 + HourNum[0]; init_time[1] = MinuteNum[1] * 16 + MinuteNum[0]; init_time[0] = SecondNum[1] * 16 + SecondNum[0]; } //延时X微秒(STC12C5A60S2@12M) //不同的工作环境,需要调整此函数 //此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同 void Delay_ds1302() { _nop_(); _nop_(); } //函数功能: 从DS1302读1字节数据 //入口参数:无 //出口参数: 返回读的数据 unsigned char DS1302_ReadByte() { unsigned char i; unsigned char dat = 0; for (i=0; i<8; i++) //8位计数器 { SCLK = 0; //时钟线拉低 Delay_ds1302(); //延时等待 dat >>= 1; //数据右移一位 if (IO) dat |= 0x80; //读取数据 SCLK = 1; //时钟线拉高 Delay_ds1302(); //延时等待 } return dat; } //函数功能: 向DS1302写1字节数据 //入口参数:写的数据 //出口参数: 无 void DS1302_WriteByte(unsigned char dat) { unsigned char i; for (i=0; i<8; i++) //8位计数器 { SCLK = 0; //时钟线拉低 Delay_ds1302(); //延时等待 dat >>= 1; //移出数据 IO = CY; //送出到端口 SCLK = 1; //时钟线拉高 Delay_ds1302(); //延时等待 } } //函数功能: 读DS1302某地址的的数据 //入口参数:地址 //出口参数: 数据 unsigned char DS1302_ReadData(unsigned char addr) { unsigned char dat; RST = 0; Delay_ds1302(); SCLK = 0; Delay_ds1302(); RST = 1; Delay_ds1302(); DS1302_WriteByte(addr); //写地址 dat = DS1302_ReadByte(); //读数据 SCLK = 1; RST = 0; return dat; } //函数功能: 往DS1302的某个地址写入数据 //入口参数:地址 //出口参数: 无 void DS1302_WriteData(unsigned char addr, unsigned char dat) { RST = 0; Delay_ds1302(); SCLK = 0; Delay_ds1302(); RST = 1; Delay_ds1302(); DS1302_WriteByte(addr); //写地址 DS1302_WriteByte(dat); //写数据 SCLK = 1; RST = 0; } //函数功能: 写入初始时间 //入口参数:时间数组地址 //出口参数: 无 void DS1302_SetTime(unsigned char *p) { unsigned char addr = 0x80; unsigned char n = 7; DS1302_WriteData(WRITE_PROTECT, 0x00); //允许写操作 while (n--) { DS1302_WriteData(addr, *p++); addr += 2; } DS1302_WriteData(WRITE_PROTECT, 0x80); //写保护 } //函数功能: 读时间 //入口参数:时间数组地址 //出口参数: 无 void DS1302_GetTime(unsigned char *p) { unsigned char addr = 0x81; unsigned char n = 7; while (n--) { *p++ = DS1302_ReadData(addr); addr += 2; } } //函数功能: 初始化DS1302 //入口参数:时间数组地址 //出口参数: 无 void DS1302_Initial() { RST = 0; SCLK = 0; DS1302_WriteData(WRITE_PROTECT, 0x00); //允许写操作 // DS1302_WriteData(0x80, 0x00); //时钟启动 DS1302_WriteData(WRITE_CHARGING, 0xa6); //使能涓流充电,一个二极管+4K电阻充电 DS1302_WriteData(WRITE_PROTECT, 0x80); //写保护 } //函数功能: DS1302显示函数 //入口参数: xposi,yposi //出口参数: 无 void Disp_Time(unsigned char xposi, unsigned int yposi) { unsigned char shi, fen , miao, year, month, date, week; DS1302_GetTime(now_time); year = now_time[6]; // 获取 年 Disp_12(xposi, yposi, NUMBIG[2]); Disp_12(xposi + 2, yposi, NUMBIG[0]); Disp_12(xposi + 4, yposi, NUMBIG[(year & 0xf0) >> 4]); //读出来的year的高4位是存放年的十位的值,所以取高4位,然后右移4位,即是年的十位应该显示的数值? Disp_12(xposi + 6, yposi, NUMBIG[(year & 0x0f)]); //读出来的year的低4位是存放年的个位的值 , Disp_24(xposi + 8, yposi, TIME[0]); month = now_time[4]; // 获取 月 Disp_12(xposi + 12, yposi, NUMBIG[(month & 0xf0) >> 4]); Disp_12(xposi + 14, yposi, NUMBIG[(month & 0x0f)]); Disp_24(xposi + 16, yposi, TIME[1]); date = now_time[3]; // 获取 日 Disp_12(xposi + 20, yposi, NUMBIG[(date & 0xf0) >> 4]); Disp_12(xposi + 22, yposi, NUMBIG[(date & 0x0f)]); Disp_24(xposi + 24, yposi, TIME[2]); week = now_time[5]; // 获取 星期 Disp_24(xposi + 28, yposi, TIME[3]); Disp_24(xposi + 31, yposi, TIME[4]); Disp_24(xposi + 34, yposi, DAY[(week & 0x0f) - 1]); shi = now_time[2]; // 获取 小时 Disp_12(xposi + 39, yposi + 0, NUMBIG[(shi & 0xf0) >> 4]); Disp_12(xposi + 41, yposi + 0, NUMBIG[shi & 0x0f]); Disp_12(xposi + 43, yposi + 0, DOTT); fen = now_time[1]; // 获取 分 Disp_12(xposi + 45, yposi + 0, NUMBIG[(fen & 0xf0) >> 4]); Disp_12(xposi + 47, yposi + 0, NUMBIG[fen & 0x0f]); Disp_12(xposi + 49, yposi + 0, DOTT); miao = now_time[0]; // 获取 秒 Disp_12(xposi + 51, yposi + 0, NUMBIG[(miao & 0xf0) >> 4]); Disp_12(xposi + 53, yposi + 0, NUMBIG[miao & 0x0f]); }

回答者:jusck4848132016-08-22 00:00

DS 5相关问题

相关阅读

DS 5频道

报价:21.99-34.59
级别:中型车
排量:1.6T 1.8T 
变速箱:-

车友关注

最新标签

按字母分类:
ABCDEFGHIJKLMNOPQRSTWXYZ0-9