我上大四了,现在在北京某公司实习,硬件工程,
代码拖拖拉拉写了两个月的时间,年前考试之前就开始写了,由于考试和找工作的事,耽搁了 ,年后,实习,发现,软件搞好很有必要,所以我以后一码一字都要自己写,以后才能成长
所以又把它拿起来了。今天终于成功了。
亲测能用。里面内嵌了串口调试程序,也就是说时间不仅通过数码管显示,还会把读取出的时分秒发到PC上去,方便调试!
测试时有一个小插曲:就是DS1302运行起来后,走时不准
,不像网上说的那个走时不准还比较靠谱的,一分钟差几秒,我这个是实际走十多秒,它才走一秒。用开发板带的例程烧进去也是很不准。大概实际走五秒才走一秒
最后我把纽扣电池卸下了,重新安装回去就好了。解决问题!
献丑了,献给后来人
- /*
- DS1302时钟芯片数码管显示
- zhanglei
- 2014年1月28日7:40:14
- */
- #include <reg52.h>
- #include <intrins.h>
- #define SECR 0x81 //对秒寄存器进行读操作
- #define SECW 0x80 //对秒寄存器进行写操作
- #define MINW 0x82 //对分寄存器进行写操作
- #define MINR 0x83 //对分寄存器进行读操作
- #define HOUW 0x84 //对小时寄存器进行写操作
- #define HOUR 0x85 //对小时寄存器进行读操作
- unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
- //数码管显示0~9的段码表
- unsigned char code sheet[1]={0x00};
- unsigned char h,m,s;
- sbit SCLK=P1^0;
- sbit IO=P1^1;
- sbit RST=P1^2;
- sbit ACC7=ACC^7;
- //显示延时函数
- void delayms(unsigned char i)
- {
- unsigned char j;
- for(;i>0;i--)
- {
- for(j=0;j<200;j++);
- }
- }
- //函数功能:通过串口中断测试读取出来的时,分,秒
- //入口参数:读取出来的数据m,h,s
- //返回值:无
- void Com_Init()
- {
- SCON= 0x40; //串口方式1
- PCON=0; //SMOD=0
- REN=1; //允许接收
- TMOD= 0x20; //定时器1定时方式2
- TH1= 0xfd; //11.0592M 9600波特率
- TL1= 0xfd;
- TR1= 1; //启动定时器
- }
- //函数功能:SPI总线字节写函数
- //入口参数:寄存器地址addr,写入寄存器的数据dat
- //返回值:无
- void writedata(unsigned char addr,unsigned char dat)
- {
- unsigned char i;
- unsigned char j;
- RST=0;
- SCLK=0;
- RST=1;
- for(i=0;i<8;i++)
- {
- SCLK=0;
- IO=(bit)(addr&0x01);
- addr>>=1;
- SCLK=1;
- _nop_();
- _nop_();
- }
- for(j=0;j<8;j++)
- {
- SCLK=0;
- IO=(bit)(dat&0x01);
- dat>>=1;
- SCLK=1;
- _nop_();
- _nop_();
- }
- RST=0;
- SCLK=1;
- }
- //SPI总线读取数据函数
- //入口参数:addr 存储数据的地址
- //返回值:返回SPI总线上的数据
- unsigned char readdata(unsigned char addr)
- {
- unsigned char i;
- unsigned char date;
- RST=0;
- SCLK=0;
- IO=0;
- RST=1;
- for(i=0;i<8;i++)
- {
- SCLK=0;
- IO=(bit)(addr&0x01);
- addr>>=1;
- SCLK=1;
- _nop_();
- _nop_();
- }
- for(i=0;i<8;i++)
- {
- ACC7=IO;//数据是从低位开始读取的
- SCLK=1;
- SCLK=0;
- ACC>>=1;
- }
- SCLK=1;
- RST=0;
- date=ACC;
- return date;
- }
- //函数功能:读取小时,分,秒数据并显示
- //入口参数:无
- //返回值:无
- void ledshow()
- {
-
- h=readdata(HOUR);//读取小时
- m=readdata(MINR);//读取分钟
- s=readdata(SECR);//读取秒
- //打印时,分,秒
- SBUF=h;
- while(TI==0);
- TI=0;
- SBUF=m;
- while(TI==0);
- TI=0;
- SBUF=s;
- while(TI==0);
- TI=0;
- SBUF=sheet[0];
- while(TI==0);
- TI=0;
- /***
- *******zhanglei test ledshow
- // h=0x20;
- // m=0x24;
- // s=0x22;
- ******/
- P2=0xfd;
- P0=tab[(h&0x0f)];
- delayms(5);
- P2=0xfe;
- P0=tab[((h>>4)&0x07)];
- delayms(5);
- P2=0xf7;
- P0=tab[(m&0x0f)];
- delayms(5);
- P2=0xfb;
- P0=tab[((m>>4)&0x07)];
- delayms(5);
- P2=0xdf;
- P0=tab[(s&0x0f)];
- delayms(5);
- P2=0xef;
- P0=tab[((s>>4)&0x07)];
- delayms(5);
-
- }
- void main(void)
- {
- Com_Init();
- writedata(0x8e,0x00);//对0x8e寄存器操作,去掉写保护,对最高位WP写0 ·
- //对DS1302写入时间 20:24:22
- writedata(HOUW,0x20);//设置小时,模式24h制,
- writedata(MINW,0x58);//设置分钟
- writedata(SECW,0x22);//设置秒并且使DS1302开始走时
- writedata(0x8e,0x80);//进行写保护
- while(1)
- {
- delayms(3);
- ledshow();
- }
- }
复制代码
搞懂了芯片之后 再来看 是简单很多了
一周热门 更多>