用ds1302制作一个精密的电子时钟

发布者:RadiantBreeze最新更新时间:2016-01-21 来源: eefocus关键字:ds1302  精密  电子时钟 手机看文章 扫描二维码
随时随地手机看文章
题目:用ds1302制作一个精密的电子时钟

感想:我看视频的时候讲的是DS12CR887这块芯片,两块毕竟是不一样的,所以,我只是看了他讲怎样看时序,之后的就没再看了。我就拿着自己下载打印的DS1302数据手册,研习,研习,再研习。还查了书上的,网上的,源程序。但是,你别指望着谁会把所有的东西都给你写上去。只能作为参考。后来,我终于写出了一个程序,可是一编译,就漏洞百出。最主要的有两点:for循环和BCD码。不过还好,都得到了很好的解决。

解决方案:

#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar data table[]="2009-01-01 Mon.";
uchar data table1[]="  00:00:00";
uchar code xingqi[]="Mon. Tue. Wed. Thu. Fri. Sat. Sun.";
uchar num;
uchar hour,min,sec,week,day,month,year;
sbit ds1302_sclk=P1^4;
sbit ds1302_io=P1^5;
sbit ds1302_ce=P2^2;
sbit acc0=ACC^0;
sbit acc7=ACC^7;
sbit lcdrs=P1^7;    //端口定义
sbit lcdrw=P1^6;
sbit lcde=P2^4;
sbit le=P3^ 6;
sbit leden=P2^5;
sbit  dkle=P3^7;
void delay(uint a);
void write_byte(uchar dat) //写入一个字节
{
 uchar i;
 ACC=dat;
 for(i=8;i>0;i--)
 {
  ds1302_io=acc0;
  ds1302_sclk=1;
  ds1302_sclk=0;
  ACC=ACC>>1; 
 }
}

uchar read_byte()  //读出一个字节
{
 uchar i;
 for(i=8;i>0;i--)
 {
  ACC=ACC>>1;
  acc7=ds1302_io;
  ds1302_sclk=1;
  ds1302_sclk=0;
 }
 return(ACC); 
}

void  s_write(uchar add,uchar dat)//单字节写入子函数
{
 ds1302_ce=0;
 ds1302_sclk=0;
 ds1302_ce=1;
 write_byte(add);
 write_byte(dat);
 ds1302_sclk=1;
 ds1302_ce=0;
}
uchar s_read(uchar add)   //单字节读出子函数
{
 uchar temp;
 ds1302_ce=0;
 ds1302_sclk=0;
 ds1302_ce=1;
 write_byte(add);
 temp=read_byte();
 ds1302_sclk=1;
 ds1302_ce=0;

 temp=(temp/0x0a)*10+temp%0x0a;

 return(temp); 
}
void set_ds1302(uchar *pClock) //设置ds1302的时间
{
 uchar i;
 uchar add=0x80;
 EA=0;
 s_write(0x8e,0x00);
 for(i=7;i>0;i--)
 {
  s_write(add,*pClock);
  pClock++;
  add+=2;
 }
 s_write(0x8e,0x80);
 EA=1;
}
void read_ds1302(uchar Curtime[])  //读取ds1302的时间
{
 uchar i;
 uchar add=0x81;
 EA=0;
 for(i=7;i>0;i--)
 {
  Curtime[i]=s_read(add);
  add+=2;    
 }
 EA=1;
}
void write_com(uchar com)   //写命令子函数
{
 lcde=0;
 lcdrw=0;
 lcdrs=0;
 delay(1);
 lcde=1;
 delay(1);
 P0=com;
 delay(1);
 lcde=0;
}
void write_data(uchar dat) //写数据子函数
{
 lcde=0;
 lcdrw=0;
 lcdrs=1;
 delay(1);
 lcde=1;
 delay(1);
 P0=dat;
 delay(1);
 lcde=0;
}
void init()
{
 month=1;
 day=1;
 year=9; 
     
 lcde=0;      //LCD1602初始化
 le=0;
 leden=0;
 write_com(0x38);
 delay(100);
 write_com(0x38);
 delay(50);
 write_com(0x38);
 delay(10);
 write_com(0x08);
 write_com(0x01);
 write_com(0x0c);
 write_com(0x80);

 for(num=0;num<15;num++)   //在第一行显示“ 2000-00-00  Mon.”
 {
  write_data(table[num]);
 }
 write_com(0x80+0x40);
 for(num=0;num<10;num++)  //在第二行末尾显示“   00:00:00”
 {
  write_data(table1[num]);
 }
  
}
void write_time(uchar add,uchar dat)  //写入时间子函数
{
 uchar shi,ge;
 shi=dat/16;
 ge=dat%16;
 write_com(0x80+0x40+add);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
void write_riqi(uchar add,uchar dat)  //写入日期子函数
{
 uchar shi,ge;
 shi=dat/16;
 ge=dat%16;
 write_com(0x80+add);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
void write_xingqi(uchar dat)  //写入星期子函数
{
 write_com(0x80+0x0b);
 switch(dat)
 {
  case 1: for(num=0;num<4;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 2: for(num=5;num<9;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 3: for(num=10;num<14;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 4: for(num=15;num<19;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 5: for(num=20;num<24;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 6: for(num=25;num<29;num++)
    {
     write_data(xingqi[num]); 
    };break;
  case 7: for(num=30;num<34;num++)
    {
     write_data(xingqi[num]); 
    };break;

 }
}
void main()
{
 init();
 delay(5);
 s_write(0x8e,0x00); //控制写入WP=0
 s_write(0x90,0xa5);
 s_write(0x80,0x00); //秒
 s_write(0x82,0x20); //分
 s_write(0x84,0x09); //时24时制
 s_write(0x86,0x27); //日
 s_write(0x88,0x08); //月
 s_write(0x8a,0x04); //星期
 s_write(0x8c,0x09); //年 */
 s_write(0x8e,0x80);//控制写入WP=1;

 P0=0xff;

 while(1)
 
 sec=s_read(0x81);
  write_time(8,sec);
  write_com(0x80+0x40+9);
 min=s_read(0x83);
  write_time(5,min);
  write_com(0x80+0x40+6);
 hour=s_read(0x85);
  write_time(2,hour);
  write_com(0x80+0x40+3);
 week=s_read(0x8b);
  write_xingqi(week);
  write_com(0x80+0x0d);
 day=s_read(0x87);
  write_riqi(8,day);
  write_com(0x80+9);
 month=s_read(0x89);
  write_riqi(5,month);
  write_com(0x80+6);
 year=s_read(0x8d);
  write_riqi(2,year);
  write_com(0x80+3);
 }
}
void delay(uint a) {   //延时子函数
 uint i,j;
 for(j=a;j>0;j--)
     for(i=250;i>0;i--) ;
}

关键字:ds1302  精密  电子时钟 引用地址:用ds1302制作一个精密的电子时钟

上一篇:51单片机C语言学习笔记8:单片机C51编程规范
下一篇:51单片机C语言学习笔记3: 存储器结构

推荐阅读最新更新时间:2024-03-16 14:44

精密幅度稳定的低失真正弦波振荡器
很多应用都需要频率和/或幅度稳定的正弦波做为定标或测量的参考。对于LVDT信号调理、ADC测试、谐波失真测试等应用也要求低谐波失真。很多正弦波产生技术不可能简单地实现精密正弦波参考所要求的低谐波失真和幅度稳定度。本文所示的正弦波产生技术能实现小于0.003%失真和0.1幅度稳定度。   图1示出1个简单的振荡器电路,它是由1个Wein桥振荡器核心和1个幅度稳定回路组成的。Linear公司的LT1632高速低失真放大器和正反馈RC网络产生振荡。由LTC1968RMS-DC振荡器、LTC2054缓冲器和LTC1632误差放大器构成的负反馈回路控制正弦波的幅度和幅度稳定度。                               
[电源管理]
<font color='red'>精密</font>幅度稳定的低失真正弦波振荡器
苹果新专利获批:为可折叠iPhone带来更复杂、更精密的铰链设计
根据美国商标和专利局(USPTO)公示的最新清单,苹果再次获得了一项可折叠手机相关的专利。该专利改进了此前的铰链设计,并为可折叠 iPhone 设计了更复杂的铰链。 苹果此前的可折叠 iPhone 专利中,铰链设计通常为 3-4 个小齿轮绕着一个较大的齿轮旋转。不过在这项名为“Hinges for Folding Display Devices”(为可折叠屏幕设计的多种铰链)中,提及了一种包含 4 对小齿轮和 6 个静态部件组成的复杂铰链设计。 相比较此前的大型铰链结构,这种由多个小齿轮组成的铰链系统更加复杂,且对工艺的要求也更高,不过这种铰链可以改善使用体验。
[手机便携]
立讯精密1750万售惠虹电子68.97%股权:后者生产陶瓷介质材料
2月18日晚间,瑞玛工业发布公告称,拟以自有资金1750万元收购昆山立讯射频科技有限公司(以下简称“立讯射频”)持有的无锡惠虹电子有限公司(以下简称“惠虹电子”或“标的公司”)68.97%股权。同日,瑞玛工业与立讯射频在苏州市高新区签订了《股权转让协议》。本次交易完成后,惠虹电子成为瑞玛工业控股子公司,并纳入其合并报表范围。 本次交易前后,惠虹电子的股权结构如下: 据悉,惠虹电子现基于陶瓷介质材料的主要产品包括微波陶瓷材料及器件,陶瓷谐振器,陶瓷天线,陶瓷滤波器件,北斗陶瓷天线,GPS 天线,卫星授时天线,蓝牙天线,微波电子元器件等,持有多项 5G 陶瓷介质波导滤波器、陶瓷天线及生产装备与工艺技术专利,同时还有一批陶瓷介质
[手机便携]
立讯<font color='red'>精密</font>1750万售惠虹电子68.97%股权:后者生产陶瓷介质材料
长盈精密2017年净利5.71亿元,同比下降16.47%
集微网消息,2月23日,长盈精密发布业绩快报,公司2017年1-12月实现营业收入84.32亿元,同比增长37.78%;归属于上市公司股东的净利润5.71亿元,同比下降16.47%,电子制造行业平均净利润增长率为38.16%。   长盈精密表示,2017年公司经营业绩变动的主要原因系大客户产品换型,订单不及预期;新开发的多个国际客户处于研发阶段;对个别客户应收账款全额计提了坏账准备;公司于2016年末收购的广东方振新材料精密组件有限公司(控股51%),其2017年经营业绩未达业绩承诺,经减值测试,对商誉计提了减值准备。 此外,长盈精密在投资者互动平台表示,公司2017年开始给三星手机提供金属外观件产品,现阶段在项目数量和供货数量上
[手机便携]
ds1302-at89c51头文件+c51驱动
修改后的头文件reg51.h内容: /*-------------------------------------------------------------------------- REG51.H Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. ----------------------------------------------------------------
[单片机]
<font color='red'>ds1302</font>-at89c51头文件+c51驱动
用单片机做的电子时钟
团队的第一个小项目就是用单片机做个电子时钟,因为自己的单片机被自己焊接的不够严谨,导致部分地方短路了,所以便换成用仿真软件(protuce)来做电子时钟。经过两天的奋斗,终于把这个电子时钟写好了,虽然很简单,但收获很大,在制作的过程中,遇到了很多问题,但。也收获了很多! 电路图如下: 程序用C代码写的: #include reg52.h #define uint unsigned int #define uchar unsigned char char code dula ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //cha
[单片机]
用单片机做的<font color='red'>电子时钟</font>
具有延迟作用的精密黑暗激活开关
具有延迟作用的精密黑暗激活开关 CBS元件为桥式电路的一条臂,另一臂的电位器R6用于设定断开点,电位器R5用作延迟调整,以防止继电器“颤抖”或不规则的振动,在2N3904断开电路停止工作之前,亮度明显增强
[模拟电子]
具有延迟作用的<font color='red'>精密</font>黑暗激活开关
PIC16F84A读取时钟芯片DS1302的简单示例
//引入文件*********************************************************** #include delay.h #include delay.c #include pic.h #include pic1684.h //熔丝配置*********************************************************** __CONFIG(XT & WDTDIS & PWRTEN & PROTECT); //引脚定义*******************************************************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved