ds1302编程
① 关于51单片机 DS1302时钟编程问题
ACC是个特殊寄存器,在reg52.h里有声明
通常用来存放数据移位运算。
ACC>>=1; //这里就是将ACC里的数据右移并赋值给自己,举例0xff也就是1111 1111经过右移1位计算,得到0111 1111
ACC_7 应该在最开始的时候定义过,也就是sbit ACC_7=ACC^7;
ACC_7代表ACC的最高位,也就是第刚才举例中右移一次得到0的那个位
而T_DIO应该是bit类型的,所以,赋值给ACC_7
也就是说ACC 0111 1111最高位被赋值为1,又变成了1111 1111
希望能帮助你
② DS1302编程的问题
就看ds1302技术手册就行,其实,ds1302的程序都有现成的,网络知道里,网络文库里都可以搜索到无数个程序答案的。
③ 汇编高手DS1302的编程LCD1602显示
;=====液晶屏通信引脚定义=====
RS BIT P2.0
RW BIT P2.1
E BIT P2.2
DB0_DB7 EQU P0;=====DS1302通信引脚定义=====
RST BIT P3.0
SCLK BIT P3.1
IO BIT P3.2;=====数据设定引脚定义========
MODE BIT P3.3
JIA BIT P3.4
JIAN BIT P3.5;=====定义数据存储地址========
DS1302_ADDR DATA 30H ;地址寄存器
DS1302_DATA DATA 31H ;数据寄存器
TIME_YEAR DATA 32H ;年寄存器
TIME_MONT DATA 33H ;月寄存器
TIME_DAY DATA 34H ;天寄存器
WEEK_DATA DATA 35H ;星期寄存器
HOUR DATA 36H ;小时寄存器
MINTUE DATA 37H ;分钟寄存器
SECOND DATA 38H ;秒钟寄存器;=========显示数据缓冲地址============
YEAR_HBUF DATA 40H
YEAR_LBUF DATA 41H
MONT_HBUF DATA 42H
MONT_LBUF DATA 43H
DAY_HBUF DATA 44H
DAY_LBUF DATA 45H
WEEK_HBUF DATA 46H
WEEK_LBUF DATA 47H
HOUR_HBUF DATA 48H
HOUR_LBUF DATA 49H
MINTUE_HBUF DATA 4AH
MINTUE_LBUF DATA 4BH
SECOND_HBUF DATA 4CH
SECOND_LBUF DATA 4DH;============程序开始==============
ORG 00H
AJMP START
;==================================
ORG 0050H
START:
MOV SP,#70H
LCALL INITIALZE ;调用初始化液晶屏幕
LCALL INIT_P ;调用初始画面
MOV A, #00000001B ;清液晶屏,写成空白
LCALL WRITE_COM;============主程序================
MAIN:
LCALL RD_DS1302
LCALL DATA_BUF
LCALL DISPLAY
AJMP MAIN;==========读1302子程序=================
RD_DS1302:
MOV DS1302_ADDR,#8DH ;读DS1302中的年
LCALL READ ;调用读DS1302子程序
MOV TIME_YEAR, DS1302_DATA ;把读出的年数据存入年寄存器中 MOV DS1302_ADDR,#8BH ;读DS1302中的星期
LCALL READ
MOV WEEK_DATA, DS1302_DATA ;把读出的星期数据存入星期寄存器中 MOV DS1302_ADDR,#89H ;读DS1302中的月
LCALL READ
MOV TIME_MONT, DS1302_DATA ;把读出的月数据存入月寄存器中 MOV DS1302_ADDR,#87H ;读DS1302中的天
LCALL READ
MOV TIME_DAY, DS1302_DATA ;把读出的天数据存入天寄存器中 MOV DS1302_ADDR,#85H ;读DS1302中的小时
LCALL READ
MOV HOUR, DS1302_DATA ;把读出的天数据存入小时寄存器中 MOV DS1302_ADDR,#83H ;读DS1302中的分钟
LCALL READ
MOV MINTUE, DS1302_DATA ;把读出的天数据存入分钟寄存器中 MOV DS1302_ADDR,#81H ;读DS1302中的秒钟
LCALL READ
MOV SECOND, DS1302_DATA ;把读出的天数据存入秒钟寄存器中
RET
;===========按键子程序=================;=========数据分离后送显示缓存==================
DATA_BUF:
MOV R0,TIME_YEAR ;年数据分离,送显示缓存
LCALL DIVIDE
MOV YEAR_HBUF,R1
MOV YEAR_LBUF,R2 MOV R0,TIME_MONT ;月数据分离,送显示缓存
LCALL DIVIDE
MOV MONT_HBUF,R1
MOV MONT_LBUF,R2 MOV R0,TIME_DAY ;日数据分离,送显示缓存
LCALL DIVIDE
MOV DAY_HBUF,R1
MOV DAY_LBUF,R2 MOV R0,WEEK_DATA ;星期数据分离,送显示缓存
LCALL DIVIDE
MOV WEEK_HBUF,R1
MOV WEEK_LBUF,R2 MOV R0,HOUR ;小时数据分离,送显示缓存
LCALL DIVIDE
MOV HOUR_HBUF,R1
MOV HOUR_LBUF,R2 MOV R0,MINTUE ;分钟数据分离,送显示缓存
LCALL DIVIDE
MOV MINTUE_HBUF,R1
MOV MINTUE_LBUF,R2 MOV R0,SECOND ;秒钟数据分离,送显示缓存
LCALL DIVIDE
MOV SECOND_HBUF,R1
MOV SECOND_LBUF,R2
RET
;=========日历显示子程序==========
DISPLAY:
MOV A,#10000001B ;设定年第1位的显示地址为第1行,第1列
LCALL WRITE_COM
MOV A, #32H ;数字2的ASCII码
LCALL WRITE_DATA MOV A,#10000010B ;设定年第2位的显示地址为第1行,第2列
LCALL WRITE_COM
MOV A, #30H ;数字0的ASCII码
LCALL WRITE_DATA MOV A,#10000011B ;设定年第3位的显示地址为第1行,第3列
LCALL WRITE_COM
MOV A, YEAR_LBUF ;年的底位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#10000100B ;设定年第4位的显示地址为第1行,第4列
LCALL WRITE_COM
MOV A, YEAR_HBUF ;年的高位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#10000101B ;设定斜线的显示地址为第1行,第5列
LCALL WRITE_COM
MOV A,#2FH ;斜线的ASCII码
LCALL WRITE_DATA MOV A,#10000110B ;设定月第1位的显示地址为第1行,第6列
LCALL WRITE_COM
MOV A, MONT_LBUF ;月的低位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#10000111B ;设定月第2位的显示地址为第1行,第7列
LCALL WRITE_COM
MOV A, MONT_HBUF ;月的高位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#10001000B ;设定斜线的显示地址为第1行,第8列
LCALL WRITE_COM
MOV A,#2FH ;斜线的ASCII码
LCALL WRITE_DATA MOV A,#10001001B ;设定天第1位的显示地址为第1行,第9列
LCALL WRITE_COM
MOV A, DAY_LBUF ;天的低位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#10001010B ;设定天第2位的显示地址为第1行,第10列
LCALL WRITE_COM
MOV A, DAY_HBUF ;天的高位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#10001101B ;设定星期第2位的显示地址为第1行,第13列
LCALL WRITE_COM
MOV A, WEEK_DATA ;星期的高位缓存数据
SUBB A,#1
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#11000000B ;设定小时第1位的显示地址为第2行,第0列
LCALL WRITE_COM
MOV A, HOUR_LBUF ;小时的低位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#11000001B ;设定小时第2位的显示地址为第2行,第1列
LCALL WRITE_COM
MOV A, HOUR_HBUF ;小时的高位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#11000010B ;设定冒号的显示地址为第2行,第2列
LCALL WRITE_COM
MOV A, #3AH ;冒号的ASCII码
LCALL WRITE_DATA MOV A,#11000011B ;设定分钟第1位的显示地址为第2行,第3列
LCALL WRITE_COM
MOV A, MINTUE_LBUF ;分钟的低位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#11000100B ;设定分钟第2位的显示地址为第2行,第4列
LCALL WRITE_COM
MOV A, MINTUE_HBUF ;分钟的高位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#11000101B ;设定冒号的显示地址为第2行,第5列
LCALL WRITE_COM
MOV A, #3AH ;冒号的ASCII码
LCALL WRITE_DATA MOV A,#11000110B ;设定秒钟第1位的显示地址为第2行,第6列
LCALL WRITE_COM
MOV A, SECOND_LBUF ;秒钟的低位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA MOV A,#11000111B ;设定秒钟第2位的显示地址为第2行,第7列
LCALL WRITE_COM
MOV A, SECOND_HBUF ;秒钟的高位缓存数据
ADD A,#30H ;加30H修正取ASCII码
LCALL WRITE_DATA
RET;=========初始画面==============
INIT_P:
MOV A,#10000000B ;设定显示地址1000为第1行,1010为第0列
LCALL WRITE_COM ;调用写液晶指令子程序
MOV DPTR,#LINE1
LCALL DISP
MOV A,#11000000B ;设定显示地址1100为第2行,1010为第0列
LCALL WRITE_COM ;调用写液晶指令子程序
MOV DPTR,#LINE2
LCALL DISP
LCALL DELAY2 ;调用延时2秒程序
RET
;=========显示的字符串============
LINE1: DB ' Welcome Use '
LINE2: DB ' wan nian li'
④ 单片机中的DS1302编程时,它的读、写底层函数是干什么用的,DS1302的初始化又是做什么的
#include "ds1302.h"
void delaynus(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++);
}
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{ DATA=dat&0x01; //取出dat的第0位数据写入1302 低位在前,高位在后
delaynus(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
} }
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于高电平状态
RST=0; //禁止数据传递
}
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{ dat>>=1;
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}
void Init_DS1302(void)
{
unsigned char flag;
flag= ReadSet1302(0x81);
if(flag&0x80) //判断时钟芯片是否关闭
{ WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((55/10)<<4|(55%10))); //根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((59/10)<<4|(59%10))); //根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((18/10)<<4|(18%10))); //根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((6/10)<<4|(6%10))); //根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8c,((9/10)<<4|(9%10))); //根据写年寄存器命令字,写入年的初始值
WriteSet1302(0x90,0xa5); //打开充电功能 选择2K电阻充电方式
WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令
}
}
⑤ 时钟芯片ds1302编程
不知道,哈哈哈哈哈哈哈哈哈
⑥ 89C51单片机ds1302C编程问题
IO是寄存器的一个位,即位变量,而你定义的变量是一个8位,即它们的数据类型不一样,位变量只有0和1,是一位bool型,相与和相或产生一个真(TURE)或者假(FASE),也是一个bool型,它们的类型是一样的。
IO = add & 0x01;
add & 0x01意思是看add的第0位是真还是假(1还是0),然后把这个1还是0赋给IO
if(IO) 如果IO的根线是真值
temp = temp | 0x80; 是把最高位强制性写1,第一次写的,经过7次循环移位后,最终回到第0位
注意IO是一个位,是bool值
temp是八个位,是字符,它们类型不同,不要直接同值
如果直接赋值而不出错,是因为编译器强制性把类型转换了。
⑦ DS1302 单片机编程
会不会是弄错读写的地址?write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
⑧ DS1302芯片如何进行12/24 制显示时间转换的编程(C语言)
修改DS1302芯片的(85h、84h)寄存的BIT7进行12/24小时模式切换,BIT7=1是12小时模式,BIT7=0是24小时模式。
⑨ DS1302Z的详细介绍谁知道
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
1.1 引脚功能及结构
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。
下图为DS1302的引脚功能图:
1.2 DS1302的控制字节
DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
1.3 数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
1.4 DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
2 DS1302实时显示时间的软硬件
DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。图3示出DS1302与89C2051的连接图,其中,时钟的显示用LCD。
2.1 DS1302与CPU的连接
实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。只是选择晶振时,不同的晶振,误差也较大。另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU一个口线即可。 LCD还可以换成LED,还可以使用北京卫信杰科技发展有限公司生产的10位多功能8段液晶显示模块LCM101,内含看门狗(WDT)/时钟发生器及两种频率的蜂鸣器驱动电路,并有内置显示RAM,可显示任意字段笔划,具有3-4线串行接口,可与任何单片机、IC接口。功耗低,显示状态时电流为2μA (典型值),省电模式时小于1μA,工作电压为2.4V~3.3V,显示清晰。
2.2 DS1302实时时间流程
图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基本操作进行编程:
3 调试中问题说明
DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位Write Protect(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。
在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。
要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。
典型工作电路
⑩ ds1302和单片机连接后,ds1302需要编程吗
ds1302不用编程,只要单片机采集数据,进行处理就行。给DS1302一个地址一个地址写好年、月、日、时、分、秒、星期,他就自己开始走时了,单片机是实时地把一个地址一个地址的年、月、日、时、分、秒、星期读出来的。读和写的地址是独立,都在DS1302芯片上。