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

📄 1602时钟带设定.c

📁 本程序 实现用 单片机 与计算机的串口通讯
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="ME-400-A clock";
uchar code table1[]="    --:--:--    ";
uchar code table2[]="ALL:00:00:-- ";
uchar code table3[]="    ";
uchar clk_time[3];  //秒,分,时寄存器初始值
sbit T_RST=P2^2;//ds1302-5
sbit T_IO=P2^3;//ds1302-6
sbit T_CLK=P2^4;//ds1302-7
sbit en=P2^5;
sbit rw=P2^6;
sbit rs=P2^7;
sbit led=P1^0;
sbit dula=P1^1;
sbit wela=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit up=P3^3;
sbit down=P3^4;
sbit set=P3^2;
sbit did=P1^4;
uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hour,mie,sei,c,nhour,nmie,shour,smie;
/******************DS1302:写入操作(上升沿)*********************/ 

void write_byte(uchar da)
{
   uchar i;
   ACC=da;
   for(i=8;i>0;i--)
   { 
      T_IO=ACC0;
	  T_CLK=0;     
      T_CLK=1;
      ACC=ACC>>1;
   }
}

/******************DS1302:读取操作(下降沿)*****************/
uchar read_byte(void)
{
   uchar i;
   for(i=0;i<8;i++)
   {
      ACC=ACC>>1;
	  T_CLK = 1;
	  T_CLK = 0;
      ACC7 = T_IO;
   }
   return(ACC);

}

/******************DS1302:写入数据(先送地址,再写数据)***************************/ 
void write_1302(uchar addr,uchar da)
{
   T_RST=0;    //停止工作
   T_CLK=0;                                 
   T_RST=1;   //重新工作
   write_byte(addr);    //写入地址
   
   write_byte(da);
   T_RST=0;
   T_CLK=1;
}

/******************DS1302:读取数据(先送地址,再读数据)**************************/
uchar read_1302(uchar addr)
{
   uchar temp;
   T_RST=0;                                   //停止工作
   T_CLK=0;  
   T_RST=1;                         //重新工作
   write_byte(addr);   //写入地址
   temp=read_byte();
   T_RST=0;
   T_CLK=1;     //停止工作
   return(temp);
}





/***********************延时程序=a*1ms**************************************/
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
void fn()
   {
   	         did=0;
			 delay(120);
			did=1;
			 delay(120);
		     did=0;
			 delay(120);
			 did=1;
			 delay(120);
             did=0;
			 delay(120);
			 did=1;
			 delay(120);
             did=0;
			 delay(320);
             did=1;
			 delay(400);
   }
void write_com(uchar com)
{
    led=1;
	wela=1;
    P0=0xff;
    delay(1);
    led=0;
     wela=0;
    P0=0x00;
     dula=1;
     delay(1);
     dula=0;
    rs=0; 
	P0=com;
	delay(5);
	en=1;
	delay(5);
	en=0;
}

void write_data(uchar date)
{
	led=1;
	wela=1;
    P0=0xff;
    delay(1);
    led=0;
     wela=0;
    P0=0x00;
     dula=1;
     delay(1);
     dula=0;
    rs=1; 
	P0=date;
	delay(5);
	en=1;
	delay(5);
	en=0;
}
void morning()
  {   shour=clock_ss*10+clock_sg;
            smie=clock_fs*10+clock_fg;
    if(b==0)
     {
	    if(nhour==shour)
	    {
		  if(smie>=nmie)
		     {
			   fn();
			 }
         }
     }
	 
	 
  }
void init()
{   
    b=0;
    P0=0xff;
    delay(5);
    led=1;
    delay(5);
    P0=0xff;
    led=0;
	dula=0;
	wela=1;
     delay(5);
    wela=0;//关ME-400开发板数码管
	nhour=0;
	nmie=0;
    rw=0;
	en=0;
	write_com(0x38);//设置液晶
	write_com(0x0c);//设光标等
	write_com(0x06);//写一个字符地址指针加1且光标加1
	write_com(0x01);//清屏
	write_com(0x80);//设置s地址指针
}
void display(uchar add,date)
{       
   if(b==0)
     {
        clock_ms=clk_time[0]/ 16;  clock_mg=clk_time[0]%16;
        led=0;
        clock_fs=clk_time[1]/ 16;  clock_fg=clk_time[1]%16;
        led=0;
        clock_ss=clk_time[2]/ 16;   clock_sg=clk_time[2]%16;
		     write_com(0x80+0x44);
		     write_data(0x30+clock_ss);
		     write_com(0x80+0x45);
		     write_data(0x30+clock_sg);
		     write_com(0x80+0x47);
		     write_data(0x30+clock_fs);
		     write_com(0x80+0x48);
		     write_data(0x30+clock_fg);
		     write_com(0x80+0x4a);
		     write_data(0x30+clock_ms);
		     write_com(0x80+0x4b);
		     write_data(0x30+clock_mg);
	
	   	}
   if(b!=0)
	    {
		clock_s=date/ 10;  clock_g=date%10;
        write_com(0x80+0x40+add);
        write_data(0x30+clock_s);
        write_data(0x30+clock_g);   
		}
  
}
void key()
 {
   uchar clock_s1, clock_s2, clock_f1, clock_f2;
   rw=0;

   if(set==0)
      {
		delay(10);
          if(set==0)
                { 
 			       did=0;
	              delay(10); did=1;
				  b++;
          
        		}
              while(!set);
			  
        if(b==1)
		{
		  hour=clock_ss*10+clock_sg;
            mie=clock_fs*10+clock_fg;
		  write_com(0x80+0x45);
          write_com(0x0f);

		}
		   if(b==2)
				{
				  write_com(0x80+0x48);
		          
		
				}
          if(b==3)
           {
				write_com(0x80+0x40);
				for(num=0;num<13;num++)
				{
					write_data(table2[num]);
					
				}

            	
			 write_com(0x80+0x45); display(4,nhour);write_com(0x80+0x45); 
           }
		   if(b==4)
			   {

                     write_com(0x80+0x48);
                    display(7,nmie); write_com(0x80+0x48);	

			   }
		   if(b==5)
				{
                 write_com(0x80+0x40);
				for(num=0;num<4;num++)
				{
					write_data(table3[num]);
					
				}
				  write_com(0x80+0x45);
		         write_com(0x0c); 
		          b=0;
				 clock_s1=hour/10;//十进制转十六进制
		         clock_s2=hour%10;//十进制转十六进制
		         clock_s1=clock_s1&0xff;//十进制转十六进制
				 clock_s2=clock_s2&0xff;//十进制转十六进制
		         clock_s1<<=4;//十进制转十六进制
		         clock_s1=clock_s1|clock_s2;//十进制转十六进制
				  
		         clock_f1=mie/10;//十进制转十六进制
		         clock_f2=mie%10;//十进制转十六进制
		         clock_f1=clock_f1&0xff; //全1出1 与运算
				 clock_f2=clock_f2&0xff;//十进制转十六进制
		         clock_f1<<=4;//十进制转十六进制
		         clock_f1=clock_f1|clock_f2;//十进制转十六进制
			 
			 write_1302(0x8e,0x00);             //WP=0 写操作
			 write_1302(0x80,0x00);//写秒
			 write_1302(0x82,clock_f1);//写分
			 write_1302(0x84,clock_s1);//写时
             write_1302(0x86,0x18);//写日
			 write_1302(0x88,0x01);//写月
			 write_1302(0x8a,0x07);//写星期
             write_1302(0x8c,0x09);
			 write_1302(0x8e,0x80); //WP=1 写保护
		
				
            }   
        }
	 if(b!=0)
	     {
		   if(up==0)
		      {
			    delay(10);
				  if(up==0)
				   { 
				     did=0;
                    delay(10);
                       did=1;
                         while(!up);
                     if(b==1) 
					   {
					   
					     hour++;
	 						if(hour>=24)
						    {
							 delay(1);
								hour=0;
							}
                           display(4,hour);	
			                write_com(0x80+0x45);

						}
                  if(b==2)   
                     {
					    mie++;

 						if(mie>=60)
					    {
							mie=0;
						}
						     display(7,mie);
 			 				 write_com(0x80+0x48);
  				      }
                   if(b==3) 
					   {
					   
					     nhour++;
	 						if(nhour>=24)
						    {
							 delay(1);
								nhour=0;
							}
                           display(4,nhour);	
			                write_com(0x80+0x45);

						}
                if(b==4)   
                     {
					    nmie++;

 						if(nmie>=60)
					    {
							nmie=0;
						}
						     display(7,nmie);
 			 				 write_com(0x80+0x48);
  				      }
				   }
                 
				}
				
		 if(down==0)
		      {
			    delay(10);
				  if(down==0)
				   { 
				     did=0;
                     delay(10);
                       did=1;
                     while(!down);
                        if(b==1)
						{
						  hour--;
	 						if(hour<0)
						    {
	
							  hour=23;
							}
                           display(4,hour);
 			 				 write_com(0x80+0x45);

						}
                        if(b==2)
	                      {  
                             mie--;
 						     if(mie<0)
					          {
						          	mie=59;
						      }
  			               display(7,mie);
 			 				 write_com(0x80+0x48);
				           }
                    if(b==3)
						{
						  nhour--;
	 						if(nhour<0)
						    {
	
							  nhour=23;
							}
                           display(4,nhour);
 			 				 write_com(0x80+0x45);

						}
                        if(b==4)
	                      {  
                             nmie--;
 						     if(nmie<0)
					          {
						          	nmie=59;
						      }
  			               display(7,nmie);
 			 				 write_com(0x80+0x48);
				           }
  			
		                  }
   
				       }
			      }
		      }           

void main()
{
   uchar  temp=0x80;          
   uchar i;
	init();
	for(num=0;num<14;num++)
	{
		write_data(table[num]);
		delay(100);
	}

	write_com(0x80+0x40);
	for(num=0;num<15;num++)
	{
		write_data(table1[num]);
		
	}
	/*for(num=0;num<16;num++)
	{
		write_com(0x18);
		delay(20);
	}*/
 write_1302(0x8e,0x00); 
 write_1302(0x90,0xa4);
 write_1302(0x8e,0x80); 
	while(1)
     {
	   
	   if(b==0)

	  { temp=0x81;                    
      for(i=0;i<3;i++)
 	  {
	     clk_time[i]=read_1302(temp);
		 temp+=2;
	  }
	  display(0x4b,0x00);
	  }
	  
morning();	
key();

	 }
}

⌨️ 快捷键说明

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