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

📄 ds1302.c

📁 一个C语言编写的单片机控制外部灯的代码
💻 C
字号:
#pragma small
#include <reg52.h>
#define uchar unsigned char
/************************************引脚连接图*****************************************/
sbit ds1302_clk=P1^0;
sbit ds1302_dat=P1^1;
sbit ds1302_rst=P1^2;

sbit ACC_0 = ACC^0;
sbit ACC_1 = ACC^1;
sbit ACC_2 = ACC^2;
sbit ACC_3 = ACC^3;
sbit ACC_4 = ACC^4;
sbit ACC_5 = ACC^5;
sbit ACC_6 = ACC^6;
sbit ACC_7 = ACC^7;

/*************************************函数说明******************************************/
void Read(void);								//写DS1302操作
void Write(void);								//读DS1302操作
uchar ReadRam_Byte(uchar address);    			//从Ram中读出一个字节
uchar ReadRTC_Byte(uchar address);    			//从DS1302中读出一个字节
uchar WriteRam_Byte(uchar address,uchar number);    	//向Ram中写入一个字节
uchar WriteRTC_Byte(uchar address,uchar number);    	//向DS1302中写入一个字节
void ReadRam(uchar data * buffer,uchar size);    		//从Ram中读出多个字节
void ReadRTC(uchar data * buffer,uchar size);    		//从DS1302中读出多个字节
void WriteRam(uchar data * buffer,uchar size);    		//向Ram中写入多个字节
void WriteRTC(uchar data * buffer,uchar size);    		//向DS1302中写入多个字节
uchar ReadSec(void);    						//从DS1302中读出秒字节
uchar ReadMin(void);    						//从DS1302中读出分字节
uchar ReadHr(void);    						//从DS1302中读出时字节
uchar ReadDay(void);    						//从DS1302中读出日字节
uchar ReadMonth(void);    					//从DS1302中读出月字节
uchar ReadWeek(void);    						//从DS1302中读出星期字节
uchar ReadYear(void);    						//从DS1302中读出年字节
void WriteSec(uchar number);    					//向DS1302中写入秒字节
void WriteMin(uchar number);    				//向DS1302中写入分字节
void WriteHr(uchar number);    					//向DS1302中写入时字节
void WriteDay(uchar number);    				//向DS1302中写入日字节
void WriteMonth(uchar number);    				//向DS1302中写入月字节
void WriteWeek(uchar number);    				//向DS1302中写入星期字节
void WriteYear(uchar number);    				//向DS1302中写入年字节
void WriteControl(uchar number);					//向慢速充电控制寄存器写入控制字节
void EnableWP(void);    						//禁止写保护
void DisableWP(void);    						//允许写保护

void Write(void)					//写DS1302操作
{
	ds1302_dat = ACC_0; 			//写DS1302
	ds1302_clk = 1; 				//时钟上升沿,发送数据有效
	ds1302_clk = 0;				//清零时钟总线
    ds1302_dat = ACC_1; 
	ds1302_clk = 1; ds1302_clk = 0;
    ds1302_dat = ACC_2; 
	ds1302_clk = 1; ds1302_clk = 0;
    ds1302_dat = ACC_3; 
	ds1302_clk = 1; ds1302_clk = 0;
    ds1302_dat = ACC_4; 
	ds1302_clk = 1; ds1302_clk = 0;
    ds1302_dat = ACC_5; 
	ds1302_clk = 1; ds1302_clk = 0;
    ds1302_dat = ACC_6; 
	ds1302_clk = 1; ds1302_clk = 0;
    ds1302_dat = ACC_7;
	ds1302_clk = 1; ds1302_clk = 0;
}

void Read(void)					//读DS1302操作
{
    ACC_0 = ds1302_dat; 			//读取DS1302数据
	ds1302_clk = 1; 				//时钟上升沿,发送数据有效
	ds1302_clk = 0; 				//清零时钟总线
    ACC_1 = ds1302_dat; 
	ds1302_clk = 1; ds1302_clk = 0;
    ACC_2 = ds1302_dat; 
	ds1302_clk = 1; ds1302_clk = 0;
    ACC_3 = ds1302_dat; 
	ds1302_clk = 1; ds1302_clk = 0;
    ACC_4 = ds1302_dat; 
	ds1302_clk = 1;ds1302_clk = 0;
    ACC_5 = ds1302_dat; 
	ds1302_clk = 1; ds1302_clk = 0;
    ACC_6 = ds1302_dat; 
	ds1302_clk = 1; ds1302_clk = 0;
    ACC_7 = ds1302_dat; 
	ds1302_rst = 0; ds1302_clk = 1;
}

uchar ReadRam_Byte(uchar address)   	//从RAM中读出一个字节
{
    ds1302_rst = 0; 				//复位引脚为低电平,所有数据传送中止
    ds1302_clk = 0; 				//清零时钟总线
	ds1302_rst = 1;				//复位引脚为高电平,逻辑控制有效
	ACC = address;
   	Write();				//写DS1302操作
    ds1302_dat = 1;
   	Read();				//读DS1302操作
    return ACC;
}

uchar ReadRTC_Byte(uchar address)    			//从DS1302中读出一个字节
{
    ds1302_rst = 0; 				//复位引脚为低电平,所有数据传送中止
    ds1302_clk = 0; 				//清零时钟总线
    ds1302_rst = 1;				//复位引脚为高电平,逻辑控制有效
    ACC = address;
    Write();				//对DS1302写命令字和地址
	ds1302_dat = 1;
	Read();				//读DS1302操作
    return ACC;					//返回读取的数据
}

uchar WriteRam_Byte(uchar address,uchar number)    //向RAM中写入一个字节
{
    ds1302_clk = 0; ds1302_rst = 0;ds1302_rst = 1;
    ACC = address;
	Write();				//对DS1302写命令字和地址
    ACC = number;
	Write();				//对DS1302写命令字和数据
    ds1302_rst = 0;
	ds1302_clk = 1;
    return ACC;
}

uchar WriteRTC_Byte(uchar address,uchar number)    //向DS1302中写入一个字节
{
    ds1302_clk = 0;
    ds1302_rst = 0;ds1302_rst = 1;
    ACC = address;
    ACC |= 0x80;
    Write();				//对DS1302写命令字和地址
    ACC = number;
	Write();				//对DS1302写命令字和数据
    ds1302_rst = 0; ds1302_clk = 1;
    return ACC;
}

void ReadRam(uchar data * buffer,uchar size)    //从RAM中读出多个字节
{
    register uchar a,b;
    ds1302_clk = 0;
    ds1302_rst = 0;
    ds1302_rst = 1;
    ACC = 0xff;					//命令字为FFH
	Write();				//对DS1302写命令字和地址
    ds1302_dat = 1;
    for(a=0;a<size;a++)
    {
        ACC_0 = ds1302_dat;    
        ds1302_clk = 1; ds1302_clk = 0; ACC_1 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_2 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_3 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_4 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_5 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_6 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_7 = ds1302_dat;
        b = ACC;
        *(buffer+a)=b;
        ds1302_clk = 1; ds1302_clk = 0;
    }
    ds1302_rst = 0; ds1302_clk = 1;
}

void ReadRTC(uchar data * buffer,uchar size)    	//从DS1302中读出多个字节
{
    register uchar a,b;
    ds1302_clk = 0;
    ds1302_rst = 0;
    ds1302_rst = 1;
    ACC = 0xbf;				//命令字为BFH
	Write();				//对DS1302写命令字和地址
    ds1302_dat = 1;
    for(a=0;a<size;a++)			//读出DS1302数据
    {
        ACC_0 = ds1302_dat;    
        ds1302_clk = 1; ds1302_clk = 0; ACC_1 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_2 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_3 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_4 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_5 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_6 = ds1302_dat;
        ds1302_clk = 1; ds1302_clk = 0; ACC_7 = ds1302_dat;
        b = ACC;
        *(buffer+a)=b;
        ds1302_clk = 1; ds1302_clk = 0;
    }
    ds1302_rst = 0;
    ds1302_clk = 1;
}

void WriteRam(uchar data * buffer,uchar size)    //向RAM中写入多个字节
{
    register uchar a;
    ds1302_clk = 0;
    ds1302_rst = 0;
    ds1302_rst = 1;
    ACC = 0xfe;				//命令字为FE
    Write();				//对DS1302写命令字和地址
    for(a=0;a<size;a++)
    {
        ACC = *(buffer+a);
        Write();			//对DS1302写数据
    }    
    ds1302_rst = 0;
    ds1302_clk = 1;
}

void WriteRTC(uchar data * buffer,uchar size)    //向DS1302中写入多个字节
{//注意:连续写DS1302只能是8个字节一起写
    register uchar a;
    ds1302_clk = 0;
    ds1302_rst = 0;
    ds1302_rst = 1;
    ACC = 0xbe;				//命令字为BEH
    Write();				//对DS1302写命令字和地址
    for(a=0;a<size;a++)
    {
        ACC = *(buffer+a);
        Write();			//对DS1302写数据
    }
    ds1302_rst = 0;
    ds1302_clk = 1;
}

uchar ReadSec(void)    			//从DS1302中读出秒字节
{
    return ReadRTC_Byte(0x81);
}

uchar ReadMin(void)    			//从DS1302中读出分字节
{
    return ReadRTC_Byte(0x83);
}

uchar ReadHr(void)    			//从DS1302中读出时字节
{
    return ReadRTC_Byte(0x85);
}

uchar ReadDay(void)   			//从DS1302中读出日字节
{
    return ReadRTC_Byte(0x87);
}

uchar ReadMonth(void)    			//从DS1302中读出月字节
{
    return ReadRTC_Byte(0x89);
}

uchar ReadWeek(void)    			//从DS1302中读出星期字节
{
    return ReadRTC_Byte(0x8B);
}

uchar ReadYear(void)    			//从DS1302中读出年字节
{
    return ReadRTC_Byte(0x8D);
}

void WriteSec(uchar number)    		//向DS1302中写入秒字节
{
    WriteRTC_Byte(0x80,number);
}

void WriteMin(uchar number)    		//向DS1302中写入分字节
{
    WriteRTC_Byte(0x82,number);
}

void WriteHr(uchar number)    		//向DS1302中写入时字节
{
    WriteRTC_Byte(0x84,number);
}

void WriteDay(uchar number)    		//向DS1302中写入日字节
{
    WriteRTC_Byte(0x86,number);
}

void WriteMonth(uchar number)    	//向DS1302中写入月字节
{
    WriteRTC_Byte(0x88,number);
}

void WriteWeek(uchar number)    	//向DS1302中写入星期字节
{
    WriteRTC_Byte(0x8A,number);
}

void WriteYear(uchar number)    	//向DS1302中写入年字节
{
    WriteRTC_Byte(0x8C,number);
}

void WriteControl(uchar number)    	//向慢速充电控制寄存器写入控制字节
{
    WriteRTC_Byte(0x90,number);
}

void DisableWP(void)    			//禁止写保护
{
    WriteRTC_Byte(0x8E,0);
}

void EnableWP(void)    			//允许写保护
{
    WriteRTC_Byte(0x8E,0x80);
}

void main(void)					//主程序
{
    uchar sec,min,hr,day,month,week,year;
    uchar data buffer1[32] = 
{32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
    uchar data buffer2[8] = {45,45,15,13,3,2,01,0};
    ReadRTC(buffer2,8);
    DisableWP();				//禁止写保护
    WriteControl(0xaa);			//向慢速充电控制寄存器写入控制字节
    WriteRam(buffer1,31);			//写DS1302RAM
    WriteRTC(buffer2,8);			//写DS1302时钟
    EnableWP();				//允许写保护
    ReadRam(buffer1,31);			//读DS1302RAM
    ReadRTC(buffer2,8);			//读DS1302时钟
    sec = ReadSec();				//读秒
    min = ReadMin();				//读分
    hr = ReadHr();				//读小时
    day = ReadDay();				//读日
    month = ReadMonth();			//读月
    week = ReadWeek();			//读星期
    year = ReadYear();			//读年
    ACC = 0;
}

⌨️ 快捷键说明

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