提问者:kong_g_lee2013-06-08 00:00
俺的程序如下,麻烦各位兄弟姐妹们帮我看看我的程序有没有问题啊,我检查N次了实在找不出那里错了,但下载到板子上数码管上一直显示 00 实在不知道怎么办了,现在搞的我对学习单片机都快兴趣了,先送一半分数,解决了我把俺在知道上的分全部送给您!!!!摆脱你们了。(我的
以前做过显示用LCD1602的DS1302时钟,我就发一个DS1302的头文件给你吧?你好好研究一下它们之间的函数吧?看懂了DS1302编程基本上难不倒你。你上面给的程序乱七八糟的我不敢恭维,显示部分电路也不知道什么回事。我也懒得看,下面是比较标准的DS1302头文件。 /////////////////////////////////////////////////////////////////////////////////////////////////////// //File : DS1302.H //Author : NULL //Created: 2008/6/18 #ifndef __DS1302_A_H__ #define __DS1302_A_H__ //引脚及位的定义 sbit DS1302_CLK = P3^6; //时钟引脚 sbit DS1302_IO = P3^4; //数据引脚 sbit DS1302_RST = P3^5; //复位引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; //宏定义便于理解 #define unchar unsigned char #define unint unsigned int #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_RAM(X) (0xC0+(X)*2) //用于计算RAM地址的宏运算 //定义时间类型 typedef struct _SYSTEMTIME_ { unchar Second; unchar Minute; unchar Hour; unchar Week; unchar Day; unchar Month; unchar Year; unchar DateString[9]; unchar TimeString[9]; }SYSTEMTIME; //函数声明 void DS1302_InputByte(unchar Data); //写入一个字节(内部函数) unchar DS1302_OutputByte(void); //读取一个字节(内部函数) void Write1302(unchar Address, unchar Data); //在指定地址写入指定的数据 unchar Read1302(unchar Address); //读取DS1302指定地址中的数据 void DS1302_SetProtect(bit Flag); //DS1302是否写入保护 void DS1302_SetTime(unchar Address, unchar Value);//设置时间函数 void DS1302_GetTime(SYSTEMTIME *Time); //读出时间 void DateToStr(SYSTEMTIME *Time); //日期转化成字符 void TimeToStr(SYSTEMTIME *Time); //时间转化成字符 void DS1302_Initial (void); //DS1302初始化 //写入一个字节(内部函数) void DS1302_InputByte(unchar Data) { unchar i; ACC = Data; for(i=8; i>0; i--) { DS1302_CLK = 0; DS1302_IO = ACC0; //由低位到高位 DS1302_CLK = 1; //上升沿写入数据 ACC >>= 1; } } //读取一个字节(内部函数) unchar DS1302_OutputByte(void) { unchar i; for(i=8; i>0; i--) { DS1302_CLK = 0; //下降沿读出DS1302的数据 ACC >>= 1; //读出由低到高位,只能移7次有效位!!! ACC7 = DS1302_IO; //第一个数据 DS1302_CLK = 1; } return (ACC); } //在指定地址写入指定的数据 void Write1302(unchar Address, unchar Data) { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302_InputByte(Address); DS1302_InputByte(Data); DS1302_CLK = 1; DS1302_RST = 0; } //读取1302指定地址中的数据 unchar Read1302(unchar Address) { unchar Data; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; //RST拉高,启动数据传送 DS1302_InputByte(Address|0x01);//读取指定地址数据指令 Data = DS1302_OutputByte(); DS1302_CLK = 1; DS1302_RST = 0; return (Data); } //是否写入保护 void DS1302_SetProtect(bit Flag) { if(Flag) Write1302(0x8E,0x80); //0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302 else Write1302(0x8E,0x00); //WP=0 允许数据写入DS1302 } //设置时间函数 void DS1302_SetTime(unchar Address, unchar Value) { DS1302_SetProtect(0); Write1302(Address,((Value/10)<<4|(Value%10))); DS1302_SetProtect(1); } //读出时间 void DS1302_GetTime(SYSTEMTIME *Time) { unchar ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_MINUTE); Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_HOUR); Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_DAY); Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_WEEK); Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_MONTH); Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); } //日期转化成字符 void DateToStr(SYSTEMTIME *Time) { Time->DateString[0] = Time->Year/10 + '0'; Time->DateString[1] = Time->Year%10 + '0'; Time->DateString[2] = '-'; Time->DateString[3] = Time->Month/10 + '0'; Time->DateString[4] = Time->Month%10 + '0'; Time->DateString[5] = '-'; Time->DateString[6] = Time->Day/10 + '0'; Time->DateString[7] = Time->Day%10 + '0'; Time->DateString[8] = '\0'; } //时间转化成字符 void TimeToStr(SYSTEMTIME *Time) { Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour%10 + '0'; Time->TimeString[2] = ':'; Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute%10 + '0'; Time->TimeString[5] = ':'; Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second%10 + '0'; Time->TimeString[8] = '\0'; } //初始化DS1302 void DS1302_Initial (void) { unchar Second=Read1302(DS1302_SECOND); if(Second&0x80)//bit7=CH CH=0 振荡器允许工作,CH=1振荡器停止工作 DS1302_SetTime(DS1302_SECOND,0); } #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 你把上面保存为DS1302.h,在主程序那里加进去就行了。显示部分的函数你自己编写一下。
回答者:nvolcano2016-06-08 00:00
显示85就是说明你延时有问题,根据你的晶振在网上找几个比较精确的延时,你这样估计是不行的
提问者:ahusj2013-04-19
你的程序没问题吧?先排除软件上的问题,1302的时间格式是BCD码的,你的是否正确,还有1302国产的片子水货比较多,之前连续用了几块都有问题,时间走得太慢比正常的慢一倍,换了块片子就好了。 这是我验证通过的程序 sb
提问者:chailang11372013-08-22
早早办护照取得国外的邀请函,通过学校报留学基金委,拿到录取文件后,就得开始做出国的准备工作了。我们是三口一起到附近的公安分局出入境接待大厅办理了护照。护照上的照片就在公安局里面照的,他们还不给拷贝,可能就是专用的,好在签
提问者:mzadoj2013-06-17
时序不对 DS18B20 的时序要求很严格,稍有不慎就会读不出 void delay(uchar k) { while(--k); } void delay1(uint k) { uint i,j
提问者:fdevb8832014-02-19
1、DS18B20的三个引脚的功能是什么?答:DS18B20的3个引脚分别为VCC电源正极、GND电源负极、DQ数据端。2、 DS18B20复位时间是多少?答:DS18B20复位时间是480us~960us。3、 如何判
提问者:Stunseetest2013-03-16
时序不对 DS18B20 的时序要求很严格,稍有不慎就会读不出 void delay(uchar k) { while(--k); } void delay1(uint k) { uint i,j
提问者:HOUXIOA56784072014-04-24