ds1302 ICC程序

发布者:春林初盛最新更新时间:2016-10-31 来源: eefocus关键字:ds1302  ICC程序 手机看文章 扫描二维码
随时随地手机看文章
//串行数码管显示  年-月-日   时-分-秒

//芯片 ATMEGA16L 
//时钟 4MHz 内部
// DS1302 上升沿读写数据
// DS1302 读数据时 IO口上拉无效  
//短延时 2us  wait();    长延时 n ms   delay_nms();
#include 

//164数据线置1
#define hc164_data_SET     PORTD |= 0x01  
//164数据线清0 
#define hc164_data_CLR     PORTD &= ~0x01 
//164时钟线置1 
#define hc164_clk_SET      PORTD |= 0x02  
//164时钟线清0 
#define hc164_clk_CLR      PORTD &= ~0x02 

void hc164_send_byte (unsigned char byte); //164发送数据子程序
void delay_nms(unsigned int);  //延时 n ms
void wait(void);               //短延时 2us   

/*--------------------------DS1302程序开始----------------------------------*/
#define SCLK1302  4  // 时钟
#define DATA1302  5  // 数据
#define RST1302   6  // 复位
//时钟线置1
#define SET_SCLK1302     PORTD |=  (1< //时钟线清0
#define CLR_SCLK1302     PORTD &= ~(1< //数据线置1
#define SET_DATA1302     PORTD |=  (1<TA1302)
//数据线清0
#define CLR_DATA1302     PORTD &= ~(1<TA1302)
//复位线置1
#define SET_RST1302      PORTD |=  (1< //复位线清0
#define CLR_RST1302      PORTD &= ~(1< //DS1302的数据线DATA置为输出
#define DATA1302_OUT   DDRD |= (1<TA1302)
//DS1302的数据线DATA置为输入
#define DATA1302_IN   DDRD &= ~(1<TA1302)

void wr1302(unsigned char dat);   //向1302写1个字节
unsigned char rd1302(void);       //从1302读1个字节
void v_wr1302(unsigned char add,unsigned char dat);  //先写地址,后写1字节数据
unsigned char v_rd1302(unsigned char add);           //先写地址,后读1字节数据
void v_set1302(unsigned char *p2);                   //设置初始时间
void v_get1302(void);                                //读取DS1302当前时间
/* --------------------DS1302程序结束--------------------------------------  */
char ledxs[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
      // 年-月-日 或 时-分-秒  LED显示  
char time[7];  //当前时间,格式: 秒 分 时 日 月 星期 年
char settime[7]={0x00,0x39,0x21,0x28,0x01,0x04,0x10};
               //时间初始值: 秒   分    时   日  月  星期  年
const char tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff,0x40};
                          //共阴极代码 0-F,  全灭,全亮,‘-’
void main(void)
{
   unsigned char i,k; 
   wait(); 
   wait(); 
   delay_nms(200); 
   DDRD = 0xff;  
   v_set1302(settime); // 设置初始时间
   while(1)
   {   
     k=30;
     while(k>0)   //年-月-日  显示3秒   (例 09-06-04 )
     {
       v_get1302();    //取得当前时间     
       ledxs[0]=time[6]>>4;
       ledxs[1]=time[6]&0x0f;  // 年
       ledxs[2]=18;        // -
       ledxs[3]=time[4]>>4;
       ledxs[4]=time[4]&0x0f;  // 月
       ledxs[5]=18;       // -
       ledxs[6]=time[3]>>4;
       ledxs[7]=time[3]&0x0f;  // 日
       for(i=0;i<8;i++) //串行显示
       {
         hc164_send_byte ( tab[ledxs[i]] );
         wait(); 
       }
       k--;
       delay_nms(100);
     }
     k=100;
     while(k>0)    //时-分-秒   显示10秒    (例 16-30-00 )
     {
       v_get1302();    //取得当前时间    
       ledxs[0]=time[2]>>4;
       ledxs[1]=time[2]&0x0f;  // 时
       ledxs[2]=18;        // -
       ledxs[3]=time[1]>>4;
       ledxs[4]=time[1]&0x0f;  // 分
       ledxs[5]=18;       // -
       ledxs[6]=time[0]>>4;
       ledxs[7]=time[0]&0x0f;  // 秒
       for(i=0;i<8;i++)  //串行显示
       {
         hc164_send_byte ( tab[ledxs[i]] );
         wait();
       }
       k--;
       delay_nms(100);
     }
   }

void wait(void)    //短延时 2us  
{  
  asm("nop"); 
  asm("nop");     
}  
void delay_nms(unsigned int k)  //延时 n ms
{
  while(k)   //4M晶振,一个循环1ms
  {
  int i;
  i=700;
  while(i--);
  k=k-1;
  }
}
void hc164_send_byte (unsigned char byte)  //164发送数据子程序
{
  unsigned char i;
   for(i=0;i<8;i++)
   {
      if( byte & ( 1 << i )) 
     hc164_data_SET;
   else 
     hc164_data_CLR;
      hc164_clk_SET;
      hc164_clk_CLR;   
   }  

void wr1302(unsigned char dat0)    //向1302写1个字节
{
  unsigned char i;
  for(i=0;i<8;i++)  //从最低位开始发送
  {
    if(dat0&0x01) 
       SET_DATA1302;
    else
       CLR_DATA1302;     //位传送至数据总线
    wait(); 
    SET_SCLK1302;  //时钟上升沿,发送数据有效
    wait(); 
    CLR_SCLK1302; //清时钟总线
    wait(); 
    dat0 >>= 1;
  }
}
unsigned char rd1302(void) //从1302读1个字节
{
  unsigned char i,dat=0;   
  for(i=0;i<8;i++)  //从最低位开始接收
  {
    dat >>= 1;
    if((PIND&(1<TA1302))==(1<TA1302)) dat |= 0x80;    //接收1位数据   
    SET_SCLK1302;;//时钟置高电平 ,时钟上降沿,接收数据有效
    wait(); 
    CLR_SCLK1302;//清时钟总线
    wait();
  }
  return dat;
}
void v_wr1302(unsigned char add,unsigned char dat)//先写地址,后写1字节数据
{            //      地址或命令             数据
 
  DATA1302_OUT; //DATA1302置为输出  
  CLR_RST1302;//复位引脚低电平,所有数据传送终止
  wait();  
  CLR_SCLK1302;//清时钟总线
  wait();   
  SET_RST1302;//复位引脚高电平,控制逻辑有效
  wait(); 
  wr1302(add);   //写地址或命令
  wait();
  wr1302(dat);   //写1个数据
  wait(); 
  CLR_RST1302;  //复位引脚低电平,所有数据传送终止
  wait();
  DATA1302_IN; // DATA1302置为输入   
}
unsigned char v_rd1302(unsigned char add) //先写地址,后读1字节数据
{                     //         地址
  unsigned char i; 
  DATA1302_OUT; //DATA1302置为输出  
  CLR_RST1302;//复位引脚低电平,所有数据传送终止
  wait();  
  CLR_SCLK1302;//清时钟总线
  wait();
  SET_RST1302;//复位引脚高电平,控制逻辑有效
  wait();   
  wr1302(add);   //写地址或命令
  wait(); 
  PORTD &= ~(1 << DATA1302); //上拉无效
  DATA1302_IN;  // DATA1302置为输入    
  wait();
  i=rd1302();   //读取数据
  wait();
  CLR_RST1302;  //复位引脚低电平,所有数据传送终止
  wait();
  return i;  //返回读取的数据
}

/********************************************************************
* 名称: v_set1302
* 功能: 设置初始时间
* 调用: v_wr1302()
* 输入: *p2: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 
***********************************************************************/
 void v_set1302(unsigned char *p2)
{
  unsigned char i;
  unsigned char addr=0x80;
  v_wr1302(0x8e,0x00); //控制命令,WP=0,允许写
  for(i=0;i<7;i++)
  {
    v_wr1302(addr,*p2); // 秒 分 时 日 月 星期 年 
    p2++;
    addr=addr+2;
  }
  v_wr1302(0x8e,0x80); // 控制命令,WP=1,写保护

/********************************************************************
* 名称: v_get1302
* 功能: 读取DS1302当前时间
* 调用: v_rd1302()
* 输入: time: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 
***********************************************************************/
void v_get1302(void)
{
  unsigned char i;
  unsigned char addr=0x81;
  for(i=0;i<7;i++)
  {
     time[i]=v_rd1302(addr);  //格式为: 秒 分 时 日 月 星期 年
     addr=addr+2;
  }
}

关键字:ds1302  ICC程序 引用地址:ds1302 ICC程序

上一篇:164驱动8位LED显示 ICC程序
下一篇:18b20 ICC程序

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

[C51代码]DS1302驱动
/*********************ds1302.c**********************/ #include Atmel/AT89X51.h #include link.h #include ds1302.h /*******************变量定义********************/ uchar co de WeekTab = { //闰年月星期表 (3 5) + 31,//1月 (6 5) + 29,//2月 (0 5) + 31,//3月 (3 5) + 30,/
[单片机]
时钟芯片DS1302的驱动程序
1 ds1302的程序,不是很简洁,占的程序空间有点长 2 3 程序: 4 5 ////////////////////////////////// 6 //根据自己的接线改管脚定义 7 sbit DS1302_cs=P1^2; 8 sbit DS1302_data=P1^1; 9 sbit DS1302_clk=P1^0; 10 sbit ACC0=ACC^0; 11 sbit ACC7=ACC^7; 12 ////////////////////////////////// 13 #define uchar unsigned char 14 #define uint unsigned int
[单片机]
MSP430 DS1302 驱动
sys.h里面需要一些延时函数。 ds1302.h #ifndef __DS1302_H #define __DS1302_H #include msp430.h #include sys.h struct ds1302time { int year; unsigned char mouth; unsigned char day; unsigned char week; unsigned char hour; unsigned char minute; unsigned char second; }; void DS1302_read_time( struct ds1302time *p );
[单片机]
AVR单片机的DS1302操作程序
file://---by 变成浪子 //mega16 7.3728MHz石英晶体 iCCavr6.31a //相关定义: #define uint unsigned int #define uchar unsigned char #define DS1302_RST 0 //pc0 #define DS1302_SDA 1 //pc1 #define DS1302_SCLK 6 //pc6 //ds1302相关 //DS1302_RST=1 #define Set_DS1302_RST() PORTC|=1 #define Clr_DS1302_RST() PORTC&=~(1 #d
[嵌入式]
单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计
程序说明:这是一个用51单片机驱动DS1302时间模块+DS18B20温度传感器模块+12864液晶显示完整程序设计实例,有四个键盘KEY0 到KEY3,key0是修改时间的 首先是秒到分到时到年到月到日到星期 key1是加1 key2是减一 在修改时间状态再按一下key3的时候就出去并修改时间日期,在平时状态按着key3再按着key2 就会打开lcd 的灯 单单是只按key3那就是把灯关了。 文件一:DS1302驱动.c #include reg52.h //ds1302 sbit sclk=P0^3; sbit io=P0^4; sbit rst=P0^5; sbit acc0=ACC^0; sbit acc1=ACC^
[单片机]
单片机复习笔记005 -- DS1302时钟芯片
1、DS1302时钟芯片的讲解 待完成!!! 2、自己写的DS1302芯片的配置文件 pre code_snippet_id= 277115 snippet_file_name= blog_20140406_1_9167487 name= code class= objc //DS1302_SPIdriver.h /pre p /p pre /pre pre code_snippet_id= 277115 snippet_file_name= blog_20140406_2_3180650 name= code class= objc //DS1302_SPIdriver.h #ifndef __SPI
[单片机]
ATmega8535L跑马灯程序(ICC编译)
ATmega8535L跑马灯程序 //*********************ICCAVR V6.30编译*******************// #include io8535v.h //头文件,AT90S8535单片机的寄存器定义 #define uchar unsigned char //数据类型说明 #define uint unsigned int //数据类型说明 void DelayMs(uint i) //Ms级延时函数,参数i:延时时间 {uint j; for(;i!=0;i--) {for(j=8000;j!=0;j--) ;} } void Horse(uchar
[单片机]
ATmega128L单片机在万年历中的应用设计
0 引言 随着信息技术的发展和生活水平的提高电子万年历正逐步走进人民大众的生活,其因寿命长、误差小而且用汉字直观显示年月日、时分秒、农历、生肖、室温等丰富的内容。 1 设计要求与采用方案 1.1 系统实现功能 (1)基本功能:a.LCD汉字显示年月日、时分秒、星期;b.LCD汉字显示天干地支纪年、农历日期、24节气,12生肖;c.LCD显示室温;d.整点蜂鸣器报时,定时闹铃时间到则蜂鸣器提示;e.通过4个按键,用来设置时间和进行定时设置。 (2)创新设计:a.采用128×64的LCD显示万年历内容;b.采用ISD111O语音模块播放闹铃铃声。 1.2 系统基本方案选择 1.2.1 单片机 系统的单片
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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