<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

      AT89C51,51單片機1602液晶顯示時鐘程序

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2018-03-12

      51單片機時鐘c語言程序,這是一款AT89C51單片機1602液晶顯示時鐘程序,功能主要有:溫度、時間、日期、星期顯示以及調節。有多級菜單顯示。第一級菜單調節時間、日期。第二級菜單顯示自定義信息。
      AT89C51單片機1602液晶顯示時鐘程序

      #include"reg52.h"
      #include"intrins.h"
      #define uchar unsigned char
      #define uint unsigned int
      sbit DQ=P2^1;
      sbit light=P2^7;
      sbit k1=P1^0;
      sbit k2=P1^1;
      sbit k3=P1^2;
      sbit k4=P1^3;
      sbit k5=P1^4;
      sbit LED1=P1^3;
      sbit LED2=P1^4;
      sbit DS1302_CE=P3^5;
      sbit DS1302_IO=P3^6;
      sbit DS1302_SCLK=P3^7;
      sbit LCD1602_RS=P2^4;
      sbit LCD1602_RW=P2^5;
      sbit LCD1602_EN=P2^6;
      extern uchar wendu[4];
      extern void get_wendu();
      extern void LCD1602_init();
      extern void LCD1602_wcmd(uchar cmd);
      extern void LCD1602_wdat(uchar dat);
      extern void LCD1602_pos(uchar x,bit y);         //定義顯示位置,x為列,y為行,0上1下
      extern void LCD1602_dischar(uchar x,bit y,uchar dat); //在指定位置顯示字符
      extern void LCD1602_prints(uchar x,bit y,uchar *p);  //顯示字符串
      extern uchar dt[7];
      extern void set_time();
      extern void get_time();
      extern void DS1302_init();
      
      uchar dt[7];
      void DS1302_write_byte(uchar dat)
      {
        char i;
        for(i=0;i<8;i++)
        {
          DS1302_SCLK = 0;
              _nop_();
              _nop_();
              dat >>= 1;
              DS1302_IO = CY;
              DS1302_SCLK=1;
              _nop_();
              _nop_();
        }
      }
      uchar DS1302_read_byte()
      {
        uchar i;
        uchar dat = 0;
        for(i=0;i<8;i++)
        {
          DS1302_SCLK = 0;
              _nop_();
              _nop_();
              dat >>= 1;
              if(DS1302_IO) dat |= 0x80;
              DS1302_SCLK =1;
              _nop_();
              _nop_();
        }
        return dat;
      }
      
      void DS1302_write(uchar address,uchar dat)
      {
        DS1302_CE=0;
        _nop_();
        _nop_();
        DS1302_SCLK=0;
        _nop_();
        _nop_();
        DS1302_CE=1;
        _nop_();
        _nop_();
        DS1302_write_byte(address);
        DS1302_write_byte(dat);
        DS1302_SCLK=1;
        DS1302_CE=0;
      }
      
      uchar DS1302_read(uchar address)
      {
        uchar dat;
        DS1302_CE=0;
        _nop_();
        _nop_();                                         
        DS1302_SCLK=0;
        _nop_();
        _nop_();
        DS1302_CE=1;
        _nop_();
        _nop_();
        DS1302_write_byte(address);
        dat =DS1302_read_byte();
        DS1302_SCLK=1;
        DS1302_CE=0;
        dat=dat/16*10+dat;
        return dat;
      }
      void DS1302_init()
      {
        DS1302_write(0x8e,0x00);
        DS1302_write(0x80,0x00);
        DS1302_write(0x82,0x00);
        DS1302_write(0x84,0x12);
        DS1302_write(0x86,0x10);
        DS1302_write(0x88,0x11);
        DS1302_write(0x8a,0x06);
        DS1302_write(0x8c,0x12);
        DS1302_write(0x8e,0x80);
      }
      void set_time()
      {
        uchar i,j=0x80;
        for(i=0;i<7;i++)
        {
          dt[i]=dt[i]/10*16+dt[i];
        }
        DS1302_write(0x8e,0x00);
        DS1302_write(0x80,0x00);
        for(i=0;i<7;i++)
        {
          DS1302_write(j,dt[i]);
          j+=2;
        }
        DS1302_write(0x8e,0x80);
      }
      void get_time()
      {
        dt[0] =DS1302_read(0x81);
        dt[1] =DS1302_read(0x83);
        dt[2] =DS1302_read(0x85);
        dt[3] =DS1302_read(0x87);
        dt[4] =DS1302_read(0x89);
        dt[5] =DS1302_read(0x8b);
        dt[6] =DS1302_read(0x8d);
      }
      void chaongdiaon()                                   //充電
      {
      DS1302_write(0x8e,0x00);          
        _nop_();
        _nop_();
      DS1302_write(0x90, 0xa6);    //使能充電   用一個二極管  用4k電阻
      DS1302_write(0x8e,0x80);          
        _nop_();
        _nop_();
      }
      uchar code self_char[]={
        0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, //年
        0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x01, //月
        0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //日
        0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //溫度標志— —攝氏度
        0x00,0x04,0x0E,0x1F,0x0E,0x04,0x00,0x00, //符號◆
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //全開
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00         //
                                                 };
      bit lcd_busy()
      {
        bit result;
        LCD1602_RS=0;
        LCD1602_RW=1;
        LCD1602_EN=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        result = (bit)(P0&0x80);
        LCD1602_EN=0;
        return(result);
      }
      void LCD1602_wcmd(uchar cmd)
      {
        while(lcd_busy());
        LCD1602_RS=0;
        LCD1602_RW=0;
        _nop_();
        _nop_();
        LCD1602_EN=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        P0=cmd;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD1602_EN=0;
      }
      void LCD1602_wdat(uchar dat)
      {
        while(lcd_busy());
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_EN=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        P0=dat;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD1602_EN=0;
      }
      void LCD1602_pos(uchar x,bit y)                //指定坐標,x為列,0~15,y為行,0為第一行,1為第二行。
      {
        if(y)LCD1602_wcmd(x|0xc0);
        else LCD1602_wcmd(x|0x80);
      }
      void LCD1602_dischar(uchar x,bit y,uchar dat)        //指定位置顯示一個字符
      {
        LCD1602_pos(x,y);
        LCD1602_wdat(dat);
      }
      void LCD1602_prints(uchar x,bit y,uchar *p)                                        //指定位置顯示字符串
      {
        LCD1602_pos(x,y);
        while((*p) != '\0') {LCD1602_wdat(*p);p++;}
      }
      void LCD1602_init()
      {
        uchar i;
        LCD1602_wcmd(0x40);
        for(i=0;i<64;i++)
              {
                LCD1602_wdat(self_char[i]);
              }
        LCD1602_wcmd(0x38);
        LCD1602_wcmd(0x38);
        LCD1602_wcmd(0x0c);
        LCD1602_wcmd(0x06);
        LCD1602_wcmd(0x01);
      }
      uchar wendu[4];
      void delay_18b20(uchar i)
      {
        int j;
        for(j=0;j
      }
      uchar init_18b20()
      {
        uchar i;
        DQ=0;
        delay_18b20(30);
        DQ=1;
        delay_18b20(3);
        i=DQ;
        delay_18b20(20);
        return(i);
      }
      uchar read_18b20_bit()
      {
        uchar i;
        DQ=0;
        DQ=1;
        for(i=0;i<3;i++);
        return(DQ);
      }
      void write_18b20_bit(unsigned xbit)
      {
        DQ=0;
        if(xbit==1)
        DQ=1;
        delay_18b20(5);
        DQ=1;
      }
      uchar read_18b20_byte()
      {
        uchar i,j,value;
        j=1;
        value=0;
        for(i=0;i<8;i++)
        {
              if(read_18b20_bit())
              {
                value=value+(j<>i;
              j=j&0x01;
              write_18b20_bit(j);
              delay_18b20(5);
        }
      }
      void get_wendu()
      {
        uchar a,b;
        float get_temp;
        int temp1,temp2;
        init_18b20();
        write_18b20_byte(0xcc);
        write_18b20_byte(0x44);
        init_18b20();
        write_18b20_byte(0xcc);
        write_18b20_byte(0xbe);
        a=read_18b20_byte();         //低8位
        b=read_18b20_byte();         //高8位
        temp1=b;
        temp1=temp1<<8;
        temp1=temp1|a;
        if(b&0xfc)
              {wendu[0]=1;temp1=~temp1+1;}                //0正1負
        else 
          wendu[0]=0;
        get_temp=temp1*0.0625;
        temp2=get_temp*10+0.5;
        wendu[1]=temp200/100;
        wendu[2]=temp2000/10;
        wendu[3]=temp2000;
      }
      
      uchar mode=0,OK=0;
      uchar dis1[16],dis2[16];
      //uchar IRCOM[7],IRCODE=0;
      uchar NUM1,NUM2;
      uchar count;
      bit L=0,select=0,DIS_EN=1,SHAN;
      void delay(uint i)
      {
        uchar j;
        while(i-- !=0)
        {
          for(j=0;j<120;j++);
        }
      }
      void delay1(uchar i)
      {
        uchar j;
        while(i--)
        {for(j=0;j<13;j++){}}
      }
      
      void get_dis()
      {
        dis1[0]='2';
        dis1[1]='0';
        dis1[2]=0x30+dt[6]/10;
        dis1[3]=0x30+dt[6];
        dis1[4]=0;
        dis1[5]=0x30+dt[4]/10;
        dis1[6]=0x30+dt[4];
        dis1[7]=1;
        dis1[8]=0x30+dt[3]/10;
        dis1[9]=0x30+dt[3];
        dis1[10]=2;
        dis1[11]=' ';
        dis1[12]=' ';
        switch(dt[5])
        {
              case 1: {
                                dis1[13]='M';
                                dis1[14]='o';
                                dis1[15]='n';
                              }
                              break;
              case 2: {
                                dis1[13]='T';
                                dis1[14]='u';
                                dis1[15]='e';
                              }
                              break;
              case 3: {
                                dis1[13]='W';
                                dis1[14]='e';
                                dis1[15]='d';
                              }
                              break;
              case 4: {
                                dis1[13]='T';
                                dis1[14]='h';
                                dis1[15]='u';
                              }
                              break;
              case 5: {
                                dis1[13]='F';
                                dis1[14]='r';
                                dis1[15]='i';
                              }
                              break;
              case 6: {
                                dis1[13]='S';
                                dis1[14]='a';
                                dis1[15]='t';
                              }
                              break;
              case 7: {
                                dis1[13]='S';
                                dis1[14]='u';
                                dis1[15]='n';
                              }
                              break;
        }
        dis2[0]=' ';
        dis2[1]=0x30+dt[2]/10;
        dis2[2]=0x30+dt[2];
        dis2[3]=':';
        dis2[4]=0x30+dt[1]/10;
        dis2[5]=0x30+dt[1];
        dis2[6]=':';
        dis2[7]=0x30+dt[0]/10;
        dis2[8]=0x30+dt[0];
        dis2[9]=' ';
        if(wendu[0]==1)
              dis2[10]=0x2d;
        else
              dis2[10]=' ';
        dis2[11]=0x30+wendu[1];
        dis2[12]=0x30+wendu[2];
        dis2[13]='.';
        dis2[14]=0x30+wendu[3];
        dis2[15]=3;
      }
      void keyscan()
      {
        if(k1==0)
        {
              delay(10);
              if(k1==0)
              {
                 while(!k1);
                mode++;
                if(mode==1 && OK==0)
                      LCD1602_wcmd(0x01);         
                if(mode==2 && OK==0)        
                {
                      mode=0;
                      select=0;
                }
                if(select==0 && OK==1)
                {
                      if(mode==7)
                        mode=1;
                }
                if(select==1 && OK==1)
                {
                      if(mode==6)
                        mode=1;
                }
              }
        }
      if(k2==0)
        {
              delay(10);
              if(k2==0)
              {
                while(!k2);
                if(mode==1 && OK==0)
                  {select=~select;LCD1602_wcmd(0x01);}
                NUM1++;
              }
        }
        if(k3==0)
        {
              delay(10);
              if(k3==0)
              {
                while(!k3);
                if(mode==1 && OK==0)
                  {select=~select;LCD1602_wcmd(0x01);}
                NUM2++;
              }
        }
        if(k4==0)
        {
              delay(10);
              if(k4==0)
              {
                while(!k4);
                if(mode==0)
                      light=~light;
                if(mode !=0)
                {
                  LCD1602_wcmd(0x01);
                      OK++;
                      NUM1=0;
                      NUM2=0;
                      if(OK==2)
                      {
                        LCD1602_wcmd(0x01);
                        set_time();
      //                  set_alarm();
                        mode=0;
                        select=0;
                        OK=0;
                      }
                }
              }
        }
        if(k5==0)
        {
              delay(100);
              if(k5==0)
              {
                while(!k5);
                DS1302_init();
              }
        }        
      }        
      
      
      void display()
      {
        get_wendu();
        get_dis();
        if(mode==0)        //正常模式                                         
        {
              uchar i;
              LED1=1;
              get_time();
      //        get_alarm();
              LCD1602_pos(0,0);
              for(i=0;i<16;i++)
                LCD1602_wdat(dis1[i]);
              LCD1602_pos(0,1);
              for(i=0;i<16;i++)
                LCD1602_wdat(dis2[i]);
        }
        if(mode==1&&OK==0)  //菜單模式
        {
              LCD1602_prints(1,0,"1.Set Time");
              LCD1602_prints(1,1,"2.About...");
              if(select)
                LCD1602_dischar(0,1,4);
              else
                LCD1602_dischar(0,0,4);
        }
        if(OK==1&&select==0)          //調日期模式
        {
              uchar i;
              LCD1602_pos(0,0);
              for(i=0;i<16;i++)
                LCD1602_wdat(dis1[i]);
              LCD1602_pos(0,1);
              for(i=0;i<10;i++)
                LCD1602_wdat(dis2[i]);
              LCD1602_prints(10,1,"Set...");
              if(SHAN==1) LCD1602_prints(10,1,"Set.  ");
              if(mode==1)                  //調分模式,秒位清零
              {
                dt[0]=0;
                LCD1602_dischar(7,1,0x30+dt[0]/10);
                LCD1602_dischar(8,1,0x30+dt[0]);
                if(NUM1!=0)
                      {
                        dt[1]++;
                        if(dt[1]==60)
                              dt[1]=0;
                        LCD1602_dischar(4,1,0x30+dt[1]/10);
                        LCD1602_dischar(5,1,0x30+dt[1]);
                        NUM1=0;
                      }
                      if(NUM2!=0)
                      {
                        dt[1]--;
                        if(dt[1]==-1)
                              dt[1]=59;
                        LCD1602_dischar(4,1,0x30+dt[1]/10);
                        LCD1602_dischar(5,1,0x30+dt[1]);
                        NUM2=0;
                      }
                      if(SHAN==1) LCD1602_dischar(5,1,5);
                      
              }
                else
                 if(mode==2)         //調時模式
                 {
                          if(NUM1!=0)
                       {
                         dt[2]++;
                         if(dt[2]==24)
                               dt[2]=0;
                         LCD1602_dischar(1,1,0x30+dt[2]/10);
                         LCD1602_dischar(2,1,0x30+dt[2]);
                         NUM1=0;
                       }
                       if(NUM2!=0)
                       {
                         dt[2]--;
                         if(dt[2]==-1)
                               dt[2]=23;
                         LCD1602_dischar(1,1,0x30+dt[2]/10);
                         LCD1602_dischar(2,1,0x30+dt[2]);
                         NUM2=0;
                       }
                        if(SHAN==1) LCD1602_dischar(2,1,5);
                  }
                      if(mode==3)        //調星期狀態
                 {
                          if(NUM1!=0)
                       {
                         dt[5]++;
                         if(dt[5]==8)
                               dt[5]=1;
                         switch(dt[5])
                         {
                                  case 1: LCD1602_prints(13,0,"Mon");break;
                               case 2: LCD1602_prints(13,0,"Tue");break;
                               case 3: LCD1602_prints(13,0,"Wed");break;
                               case 4: LCD1602_prints(13,0,"Thu");break;
                               case 5: LCD1602_prints(13,0,"Fri");break;
                               case 6: LCD1602_prints(13,0,"Sat");break;
                               case 7: LCD1602_prints(13,0,"Sun");break;
                         }
                         NUM1=0;
                       }
                       if(NUM2!=0)
                       {
                         dt[5]--;
                         if(dt[5]==0)
                               dt[5]=7;
                         switch(dt[5])
                         {
                                  case 1: LCD1602_prints(13,0,"Mon");break;
                               case 2: LCD1602_prints(13,0,"Tue");break;
                               case 3: LCD1602_prints(13,0,"Wed");break;
                               case 4: LCD1602_prints(13,0,"Thu");break;
                               case 5: LCD1602_prints(13,0,"Fri");break;
                               case 6: LCD1602_prints(13,0,"Sat");break;
                               case 7: LCD1602_prints(13,0,"Sun");break;
                         }
                         NUM2=0;
                       }
                        if(SHAN==1) LCD1602_dischar(15,0,5);
                  }
                      if(mode==4)          //調日模式
                 {
                          if(NUM1!=0)
                       {
                         dt[3]++;
                         if(dt[3]==32)
                               dt[3]=1;
                         LCD1602_dischar(8,0,0x30+dt[3]/10);
                         LCD1602_dischar(9,0,0x30+dt[3]);
                         NUM1=0;
                       }
                       if(NUM2!=0)
                       {
                         dt[3]--;
                         if(dt[3]==0)
                               dt[3]=31;
                         LCD1602_dischar(8,0,0x30+dt[3]/10);
                         LCD1602_dischar(9,0,0x30+dt[3]);
                         NUM2=0;
                       }
                        if(SHAN==1) LCD1602_dischar(9,0,5);
                  }
                      if(mode==5)                //調月模式
                 {
                          if(NUM1!=0)
                       {
                         dt[4]++;
                         if(dt[4]==13)
                               dt[4]=1;
                         LCD1602_dischar(5,0,0x30+dt[4]/10);
                         LCD1602_dischar(6,0,0x30+dt[4]);
                         NUM1=0;
                       }
                       if(NUM2!=0)
                       {
                         dt[4]--;
                         if(dt[4]==0)
                               dt[4]=12;
                         LCD1602_dischar(5,0,0x30+dt[4]/10);
                         LCD1602_dischar(6,0,0x30+dt[4]);
                         NUM2=0;
                       }
                        if(SHAN==1) LCD1602_dischar(6,0,5);
                  }
                      if(mode==6)          //調年模式
                 {
                          if(NUM1!=0)
                       {
                         dt[6]++;
                         if(dt[6]==100)
                               dt[6]=0;
                         LCD1602_dischar(2,0,0x30+dt[6]/10);
                         LCD1602_dischar(3,0,0x30+dt[6]);
                         NUM1=0;
                       }
                       if(NUM2!=0)
                       {
                         dt[6]--;
                         if(dt[6]==-1)
                               dt[6]=99;
                         LCD1602_dischar(2,0,0x30+dt[6]/10);
                         LCD1602_dischar(3,0,0x30+dt[6]);
                         NUM2=0;
                       }
                        if(SHAN==1) LCD1602_dischar(3,0,5);
                  }
        }
        if(OK==1&&select==1)        //調鬧鈴模式
        {
      
                LCD1602_prints(0,0," Birthday gift  ");
                LCD1602_prints(0,1,"        --by HJL");
                delay(2000);
                LCD1602_wcmd(0x01);
                LCD1602_prints(0,0,"2013-12-04 Is   ");
                LCD1602_prints(0,1,"LiYunL birthday!");
                delay(2000);
                LCD1602_wcmd(0x01);
                LCD1602_prints(0,0,"Friends together");
                LCD1602_prints(0,1,"for life...     ");
                delay(2000);
                LCD1602_wcmd(0x01);
                  mode=1 ;
                OK=0;
        }
      }
      void diy()
      {
        LCD1602_init();
        delay(1);
        LCD1602_prints(0,0," Digital Clock  ");
        LCD1602_prints(0,1,"v1.1.0  --by HJL");
        delay(1000);
        LCD1602_wcmd(0x01);             
      }
      
      void main()
      {
        IT0=1;          //外部中斷0為下降沿觸發
        EX0=1;          //
        TMOD=0x01;
        TH0=0x3C;                //50ms
        TL0=0xB0;
        EA=1;
        ET0=1;
        TR0=1;
        get_wendu();
        diy();
        chaongdiaon();
      
        while(1)
        {
          P1=0xff;
                keyscan();
              display();
        }
      }
      
      void timer0() interrupt 1
      {
        TH0=0x3C;
        TL0=0xB0;
        count++;
        if(count==10)
        {
              count=0;
              SHAN=~SHAN;
        }
      } 
      
      
      Tags:51單片機,c語言程序,單片機時鐘  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 色综合久久天天综合| 久久综合久久综合九色| 亚洲综合av永久无码精品一区二区 | 色婷婷六月亚洲综合香蕉| 精品综合久久久久久98| 国产综合激情在线亚洲第一页| 综合亚洲伊人午夜网| 激情伊人五月天久久综合| 亚洲VA综合VA国产产VA中| 亚洲AV日韩综合一区尤物| 色欲久久久天天天综合网| 国产成人精品综合久久久| 色综合久久久无码网中文| 亚洲伊人tv综合网色| 伊人久久大香线焦AV综合影院| 亚洲heyzo专区无码综合| 亚洲综合无码一区二区三区| 狠狠色狠狠色综合曰曰| 日本一道综合久久aⅴ免费| 亚洲欧洲国产综合| 色综合久久中文色婷婷| 亚洲色欲www综合网| 色狠狠色狠狠综合天天| 亚洲综合在线成人一区| 天天综合网色中文字幕| 一本色道久久88—综合亚洲精品| 一本久久a久久精品综合香蕉| 久久国产综合精品SWAG蓝导航| 一本久道综合在线无码人妻 | 久久综合久久性久99毛片| 亚洲综合久久夜AV | 国产综合成色在线视频| 五月丁香六月综合缴清无码| 麻豆精品一区二区综合av| 综合久久国产九一剧情麻豆| 国产色综合一二三四| 伊人久久大香线蕉综合影院首页| 一本大道久久a久久精品综合| 色综合久久中文色婷婷| 综合一区自拍亚洲综合图区| 亚洲国产免费综合|