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

📄 时钟.c

📁 红外接收、蜂鸣器、时钟、led、lcd1602的一些源程序
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^4;
sbit rw=P1^5;
sbit en=P1^6;
sbit bflag=P0^7;
sbit reset=P3^5;
sbit sclk=P3^7;
sbit io=P3^6;
uchar str1[]="date of today is:";
//uchar str2[]="i will kill you lj";

//
void delay()
	{
	uchar j;
 	for(j=250;j>0;j--);
 	}
//-------------------液晶模块-----------------//
void en_toggle()
	{
  	en=0;
  //_nop_();
 	delay();
  	en=1;
 	delay();
 // _nop_();
  	en=0;
	}             //注意必须加延时,否则会出问题的
void is_ready()
	{
   P0=0x00;//设置为输入口
   rs=0;
   rw=1;
   en=1;
   while(bflag);
  	en=0;
	}

void write_cmd(uchar cmd)
{
  is_ready();
  rs=0;
  rw=0;
  P0=cmd;
  en_toggle();
}
void write_data(uchar indata)
{
  is_ready();
  rs=1;
  rw=0;
  P0=indata;
  en_toggle();
  _nop_();
}
void write_str(uchar addr,uchar *p)
{
 uchar i; 
 write_cmd(addr);
 while(p[i]!='\0')
 {write_data(p[i]);
  i++;
 }
}
void write_position(uchar row,uchar col)
{uchar p;
 if(row==1)
 {p=0x80+col-1;
  write_cmd(p);}
 else
 {p=0xc0+col-1;
  write_cmd(p);
   }
}
void init_lcd()
{
 write_cmd(0x38);
 write_cmd(0x0c);
 write_cmd(0x06);
 write_cmd(0x01);//清屏幕
 delay();
}
//------------液晶模块结束---------------------

//****************ds1302 programme********************
unsigned char time[]={0x23,0x50,0x22,0x01,0x01,0x01,0x06,0x20};//秒,分,时,日,月,星期,年


void write_byte(unsigned char inbyte)
	{
 	unsigned char i;
 	for(i=8;i>0;i--)
 		{
  		io=inbyte&0x01;
  		sclk=1;
		sclk=0;
  		inbyte=inbyte>>1;
 		}
	}

unsigned char read_byte() //sclk的下跳沿读数据
{
 unsigned char i,temp=0; 
 io=1;          //设置为输入口
 for(i=8;i>0;i--)
 	{
	temp=temp>>1;
	if(io==1)
   		temp=temp|0x80;
   	else
   		temp=temp&0x7f;
   sclk=1;
   sclk=0;
   
 	}
 //sclk=0;
 return (temp);
}
//----------往ds1302的某个地址写入数据-------------
void write_ds1302(unsigned char cmd,unsigned char indata)
{
  reset=1;
  write_byte(cmd);
  write_byte(indata);
  reset=0;
  sclk=0;
}
//----------读ds1302某地址的的数据-----------------
unsigned char read_ds1302(unsigned char addr)
{
 unsigned char backdata;
 reset=1;
 write_byte(addr);
 backdata=read_byte();//先写地址,然后读数据
 reset=0;
 //sclk=0;
 return (backdata);
}
//------------设置初始时间-------------------
void set_ds1302(unsigned char addr,unsigned char *p,unsigned char n)//写入n个数据
	{
  	write_ds1302(0x8e,0x00);//写控制字,允许写操作
  	for(;n>0;n--)
  		{
		write_ds1302(addr,*p);
   		p++;
   		addr=addr+2;
  		}
  	write_ds1302(0x8e,0x80);//写保护,不允许写
	}
//----------- 读取当前时间-------------------
void read_nowtime(unsigned char addr,unsigned char *p,unsigned char n)
{
 for(;n>0;n--)
 {
   *p=read_ds1302(addr);
   p++;
   addr=addr+2;
 } 		   
}
void init_ds1302()
	{
	reset=0;
  	sclk=0;
  	write_ds1302(0x80,0x00);//写控制字,允许写
  	write_ds1302(0x90,0x00);//禁止涡流充电 
	}

/*void reflash_time()
	{
	unsigned char h,l;
	write_char(0x80,(time[6]>>4)+'0');
	write_char(0x81,(time[6]&0x0f)+'0');
	write_char(0x82,' ');
	write_char(0x83,(time[4]>>4)+'0');
	write_char(0x84,(time[4]&0x0f)+'0');
	write_char(0x85,' ');
	write_char(0x86,(time[3]>>4)+'0');
	write_char(0x87,(time[3]&0x0f)+'0');
	write_char(0x88,' ');
	write_char(0x89,(time[5]&0x07)+'0');
	write_char(0x8A,' ');
	write_char(0x8B,(time[2]>>4)+'0');
	write_char(0x8C,(time[2]&0x0f)+'0');
	write_char(0x8D,':');
	write_char(0x8E,(time[1]>>4)+'0');
	write_char(0x8F,(time[1]&0x0f)+'0');
	write_char(0x90,':');
	write_char(0x91,(time[0]>>4)+'0');
	write_char(0x92,(time[0]&0x0f)+'0');

	h=(TEMP[0]<<4)+(TEMP[1]>>4);
	l=(TEMP[1]&0x0f)*10/16;
//	write_char(0x93,(TEMP[0]/100)+'0');
	write_char(0x94,(h%100/10)+'0');
	write_char(0x95,(h%10)+'0');
	write_char(0x96,'.');
	write_char(0x97,l+'0');
	SER_OUT((TEMP[0]<<4)+(TEMP[1]>>4));
	}*/

//************end of ds1302 programme***************** 
 

void main()
	{
 	init_lcd();             //初始化LCD
	write_str(0x80,str1);	  //液晶显示提示信息
 	init_ds1302();          //初始化ds1302
 	set_ds1302(0x80,time,7);//设置初始时间,日期,年月
  	
  	while(1)
  		{
		read_nowtime(0x81,time,7); //读出当前时间

   write_position(2,1);
   write_data('0'+((time[2]&0xf0)>>4));
	
   write_position(2,2);
   write_data('0'+(time[2]&0x0f));	//读小时

   write_position(2,3);
   write_data(':');

   write_position(2,4);
   write_data('0'+((time[1]&0xf0)>>4));
  
   write_position(2,5);
   write_data('0'+(time[1]&0x0f));    //读分钟
  
   write_position(2,6);
   write_data(':');

   write_position(2,7);
   write_data('0'+((time[0]&0xf0)>>4));
  
   write_position(2,8);
   write_data('0'+(time[0]&0x0f));	//读秒
		}
	
	}

⌨️ 快捷键说明

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