DS1302测试程序

发布者:CrystalRose最新更新时间:2016-08-23 来源: eefocus关键字:DS1302  测试程序 手机看文章 扫描二维码
随时随地手机看文章
#include

#include

#define uint unsigned int
#define uchar unsigned char

/************声明*************/
void ds1302_init();

/*************LCD12864*************/

sbit beer=P2^0;

#define P0 P0

uchar code table1[]={"电子时钟"};
uchar code table2[]={"时间:"}; 
uchar code table3[]={"日期:"};


sbit lcd_rs=P1^0;//定义LCD引脚 
sbit lcd_rw=P1^1;
sbit lcd_en=P1^2;
sbit lcd_psb=P2^4;
sbit lcd_rst=P2^3;

void delay(uint z) //延时 
{
 uint x,y;
 for(x=110;x>0;x--);
  for(y=z;y>0;y--);
}

void lcd_w_com(uchar com)//写命令 
{
 lcd_rs=0;
 lcd_rw=0;
 lcd_en=0;
 P0=com;
 delay(5);
 lcd_en=1;
 delay(5);
 lcd_en=0;
}

void lcd_w_data(uchar date)// 写数据 
{
 lcd_rs=1;
 lcd_rw=0;
 lcd_en=0;
 P0=date;
 delay(5);
 lcd_en=1;
 delay(5);
 lcd_en=0;
}

void lcd_init()//液晶初始化 
{
 lcd_rst=0;
 delay(10);
 lcd_rst=1;
 delay(10);
 lcd_psb=1;

 P3=0xff;
 key5=1;
 key6=1;

 lcd_w_com(0x30);
 lcd_w_com(0x0c);
 lcd_w_com(0x14);
 lcd_w_com(0x01);
}

void lcd_pos(uchar x,uchar y)//选择写入位置 
{
 uchar pos;
 if(x==0)
  {x=0x80;}
 else if(x==1)
  {x=0x90;}
 else if(x==2)
  {x=0x88;}
 else if(x==3)
  {x=0x98;}
 pos=x+y;
 lcd_w_com(pos);
}


void clr_screen()//清屏 
{
 lcd_w_com(0x34);
 delay(5);
 lcd_w_com(0x30);
 delay(5);
 lcd_w_com(0x01);
}

void disp_chinese(uchar code *s)
{
 while(*s>0)
 {
  lcd_w_data(*s);
  s++;
  delay(500);
 }
}


void disp_title()
{
    uchar i;
  lcd_pos(0,2);
  i=0;
  while(table1[i]!='\0')
  {
   lcd_w_data(table1[i]);
   i++;
  }
 
  lcd_pos(1,0);
  i=0;
  while(table2[i]!='\0')
  {
   lcd_w_data(table2[i]);
   i++;
  }
 
  lcd_pos(2,0);
  i=0;
  while(table3[i]!='\0')
  {
   lcd_w_data(table3[i]);
   i++;
  }
 
  lcd_pos(3,0);
  i=0;

}

/***********DS1302************/
sbit ds1302_sclk=P3^4;// 时钟线引脚 
sbit ds1302_io=P3^5;  //数据线引脚 
sbit ds1302_rst=P3^6; //复位线引脚

uchar year,month,day,week,hour,minute,second;
uchar time[20];

uchar ds1302_r_data(uchar addr)//读DS1302数据 
{
 uchar i,j,k;
 ds1302_rst=0;
 ds1302_sclk=0;
 ds1302_rst=1;
 for(i=0x01,j=0;j<8;j++)
 {
  if(addr&i)
  ds1302_io=1;
  else
  ds1302_io=0;
  ds1302_sclk=1;
  i=i<<1;
  ds1302_sclk=0;
 }
 k=0;
 for(i=0;i<8;i++)
 {
  k>>=1;
  ds1302_sclk=0;
  if(ds1302_io)
  k|=0x80;
  ds1302_sclk=1;
 }
 ds1302_rst=0;
 ds1302_sclk=1;
 return(k);
}

void ds1302_w_data(uchar addr,uchar dat)//向DS1302写入数据 
{
 uchar i,j;
 ds1302_rst=0;
 ds1302_sclk=0;
 ds1302_rst=1;
 for(i=0x01,j=0;j<8;j++)
 {
  if(addr&i)
  ds1302_io=1;
  else
  ds1302_io=0;
  ds1302_sclk=1;
  i=i<<1;
  ds1302_sclk=0;
 }
 for(i=0x01,j=0;j<8;j++)
 {
  if(dat&i)
  ds1302_io=1;
  else
  ds1302_io=0;
  ds1302_sclk=1;
  i=i<<1;
  ds1302_sclk=0;
 }
 ds1302_rst=0;
 ds1302_sclk=1;
}

void ds1302_init()//DS1302初始化 (如果有初始化,每次上电都将
      //      重新设置时间,无法让1302断电保持!)
{
 ds1302_w_data(0x8e,0x00);
 ds1302_w_data(0x90,0x00);
 ds1302_w_data(0x80,0x00);//秒
   ds1302_w_data(0x82,0x30);//分
 ds1302_w_data(0x84,0x12);//时
 ds1302_w_data(0x86,0x07);//日
 ds1302_w_data(0x88,0x10);//月
 ds1302_w_data(0x8c,0x08);//年
 ds1302_w_data(0x8a,0x02);//星期
 ds1302_w_data(0x8e,0x80);
}

void dotime()//时间处理 
{
time[0]=ds1302_r_data(0x81);
time[1]=ds1302_r_data(0x83);
time[2]=ds1302_r_data(0x85);
time[3]=ds1302_r_data(0x87);
time[4]=ds1302_r_data(0x89);
time[5]=ds1302_r_data(0x8d);
time[6]=ds1302_r_data(0x8b);
second=((time[0]&0x70)>>4)*10+(time[0]&0x0f);
minute=((time[1]&0x70)>>4)*10+(time[1]&0x0f);
hour=((time[2]&0x70)>>4)*10+(time[2]&0x0f);
day=((time[3]&0x70)>>4)*10+(time[3]&0x0f);
month=((time[4]&0x70)>>4)*10+(time[4]&0x0f);
year=((time[5]&0x70)>>4)*10+(time[5]&0x0f);
week=((time[6]&0x70)>>4)*10+(time[6]&0x0f);
}

void disp_week()//显示星期 
{
  dotime();
  switch(week)
  {
    case 1:
            lcd_pos(3,0);
            disp_chinese("星期一 ");
   break;
  case 2:
            lcd_pos(3,0);
            disp_chinese("星期二");
   break;
  case 3:
            lcd_pos(3,0);
            disp_chinese("星期三");
   break;
  case 4:
            lcd_pos(3,0);
            disp_chinese("星期四");
   break;
  case 5:
            lcd_pos(3,0);
            disp_chinese("星期五");
   break;
  case 6:
            lcd_pos(3,0);
            disp_chinese("星期六");
   break;
  case 7:
            lcd_pos(3,0);
            disp_chinese("星期日");
   break;
  }
}

void disp_data()//显示时间 
{
 dotime();
 lcd_pos(1,3);
 lcd_w_data(0x30+hour/10);
 lcd_w_data(0x30+hour%10);
 lcd_w_data(0x3a);
 lcd_w_data(0x30+minute/10);
 lcd_w_data(0x30+minute%10);
 lcd_w_data(0x3a);
 lcd_w_data(0x30+second/10);
 lcd_w_data(0x30+second%10);
 lcd_pos(2,3);
 lcd_w_data(0x30+year/10);
 lcd_w_data(0x30+year%10);
 lcd_w_data('-');
 lcd_w_data(0x30+month/10);
 lcd_w_data(0x30+month%10);
 lcd_w_data('-');
 lcd_w_data(0x30+day/10);
 lcd_w_data(0x30+day%10);
}

void main()
{
 lcd_init();//液晶初始化
 dotime();
 while(1)
 {
    dotime();//处理时间
  disp_title();//显示表头
  disp_week();//显示星期
  disp_data();//显示时间与日期
  keyscan();  //扫描键盘 
 }
}

关键字:DS1302  测试程序 引用地址:DS1302测试程序

上一篇:LCD12864测试程序
下一篇:DS18B20测试程序

推荐阅读最新更新时间:2024-03-16 15:06

STM32驱动DS1302
// 程序名: STM32驱动DS1302 //头文件 #include stm32f10x.h #include usart.h #define uchar unsigned char #define uint unsigned int ////DS1302引脚定义,可根据实际情况自行修改端口定义 #define RST PAout(5) #define IO PAout(6) #define SCK PAout(7) //DS1302地址定义 #define ds1302_sec_add 0x80 //秒数据地址 #define ds1302_min_add 0x82 //分数据地址 #define ds1302_hr_a
[单片机]
实时时钟电路的原理及应用
1 引言   现在流行的串行时钟电路很多,如 DS1302、DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。 2 DS1302的结构及工作原理   DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可
[模拟电子]
AVR128的程序——12864液晶与ds1302与ds18b20的综合运用
此程序包含子文件 #include iom128v.h #include macros.h #include 12864lcd.h #include ds1302.h #include ds18B20.h void mcu_init(void) { DDRA = 0XFF; PORTA = 0XFF; DDRC = 0XFF; PORTC = 0XFF; DDRF |= 0X0E; PORTF |= 0X0E; PORTF &= 0xF0; DDRB |= 0X10; PORTB
[单片机]
基于s3c2410开发板的UART测试程序
如下程序实现的是开发板从PC端口接受一个字符,并把该字符加1后发送会PC端口。(在本开发板测试成功)对于不同的主频要设置好UBRDIV0的值,在技术文档中有这个值的计算公式。 #define ULCON0 (*(volatile unsigned *)0x50000000) //UART 0 Line control #define UCON0 (*(volatile unsigned *)0x50000004) //UART 0 Control #define UFCON0 (*(volatile unsigned *)0x50000008) //UART 0 FIFO control #define UMCON0
[单片机]
编程点滴:8位AVR定时器溢出中断测试程序
本程序利用timer0控制LED以500ms为间隔亮灭。 文件组成:测试程序 main.c ,定时器设置程序 timer_8bit_test1.c 及头文件 timer_8bit_test1.h 。 main.c /* ***************************************** * File name: main.c * Function: 8位定时器溢出中断方式测试程序 * Description: 定时器控制LED以500ms间隔闪烁 * Author & Date: Joshua Chan, 2012/03/24 * *************************************
[单片机]
关于STM32驱动DS1302的一点思考
之前用51驱动过DS1302,没用多久就输出了正确的时间。当时以为这块芯片其实没啥,很简单。但是现在用STM32做项目,用到同样的芯片,以为这有何难,只要把那个程序拿过来复制黏贴改一下IO设置不就行了?但是事情远没有想想的那么简单。 经过3天的挣扎,现在才知道当时自己是多么天真。 关于DS1302的基本操作可以看这里:http://www.cnblogs.com/qsyll0916/p/7712695.html 好了,废话少说了,进入正题。 首先DS1302读写方式属于3线SPI。CE、SCK、IO。其中IO口属于双向IO口,我们读写都要经过这个IO口。在用51开发的时候,因外他是准双向IO,不需要我
[单片机]
DS1302时钟+1602液晶,proteus电路图+程序
#include REGX51.H #include LCD1602.h #include DS1302.h void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i count;i++) for(j=0;j 120;j++); } main() { SYSTEMTIME CurrentTime; LCD_Initial(); Initial_DS1302(); GotoXY(0,0); Print( Date: ); GotoXY(0,1); Print( Time: )
[单片机]
<font color='red'>DS1302</font>时钟+1602液晶,proteus电路图+程序
51单片机~DS1302时钟,SPI总线原理
(一)说明: (二)SPI总线原理: (三)日历时钟寄存器: 慢充电: BCD码: temp.h #ifndef __TEMP_H_ #define __TEMP_H_ #include reg52.h //---重定义关键词---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif //--定义使用的IO口--// sbit DSPORT=P3^7; //--声明全局函数--// void Delay1ms(uin
[单片机]
51单片机~<font color='red'>DS1302</font>时钟,SPI总线原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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