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

📄 智能电子表.c

📁 单片机编程:智能电子表设计:日历、时钟、秒表、定时器、温度计
💻 C
字号:
 ////////////////////////////////////////
 //         智能电子表
 // 功能:日历、时钟、秒表、定时器、温度计
 ////////////////////////////////////// //
#include <reg52.h>
#include <absacc.h>
#include <math.h>                          //使用89s52
#define uchar unsigned char
#define uint unsigned int
#define IN3 XBYTE[0xFEF3]
uchar tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar display[6];
uchar cover1,cover2,cover3;
uchar m,m0,mo,s,s0,so,i,h,dm,ds,dh,status,status1,status2,status3,status4,key,flag0,flag1,flag3,flag4,flag5,flag6;
uint time,time1,time0,timeo,dd,mm,weekday,t;
 sbit P21=P2^1;                 //给出蜂鸣器驱动信号
void dlms(uchar count)		//延迟函数,参数为毫秒数
{unsigned char i,j;
  for(i=0;i<count;i++)
    for(j=0;j<100;j++)	  ;
}

void timer0(void) interrupt 1 using 1
{
    TH0=-9216/256;
    TL0=-9216%256;
    t=0x00;
    XBYTE[0xFEF3]=0x00;
    t=XBYTE[0xFEF3];
    time=time+1;  time0=time0+1;
     if(m==dm&h==dh)       //到达定时时间,输出信号是蜂鸣器响
{

	if((s-ds)%2==1)     //每隔1s响一次
        P21=0x80;
        else
        P21=0x00;

	}
     if(time==100)            //时钟计时
     {
        time=0;
        s=s+1;
        if(s==60)
        {
            s=0;
            m=m+1;
            if(m==60)
            {
                m=0;
				h=h+1;
				if(h==24)
				{
					h=0;
					dd=dd+1;                 //日期为mm:dd
                                        weekday=weekday+1;      //weekday为星期
                                        weekday=weekday%7+1;
					if((dd==30&(mm==2|4|6|9|11))|(dd==31))
					{
						dd=1;
						mm=mm+1;
						if(mm==12)
						{
							mm=1;

						}
					}
				}

		}
             }
          }
    switch(flag0)
    { case 0:  break;
      case 1:  display[0]=m/10;display[1]=m%10;display[2]=s/10;   //显示时钟
               display[3]=s%10;display[5]=h/10;display[4]=h%10;
               break;
      case 2:  if(time0==100)      //秒表计时
	       {
		   time0=0;
		   s0=s0+1;
		   if(s0==60)
		   {
			   s0=0;
			   m0=m0+1;
			   if(m0==60)
			   {
				   m0=0;
			   }
		   }
	       }
	       display[0]=s0/10;display[1]=s0%10;display[2]=time0/10; //显示计时秒表
               display[3]=time0%10;display[5]=m0/10;display[4]=m0%10;
               break;
     case 3: display[0]=mm/10;display[1]=mm%10;display[2]=dd/10;       //显示日期
             display[3]=dd%10;display[5]=0;display[4]=weekday%10;
             break;
     case 4: display[0]=so/10;display[1]=so%10;display[2]=timeo/10;     //显示暂停秒表
             display[3]=timeo%10;display[5]=mo/10;display[4]=mo%10;
             break;
     case 5: display[0]=dm/10;display[1]=dm%10;display[2]=ds/10;      //显示定时
             display[3]=ds%10;display[5]=dh/10;display[4]=dh%10;
             break;
             break;
     case 6: display[0]=0;display[1]=t/100;display[2]=t/10;      //显示温度
             display[3]=t%10;display[5]=0;display[4]=0;
             break;
}

 }


void timer1(void) interrupt 3 using 3
{
    TH1=-50000/256;
    TL1=-50000%256;
    time1=time1+1;
    if(time1==4)
    { //去抖动
        time1=0;
        if(P2|0x0f!=0xff)
        {
            key=~(P2|0x0f);
            if(key==0x10)  //总控制键key5
            {
                status=status+1;
                if(status==5)
                {
                    status=0;
                }
                cover1=0x7f;
                cover2=0x7f;
                cover3=0x7f;
                flag1=0;
                flag3=0;
                flag4=0;
                flag5=0;
               //%%%%%%%%%%%%%%以下为秒表功能 %%%%%%%%%%%%%%%%%%
		if(status==1)
                {
					flag1=1;          //秒表功能标志

                      time0=0;timeo=0;                    //秒表清零
		      s0=0;so=0;
		      m0=0;mo=0;
                        flag0=4;
              }
              			}
			if(key==0x20&flag1==1)
			{
				status1=status1+1;
				if(status1==2)
				{
					status1=0;
				}
				if(status1==0)             //按2次则停止计时
				{       mo=m0;
                                        so=s0;
                                        timeo=time0;
					flag0=4;
				}
				else                           //按1次继续计时
				{       time0=timeo;
                                        s0=so;
                                        m0=mo;
					flag0=2;
				}
			}
			if(key==0x40&flag1==1)         //秒表清零
			{

				time0=0;timeo=0;
				s0=0;so=0;
				m0=0;mo=0;
			       flag0=4;
			}
                  //%%%%%%%%%%%%%%以上为秒表功能,以下为定时%%%%%%%%%%%%%%%%%%

    if(status==4)
   {
	flag5=1;                 //定时标志
	flag0=5;
}
		   if(key==0x20&flag5==1)
		   {       cover1=0x7f;
                                cover2=0x7f;
                                cover2=0x7f;
			   status2=status2+1;
		//	   k=status2/4;
		//	   if(k>=11)
		//		   k=0;
		//	   if(status2%4==0)
		//		{
		//		  	flag0=6;
		//			goto AA;
		//		}
               switch(status2%4)
               { case 0: break;
                 case 1:  cover1=0xff;     //按一下调秒位提示信息
                          cover2=0x7f;
                          cover3=0x7f;
			  break;
		 case 2:   cover1=0x7f;            //按二下调分位提示信息
			   cover2=0xff;
                           cover3=0x7f;
			   break;
                 case 3:    cover1=0x7f;         //按三下调时位提示信息
		            cover2=0x7f;
                            cover3=0xff;
                            break;
                            break;
		}
			}
                 if(key==0x40&flag5==1)
                 switch(status2%4)
                 {case 0:break;
                  case 1:ds=ds+1;        //按一下调秒位
                         if(ds==60)
			    ds=0;
                         break;
                  case 2: dm=dm+1;    //按二下调分位
			  if(dm==60)
			     dm=0;
                          break;
                  case 3: dh=dh+1;          //按三下调时位
			  if(dh==24)
                              dh=0;
                          break;
                          break;
                 }

		//%%%%%%%%%%%%%以上为定时,以下为调整时钟%%%%%%%%%
           if(status==2)
		   {
			 //  TR0=0;
			   flag3=1;       //时钟调整标志
                           flag0=1;

		   }
		   if(key==0x20&flag3==1)
			{
                        	status3=status3+1;
				if(status3==3)
				{
					status3=0;
				}

	        switch(status3)
               { case 0:    cover1=0x7f;         //按三下调时位提示信息
		            cover2=0x7f;
                            cover3=0xff;
                            break;
                 case 1:  cover1=0xff;     //按一下调秒位提示信息
                          cover2=0x7f;
                          cover3=0x7f;
			  break;
		 case 2:   cover1=0x7f;            //按二下调分位提示信息
			   cover2=0xff;
                           cover3=0x7f;
			   break;
                           break;

		}

			}
               if(key==0x40&flag3==1)
                 switch(status3)
                 {case 0: h=h+1;          //按三下调时位
			  if(h==24)
                              h=0;
                          break;
                  case 1:s=s+1;        //按一下调秒位
                         if(s==60)
			    s=0;
                         break;
                  case 2: m=m+1;    //按二下调分位
			  if(m==60)
			     m=0;
                          break;
                          break;
                 }

           //%%%%%%%%%%%%%%%调整日期%%%%%%%%%%%%%%%
                 if(status==3)
		   {
			 //  TR0=0;
			   flag4=1;
                           flag0=3;
                             }
		   if(key==0x20&flag4==1)
			{       status4=status4+1;
				if(status4==3)
				{
					status4=0;
				}
                  switch(status4)
               { case 0:    cover1=0x7f;         //按一下调星期位提示信息
		            cover2=0x7f;
                            cover3=0xff;
                            break;
                 case 1:  cover1=0xff;      //按一下调日期位提示信息
                          cover2=0x7f;
                          cover3=0x7f;
			    break;
		 case 2:   cover1=0x7f;            //按一下调月份位提示信息
			   cover2=0xff;
                           cover3=0x7f;
			   break;
                           break;
		}
			}
                if(key==0x40&flag4==1)
                 switch(status4)
                 {case 0: weekday=weekday+1;         //按一下调星期位
                          if(weekday==8)
                             weekday=1;
                             break;
                  case 1: dd=dd+1;                   //按一下调日期位
                         if((dd==29&mm==2)|(dd==31&(mm==4|mm==6|mm==9|mm==11))|(dd==32))
                           dd=1;
                            break;
                  case 2:   mm=mm+1;            //按一下调月份位
                            if(mm==13)
                               mm=1;
                                break;
                                 break;
                 }

                 //%%%%%%%%%%%%%%以上为调整时钟,以下为返回%%%%%%%%%
             //   if(status==6)
            //  {flag6=1;
            //  dlms(5);
            //   t=t/3;
            //  }

                if(status==0)
                {
                flag0=1;
                }
                //%%%%%%%%%%%%%%%%%%显示%%%%%%%%%%%%%
                 if(key==0x20&flag1==0&flag5==0&flag3==0&flag4==0)  //只按key6显示日期
                 flag0=3;
                 else if(key==0x40&flag1==0&flag5==0&flag3==0&flag4==0)  // 只按key7显示定时
                 flag0=5;
                 if(key==0x80&flag1==0&flag5==0&flag3==0&flag4==0)  //只按key8显示日期
                  {
                  flag0=6;
                   dlms(1);
                  }

     }
     }

}

main()
{
    TMOD=0x11;
    TH0=-9216/256;
    TL0=-9216%256;
    TH1=-50000/256;
    TL1=-50000%256;
    IE=0x8a;
    status=0; status1=0; status2=0; status3=0;  status4=0;  //功能进入标志
    flag1=0; flag3=0;    flag5=0;  	flag0=1;     //功能操作标志
   weekday=06;mm=05; 	dd=25;   //日期
   h=12;m=00;  s=00;             //时钟
   m0=0; s0=0;       //秒表
   mo=0; so=0;        //暂停秒表计时
   ds=00; dm=01;   dh=12;       //定时
   cover1=0x7f;cover2=0x7f;    cover3=0x7f;     //操作位标志
   time=0;   time1=0;    time0=0;    timeo=0;
   TCON=0x50;
   TR0=1;
    while(1)
    {    //后三位可显示温度
        P3=0x01;
        P1=tab[display[3]]&cover1; //显示0.01秒位,或显示秒个位,或显示日期位
        dlms(1);

        P3=0x02;
        P1=tab[display[2]]&cover1; //显示0.1秒位,或显示秒十位,或显示日期位
        dlms(1);

        P3=0x04;
        P1=tab[display[1]]&cover2; //显示秒个位,或显示分个位,或显示月份位
        dlms(1);

        P3=0x08;
        P1=tab[display[0]]&cover2; //显示秒十位,或显示分十位,或显示月份位
        dlms(1);

        P3=0x10;
        P1=tab[display[4]]&cover3; //显示分位,或显示时个位,或显示星期位
        dlms(1);

        P3=0x20;
        P1=tab[display[5]]&cover3; //显示分十位,或显示时十位
        dlms(1);

      }

}

⌨️ 快捷键说明

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