完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "ds1302.h"
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; uchar tiM[7]={0,0,0x12,0x05,0x07,0x06,0x16};//存入时间,存储格式是用BCD码 注意这个地方不能用code void ds13write(uchar addr,uchar dat) //写入1302,先写地址,再写数据 { uchar n; RST=0; //低电平有效是RST位 _nop_(); SCLK=0; _nop_(); RST=1; _nop_(); for(n=0;n<8;n++) { DSIO=addr&0x01; //从首地址开始写起,此处是写地址 并且是先写再移位,和读数据进行区别,读和写都是以单片机为主角呢 addr>>=1;//移位,将最低位变为次低位 SCLK=1; _nop_();//延时一个机器周期 SCLK=0; _nop_();//因为是循环操作 } for(n=0;n<8;n++) { DSIO=dat&0x01; //从首地址开始写起,此处是写数据 addr>>=1;//移位,右移就将数据从低到高排列了 SCLK=1; _nop_();//延时一个机器周期 SCLK=0; _nop_();//因为是循环操作 } RST=0; _nop_();//结束数据的传送 } uchar ds1302read(uchar addr) //读函数的初始化,先移位,再读数据 { uchar n,dat,dat1; RST=0; _nop_(); SCLK=0; _nop_(); RST=1; _nop_(); for(n=0;n<8;n++) //传送地址 { DSIO=addr&0x01; //从低位开始传送 addr>>=1;//右移一位将次低位变为最低位 SCLK=1; //上升沿的时候读取数据 _nop_(); SCLK=0; //下降沿的时候放置数据 _nop_(); } _nop_(); for(n=0;n<8;n++) //传送数据 { dat1=DSIO; //将写进IO口的数据读出 dat=(dat>>1)|(dat1<<7); //通过 8次dat = (dat>>1) | (dat1<<7)可以将dat1中接收的最低位移到dat中的最低位, //以此类推,能够完整的将dat1从最低位开始接收的数放在dat中从高位到低位不变的存储。 实现的是循环移位的功能 SCLK=1; //从最低位开始接收数据 _nop_(); SCLK=0; //下降沿接收数据,注意和写数据对时钟的操作一样,不过是数据传送的时刻不同罢了 _nop_(); } RST=0; //复位稳定时间,这是必须的! _nop_(); SCLK=1; _nop_(); DSIO=0; _nop_(); DSIO=1; _nop_(); return dat; } void ds1302_init() //初始化函数 { uchar n; ds13write(0x8e,0x00);//取消写保护 for(n=0;n<7;n++) { ds13write(WRITE_RTC_ADDR[n],TIM[n]); } ds13write(0x8e,0x80);//开启写保护 } void DsReadTime() { uchar n; for(n=0;n<7;n++) { TIM[n]=ds1302read(READ_RTC_ADDR[n]); } } #ifndef __DS_H_ #define __DS_H_ #include #include typedef unsigned char uchar; typedef unsigned int uint; ***it DSIO=P3^4; ***it RST=P3^5; ***it SCLK=P3^6; void ds13write(uchar addr,uchar dat); uchar ds1302read(uchar addr); void ds1302_init(); void DsReadTime(); extern uchar TIM[7];//数组的全局化 #endif #include "ds1302.h" #include "reg52.h" ***it A=P2^2; ***it D=P2^3; ***it C=P2^4; char num=0; uchar DisplayData[8]; uchar code Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示0——9 //uchar TIM[7]; void delayms(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--);//此处表示延时了1mS } void datapros() { DsReadTime(); DisplayData[0] = Table[TIM[2]/16]; //时 DisplayData[1] = Table[TIM[2]&0x0f]; DisplayData[2] = 0x40; //中间时间的连接: DisplayData[3] = Table[TIM[1]/16]; //分 DisplayData[4] = Table[TIM[1]&0x0f]; DisplayData[5] = 0x40; DisplayData[6] = Table[TIM[0]/16]; //秒 DisplayData[7] = Table[TIM[0]&0x0f]; } void Display() //数码管的显示函数 { uchar i; for(i=0;i<8;i++) { switch(i) { case(0): A=0;D=0;C=0;break; //最后一个数码管 case(1): A=1;D=0;C=0;break; case(2): A=0;D=1;C=0;break; case(3): A=1;D=1;C=0;break; case(4): A=0;D=0;C=1;break; case(5): A=1;D=0;C=1;break; case(6): A=0;D=1;C=1;break; case(7): A=1;D=1;C=1;break; //第一个数码管 } P0=DisplayData[7-i]; delayms(1); P0=0x00;//消隐 } } void main() { ds1302_init();//初始化DS1302 while(1) { datapros();//数据处理函数 Display();//数据显示函数 } } 为什么我下载程序显示的是从00:00:00开始的,不是从我设置的初始值开始的呢 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 03:10 , Processed in 1.300059 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号