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

📄 rt1602c+ds1302二号.c

📁 RT1602C+DS1302二号.rar
💻 C
字号:
//单片机RT1602_C语言程序__DS1302读写一体化C51源程序
//2006年3月8951_LCD_1602_Q_D_MCU适用
//AT89C54_Ver1.00
//KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式
//DB0=P1.0 DB1=P1.1 DB2=P1.2 DB3=P1.3 DB4=P1.4 DB5=P1.5
//DB6=P1.6 DB7=P1.7 R/W=P2.0 RS=P2.1  E=P2.7 
//[注]:AT89C51的晶振频率为12MHz

#include <REGX51.H>
#include <stdio.h> 
#include <absacc.h>
#include <intrins.h> 
#include <SS89BIN.h> 
   
sbit E_E=P3^3; 									//片选,下降沿触发
sbit R_S=P3^4;									//H数据寄存器,L指令寄存器 
sbit R_W=P3^5;									//H读数据,L写数据  
sbit DS1302_RST=P0^3; 							//DS1302_RST
sbit DS1302_IO =P0^4;							//DS1302_IO
sbit DS1302_SCL=P0^5;							//DS1302_CLK

unsigned char settime[7]={0x55,0x59,0x23,0x31,0x12,0x07,0x04}; 
												//设置时间:秒 分 时 日 月 星期 年
unsigned char data rdtime[7];
unsigned char bdata data_ds1302;
sbit bit_data0=data_ds1302^0;
sbit bit_data7=data_ds1302^7;
unsigned char bdata x;
sbit x0=x^0;
sbit x7=x^7;

void close_write_bit()
	{char i;
	DS1302_SCL=0;
	_nop_();
	DS1302_RST=1;
	_nop_();_nop_();
	data_ds1302=0x8E;							//写控制代码
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	data_ds1302=0x80;							//关闭写保护
	DS1302_IO=0;
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	}
void open_write_bit()
	{char i;
	DS1302_SCL=0;
	_nop_();
	DS1302_RST=1;
	_nop_();_nop_();
	data_ds1302=0x8E;							//写控制代码
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	data_ds1302=0x00;							//关闭写保护
	DS1302_IO=0;
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	}
void initial_ds1302()
	{unsigned char i;
	DS1302_SCL=0;
	_nop_();
	DS1302_RST=1;
	_nop_();_nop_();
	data_ds1302=0x8E;							//写控制代码
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	data_ds1302=0x80;							//关闭写保护
	DS1302_IO=0;
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	DS1302_RST=0;
	_nop_();
	DS1302_SCL=0;
	DS1302_SCL=0;
	_nop_();
	DS1302_RST=1;
	_nop_();_nop_();
	data_ds1302=0x90;							//recharge register
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	data_ds1302=0xA4;							//no rechaarge for battery
	DS1302_IO=0;
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	DS1302_RST=0;
	_nop_();
	DS1302_SCL=0;
	DS1302_SCL=0;
	_nop_();
	DS1302_RST=1;
	_nop_();_nop_();
	data_ds1302=0x80;							//关闭写保护
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	data_ds1302=0x80;							//关闭写保护
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	DS1302_RST=0;
	_nop_();
	DS1302_SCL=0;
	}

unsigned char read_ds1302(char command)
	{char i;
	data_ds1302=(command<<1)|0x81;
	DS1302_SCL=0;
	_nop_();
	DS1302_RST=1;
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	DS1302_SCL=1;	
	for(i=1;i<=8;i++)
		{data_ds1302=data_ds1302>>1;
		DS1302_SCL=0;_nop_();
		bit_data7=DS1302_IO;DS1302_SCL=1;
		}	
	DS1302_RST=0;
	_nop_();
	DS1302_SCL=0;
	return(data_ds1302);
	}
void write_ds1302(unsigned char address,unsigned char numb)
	{char i;									//写入时分秒
	DS1302_RST=0;
	DS1302_SCL=0;
	DS1302_RST=0;
	DS1302_RST=1;
	data_ds1302=0x80|(address<<1);
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	data_ds1302=numb;
	for(i=1;i<=8;i++)
		{DS1302_SCL=0;
		DS1302_IO=bit_data0;
		_nop_();DS1302_SCL=1;
		data_ds1302=data_ds1302>>1;
		}
	DS1302_RST=0;
	DS1302_SCL=1;
	}
void read_time()								//读秒分时日月星期年
	{unsigned char n;
	for(n=0;n<7;n++)
		{rdtime[n]=read_ds1302(n);
		}
	}
void set_time()
	{unsigned char data n;
	open_write_bit();	
	for(n=0;n<7;n++)
		{write_ds1302(n,settime[n]);
		}
	close_write_bit();
	}

void TIME(int nt)								//延时函数
	{long int it=0;
	for(it=0;it<nt*1000;it++);
	return;
	}
void DELAY(void)								//判断液晶显示器是否忙的子程序
	{P1=0xFF;
	R_S=0;R_W=1;E_E=0;
	_nop_();
	E_E=1;
	while(P1_7);								//如果P1.7为高电平表示忙就循环等待
	return;
	}
void WR1602C(char mun,char rs)					//写入控制命令的子程序
	{P1=mun;									//将代码送到P1口
	R_S=rs;										//1数据寄存器,0指令寄存器 
	R_W=0;E_E=0;								//执行显示命令
	DELAY();									//判断液晶模块是否忙
	E_E=1;										//显示完成,程序停车
	return;
	}

void main(void)
{	P3_1=0;P3_2=1;TIME(3);						//指示灯闪烁
	P3_1=1;P3_2=0;TIME(3);	
	P3_1=0;P3_2=1;TIME(3);

	WR1602C(B0000_0001,0);						//清屏并光标复位									
	WR1602C(B0011_1000,0);						//设置显示模式:8位2行5x7点阵
	WR1602C(B0000_1111,0);						//显示器开,光标开,光标允许闪烁
	WR1602C(B0000_0110,0);						//文字不动,光标自动右移
	WR1602C(B1110_1000,0);						//写入显示起始地址(第一行第一个位置)
	WR1602C(B0100_0001,1);						//字母A的代码
	WR1602C(B0100_0010,1);
	WR1602C(B0100_0011,1);
	TIME(5);

	initial_ds1302();							//上电启用,否则不走时
	set_time();									//将数组中的时间置入DS1302
			
START:
	read_time();								//读取当前时分秒,放在数组中

   	WR1602C(B1100_0000,0);						//写入显示起始地址(第二行第一个位置)
	WR1602C(0x4E,1);WR1602C(0x6F,1);			//第二排从头开始显示NowTime
	WR1602C(0x77,1);WR1602C(0x54,1);
	WR1602C(0x69,1);WR1602C(0x6D,1);				
	WR1602C(0x65,1);WR1602C(0x20,1);

	WR1602C(rdtime[2]/16+48,1);					//时钟_时_十位
	WR1602C(rdtime[2]%16+48,1);					//时钟_时_个位
	WR1602C(0x3A,1);							//显示:
	WR1602C(rdtime[1]/16+48,1);					//时钟_分_十位
	WR1602C(rdtime[1]%16+48,1);					//时钟_分_个位
	WR1602C(0x3A,1);							//显示:
	WR1602C(rdtime[0]/16+48,1);					//时钟_秒_十位
	WR1602C(rdtime[0]%16+48,1);					//时钟_秒_个位  

	WR1602C(B1110_1000,0);						//写入显示起始地址(第一行第一个位置)
	WR1602C(0x32,1);WR1602C(0x30,1);			//第一排从头开始显示20世纪
	WR1602C(rdtime[6]/16+48,1);					//时钟_年_十位
	WR1602C(rdtime[6]%16+48,1);					//时钟_年_个位
	WR1602C(0x2F,1);							//显示/
	
	WR1602C(rdtime[4]/16+48,1);					//时钟_月_十位
	WR1602C(rdtime[4]%16+48,1);					//时钟_月_个位
	WR1602C(0x2F,1);							//显示/
	WR1602C(rdtime[3]/16+48,1);					//时钟_日_十位
	WR1602C(rdtime[3]%16+48,1);					//时钟_日_个位
	
	WR1602C(0x20,1);
	WR1602C(0x57,1);WR1602C(0x65,1);			//显示Week
	WR1602C(0x65,1);WR1602C(0x6B,1);
	WR1602C(rdtime[5]%16+48,1);					//时钟_星期几
	TIME(5);

	goto START;	

}


⌨️ 快捷键说明

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