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

📄 1302.c

📁 用89c52单片机控制ds1302在1602液晶上显示时钟
💻 C
字号:

#include <reg52.H>

#define uint unsigned int
#define uchar unsigned char

sbit ledlk=P1^0;
sbit smglk=P1^1;
sbit smgbitlk=P1^2;
sbit rs=P3^4;
sbit lcdcs=P1^5; 
sbit scl=P0^0;
sbit sda=P0^2;
sbit rst=P0^1;

//uchar code table[]={"www.mcuby.com"};
//uchar code table2[]={"welcome"};
/**/
void delay(uint ms)
{
	uint i,j;
	for (j=0;j<ms;j++)
		for (i=0;i<120;i++);
}
 
/*void delayus(uint us)
{
	uint i,j;
	for (j=0;j<us;j++)
		for (i=0;i<12;i++);
}*/
//1602显示开始
void write_command(uchar command)
{
	rs=0;
	P2=command;
	lcdcs=1;
	lcdcs=0;
}

void write_data(uchar data0)
{
	rs=1;
	P2=data0;
	lcdcs=1;
	lcdcs=0;	
}

void init_1602()
{
	ledlk=0;
	smglk=0;
	smgbitlk=0;
	delay(15);
	write_command(0x38);
	delay(5);
	write_command(0x0e);
	delay(5);
	write_command(0x06);
	delay(5);
} 
//1602显示结束



uchar DS1302_OutputByte(void) 	//实时时钟读取一字节(内部函数)
{ 
	uchar value,i;
	value=0x00;
	for (i=8;i>0;i--)
	{
		 value= value>>1 ;
		if (sda==1)
		{
			value= value|0x80;
		}
 
		scl=1;
		scl=0; 
	}
	return value;   
}


void DS1302_InputByte(uchar value)//实时时钟写入一字节(内部函数)
{ 
	uchar i;
	for (i=8;i>0;i--)
	{ 	
	    sda=value&0x01;
		scl=1;
 		scl=0; 
		value=value>>1;		
	}  
}

uchar Read_DS1302(uchar Addr)//读取DS1302某地址的数据
{
    unsigned char ucData;
    rst = 0;
    scl = 0;
    rst = 1;
    DS1302_InputByte(Addr|0x01); // 地址,命令 
    ucData = DS1302_OutputByte();// 读1Byte数据
    scl = 1;
    rst = 0;
    return(ucData);
}

void Write_DS1302(uchar Addr,uchar ucDa)	//Addr: DS1302地址, ucData: 要写的数据
{
    rst = 0;
    scl = 0;
    rst = 1;
    DS1302_InputByte(Addr);       	// 地址,命令 
    DS1302_InputByte(ucDa);       	// 写1Byte数据
    scl = 1;
    rst = 0;
} 

 void DS1302_SetProtect(bit flag)        //是否写保护
{
	if(flag)
		Write_DS1302(0x8E,0x10);
	else
		Write_DS1302(0x8E,0x00);
}

uchar tran_input(uchar value)//输入数据入转换函数
{
  return (value/10)<<4 | (value%10);
}

uchar Tran_Output(uchar value)//bcd转换成ascii
{
 return (((value&0x70)>>4)*10 +(value&0x0F));
}

void DS1302_SetTime(uchar Address, uchar value) // 设置时间函数
{
	DS1302_SetProtect(0);
	Write_DS1302(Address, tran_input(value)); 
}

void Init_DS1302(void)//初始化芯片
{
  	uchar Second=Read_DS1302(0x80); 
	 if(Second&0x80)		  
	  	DS1302_SetTime(0x80,0);  
}

void show_date()
{
	uchar i,value,key;
	uchar date[]="DATE:2009-03-12";
	uchar time[]="TIME:20:59:50";
	 	
	 	init_1602();//初始化lcd
	 	write_command(0x80);//液晶显示位置
	 	Init_DS1302();//初始化芯片
	
	//	DS1302_SetTime(0x86,12);//设置日期  
		value=(Read_DS1302(0x87));//日 
		key=Tran_Output(value) ;
		date[13]=( key/10 + '0');	  
		date[14]=( key%10 + '0');	
	
	//	DS1302_SetTime(0x88,3);  
		value=(Read_DS1302(0x89));//月
		key=Tran_Output(value);
		date[10]=( key/10 + '0');
		date[11]=( key%10 + '0');
		
	//	DS1302_SetTime(0x8c,9);  
		value=(Read_DS1302(0x8d));//年
		key=Tran_Output(value);
		date[7]=( key/10 + '0');
		date[8]=( key%10 + '0');


	 	for (i=0;i<sizeof(date)-1;i++)
		{
			write_data(date[i]);
			delay(5);
		} 
	 	write_command(0x80+0x40); //液晶显示位置
	
		//DS1302_SetTime(0x80,0);
		value=(Read_DS1302(0x81));//秒
		key=Tran_Output(value);
		time[11]=( key/10 + '0');
		time[12]=( key%10 + '0');
	
    	//DS1302_SetTime(0x82,50);  
		value=(Read_DS1302(0x83));//分
		key=Tran_Output(value);
		time[8]=( key/10 + '0');
		time[9]=( key%10 + '0');

   	 //   DS1302_SetTime(0x84,16);  			
		value=(Read_DS1302(0x85));//时
		key=Tran_Output(value);
		time[5]=( key/10 + '0');
		time[6]=( key%10 + '0');
	

	 	for (i=0;i<sizeof(time)-1;i++)
		{
			write_data(time[i]);
			delay(5);
		}
}

void main()
{
	while(1)
	{
		show_date();
 	}
}

⌨️ 快捷键说明

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