怎么理解ds1302的读数据和写数据的区别(怎么理解ds1302的读数据和写数据的关系)
大家好,给大家分享一下如何理解ds1302读数据和写数据的区别(如何理解ds1302读数据和写数据的关系)。很多人还不知道这一点。下面详细解释一下。现在让我们来看看!
1.如何读写c语言写的DS1302中的数据?
这是dS1302驱动的汇编版本,可以参考一下。
PUBLIC D1302_INIT,SET1302,GET1302,WRITE,READ CODE_DS1302段代码T_CLK位P1.0 T_IO位P1.1 T_RST位P1.2秒EQU 30H分钟EQU 31H小时EQU 32H天EQU 33H月EQU 34H周EQU 35H年EQU 36H RSEG代码_ ds 1302;使用当前段;下面是DS1302初始化子程序d 1302 _ INIT:CLR T _ RST;DS1302复位CLRT _ clk NOP SETB T _ RST mov R1,# 80H MOVR0,# 00H LCALL WRITE MOVR1,# 90H MOVR0,# 0AH LCALL WRITE RET下面的子程序get1302读取日期和时间数据:movr1,# 81h lcall读取movr2,r0movr1,# 83h lcall读取movr1,r0movr1,# 85h lcall读取movr1,r0movr1,#87H LCALL读取MOV日,R0 MOV R1,#89H LCALL读取MOV月,R0 MOV R1,#8BH LCALL读取MOV周,R0 MOV R1,#8DH LCALL读取MOV年,R0 RET下面是时钟和日历写操作的子程序(单片机向DS1302写初始时间)SET1302: MOVR1,# 80h写lcall写mov秒,r0mov R1,# 82h写lcall写mov分钟,r0mov R1,# 84h写lcall写movhour,r0movr1,# 86hWrite lcall write mov day,r0mov R1,# 88h写lcall写movmonth,r0movr1,# 8ah写周lcall写movweek,r0movr1,# 8chWrite lcall写mov年,r0ret下面是写一个字节地址和数据的子程序write:CLRT _ CLKNOPNOP SETB T _ RST NOP mova,R1MOVR2,# 08 hwri _ 01:RRC A NOP CLRT _ CLKNOPNOP MOVR T _ IO,C NOP NOP SETB T_CLK NOP NOP DJNZ R2,WRI _ 02 CLR T _ CLK NOP NOP,R0 MOV R2,# 08 hwri _ 02:RRC A NOP CLR T _ CLK NOP MOV以下子程序从DS1302读取一个字节地址中数据:CLR T _ CLK NOP NOP SETB T _ RST NOP NOP MOV A,r1mov R2,# 08hread _ 01: RRC a nop mov t _ io,C NOP NOP SETB T _ CLK NOP NOP CLR T _ CLK NOP NOP DJNZ R2,READ _ 01 NOP NOP SETB T _ IO CLR A CLR C MOV R2,# 08 hread _ 02:CLR T _ o
2.如何读取DS1302中的时钟数据
一个例子重点介绍ds 1302 _ read()# include # include # define uchar unsigned char # define uint unsigned int # define second 0x 81 # define minute 0x 83 # define hour 0x 85 sbits = p2 0;sbit rw=p2^1;sbit ep=p2^2;sbit ds 1302 _ sclk = p1^0;sbit ds 1302 _ io = p1^1;sbit ds 1302 _ rst = p1^2;sbit m=p3^2;sbit u=p3^3;sbit d=p3^4;无符号字符sel = 0;uchar code dis 1[]= { " abcdef " };uchar code dis 2[]= { " abcdef " };//////////////////////////////////////////void delay(uints ms for(a = 0;a > 1;} }////////////////////////////////////////////////////uchar ds 1302 _ Read(){ uchar TempDat = 0,I;for(I = 0;I > = 1;if(ds 1302 _ IO)TempDat = TempDat | 0x 80;ds 1302 _ SCLK = 1;ds 1302 _ SCLK = 0;}返回TempDat} /////////////ds 1302 _ SCLK = 0;ds 1302 _ RST = 1;ds 1302 _ Write(ucAddr);ds 1302 _ Write(ucDat);ds 1302 _ SCLK = 1;ds 1302 _ RST = 0;}/////////////////////////////////////////////////uchar rds 1302(uchar ucAddr){ uchar ucDat;ds 1302 _ RST = 0;ds 1302 _ SCLK = 0;ds 1302 _ RST = 1;ds 1302 _ Write(ucAddr);ucDat = ds 1302 _ Read();ds 1302 _ SCLK = 1;ds 1302 _ RST = 0;返回ucDat}////////////void init _ 1302(){ WDS 1302(0x8e,0x 00);//打开保护寄存器WDS1302 (0x80,0x 55);//第二个WDS1302 (0x82,0x 59);//除WDS1302 (0x84,0x 23);//当WDS1302 (0x8a,0x 07);//星期WDS1302 (0x86,0x 02);//Day WDS1302 (0x88,0x 08);//月WDS1302 (0x8c,0x 09);//WDS1302 (0x90,0x ab);//体积电流充电WDS1302 (0x8e,0x 80);//关闭保护寄存器}///////////////////////////////////////////////////////////////////////////////////-位lcdRS = 0;rw = 1;EP = 1;_ nop _();_ nop _();_ nop _();_ nop _();结果=(位)(P0 & 0x 80);EP = 0;返回结果;}///////////void LCD _ wcmd(unsigned char cmd){ while(LCD _ BZ());RS = 0;rw = 0;EP = 0;_ nop _();_ nop _();P0 = cmd_ nop _();_ nop _();_ nop _();_ nop _();EP = 1;_ nop _();_ nop _();_ nop _();_ nop _();EP = 0;}///////////void LCD _ pos(unsigned char pos){ LCD _ wcmd(pos | 0x 80);}///////////void LCD _ wdat(unsigned char dat){ while(LCD _ BZ());RS = 1;rw = 0;EP = 0;P0 = dat_ nop _();_ nop _();_ nop _();_ nop _();EP = 1;_ nop _();_ nop _();_ nop _();_ nop _();EP = 0;}/////////////void LCD _ init(){ LCD _ wcmd(0x 38);延迟(1);LCD _ wcmd(0x0c);延迟(1);LCD _ wcmd(0x 06);延迟(1);LCD _ wcmd(0x 01);延迟(1);}/////////////////void set _ time(){ signed char address,item署名char max,miniif(M = = 0){ sel ;延迟(300);if(sel = = 6)sel = 0;if(sel = = 2){ address = 0x 82;max = 59mini = 0;} if(sel = = 1){ address = 0x 84;max = 23mini = 0;} if(sel = = 3){ address = 0x8c;max = 99mini = 9;} if(sel = = 4){ address = 0x 88;max = 12mini = 1;} if(sel = = 5){ address = 0x 86;max = 31mini = 1;} M = 1;} item=((RDS1302(地址 1))/16)*10 (RDS1302(地址 1))% 16;if(U = = 0){ delay(200);u = 1;item ;} if(D = = 0){ delay(200);d = 1;项目-;} if(item > max)item = mini;if(item > 4;lcdshow_u(6,0x 30 x);y = y & 0x0flcdshow_u(7,0x 30 y);lcdshow_u(8,':');x=RDS1302(分钟);y = x;x = x > > 4;lcdshow_u(9,0x 30 x);y = y & 0x0flcdshow_u(0x0a,0x 30 y);lcdshow_u(0x0b,':');x=RDS1302(秒);y = x;x = x > > 4;lcdshow_u(0x0c,0x 30 x);y = y & 0x0flcdshow_u(0x0d,0x 30 y);x = rds 1302(0x8d);y = x;x = x > > 4;lcdshow_d(8,0x 30 x);y = y & 0x0flcdshow_d(9,0x 30 y);lcdshow_d(0x0a,'-');x = rds 1302(0x 89);y = x;x = x > > 4;lcdshow_d(0x0b,0x 30 x);y = y & 0x0flcdshow_d(0 .
3.如何读取DS1302中的时钟数据
一个例子重点介绍ds 1302 _ read()# include # include # define uchar unsigned char # define uint unsigned int # define second 0x 81 # define minute 0x 83 # define hour 0x 85 sbits = p2 0;sbit rw=p2^1;sbit ep=p2^2;sbit ds 1302 _ sclk = p1^0;sbit ds 1302 _ io = p1^1;sbit ds 1302 _ rst = p1^2;sbit m=p3^2;sbit u=p3^3;sbit d=p3^4;无符号字符sel = 0;uchar code dis 1[]= { " abcdef " };uchar code dis 2[]= { " abcdef " };//////////////////////////////////////////void delay(uints ms for(a = 0;a > 1;} }////////////////////////////////////////////////////uchar ds 1302 _ Read(){ uchar TempDat = 0,I;for(I = 0;I > = 1;if(ds 1302 _ IO)TempDat = TempDat | 0x 80;ds 1302 _ SCLK = 1;ds 1302 _ SCLK = 0;}返回TempDat}/////////////ds 1302 _ SCLK = 0;ds 1302 _ RST = 1;ds 1302 _ Write(ucAddr);ds 1302 _ Write(ucDat);ds 1302 _ SCLK = 1;ds 1302 _ RST = 0;}/////////////////////////////////////////////////uchar rds 1302(uchar ucAddr){ uchar ucDat;ds 1302 _ RST = 0;ds 1302 _ SCLK = 0;ds 1302 _ RST = 1;ds 1302 _ Write(ucAddr);ucDat = ds 1302 _ Read();ds 1302 _ SCLK = 1;ds 1302 _ RST = 0;返回ucDat}////////////void init _ 1302(){ WDS 1302(0x8e,0x 00);//打开保护寄存器WDS1302 (0x80,0x 55);//第二个WDS1302 (0x82,0x 59);//除WDS1302 (0x84,0x 23);//当WDS1302 (0x8a,0x 07);//星期WDS1302 (0x86,0x 02);//Day WDS1302 (0x88,0x 08);//月WDS1302 (0x8c,0x 09);//WDS1302 (0x90,0x ab);//体积电流充电WDS1302 (0x8e,0x 80);//关闭保护寄存器}////////////////////////////////////////////////////////////////////////////////////-bit LCD _ bRS = 0;rw = 1;EP = 1;_ nop _();_ nop _();_ nop _();_ nop _();结果=(位)(P0 & 0x 80);EP = 0;返回结果;}///////////void LCD _ wcmd(unsigned char cmd){ while(LCD _ BZ());RS = 0;rw = 0;EP = 0;_ nop _();_ nop _();P0 = cmd_ nop _();_ nop _();_ nop _();_ nop _();EP = 1;_ nop _();_ nop _();_ nop _();_ nop _();EP = 0;}///////////void LCD _ pos(unsigned char pos){ LCD _ wcmd(pos | 0x 80);}///////////void LCD _ wdat(unsigned char dat){ while(LCD _ BZ());RS = 1;rw = 0;EP = 0;P0 = dat_ nop _();_ nop _();_ nop _();_ nop _();EP = 1;_ nop _();_ nop _();_ nop _();_ nop _();EP = 0;}/////////////void LCD _ init(){ LCD _ wcmd(0x 38);延迟(1);LCD _ wcmd(0x0c);延迟(1);LCD _ wcmd(0x 06);延迟(1);LCD _ wcmd(0x 01);延迟(1);}////////////////void set _ time(){ signed char address,item署名char max,miniif(M = = 0){ sel ;延迟(300);if(sel = = 6)sel = 0;if(sel = = 2){ address = 0x 82;max = 59mini = 0;} if(sel = = 1){ address = 0x 84;max = 23mini = 0;} if(sel = = 3){ address = 0x8c;max = 99mini = 9;} if(sel = = 4){ address = 0x 88;max = 12mini = 1;} if(sel = = 5){ address = 0x 86;max = 31mini = 1;} M = 1;} item=((RDS1302(地址 1))/16)*10 (RDS1302(地址 1))% 16;if(U = = 0){ delay(200);u = 1;item ;} if(D = = 0){ delay(200);d = 1;项目-;} if(item > max)item = mini;if(item > 4;lcdshow_u(6,0x 30 x);y = y & 0x0flcdshow_u(7,0x 30 y);lcdshow_u(8,':');x=RDS1302(分钟);y = x;x = x > > 4;lcdshow_u(9,0x 30 x);y = y & 0x0flcdshow_u(0x0a,0x 30 y);lcdshow_u(0x0b,':');x=RDS1302(秒);y = x;x = x > > 4;lcdshow_u(0x0c,0x 30 x);y = y & 0x0flcdshow_u(0x0d,0x 30 y);x = rds 1302(0x8d);y = x;x = x > > 4;lcdshow_d(8,0x 30 x);y = y & 0x0flcdshow_d(9,0x 30 y);lcdshow_d(0x0a,'-');x = rds 1302(0x 89);y = x;x = x > > 4;lcdshow_d(0x0b,0x 30 x);y = y & 0x0flcdshow_d(0x0c,0x 30 y);lcdshow_d(0x0d,'-');x = rds 1302(0x 87);y = x;x = x > > 4;lcdshow_d(0x0e,
4.如何读取时钟芯片DS1302的时间
说明p1.2采用非门压RST脚,所以设置p1.2;订单=0
DS _ READ setbp 1.2;订单=0。
CLRP1.1使SCLK=0。
CLRP1.2Order =1启动芯片。
LCALLDS _ WSUB写一个8位地址。
LCALLDS _ RSUB读出8位数据。
浸水使柔软
DS _ WSUB movr 7,#08H
WL00P RRCA;a是地址字节。
MOVP1.0,C
SETBP1.1在时钟的上升沿
NOP输入地址字节。
CLRP1.1
djnzr 7 WL00P
浸水使柔软
DS _ RSUB setbp 1.0;准备读取数据。
movr 7 # 08H
RL00P:SETBP1.1
nototherwiseprovided(for)除非另有规定
CLRP1.1在第九个正脉冲下
MOVC,P1.0下降沿开始输出数据。
RRCAa是读取的数据。
DJNZR7,RL00P
浸水使柔软
如果使用下面的程序读取DSl302的RAM 1,内容为5AH
阅读:MOVA # 11000101 b;RAM1单元1的读取地址。
LCAllDS _ READ调用子程序。
那么程序执行后A中的数据是2DH,显然读取的数据是不正确的。如果使用RLA指令进行调整,则A中为5AH,结果将是正确的。因此,使用上述程序在RAM1单元中读出的第0位数据实际上是第1位数据,读出的第7位数据实际上是第0位数据。
经过对时序图的仔细研究和多次实验,笔者知道问题的原因是SCLK出现第8个正脉冲时,地址字节的最后一位数据会在上升沿输入,而数据字节的第0位数据会在正脉冲的下降沿输出。但在作者的程序中,是第9个正脉冲的下降沿误认为输出了数据字节的第0位。这位数据实际上是第二个下降沿,因此它实际上是数据字节的第1位。根据作者的实验,只要RST保持在高电平,超过8个下降沿,它们就会从第0位重新输出数据位。因为程序中输出的最后一个数据位是9个下降沿输出的数据位,所以实际上是数据字节的第0个数据位。
因此,如果将单字节读取操作的时序图改变为图2所示的时序图,读者将更容易理解可以避免上述编程错误。
只要把上面的DS_RSUB子程序改成下面的子程序,就可以解决上面的问题了:
DS _ r subl:setbp 1.0;准备读取数据
MOVR7,#08H
RL00P:clrp 1.1;SCLK第八正脉冲
MOVC,P1.0下降沿开始输出数据。
皇家汽车俱乐部
SETBP1.1
DJNZR7,RL00P
浸水使柔软
5.从DS1302读出的数据说明了如何用7段数码管编写程序。
楼上,我是ds1302的,呵呵,给你个参考:# includesBitlock _ clk = p2 7;sbitclock_dat=p2^6;sbitclock_rst=p2^5;sbitwei1=p2^0;sbitwei2=p2^1;sbitwei3=p2^2;sbitwei4=p2^3;sbitwei5=p2^4;sbitwei6=p3^3;sbita0=acc^0;//为编程方便而定义的位变量sbita1=acc^1;sbita2=acc^2;sbita3=acc^3;sbita4=acc^4;sbita5=acc^5;sbita6=acc^6;sbita7=acc^7;unsignedcharTab_Num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x 90 };//0-9数字voiddelay(intnum)//延迟函数{ { while(num-);} void clock _ write(无符号硬)//写一个字节,DS1302计时{ ACC = dd时钟_时钟= 0;clock _ dat = a0时钟_时钟= 1;时钟_时钟= 0;clock _ dat = a1时钟_时钟= 1;时钟_时钟= 0;clock _ dat = a2时钟_时钟= 1;时钟_时钟= 0;clock _ dat = a3时钟_时钟= 1;时钟_时钟= 0;clock _ dat = a4时钟_时钟= 1;时钟_时钟= 0;clock _ dat = a5时钟_时钟= 1;时钟_时钟= 0;clock _ dat = a6时钟_时钟= 1;时钟_时钟= 0;clock _ dat = a7时钟_时钟= 1;} unsigned clock _ Read(void)//读取一个字节,计时{ clock _ clk = 1;时钟_时钟= 0;a0 = clock _ dat时钟_时钟= 1;时钟_时钟= 0;a1 = clock _ dat时钟_时钟= 1;时钟_时钟= 0;a2 = clock _ dat时钟_时钟= 1;时钟_时钟= 0;a3 = clock _ dat时钟_时钟= 1;时钟_时钟= 0;a4 = clock _ dat时钟_时钟= 1;时钟_时钟= 0;a5 = clock _ dat时钟_时钟= 1;时钟_时钟= 0;a6 = clock _ dat时钟_时钟= 1;时钟_时钟= 0;a7 = clock _ dat返回(ACC);} unsigned charead _ clock(unsigned chareg1)//从reg 1寄存器读取数据{ unsigned chard = 0;时钟_时钟= 0;clock _ rst = 0;clock _ rst = 1;clock_write(寄存器1);dd =时钟_读取();clock _ rst = 0;返回(DD);} void Write _ clock(unsigned harreg 2,unsigned hard)//将日期数据写入reg 2 { clock _ clk = 0;clock _ rst = 0;clock _ rst = 1;clock_write(寄存器2);clock_write(日期);clock _ rst = 0;}voidshow(void)//显示和闪烁函数{unsignedchard,e;unsignedintifor(I = 0;I > 4;e = e & 0x0fP0 = Tab _ Num[d];//sec十位数Wei 2 = 1;延迟(250);Wei 2 = 0;P0 = Tab _ Num[e];//sec Wei 1 = 1;延迟(250);Wei 1 = 0;d =读取时钟(0x 83);//阅读分钟数e = d;d = d > > 4;e = e & 0x0fP0 = Tab _ Num[d];//wei4=1十位数;延迟(250);Wei 4 = 0;P0 = Tab _ Num[e];//Wei 3 = 1;延迟(250);Wei 3 = 0;d =读取时钟(0x 85);//读书小时e = d;d = d > > 4;e = e & 0x0fP0 = Tab _ Num[d];//小时十位Wei 6 = 1;延迟(250);Wei 6 = 0;P0 = Tab _ Num[e];//小时Wei 5 = 1;延迟(250);Wei 5 = 0;} for(I = 0;I > 4;e = e & 0x0fP0 = Tab _ Num[d];//十位数Wei 2 = 1;延迟(250);Wei 2 = 0;P0 = Tab _ Num[e];//every one Wei 1 = 1;延迟(250);Wei 1 = 0;d =读取时钟(0x 89);//读取月份e = d;d = d > > 4;e = e & 0x0fP0 = Tab _ Num[d];//月十Wei 4 = 1;延迟(250);Wei 4 = 0;P0 = Tab _ Num[e];//month Wei 3 = 1;延迟(250);Wei 3 = 0;d = read _ clock(0x8d);//年份e = d;d = d > > 4;e = e & 0xfP0 = Tab _ Num[d];//年份十位数Wei 6 = 1;延迟(250);Wei 6 = 0;P0 = Tab _ Num[e];//year Wei 5 = 1;延迟(250);Wei 5 = 0;} for(I = 0;I > 4;e = e & 0xfP0 = Tab _ Num[d];//年份十Wei 2 = 1;延迟(250);Wei 2 = 0;P0 = Tab _ Num[e];//year Wei 1 = 1;延迟(250);Wei 1 = 0;}}/* -时钟的初始化(void//close _ protect delay(250);write_clock(0x8c,0x 08);//year08延迟(250);write_clock(0x88,0x 6);//month 06 delay(250);write_clock(0x86,0x 25);//date 25 delay(250);write_clock(0x84,0x 8);//hour 8 delay(250);write_clock(0x82,0x 28);//minute 28 delay(250);write_clock(0x80,0x 29);//second 40 delay(250);write_clock(0x8a,0x 03);//week _ day 3 delay(250);write_clock(0x90,0xa 0);//supply _ power delay(250);write_clock(0x8e,0x 80);//protect delay(250);} void main(void){ inti;for(I = 0;I 以上解释了如何理解ds1302读数据和写数据的区别(如何理解ds1302读数据和写数据的关系)。这篇文章已经分享到这里了。希望能帮到大家。请联系边肖以更正任何错误。
相关推荐
- 出包王女有多少集02-16
- 考编和考公务员的区别12-01
- 花旗参泡水喝的功效 经常喝有这7大好处12-01
- 属鼠的几月犯月,属鼠的几月出生最不好12-01
- 中职专业课面试科目指定教材02-16
- 车轮胎到底多久更换一次12-01
- 做梦在结婚是什么征兆12-01
- 二极管漏电流多大时会影响使用寿命12-01
- 做梦打架是啥意思02-16
- 苹果13辅助圆球怎么设置12-01