ds1302 CVAVR程序

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

//芯片 ATMEGA16L 
//时钟 4MHz 内部
// DS1302 上升沿读写数据
// DS1302 读数据时 IO口上拉无效
//短延时 2us  wait();    长延时 n ms   delay_nms();
#include   
//#include  
#define hc164_data PORTD.0
#define hc164_clk  PORTD.1  
void hc164_send_byte (unsigned char byte);   // 数码管显示   
//相关定义:
#define uint unsigned int
#define uchar unsigned char
#define DS1302_SCLK 4 //PD4  
#define DS1302_SDA  5 //PD5
#define DS1302_RST  6 //PD6
//ds1302相关
//DS1302_RST=1
#define Set_DS1302_RST() PORTD|=1< //DS1302_RST=0
#define Clr_DS1302_RST() PORTD&=~(1< //DS1302_SDA=1
#define Set_DS1302_SDA() PORTD|=1< //DS1302_SDA=0
#define Clr_DS1302_SDA() PORTD&=~(1< //DS1302_SCLK=1
#define Set_DS1302_SCLK() PORTD|=1< //DS1302_SCLK=0
#define Clr_DS1302_SCLK() PORTD&=~(1< //DS1302的SDA置为输出脚
#define Set_DS1302_DDRSDA() DDRD|=1< //DS1302的SDA置为输入脚
#define Clr_DS1302_DDRSDA() DDRD&=~(1< #define DS1302_SEC_Reg 0x80
#define DS1302_MIN_Reg 0x82
#define DS1302_HR_Reg 0x84
#define DS1302_DATE_Reg 0x86
#define DS1302_MONTH_Reg 0x88
#define DS1302_DAY_Reg 0x8a
#define DS1302_YEAR_Reg 0x8c
#define DS1302_CONTROL_Reg 0x8e
#define DS1302_CHARGER_Reg 0x90
#define DS1302_CLKBURST_Reg 0xbe
//全局变量
//为了方便,我把个位和十位分开了
uchar year1=0x00;
uchar year0=0x00;
uchar month1=0x00;
uchar month0=0x00;
uchar date0=0x00;
uchar date1=0x00;
uchar day=0x00;
uchar hour1=0x00;
uchar hour0=0x00;
uchar minute1=0x00;
uchar minute0=0x00;
uchar second1=0x00;
uchar second0=0x00;      
char ledxs[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};;  // 年-月-日   LED显示  
flash char tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff,0x40};

//自程序开始   
void wait(void)
{
  #asm
  nop
  nop  
  nop
  nop
  nop
  nop
  nop
  nop
  #endasm
}
void DS1302_Write(uchar reg,uchar data)
{
  uchar i;
  Set_DS1302_DDRSDA();
  Clr_DS1302_RST();
  wait();
  Clr_DS1302_SCLK();
  wait();
  Set_DS1302_RST();
  wait();
  for(i=8;i>0;i--)
  {
    if(reg&0x01) Set_DS1302_SDA();
    else Clr_DS1302_SDA();
    wait();
    Set_DS1302_SCLK();
    wait();
    Clr_DS1302_SCLK();
    wait();
    reg>>=1;
  }
  for(i=8;i>0;i--)
  {
    if(data&0x01) Set_DS1302_SDA();
    else Clr_DS1302_SDA();
    wait();
    Set_DS1302_SCLK();
    wait();
    Clr_DS1302_SCLK();
    wait();
    data>>=1;
  }
  Clr_DS1302_RST();
  wait();
  Clr_DS1302_DDRSDA();
}
uchar DS1302_Read(uchar reg)
{
  uchar data=0,i;
  reg+=1;//读标志
  Set_DS1302_DDRSDA();
  Clr_DS1302_RST();
  wait();
  Clr_DS1302_SCLK();
  wait();
  Set_DS1302_RST();
  wait();
  for(i=8;i>0;i--)
  { 
    if(reg&0x01) Set_DS1302_SDA();
    else Clr_DS1302_SDA();
    wait();
    Set_DS1302_SCLK();
    wait();
    Clr_DS1302_SCLK();
    wait();
    reg>>=1;
  }   
  PORTD &= ~(1 << DS1302_SDA);     
  Clr_DS1302_DDRSDA();
  for(i=8;i>0;i--)
  {
    data>>=1;
    if((PIND&(1<ta|=0x80;
    Set_DS1302_SCLK();
    wait();
    Clr_DS1302_SCLK();
    wait();
  }
  Clr_DS1302_RST();
  wait();
  return(data);
}
/*uchar Check_DS1302(void)
{
    DS1302_Write(DS1302_CONTROL_Reg,0x80);
    if(DS1302_Read(DS1302_CONTROL_Reg)==0x80) return 1;
    return 0;
}*/
void DS1302_Init(void)
{
  DS1302_Write(DS1302_CONTROL_Reg,0x00);//关闭写保护
  //DS1302_Write(DS1302_SEC_Reg,0x80);//暂停
  //DS1302_Write(DS1302_CHARGER_Reg,0xa9);//涓流充电
  DS1302_Write(DS1302_YEAR_Reg,0x10); //年
  DS1302_Write(DS1302_MONTH_Reg,0x01); //月
  DS1302_Write(DS1302_DATE_Reg,0x28); //日
  DS1302_Write(DS1302_DAY_Reg,0x04); //周
  DS1302_Write(DS1302_HR_Reg,0x20); //时
  DS1302_Write(DS1302_MIN_Reg,0x58); //分
  DS1302_Write(DS1302_SEC_Reg,0x00); //秒

  DS1302_Write(DS1302_CONTROL_Reg,0x80);//打开写保护
}
void ReadTime(void)
{
  uchar data;
  data=DS1302_Read(DS1302_YEAR_Reg);//年
  year0=data&0x0f;
  year1=data>>4;
  data=DS1302_Read(DS1302_MONTH_Reg);//月
  month0=data&0x0f;
  month1=data>>4;
  data=DS1302_Read(DS1302_DATE_Reg);//日
  date0=data&0x0f;
  date1=data>>4;
  data=DS1302_Read(DS1302_DAY_Reg);//周
  day=data&0x0f;
  data=DS1302_Read(DS1302_HR_Reg);//时
  hour0=data&0x0f;
  hour1=data>>4;
  data=DS1302_Read(DS1302_MIN_Reg);//分
  minute0=data&0x0f;
  minute1=data>>4;
  data=DS1302_Read(DS1302_SEC_Reg);//秒
  second0=data&0x0f;
  second1=data>>4; 
}

void delay_nms(unsigned int k)  //延时 n ms
{
  while(k)   //4M晶振,一个循环1ms
  {
  int i;
  i=280;
  while(i--);
  k=k-1;
  }
}
void main(void)
{
   unsigned char i,k; 
   delay_nms(200); 
   DDRD = 0xff;  
   DS1302_Init(); // 设置初始时间
   while(1)
   {   
     k=3;
     while(k>0)   //年-月-日  显示3秒   (例 09-06-04 )
     {
       ReadTime();    //取得当前时间     
       ledxs[0]=year1;
       ledxs[1]=year0;  // 年
       ledxs[2]=18;        // -
       ledxs[3]=month1;
       ledxs[4]=month0;  // 月
       ledxs[5]=18;       // -
       ledxs[6]=date1;
       ledxs[7]=date0;  // 日
       for(i=0;i<8;i++) //串行显示
       {
         hc164_send_byte ( tab[ledxs[i]] );
         wait(); 
       }
       k--;
       delay_nms(1000);
     } 
    k=100;
     while(k>0)    //时-分-秒   显示10秒    (例 16-30-00 )
     {
       ReadTime();   //取得当前时间    
       ledxs[0]=hour1;
       ledxs[1]=hour0;  // 时
       ledxs[2]=18;        // -
       ledxs[3]=minute1;
       ledxs[4]=minute0;  // 分
       ledxs[5]=18;       // -
       ledxs[6]=second1;
       ledxs[7]=second0;  // 秒
       for(i=0;i<8;i++)  //串行显示
       {
         hc164_send_byte ( tab[ledxs[i]] );
         //delay_nms(1); 
         wait();
       }
       k--;
      delay_nms(100);
     }
   }

void hc164_send_byte (unsigned char byte)
{
  unsigned char i;
   for(i=0;i<8;i++)
   {
      hc164_data = byte & ( 1 << i );       
      hc164_clk = 1;       
      hc164_clk = 0;   
   }  

关键字:ds1302  AVR程序 引用地址:ds1302 CVAVR程序

上一篇:tlc549 CVAVR程序
下一篇:atmega16片上A/D程序-CVAVR程序

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

基于AVR单片机的CD纹机的自动控制程序
首先要感谢 反省(网名),给我提供的思路。否则我那个停止按钮估计弄到今年年底都搞不定了。 再要感谢 天狼星 提供的视屏教程,向你的无私奉献致敬。以下是源代码,欢迎各位高手拍砖。另外还有一个修改版本功能更完善大家可以参考一下 :http://www.51hei.com/mcu/2721.html //环境:编译为ICC AVR6.25A //硬件:ATMEGA16芯片 //日期:2013年10月20日 //功能:CD纹机控制器 //作者:李亚新 //晶振:内部RC震荡,主频1M //备注:适合用于 CD纹机的自动控制 #include iom16v.h #include macros.h #de
[单片机]
基于<font color='red'>AVR</font>单片机的CD纹机的自动控制<font color='red'>程序</font>
AVR单片机延时程序
AVR单片机延时程序: 1.毫秒级的延时 延时1ms; void delay_1ms(void) { unsigned int i; for(i=1;i (unsigned int)(xtal*143-2);i++) ; } 在上式中,xtal为晶振频率,单位为MHz. AVR 延时程序 当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M时,延时函数软件仿真结果为999.5μs. AVR 延时程序 如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。 下面的函数可以获得1
[单片机]
avr单片机DS18B20温度读取程序-母亲节的礼物
/*DS18B20读取温度字节程序 本函数花了我不少时间,主要问题是在51可以的情况下他却不行,知道今天才解决,原来是部分延时函数数值不对,造成的 所以虽然做过也未见得好用,切不可粗心大意,AVR内部8M晶振,20110508 天津第四项目部宿舍 */ #include iom16v.h #define uchar unsigned char #define uint unsigned int #define get_bit(a,b) a&(1 b) #define set_bit(a,b) a|=(1 b) #define clr_bit(a,b) a&=~(1 b) void delay600us() { uin
[单片机]
ATmega128(DS1302
//ATmega128的DS1302实时时钟芯片驱动程序 //编译环境 AVR Studio 4.17/AVR GCC //系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms //作者:张奇 zhangqi123zq@126.com //日期:2010.02.20 //*********************************************************************** // 包含文件 //*********************************************************************** #include str
[单片机]
AVR单片机驱动CH451实例程序_C语言
1) CH451简介 CH451可用于LED数码管显示驱动、键盘扫描控制、μP监控电路等领域。芯片封装包括双列直插DIP28、SOP28以及DIP24S封装。其内置RC振荡电路,可以直接动态驱动8位数码管或者64位LED,具有BCD译码或不译码功能,可实现数据的左移、右移、左循环、右循环、各数字独立闪烁等控制功能。CH451内置大电流驱动级,段电流不小于30 m A,字电流不小于160mA,并有16级亮度控制功能。该器件内置64键键盘控制器,可实现8×8矩阵键盘扫描,并内置去抖动电路,可提供按键中断与按键释放标志位等功能。CH451可选择简洁的1线串行接口或高速4线串行接口,且内置上电复位,可提供高电平有效复位和低电平有效复位
[单片机]
<font color='red'>AVR</font>单片机驱动CH451实例<font color='red'>程序</font>_C语言
AVR单片机I2C总线程序
#include iom16v.h /*I2C总线主机模式错误处理*/ void error(unsigned char type) { switch (type & 0xF8) { case 0x20: /*址址写失败*/ /*stop 停止*/ TWCR = (1 TWINT) | (1 TWEN) | (1 TWSTO); break; case 0x30: /*数据写失败*/ /*stop 停止*/
[单片机]
AVR单片机的DS18B20 C语言程序
#include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int // #define BIT_SET(a,b) a|=(1 b) //置位位a.b #define BIT_CLR(a,b) a&=~(1 b) //清零位a.b
[单片机]
AVR DS1302程序
//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 DS1302_RST //DS1302_RST=0 #define Clr_DS1302_RST() PORTC&=~(1 DS1302_RS
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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