ds1302c语言(ds1302 iic)

今天给各位分享ds1302c语言的知识,其中也会对ds1302 iic进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、麻烦老师们大侠们注释一下下面这段51c语言,ds1302时间读取代码。越详细越好,感激不尽啊~2、将DS1302时钟芯片的时期显示在LCD上的代码 要是C语言的 单片机用51的,急急急!!!3、c语言编的DS1302怎么读出和写入数据

麻烦老师们大侠们注释一下下面这段51c语言,ds1302时间读取代码。越详细越好,感激不尽啊~

你是在学习吗? 这段代码很简单啊,看不懂证明你还差得很远。基础很重要,要会二进制数学,要有一定的英语基础,能看懂芯片手册,要会C语言,如果会汇编就更好了。

大概给你说一下吧,上半段是读时分秒的,从寄存器读出来以后,根据寄存器的定义进行了处理,把每个数字都分成了两部分存储,下半段类似,是读年月日的。

和0x70相与并右移,意思是只要第6、5、4位,和0x0f相与,意思是只要第3、2、1、0位。

看不到Time数组的定义和用法,所以这里只能猜,与操作和右移操作是为了将数字在什么地方显示出来,比如数码管之类的。

将DS1302时钟芯片的时期显示在LCD上的代码 要是C语言的 单片机用51的,急急急!!!

#include reg52.hsbit T_CLK = P2^4; /*实时时钟时钟线引脚 */

sbit T_IO = P2^3; /*实时时钟数据线引脚 */

sbit T_RST = P2^2; /*实时时钟复位线引脚 */

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

sbit rs=P2^0;

sbit rw=P2^1;

sbit e=P2^7;

sbit setd=P3^2;

sbit sett=P3^3;

sbit add=P2^5;

sbit enter=P2^6;

sbit speaker=P3^7;

unsigned char code tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

void v_RTInputByte(unsigned char ucDa)

{

unsigned char i;

ACC = ucDa;

for(i=8; i0; i–)

{

T_IO = ACC0; /*相当于汇编中的 RRC */

T_CLK = 1;

T_CLK = 0;

ACC = ACC 1;

}

}

unsigned char uc_RTOutputByte(void)

{

unsigned char i;

for(i=8; i0; i–)

{

ACC = ACC 1; /*相当于汇编中的 RRC */

ACC7 = T_IO;

T_CLK = 1;

T_CLK = 0;

}

return(ACC);

}

void v_W1302(unsigned char ucAddr, unsigned char ucDa)

{

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_RTInputByte(ucAddr); /* 地址,命令 */

v_RTInputByte(ucDa); /* 写1Byte数据*/

T_CLK = 1;

T_RST =0;

}

unsigned char uc_R1302(unsigned char ucAddr)

{

unsigned char ucDa;

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_RTInputByte(ucAddr); /* 地址,命令 */

ucDa = uc_RTOutputByte(); /* 读1Byte数据 */

T_CLK = 1;

T_RST =0;

return(ucDa);

}

void v_BurstW1302T(unsigned char *pSecDa)

{

unsigned char i;

v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */

for (i=8;i0;i–) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/

{

v_RTInputByte(*pSecDa);/* 写1Byte数据*/

pSecDa++;

}

T_CLK = 1;

T_RST =0;

}

void v_BurstR1302T(unsigned char *pSecDa)

{

unsigned char i;

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */

for (i=8; i0; i–)

{

*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */

pSecDa++;

}

T_CLK = 1;

T_RST =0;

}

void v_BurstW1302R(unsigned char *pReDa)

{

unsigned char i;

v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */

for (i=31;i0;i–) /*31Byte 寄存器数据 */

{

v_RTInputByte(*pReDa); /* 写1Byte数据*/

pReDa++;

}

T_CLK = 1;

T_RST =0;

}

void v_BurstR1302R(unsigned char *pReDa)

{

unsigned char i;

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */

for (i=31; i0; i–) /*31Byte 寄存器数据 */

{

*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */

pReDa++;

}

T_CLK = 1;

T_RST =0;

}

void v_setd1302(unsigned char *pSecDa)

{

unsigned char i;

unsigned char ucAddr = 0x80;

v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/

for(i =7;i0;i–)

{

v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */pSecDa++;

ucAddr +=2;

}

v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/

}

void delay()

{ unsigned char x,y ;

for(y=0;y0xff;y++)

for(x=0;x2;x++)

{;}

}/*****************************************/ void wc51r(unsigned char j)//写命令

{

e=0;rs=0;rw=0;

e=1;

P1=j;

e=0;

delay();

}void init()//初始化

{

wc51r(0x01);

wc51r(0x38);

wc51r(0x38);

wc51r(0x0e);

wc51r(0x06);

wc51r(0x0c);

}

void wc51ddr(unsigned char j)//写数据

{

e=0;rs=1;rw=0;

e=1;

P1=j;

e=0;

delay();

}void write1602(unsigned char add,unsigned char da)//写入显示数据

{wc51r(add);wc51ddr(da);}

void main(void)

{

unsigned char ucCurtime[7];

unsigned char i,yearh,yearl,monh,monl,dah,dal,hoh,hol,mih,mil,seh,sel;

unsigned char ucAddr;

unsigned int c;EA=1;init();

write1602(0x85,0x35);

for(c=0;c30000;c++);

write1602(0x86,0x32);

for(c=0;c30000;c++);

write1602(0x87,0x4D);

for(c=0;c30000;c++);

write1602(0x88,0x43);

for(c=0;c30000;c++);

write1602(0x89,0x55);

for(c=0;c30000;c++);

/*write1602(0xC2,0x51);

write1602(0xC3,0x51);

write1602(0xC4,0x3A);

write1602(0xC5,0x35);

write1602(0xC6,0x39);

write1602(0xC7,0x37);

write1602(0xC8,0x33);

write1602(0xC9,0x38);

write1602(0xCA,0x35);

write1602(0xCB,0x33);

write1602(0xCC,0x36);

write1602(0xCD,0x39);

for(c=0;c50000;c++);

init();//LCD初始化 */ TMOD=0X20;

TH1=0XF3;

TL1=0XF3;

SCON=0X50;

PCON=0X00;

IT0=1;

EX0=1;

IT1=1;

EX1=1;

TR1=1;

// EA=1;

ES=1;

while(1)

{ucAddr = 0x81;brfor (i=0;i7;i++)br{brucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */brucAddr += 2;br}

yearh=ucCurtime[6]/16;

yearl=ucCurtime[6]%16;

monh=ucCurtime[4]/16;

monl=ucCurtime[4]%16;

dah=ucCurtime[3]/16;

dal=ucCurtime[3]%16;hoh=ucCurtime[2]/16;

hol=ucCurtime[2]%16;

mih=ucCurtime[1]/16;

mil=ucCurtime[1]%16;

seh=ucCurtime[0]/16;

sel=ucCurtime[0]%16;//EA=1;write1602(0x80,0x44);

write1602(0x81,0x61);

write1602(0x82,0x74);

write1602(0x83,0x65);

write1602(0x84,0x3a);//显示date:write1602(0x85,tab[yearh]);

write1602(0x86,tab[yearl]);

write1602(0x87,0x2d);//显示年

write1602(0x88,tab[monh]);

write1602(0x89,tab[monl]);

write1602(0x8a,0x2d);//显示月

write1602(0x8b,tab[dah]);

write1602(0x8c,tab[dal]);write1602(0xc0,0x54);

write1602(0xc1,0x69);

write1602(0xc2,0x6d);

write1602(0xc3,0x65);

write1602(0xc4,0x3a);//显示time:write1602(0xc5,tab[hoh]);

write1602(0xc6,tab[hol]);

write1602(0xc7,0x3a);//显示小时

write1602(0xc8,tab[mih]);

write1602(0xc9,tab[mil]);

write1602(0xca,0x3a);//显示小时

write1602(0xcb,tab[seh]);

write1602(0xcc,tab[sel]);EA=0;

/*if((ucCurtime[1]==0)(ucCurtime[0]==0|ucCurtime[0]==1|ucCurtime[0]==2))//3秒整点报时

speaker=0;

else speaker=1; **/}

}/******************************************/

serint() interrupt 4

{// EA=0;

static unsigned char k;

unsigned char temp,year,month,date,hour,min,sec,week;

unsigned char stemp[7]={0};

RI=1;

temp=SBUF;

RI=0;

k++;

switch (k)

{ case 1:sec=temp;

break;

case 2:min=temp;

break;

case 3:hour=temp;

break;

case 4:date=temp;

break;

case 5:month=temp;

break;

case 6:week=temp;

break;

case 7:year=temp; k=0;

break;

stemp[0]=(sec/10)*16+sec%10;

stemp[1]=(min/10)*16+min%10;

stemp[2]=(hour/10)*16+hour%10;

stemp[3]=(date/10)*16+date%10;

stemp[4]=(month/10)*16+month%10;

stemp[5]=(week/10)*16+week%10;

stemp[6]=(year/10)*16+year%10;

v_setd1302(stemp);//设定值

}

}

ds1302c语言(ds1302 iic)

c语言编的DS1302怎么读出和写入数据

这是汇编版的dS1302驱动程序,你可以参考一下。

PUBLIC D1302_INIT,SET1302,GET1302,WRITE,READ

CODE_DS1302 SEGMENT CODE

T_CLK BIT P1.0

T_IO BIT P1.1

T_RST BIT P1.2

SECOND EQU 30H

MINUTE EQU 31H

HOUR EQU 32H

DAY EQU 33H

MONTH EQU 34H

WEEK EQU 35H

YEAR EQU 36H

RSEG CODE_DS1302 ;使用当前段

;以下是DS1302初始化子程序

D1302_INIT: CLR T_RST ;DS1302复位

CLR T_CLK

NOP

NOP

SETB T_RST

MOV R1,#80H

MOV R0,#00H

LCALL WRITE

MOV R1,#90H

MOV R0,#0ABH

LCALL WRITE

RET

;以下是 读 日期时间数据子程序

GET1302: MOV R1,#81H

LCALL READ

MOV SECOND,R0

MOV R1,#83H

LCALL READ

MOV MINUTE,R0

MOV R1,#85H

LCALL READ

MOV HOUR,R0

MOV R1,#87H

LCALL READ

MOV DAY,R0

MOV R1,#89H

LCALL READ

MOV MONTH,R0

MOV R1,#8BH

LCALL READ

MOV WEEK,R0

MOV R1,#8DH

LCALL READ

MOV YEAR,R0

RET

;以下是时钟日历写操作子程序(单片机向DS1302写入初始时间)

SET1302: MOV R1,#80H ;写 秒

LCALL WRITE

MOV SECOND,R0

MOV R1,#82H ;写 分

LCALL WRITE

MOV MINUTE,R0

MOV R1,#84H ;写 时

LCALL WRITE

MOV HOUR,R0

MOV R1,#86H ;写 天

LCALL WRITE

MOV DAY,R0

MOV R1,#88H ;写 月

LCALL WRITE

MOV MONTH,R0

MOV R1,#8AH ;写 周

LCALL WRITE

MOV WEEK,R0

MOV R1,#8CH ;写 年

LCALL WRITE

MOV YEAR,R0

RET

;以下是 写 一个字节地址和数据的子程序

WRITE: CLR T_CLK

NOP

NOP

SETB T_RST

NOP

MOV A,R1

MOV R2,#08H

WRI_01: RRC A

NOP

NOP

CLR T_CLK

NOP

NOP

MOV T_IO,C

NOP

NOP

SETB T_CLK

NOP

NOP

DJNZ R2,WRI_01

CLR T_CLK

NOP

NOP

MOV A,R0

MOV R2,#08H

WRI_02: RRC A

NOP

CLR T_CLK

NOP

NOP

MOV T_IO,C

NOP

NOP

SETB T_CLK

NOP

NOP

DJNZ R2,WRI_02

CLR T_CLK

NOP

NOP

CLR T_RST

NOP

NOP

RET

;以下是从DS1302读取一字节地址中数据子程序

READ: CLR T_CLK

NOP

NOP

SETB T_RST

NOP

NOP

MOV A,R1

MOV R2,#08H

READ_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,#08H

READ_02: CLR T_CLK

NOP

NOP

MOV C,T_IO

NOP

NOP

RRC A

NOP

NOP

SETB T_CLK

NOP

NOP

DJNZ R2,READ_02

MOV R0,A

CLR T_RST

RET

END

ds1302c语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于ds1302 iic、ds1302c语言的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月30日 18:10:48
下一篇 2024年3月30日 18:18:00

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    4100
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5800
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4500
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4500
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7500
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6500
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4700
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    5000
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3500
  • c语言用string定义字符串,c语言中用string类型来处理字符串类型

    C++怎样定义定义字符串 1、第一是字符数组来表示字符串。用下面的语句声明:char a[10];C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符\0,而字符数组不需要。 2、在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 字符串常量 即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为 …

    2024年5月23日
    4500

发表回复

登录后才能评论



关注微信