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

📄 rtc.c

📁 这是单片机实验板比较齐全的程序
💻 C
字号:
/*******************************************************************************
*  标题:  student2000单片机开发系统演示程序                                    *
*  文件:  fun.C                                                                *
*  日期:  2007-5-4                                                             *
*  版本:  1.0                                                                  *

  ********************************************************************************
  *  描述:                                                                       *
  *        大部分通用函数集合                                         		   *     
*        RS232,RS485,延时函数,协议框架演示等                                 */
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include <absacc.h>
#include <stdio.h>
#include "SYBXT1.h"
sbit     ds_scl=P1^1; 
sbit     ds_rst=P1^3;
sbit     ds_sda= P1^0;
sbit    ACC7=ACC^7;
sbit    ACC0=ACC^0;
DateTime dt;
xdata DateTime dtset;
xdata uchar str[50];
//xdata SetJdqTime dtjdq;
bit clock_12h=0;//24小时
bit clock_am_pm=0;//上午
bit clockset_12h=0;//24小时
bit clockset_am_pm=0;//上午
static    void    wt_byte(uchar    xx)
{
    uchar    i=8;
    ACC=xx;
    do
    {
        ds_scl=0;
        ds_sda=ACC0;
        ACC>>=1;
		_nop_();
        ds_scl=1;
    }
    while (--i);
}

static    uchar    rd_byte(void)
{
    uchar    i=8;
    do
    {
        ds_scl=1;
        ACC>>=1;
        ds_scl=0;
        _nop_();
        ACC7=ds_sda;
    }
    while (--i);
    return (ACC);
}
void    ds_read(uchar    command,uchar    idata    *time)
{
	uchar command1;
	command1=command;
	command=command|0x01;
	
	ds_scl=0;
    ds_rst=1;
    wt_byte(command);
    *time=rd_byte();
    ds_rst=0;
	if(command1== SECOND_ADDR)
	{
		*time &= 0x7f;
	}
	else if(command1 == HOUR_ADDR)
	{
		if((*time & 0x80) != 0)//
		{//12小时
			clock_12h = 1;
			//确定是上午还是下午?
			if((*time&0x20) != 0)
				clock_am_pm = 1;//下午
			
			else
				clock_am_pm = 0;//上午
			
			*time  &= 0x1f;//范围0——12的bcd数
		}
		else
		{//24小时
			clock_12h = 1;
			*time  &= 0x3f;
		}
	}
	*time =bcd2_hex(*time);
}
//用bcd输入如:0x00~0x59:表示00~59的十进制数
void    ds_write(uchar    command,uchar    idata    *time)
{
	uchar i;
	clock_12h=0;//24小时
	clock_am_pm=0;//上午
	
	i = *time / 10;
	i <<= 4;
	i |= (*time % 10);
	*time = i;
	
	if(command == HOUR_ADDR)
	{
		if(clock_12h)
		{
			if(clock_am_pm)
				*time |= 0xa0;
			else
			{
				*time &= 0x1f;
				*time |= 0x80;
			}
		}
		else
			*time &= 0x7f;
	}
	command &= 0xfe;//set write state
    ds_scl=0;
    ds_rst=1;
    wt_byte(command);
    wt_byte(*time);
    ds_rst=0;
}

uchar bcd2_hex(uchar val)
{
	uchar i;
	i = val&0x0f;
	val >>= 4;
	val &= 0x0f;
	val *= 10;
	i += val;
	return i;
}
/*
void    ds_checktime(void)
{
//设置年月日是分秒

  
	uchar i;
	uchar n;
	
	  i=0;
	  dt.second=0;
	  dt.year=07;
	  dt.month=02;
	  dt.day=10;
	  dt.week=3;
	  dt.hour=13;
	  dt.minute=20;
	  dt.second=0;
	  ds_write(CONTROL_ADDR, (uchar *)&i);
	  
		i=dt.second&0x7f;
		ds_write(SECOND_ADDR, (uchar *)&i);
		//i=0;
		ds_write(MINUTE_ADDR,(uchar *) &dt.minute);
		//i=12;
		ds_write(HOUR_ADDR, (uchar *)&dt.hour);
		//i=31;
		ds_write(DAY_ADDR, (uchar *)&dt.day);
		//i=5;
		ds_write(MONTH_ADDR,(uchar *)&dt.month);
		//i=06;
		ds_write(YEAR_ADDR,(uchar *)&dt.year);
		
		  
			i=0;
			ds_write(0x8e,(uchar *)&i);	
			n=0;
			n =sprintf(str, "%02bd-",dt.year);
			n+=sprintf(str+n,"%02bd-",dt.month);
			n+=sprintf(str+n,"%02bd ",dt.day);
			n+=sprintf(str+n,"%02bd:",dt.hour);
			n+=sprintf(str+n,"%02bd:",dt.minute);
			n+=sprintf(str+n,"%02bd",dt.second);
			//send_bytes(str);
			
			  
}
*/
void    ds_init(void)
{
	xdata uchar ss[5];
    uchar    i;
    ds_scl=0;
    ds_rst=0;
	ds_sda=0;
    ds_read(0x81,(uchar *)&i);
    if (i&0x80)
    {
		//		send_bytes("clock has been stop!\n");
		//		send_bytes("it's running!\n");
		i=0;
        ds_write(0x8e,(uchar*)&i);
        i=0;
        ds_write(0x80,(uchar*)&i);
        i=0xa5;
        ds_write(0x90,(uchar*)&i);
    }
  	 //read ram 
	ds_read(0xc1,(uchar *)&i);
	ss[0]=i;
	ds_read(0xc3,(uchar *)&i);
	ss[1]=i;
	if(strncmp(ss,"ok",2)==0)
	{
		//不需要初始化; 
	}
	else
	{
		
	//设置年月日是分秒
        i=0;
        ds_write(CONTROL_ADDR, (uchar *)&i);
		i=0;
        ds_write(SECOND_ADDR, (uchar *)&i);
		i=0;
        ds_write(MINUTE_ADDR,(uchar *) &i);
		i=12;
        ds_write(HOUR_ADDR, (uchar *)&i);
		i=31;
        ds_write(DAY_ADDR, (uchar *)&i);
		i=5;
        ds_write(MONTH_ADDR,(uchar *)&i);
		i=06;
        ds_write(YEAR_ADDR,(uchar *)&i);
		
		
        i=0;
        ds_write(0x8e,(uchar *)&i);
		
		
        i=0xa5;
        ds_write(0x90,(uchar *)&i);
		i='o';
		ds_write(0xc0,(uchar *)&i);
		i='k';
		ds_write(0xc2,(uchar *)&i);
		send_bytes("set default time!\n");
		
		//Delay_msec(5);
	}
	send_bytes("time format error,has modify\n\n");
	//	ds_checktime();	 
}
bit bgo=1;
void timeoutput()
{
	uchar i;
	int n;
	int second;
	ds_read(SECOND_ADDR+1,(uchar *)&i);
	dt.second =i;
	ds_read(MINUTE_ADDR+1,(uchar *)&i);
	dt.minute=i;
	ds_read(HOUR_ADDR+1,(uchar *)&i);
	dt.hour=i;
	ds_read(DAY_ADDR+1,(uchar *)&i);
	dt.day=i;
	ds_read(MONTH_ADDR+1,(uchar *)&i);
	dt.month=i;
	ds_read(YEAR_ADDR+1,(uchar *)&i);
	dt.year=i;
	if(bgo)
	{
		n=sprintf(str,"%02bd-",0x07f&dt.year);      
		n+=sprintf(str+n,"%02bd-",0x07f&dt.month);    
		n+=sprintf(str+n,"%02bd ",0x07f&dt.day);      
		n+=sprintf(str+n,"%02bd:",0x07f&dt.hour);      
		n+=sprintf(str+n,"%02bd:",0x07f&dt.minute);      
		n+=sprintf(str+n,"%02bd\n",0x07f&dt.second); 
		send_bytes(str);
		bgo=0;
	}
	if(second!=dt.second)
	{
		n=0;
		n=sprintf(str,"%02bd-",0x07f&dt.year);      
		n+=sprintf(str+n,"%02bd-",0x07f&dt.month);    
		n+=sprintf(str+n,"%02bd ",0x07f&dt.day);      
		n+=sprintf(str+n,"%02bd:",0x07f&dt.hour);      
		n+=sprintf(str+n,"%02bd:",0x07f&dt.minute);      
		n+=sprintf(str+n,"%02bd\n",0x07f&dt.second); 
		send_bytes(str);
	}
	second=dt.second;
	
	
}


⌨️ 快捷键说明

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