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

📄 shiz.c

📁 本时钟采用8吋笔段式LED高亮度数码管组装而成
💻 C
📖 第 1 页 / 共 2 页
字号:
#define uint unsigned int
#define uchar unsigned char
#include <reg51.h>
#include <math.h>

sbit SDA = P3^1;                           //二线通信
sbit SCL = P3^0;
sbit LEDA = P3^3;                           //倒计时运行指示灯
sbit FY1 = P3^5;                            //放音控制1,高电平有效
sbit FY2 = P3^6;                            //放音控制2,高电平有效
sbit FY3 = P3^7;                            //放音控制3,高电平有效
bit c_flash = 0;                               //小时位闪烁标志
bit m_flash = 0;                               //分钟位闪烁标志
bit s_flash = 0;                               //秒位闪烁标志
bit ibflag;
//bit sf = 1;                                //定时标志位,sf=1:时间显示;sf=0:定时显示
#define M41T0_ADR    0xD0                  //时钟芯片地址
#define WRITE	     0x00				//  WRITE command
#define	READ 	     0x01				//  READ command

uchar code tab[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳带圆点

unsigned long dingshi;                     //定时时长

void nop(uchar j);
void msec(uint x);
void display(uchar *p);
uchar RMT_SCAN(void);
void M41T0_Send (uchar *p);
uchar *M41T0_Receive (void);
uchar *read_time(void);
unsigned long time_to_long(void);
void timer_adj(void);
void clock_adj(void);

main()
{uchar key;
 uchar *p;
 EA = 0;
 SDA = 1;
 SCL = 1;
 while(1)
  {key = RMT_SCAN();                      //遥控
  	   switch(key)
	    {//case 4:sf = ~sf;break;               //SWITCH_KEY,时间与定时切换
         case 2:timer_adj();break;            //TIMER_KEY,定时设定
         case 1:clock_adj();break;            //CLOCK_KEY,时间设定
         default:break;
        }
   p = read_time();
   display(p);
   }
}
   
void nop(uchar j)
{uchar i;
 for(i=0;i<j;i++)
 {;}
}


void msec(uint x)
 { unsigned char j;
   while (x--)
   { for (j=0;j<125;j++)
    {;}
   }
 }


void display(uchar *pt)
{uchar i;
 uchar temp;
 temp = 0x01;
 P2 = ~temp;
 for(i = 0;i < 6;i++)
    {P0 = pt[i];
	 msec(2);
	 temp <<= 1;
	 P2 = ~temp;
	}

}


  
uchar RMT_SCAN(void)
{uchar temp1,temp2;
 uchar i;
 i = P1;
 temp1 = i & 0xf0;
 if(temp1)
 {do{i = P1;
	  temp2 = i&0xf0;
      }while(temp2);
  temp1>>=4;
  temp1 &= 0x0f;
  return temp1;  
  }
 else return 0;
}  
   

uchar *read_time(void)
{uchar *pt,day[8];
 uchar show[6];                             //数码管显示数组
 uchar i;
 pt = M41T0_Receive();
 for(i = 0;i < 8;i++)day[i] = *(pt+i);
 show[0] = tab[day[0]&0x0f];             //秒个位
 show[1] = tab[(day[0]&0x70)>>4];        //秒十位
 show[2] = tab[day[1]&0x0f];             //分个位
 show[3] = tab[(day[1]&0x70)>>4];        //分十位
 show[4] = tab[day[2]&0x0f];             //时个位
 show[5] = tab[(day[2]&0x30)>>4];        //时十位
 return(show);
}  
  

unsigned long time_to_long(void)
{uchar *pt,day[8];
 uchar shi,feng,miao,i;
 unsigned long th;
 pt = M41T0_Receive();
 for(i = 0;i < 8;i++)day[i] = *(pt+i);
 shi = (day[2]&0x0f) + (day[2]>>4)*10;
 feng = (day[1]&0x0f) + (day[1]>>4)*10;
 miao = (day[0]&0x0f) + (day[0]>>4)*10;
 th = miao + feng*60 + shi*3600;
 return th;
}


void timer_adj(void)
{uchar idata day[3],*pt,dat[8];
 uchar show[6];                             //数码管显示数组
 uchar shi,feng,miao,i;
 uchar key;
 bit ff;
 uchar jm;
 unsigned long th;
 uchar flag = 1;
 bit nflag,pflag;
 day[2] = 0;
 day[1] = 0;
 day[0] = 0;
 c_flash = 1;m_flash = 0;s_flash = 0;
 while(1)
      {if(c_flash){if(nflag){if(day[2]==0)day[2] = 23;
	                         else         day[2] = day[2] - 1;
                             nflag = 0;
                            }
                   if(pflag){if(day[2]==23)day[2] = 0;
				             else          day[2] = day[2] + 1;
                             pflag = 0;
                            }
				   if(day[2]>23)day[2] = 0;  //防止超阈值数据
                  }          //时
        if(m_flash){if(nflag){if(day[1]==0)day[1] = 59;
	                          else         day[1] = day[1] - 1;
                              nflag = 0;
                             }
                    if(pflag){if(day[1]==59)day[1] = 0;
				              else          day[1] = day[1] + 1;
                              pflag = 0;
                             }
					if(day[1]>59)day[1] = 0;  //防止超阈值数据
                   }             //分
                     
         if(s_flash){if(nflag){if(day[0]==0)day[0] = 59;
	                           else         day[0] = day[0] - 1;
                               nflag = 0;
                              }
                    if(pflag){if(day[0]==59)day[0] = 0;
				              else          day[0] = day[0] + 1;
                              pflag = 0;
                             }
					if(day[0]>59)day[0] = 0;  //防止超阈值数据
                   }                
                            //秒
           show[0] = tab[day[0]%10];             //秒个位
           show[1] = tab[day[0]/10];             //秒十位
           show[2] = tab[day[1]%10];             //分个位
           show[3] = tab[day[1]/10];             //分十位
           show[4] = tab[day[2]%10];             //时个位
           show[5] = tab[day[2]/10];             //时十位
		   
           if(c_flash)
               {if(ff){show[4] = 0x7f;          //圆点不灭
                       show[5] = 0xff;
                       if(jm++ > 15){ff = 0;jm = 0;}
                      }
	            else if(jm++ > 60){ff = 1; jm = 0;}      //闪烁频率
               }
           if(m_flash)
               {if(ff){show[2] = 0x7f;
                       show[3] = 0xff;
                       if(jm++ > 15){ff = 0;jm = 0;}
                      }
	            else if(jm++ >60){ff = 1; jm = 0;}      //闪烁频率
               }
           if(s_flash)
               {if(ff){show[0] = 0xff;
                       show[1] = 0xff;
                       if(jm++ > 15){ff = 0;jm = 0;}
                      }
	            else if(jm++ > 60){ff = 1; jm = 0;}      //闪烁频率
               }
           display(show);
     	   key = RMT_SCAN();                      //遥控
  	       switch(key)
	           {case 4:flag = flag + 1;            //SWITCH_KEY,时段切换
                       if(flag > 3)flag = 1;
                       switch(flag){case 1:c_flash = 1;m_flash = 0;s_flash = 0;break;
                                    case 2:c_flash = 0;m_flash = 1;s_flash = 0;break;
                                    case 3:c_flash = 0;m_flash = 0;s_flash = 1;break;
                                    default:break;
                                   }
                       break;
                case 8:pflag = 1;break;            //ADJUST_KEY,数字增加
                case 1:nflag = 1;break;            //CLOCK_KEY,数字减小
                case 2: {dingshi = (unsigned long)day[2]*3600+(unsigned long)day[1]*60+(unsigned long)day[0];          
                         //TIMER_KEY,保存退出
                         if(dingshi < 301)break;//小于5分钟无效
                         th = time_to_long();
                         dingshi = dingshi + th;
                         goto pre_end;
						 }
                default:break;
                }
  }                
  pre_end:{c_flash = 0;m_flash = 0;s_flash = 0; LEDA = 0;}//倒计时启动,指示灯亮
  FY1 = 1;//地址选择,启动倒计时
   /*************定时状态******************/
  while(1){pt = M41T0_Receive();
           for(i = 0;i < 8;i++)dat[i] = *(pt+i);
           shi = (dat[2]&0x0f) + (dat[2]>>4)*10;
           feng = (dat[1]&0x0f) + (dat[1]>>4)*10;
           miao = (dat[0]&0x0f) + (dat[0]>>4)*10;
           th = miao + feng*60 + shi*3600;
           th = dingshi - th;                   //当前定时时间
           if(th > 86399)th = th - 86400;       //总时长超过24小时,当前时间进入第二天
           if(th == 300)FY2 = 1;                 //定时状态,倒计时5分钟语音提示
           if(th < 2 ){LEDA = 1;FY3 = 1; break;}              //定时结束,指示灯灭
           shi = th/3600;
           feng = (th%3600)/60;
		   miao = th%60;
		   show[0] = tab[miao%10];        //秒个位
           show[1] = tab[miao/10];        //秒十位
           show[2] = tab[feng%10];        //分个位
           show[3] = tab[feng/10];        //分十位
           show[4] = tab[shi%10];        //时个位
           show[5] = tab[shi/10];        //时十位 
           display(show);     
          } 

}

void clock_adj(void)
{uchar idata day[8];

⌨️ 快捷键说明

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