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

📄 yaohuaxwj.c

📁 Keil C51 89c52单片机挂接ds1302时钟芯片的驱动程序
💻 C
字号:
/*----------------------------------------
yaohuaxwj.c
实时时钟模DS1302程序列子 
----------------------------------------*/

#include <AT89X51.h>
//#include <instrins.h>

sbit CLK = 0x95;	//时钟线
sbit IO = 0x96;	//数据线
sbit RST = 0x97;	//复位线
sbit ACC_0 = ACC^0;
sbit ACC_7 = ACC^7;

unsigned data second,mintue,hour,dat,month,week,year;
         //秒,分,时,日,月,星期,年
unsigned data ucBuffer;


void main(void)			//测试版本,同时代表12台下位机,三种型号每种4台
{
	void InitCom(unsigned char BaudRate);
	void Delay();
	void Write_Data(unsigned char ucSendData);
	unsigned char Read_Data();
	void Write_DS1302(unsigned char ucAddress,unsigned char ucData);
	unsigned char Read_DS1302(unsigned char ucAddress);



	P1 = 85;						//设置 P1 口状态,为操作 62256 作准备	
	InitCom(6); 					//设置波特率为9600 1-8波特率300-57600
//	EA = 1;							//允许CPU中断
//	ES = 1;							//开串口中断

	do							
	{
				SBUF = 0xf0 ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI
		
        Write_DS1302(0x8e,0x00);//WP=0
        Delay();		//延时
        Delay();
        Write_DS1302(0x90,0xa5);//
        Delay();
        Delay();
        Write_DS1302(0x80,0x00);//设定second=0x00
        Delay();
        Delay();
        Write_DS1302(0x82,0x30);//设定mintue=0x00
        Delay();
        Delay();
        Write_DS1302(0x84,0x08);//hour=8
        Delay();
        Delay();
        Write_DS1302(0x86,0x08);//dat=1
        Delay();
        Delay();
        Write_DS1302(0x88,0x06);//month=6
        Delay();
        Delay();
        Write_DS1302(0x8a,0x01);//week=1
        Delay();
        Delay();
        Write_DS1302(0x8c,0x05);//year=5
        while(1)
        {
                second=Read_DS1302(0x81);//读秒
                Delay();
                Delay();
                mintue=Read_DS1302(0x83);//读分
                Delay();
                Delay();
                hour=Read_DS1302(0x85);//读时
                Delay();
                Delay();
                dat=Read_DS1302(0x87);//读日
                Delay();
                Delay();
                month=Read_DS1302(0x89);//读月
                Delay();
                Delay();
                week=Read_DS1302(0x8b);//读星期
                Delay();
                Delay();
                year=Read_DS1302(0x8d);//读年


				SBUF = second ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI


				SBUF = mintue ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI


				SBUF = hour ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI


				SBUF = dat ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI


				SBUF = month ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI


				SBUF = week ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI


				SBUF = year ; 		//输出字符
				while(!TI); 		//空语句判断字符是否发完
				TI = 0; 				//清TI
			}
	}
	while(1);
}


//串口初始化 晶振为11.0592M 方式1 波特率300-57600
void InitCom(unsigned char BaudRate)
{
	unsigned char data THTL;
	switch (BaudRate)
		{
			case 1: THTL = 64; break; //波特率300
			case 2: THTL = 160; break; //600
			case 3: THTL = 208; break; //1200
			case 4: THTL = 232; break; //2400
			case 5: THTL = 244; break; //4800
			case 6: THTL = 250; break; //9600
			case 7: THTL = 253; break; //19200
			case 8: THTL = 255; break; //57600
			default: THTL = 208;
		}
	SCON = 0x50; 	//串口方式1,允许接收
	TMOD = 0x20; 	//定时器1定时方式2
	TCON = 0x40; 	//设定时器1开始计数
	TH1 = THTL;
	TL1 = THTL;
	PCON = 0x80; 	//波特率加倍控制,SMOD位
	RI = 0;			//清收发标志
	TI = 0;
	TR1 = 1; 		//启动定时器
}

/***********************************************************
***功能:延时
************************************************************/
void Delay()
{
        int j;
        for(j=250; j>0; j--) j=j;
}
/**************************************************************
***功能:写入数据
***入口参数:ucSendData
**************************************************************/
void Write_Data(unsigned char ucSendData)
{
        int i;
        for(i=8;i>0;i--)
        {
        			 ACC=ucSendData;
                IO=ACC_0;//从第0位开始传输
                ACC=ACC>>1;//右移一位
					 ucSendData=ACC;
                CLK=1;   //上升沿写入数据
					 Delay();
                CLK=0;

        }
}
/****************************************************************
***功能:读出数据
***出口参数:ACC
****************************************************************/
unsigned char Read_Data()
{
        int i;
		  unsigned char Rdata=0;
        for(i=8;i>0;i--)
        {
		  			 ACC=Rdata;
                ACC=ACC>>1;
                ACC_7=IO;//读取数据线上的数据
					 Rdata=ACC;
                CLK=1;  //下降沿读出数据
					 Delay();
                CLK=0;
        }
        return Rdata;
}
/**************************************************************
***功能:向DS1302中写入数据
***说明:先写地址,后写数据 ucAddress-地址,ucData-数据
**************************************************************/
void Write_DS1302(unsigned char ucAddress,unsigned char ucData)
{
        RST=0;
        Delay();
        CLK=0;
        Delay();
        RST=1;
        Delay();
        Write_Data(ucAddress);//写入地址
        Delay();
        Delay();
        Write_Data(ucData);//写入数据
        Delay();
        CLK=0;
        Delay();
        RST=0;
        Delay();
}
/****************************************************************
***功能:从DS1302中读出数据
***说明:先写地址,后读数据 ucAddress-地址,ucBuffer-接收数据
****************************************************************/
unsigned char Read_DS1302(unsigned char ucAddress)
{
        RST=0;
        Delay();
        CLK=0;
        Delay();
        RST=1;
        Delay();
        Write_Data(ucAddress);//写入地址
        ucBuffer=Read_Data();//读出数据
        Delay();
        CLK=0;
        Delay();
        RST=0;
        Delay();
        return ucBuffer;
}

⌨️ 快捷键说明

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