• 大小: 4KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签: 12864  1302  实时时钟  

资源简介

此程序为12864液晶显示ds1302实时时钟,程序经本人修改后亲测正确。硬件连接说明很清楚,适合新手学习。

资源截图

代码片段和文件信息

#define TRUE 1
#define FALSE 0
#include “12864.h“ //包含12864液晶函数文件

/*
cpu晶振      8Mhz
ds1302晶振   32.768khz
*/

/******************RTC常量******************/
#define RTC_CLK    PB0
#define RTC_DATA   PB1
#define RTC_CS     PB2
//命令
#define RD        0x01
#define WR        0x00
#define C_SEC 0x80 //秒
#define C_MIN 0x82 //分
#define C_HR 0x84 //时
#define C_DAY 0x86 //日
#define C_MTH 0x88 //月
#define C_WK 0x8A //星期 DATE
#define C_YR 0x8C //年
#define C_WP 0x8E //控制(写保护)
#define C_CHARGE 0x90 //涓流充电
#define C_BURST 0xBE //时钟多字节
//配置
#define CLK_HALT 0x80 //停止时钟控制位    SECOND bit7
#define CLK_START 0x00 //启动时钟
#define M12_24 0x80 //12/24小时值选择位 HOUR bit7 
#define PROTECT 0x80 //写保护控制位      CONTROL bit7 
#define UPROTECT 0x00 //写保护控制位      CONTROL bit7 
//涓流充电控制常量
#define TC_D1R2 0xA5 //high 1 Diode +2K Resistors  
#define TC_D2R8 0xAB //low  2 Diodes+8K Resistors  
#define TC_DISABLED 0x00 //Disabled(TCS<>1010 or DS=00 or RS=00)
//RAM 命令
#define C_RAMbase 0xC0 //RAM0~RAM30<<1 地址需左移一位 

void Delayus(uint US)   
{
 uint i;
 US=US*5/4;     //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
 for( i=0;i}
void Delayms(uint MS)   
{
 uint ij;
 for( i=0;i for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}



/*******************************************
函数名称: DS1302_init
功    能: 初始化DS1302的数据接口
参    数: 无
返回值  : 无
/********************************************/
void DS1302_portinit(void)   
{
 DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
}
/*******************************************
函数名称: DS1302_writeB
功    能: 向DS1302写入一个字节数据(没有RST操作)
参    数: byte--要写入的数据
返回值  : 无
/********************************************/
void DS1302_writeB(uchar byte)
{
 uchar i;
 for(i=0;i<8;i++)     //8位数据计数
 {
  PORTB&=~BIT(RTC_CLK);   //拉低时钟端
  if(byte&0x01)   //当前位是否是1
  {
   PORTB|=BIT(RTC_DATA);   //当前位是1,拉高数据端
  }
  else   
  {
   PORTB&=~BIT(RTC_DATA);   //当前位是0,拉低数据端
  }  
  Delayus(10);   //调整时钟和脉冲宽度
  PORTB|=BIT(RTC_CLK);   //时钟上升沿(DS1302采样数据)
  byte>>=1;   //数据右移1位,为送出新数据位做准备
 }
}
/*******************************************
函数名称: DS1302_readB
功    能: 从DS1302读出一个字节数据(没有RST操作)
参    数: 无
返回值  : byte--读出的数据
/********************************************/
uchar DS1302_readB(void)
{
 uchar ibyte=0;
 DDRB&=~BIT(RTC_DATA);  //将数据端口设置为输入   
 PORTB&=~BIT(RTC_DATA);  //无上拉电阻
 for(i=0;i<8;i++)  //8位数据计数
 {
  byte>>=1;    //保存读入的数据位
  PORTB|=BIT(RTC_CLK);  //时钟上升沿
  Delayus(10);  //延时,调整时钟脉冲宽度
  PORTB&=~BIT(RTC_CLK);  //时钟下降沿,DS1302输出数据位
  Delayus(10);  //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
  if(PINB&BIT(RTC_DATA))  //当前位是否是高电平
  {
   byte|=BIT(PB7);  //是高电平就将返回数据的当前位置1
  }
  else
  {
   byte&=~BIT(PB7);  //是低电平就将返回数据的当前位置0
  }
 }
 DDRB|=BIT(RTC_DATA);  //最后将数据端口设置为输出
 return byte;  //返回读出的数据
}
/*******************************************
函数名称: DS1

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2133  2011-04-13 11:11  12864.h

     文件      10258  2011-04-13 11:16  1302.c

----------- ---------  ---------- -----  ----

                12391                    2


评论

共有 条评论