⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 基于PIC18F4520的实时时钟芯片ds1302的使用
💻 C
字号:
//===============================================================================
//模块名称:  ds1302.h
//简介:  实时时钟芯片ds1302功能函数 
//版本: 1.0
//作者: 王伟民
//日期: 2007.12
//下一步工作:
//===============================================================================
#include <p18F4520.h>
#include"coolbaby.h"
#include"lcd1602.h"
#include"ds1302.h"

/*定义待设置的时间:           秒、 分、  时、 日、 月、 星期、年、控制字*/
const rom char time_tab[]={0x00,0x25,0x12,0x11,0x12,0x06,0x07,0x00};
char table[7];//定义读取时间和日期存放表格(从DS1302中读取的原始数据,格式见<<串行实时时钟/日历芯片DSl302的特性及其应用>>P2-3)
char date[5];//定义格式化日期存放表格
char time[5];//定义格式化时间存放表格

/******************************************************************** 
函 数 名:ds1302_init()DS1302初始化函数
功    能:DS1302初始化
入口参数:无
返 回 值:无
***********************************************************************/
void ds1302_init(void)
  {
   SCLK=0;/*拉低时钟信号*/
   RST=0;/*复位DS1302*/
   RST=1;/*使能DS1302*/
   ds1302_write(0x8e);/*发控制命令*/
   ds1302_write(0);/*允许写DS1302*/
   RST=0;/*复位*/
  }

/******************************************************************** 
函 数 名:ds1302_write()写一个字节数据函数
功    能:往DS1302中写入一个字节
入口参数:time_tx 要写入的一个字节
返 回 值:无
***********************************************************************/
void ds1302_write(unsigned char time_tx)
 {
    int j; //设置循环变量
    TRIS_IO=OUT; //设置数据口方向为输出
    for(j=0;j<8;j++) //连续写8bit
      {
        IO=0; //先设置数据为0
        SCLK=0; //时钟信号拉低
        if(time_tx&0x01!=0) IO=1; //判断待发送的数据位是0或1
        time_tx=time_tx>>1; //待发送的数据右移1位
        SCLK=1; //拉高时钟信号
       }
      SCLK=0; //写完一个字节,拉低时钟信号
  }
  
/******************************************************************** 
函 数 名:ds1302_read()读一个字节函数
功    能:从DS1302读一个字节
入口参数:无
返 回 值:unsigned char :读取的数据
***********************************************************************/
unsigned char ds1302_read(void)
 	{
   	int j;//设置循环变量
   	unsigned char time_rx=0;
   	TRIS_IO=IN;//设置数据口方向为输入
   	for(j=0;j<8;j++)//连续读取8bit
      	{
        	SCLK=0;//拉低时钟信号
        	time_rx=time_rx>>1; //接收寄存器右移1位
        	if (IO==1) time_rx|=0B10000000;//把接收到的数据放到接收寄存器的最高位
       	SCLK=1; //拉高时钟信号
      	}
    	SCLK=0; //拉低时钟信号
    	return(time_rx); //返回读取到的数据
  	}

/******************************************************************** 
函 数 名:set_time()设置时间函数
功    能:设置初始时间
说    明:使用了多字节写方式
入口参数:无
要写的初始时间事先放置在本函数内部定义的数组time_tab[]内,其数据存放格式为:
秒、分、时、日、月、星期、年、控制字(BCD码)
返 回 值:无
***********************************************************************/
void set_time(void)
  	{
   	int i; /*定义循环变量*/
   	RST=1;/*使能DS1302*/
   	ds1302_write(0xbe);/*时钟多字节写命令*/
   	for(i=0;i<8;i++) /*连续写8个字节数据*/
     	{
       	ds1302_write(time_tab[i]);/*调用写一个字节函数*/
     	}
   	RST=0;/*复位*/
   	}

/******************************************************************** 
函 数 名:get_time_info()读取全部时间信息函数
功    能:读取DS1302内部的全部时间信息
入口参数:无
返 回 值:无。读取全部时间信息存放在全局数组table[7]中
***********************************************************************/
void get_time_info(void)
 	{
   	int i; //设置循环变量
   	RST=1; //使能DS1302
   	ds1302_write(0xbf); //发送多字节读取命令
   	for(i=0;i<7;i++) //连续读取7个字节数据
     	{
        	table[i]=ds1302_read();//调用读取1个字节数据的函数
    		}
    	RST=0;//复位DS1302
 	}

/******************************************************************** 
函 数 名:get_time()读取时间函数
功    能:读取DS1302当前时间
入口参数:无
返 回 值:无。读取的时间按“时分秒”格式(BCD码)存放在全局数组time[5]中。 
***********************************************************************/
void get_time(void)
 	{
    	get_time_info(); /*读取全部时间信息函数*/                      
	 /*从原始数据中提取时分秒,格式化后存放在time[5]中*/
 	time[0]=table[0]&0b00001111;//求秒的个位
 	time[1]=table[0]&0b01110000; //求秒的十位
    	time[1]>>=4;//右移4位
	time[2]=table[1]&0b00001111; //求分的个位
	time[3]=table[1]&0b01110000; //求分的十位
   	time[3]>>=4; 
  	time[4]=table[2]&0b00001111; //求时的个位
  	time[5]=table[2]&0b00110000; //求时的十位
	time[5]>>=4; 
 	}

/******************************************************************** 
函 数 名:get_date()读取日期函数
功    能:读取DS1302当前日期
入口参数:无
返 回 值:无。读取的日期按“年月日”格式(BCD码)存放在全局数组date[5]中。 
***********************************************************************/
void get_date(void)
 	{
    	get_time_info(); /*读取全部时间信息函数*/ 
 	/*从原始数据中提取年月日,格式化后存放在data[5]中*/
 	date[0]=table[3]&0b00001111;//求日的个位
 	date[1]=table[3]&0b00110000; //求日的十位
    	date[1]>>=4;//右移4位
	date[2]=table[4]&0b00001111; //求月的个位
	date[3]=table[4]&0b00010000; //求月的十位
   	date[3]>>=4; 
  	date[4]=table[6]&0b00001111; //求年的个位
  	date[5]=table[6]&0b11110000; //求年的十位
	date[5]>>=4; 
 	}

/******************************************************************** 
函 数 名:display_time()显示时间函数
功    能:在LCD屏上显示当前时间,显示格式:**:**:**
入口参数:无
返 回 值:无
***********************************************************************/
void display_time(void)
   	{
    	int i;
    	get_time();//调用取时间函数
    	i=time[5]; //得时的十位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	i=time[4]; //得时的个位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	LCD_wrchar(':');/*显示":"*/
    	i=time[3]; //得分的十位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	i=time[2]; //得分的个位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	LCD_wrchar(':');/*显示":"*/
    	i=time[1]; //得秒的十位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	i=time[0]; //得秒的个位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
   	}

/******************************************************************** 
函 数 名:display_date()显示日期函数
功    能:在LCD屏上显示当前日期,显示格式:**年**月**日
入口参数:无
返 回 值:无
***********************************************************************/
void display_date(void)
   	{
   	int i;
	get_date();/*调用取日期函数*/
    	i=date[5]; //得年的十位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	i=date[4]; //得年的个位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	LCD_wrchar(USER_CHAR1);/*在LCD屏上显示单个预定义字符:年*/
    	i=date[3]; //得月的十位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	i=date[2]; //得月的个位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	LCD_wrchar(USER_CHAR2);/*在LCD屏上显示单个预定义字符:月*/
    	i=date[1]; //得日的十位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
    	i=date[0]; //得日的个位
    	i|=0b00110000;//BCD转换成ASCII码
    	LCD_wrchar(i);//显示
	LCD_wrchar(USER_CHAR3);/*在LCD屏上显示单个预定义字符:日*/
   	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -