久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12545|回復: 11
打印 上一主題 下一主題
收起左側

51單片機實時時鐘程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:96742 發表于 2015-12-1 21:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
原理圖在7樓。。!
#include<reg52.h>
#define uint unsigned int  
#define uchar unsigned char
bit write=0;         //寫2402的標志
sbit scl=P2^1;                         //IC總線的位置
sbit sda=P2^0;
sbit RST=P2^5;   
sbit CS_DA =P2^4 ;  
sbit lcden=P2^5;                        //LCD使能端
sbit lcdrd=P1^0;                        //數據命令選擇端
sbit lcdwr=P1^1;                         //讀寫選端
uchar n,m;
char miao,shi,fen;
sbit k1=P3^4;                                   //開關的位置
sbit k2=P3^5;
sbit k3=P3^6;
sbit beep=P2^3;                                  //蜂鳴器的位置
uchar code t[]="2015-11-01 sun";  //時間
void delay()                                //延時函數
{;;}
void delays(uint x)                         //延時函數2
{ uint i,j;
for(i=0;i<x;i++)
for(j=0;j<115;j++);
  }                                                         //延時X*MS
void start()                                 //啟動信號
{ sda=1;
  delay();
  scl=1;                                           //SCL高電平
  delay();
  sda=0;                                          //SDA下降沿的時候
  delay();
   }
void stop()                                         //停止信號
{ sda=0;
  delay();
  scl=1;
  delay();
  sda=1;
  delay();
    }
void respons()                                         //應答信號
{ uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))
i++;
scl=0;                                                         //低電平應該成功
delay();
   }
void init()                                                //初始化24C16芯片
{
   RST=0;   
CS_DA =0 ;  
sda=1;
  delay();
  scl=1;
  delay();
   }
void write_byte(uchar date)                                        //寫一個字符
{ uchar i,temp;
temp=date;
for(i=0;i<8;i++)
   {  temp=temp<<1;
   scl=0;
   delay();
   sda=CY;
   delay();
   scl=1;
   delay();
      }
   scl=0;
   delay();
   sda=1;
   delay();
   }
uchar read_byte()                                                 //讀一個字符
{ uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        { scl=1;
        delay();
        k=(k<<1)|sda;
        scl=0;
        delay();
  }
  return k;
   }
void write_add(uchar a,uchar date)                                   //指定地址寫一個字符
{ start();                                                               
   write_byte(0xa0); //器件地址
   respons();
   write_byte(a);
   respons();
   write_byte(date);
   respons();
   stop();
    }
char read_add(uchar a)
{ uchar date;                                                                                  //指定地址讀一個字符
   start();
   write_byte(0xa0);
   respons();
   write_byte(a);
   respons();
   start();
   write_byte(0xa1);
   respons();
   date=read_byte();
   stop();
   return date;
    }
void di()                                                //蜂鳴器函數
{  beep=0;
   delays(100);
   beep=1;
   }
void write_com(uchar com)                          //寫命令函數
{ lcdrd=0;                                                           //選命令端
  P0=com;
  delays(5);
  lcden=1;
  delays(5);
  lcden=0;
   }
void write_date(uchar date)                          //寫數據函數
{  lcdrd=1;                                                           //選擇數據端
   P0=date;
   delays(5);
   lcden=1;
   delays(5);
   lcden=0;
   }
void write_sfm(uchar add,uchar date)                //寫時分秒函數
{ uchar shi,ge;
shi=date/10;                                                 //分解一個2位數十位和個位
ge=date%10;
write_com(0x80+0x40+add);                          //設置顯示位置
write_date(0x30+shi);                                        //送液晶顯示十位

write_date(0x30+ge);                                        //送液晶顯示個位
    }
void inits()                                                 //初始化函數
{ uchar a;
lcdrd=0;
lcden=0;
fen=0;                                                  //初始化分鐘設置
miao=0;
shi=0;
n=0;
m=0;
init();
write_com(0x38);                  //設置16*2顯示,5*7點陣,8位數據接口
write_com(0x0c);                  //打開顯示,不顯示光標
write_com(0x06);                  //寫一個字符后地址指針自動加1
write_com(0x01);                  //顯示清0,數據指針清0
write_com(0x80);                  //顯示初始值位置
for(a=0;a<14;a++)
{
    write_date(t[a]);
        delays(5);
        }
         write_com(0x80+0x40+6);
         write_date(':');                                 //寫出時間的兩個冒號
         delays(5);
         write_date(':');
         delays(5);
         write_com(0x80+0x40+9);           //
         write_date(':');
         delays(5);
         miao=read_add(1);                        //從AT24c16讀取數據
         fen=read_add(2);
         shi=read_add(3);
         write_sfm(10,miao);                //分別送液晶顯示
         write_sfm(7,fen);
         write_sfm(4,shi);
         TMOD=0x01;                                        //定時器0工作方式1
         TH0=(65536-45872)/256;
         TL0=(65536-45872)%256;
         EA=1;                                          //開啟總中斷
         ET0=1;                                           //開啟中斷
         TR0=1;                                                //開啟定時器0
   }
void keyscan()                                           //開關函數
{ if(k1==0)
   { delays(10);                                   //去抖動
     if(k1==0)                                                //確認被按下
         { m++;
         while(!k1);                                 //等待按鍵釋放
         di();
         if(m==1)                                        //第一次被按下
         {         TR0=0;
         write_com(0x80+0x40+10);                //光標定位到秒位置
         write_com(0x0f);                                //光標開始閃爍
             }
         if(m==2)                                                  //第二次按下光標閃爍到定位到分位置
         { write_com(0x80+0x40+7);
             }
          if(m==3)                                                 //第三次按下光標閃爍定位到小時位置
          {        write_com(0x80+0x40+4);
             }
          if(m==4)                                           //第四次被按下
          {        m=0;
           write_com(0x0c);
           TR0=1;
            }
            }
     }
   if(m!=0)                                                          //只有被按下后,才有增大和減小
   { if(k2==0)
    {
          delays(10);                                        //抖動
          if(k2==0)                                                //確認被按下
          {        while(!k2);
          di();                                                   //每按下按鍵蜂鳴器響一次
          if(m==1)
          {         miao++;                                        //秒加1
            if(miao==60)                                 //滿60后清0
                miao=0;
                write_sfm(10,miao);                          //每調節一次送液晶顯示一下
                write_com(0x80+0x40+10);           //顯示位置重新回到調節處
                write_add(1,miao);                           //數據改變立即存入24C16
             }
          if(m==2)                                                   //第二次被按下
          {         fen++;                                                   //分加1
          if(fen==60)                                           //滿60后 清0
          fen=0;
          write_sfm(7,fen);                                        //每調節一次送到液晶顯示
          write_com(0x80+0x40+7);                         //顯示回到調節處
          write_add(2,fen);                                         //改變的數據立即存入24C16
             }
        if(m==3)                                                         //第三次被按下
        { shi++;                                                        //小時加1
          if(shi==24)                                                //滿24后清0
          shi=0;
          write_sfm(4,shi);                                        //每調節一次送液晶顯示一次
          write_com(0x80+0x40+4);                        //顯示位置重新回到調節處
          write_add(3,shi);                                        //改變的數據立即存取24C16
            }
             }
          }
  if(k3==0)
{ delays(10);                                                //去抖動
  if(k3==0)                                                        //確認被按下
  {        while(!k3);
    di();                                                         //第一次被按下秒減1
        if(m==1)
        {
             miao--;
          if(miao==-1)
           miao=59;
             write_sfm(10,miao);                   //每調節一次送液晶顯示
                 write_com(0x80+0x40+10);                //顯示位置重新回到調節處
                 write_add(1,miao);                                //數據改變立即存入24C16
                   }
           if(m==2)                                                   //第二次被按下分減1
           { fen--;
           if(fen==-1)
             fen=59;
                 write_sfm(7,fen);                                 //每調節一次送液晶顯示
                 write_com(0x80+0x40+7);                   //顯示位置重新回到調節處
                 write_add(2,fen);                                   //數據改變存入24C16
              }
          if(m==3)                                                          //第三次被按小時減1
          {shi--;
           if(shi==-1)
            shi=23;
                write_sfm(4,shi);                                  //每調節一次送液晶顯示
                write_com(0x80+0x40+4);                          //顯示位置重新回到調節處
                write_add(3,shi);                                   //數據改變立即存入24C16
                      }
                  }
          }
       }
    }
void main()                                                                  //主函數
{  lcdwr=0;
   inits();
while(1)
{ keyscan();
     }
   }
void time()interrupt 1                                  //定時器0中斷服務
{  TH0=(65536-45872)/256;
   TL0=(65536-45872)%256;
   n++;
   if(n==20)                                                 //1秒到了
   {  n=0;
      miao++;                                                 //滿60清0
          if(miao==60)
          {        miao=0;
          fen++;
          if(fen==60)                                   //滿60清0
           {  fen=0;
               shi++;
                   if(shi==24)                           //滿24清0
                   {  shi=0;
                      }
                write_sfm(4,shi);                        //小時變化則重新寫入
                write_add(3,shi);                         //數據改變麗江存入24C16
              }
                write_sfm(7,fen);                   //分鐘變化則重新寫入
                write_add(2,fen);                        //數據改變立即存入24C16
             }
          write_sfm(10,miao);                   //秒變化則重新寫入
          write_add(1,miao);                   //數據變化立即存入24C16
      }
   }

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:76227 發表于 2015-12-1 22:25 | 只看該作者
你貼這么多程序在這里是分享  還是求助?
回復

使用道具 舉報

板凳
ID:54731 發表于 2015-12-2 10:32 | 只看該作者
請問樓主:說明你編譯實時時鐘程序?還是問題?可以的話把圖貼出來
回復

使用道具 舉報

地板
ID:96742 發表于 2015-12-4 18:29 | 只看該作者
905377346 發表于 2015-12-1 22:25
你貼這么多程序在這里是分享  還是求助?

當然是分享了。
回復

使用道具 舉報

5#
ID:96742 發表于 2015-12-4 18:30 | 只看該作者
南天白云 發表于 2015-12-2 10:32
請問樓主:說明你編譯實時時鐘程序?還是問題?可以的話把圖貼出來

是照片么????、
回復

使用道具 舉報

6#
ID:1 發表于 2015-12-4 22:29 | 只看該作者
樓主能分享下電路圖就好了
回復

使用道具 舉報

7#
ID:96742 發表于 2015-12-5 08:58 | 只看該作者
admin 發表于 2015-12-4 22:29
樓主能分享下電路圖就好了

慧凈單片機的原理圖

HL-1 V6.5原理圖(實驗板) (3).pdf

111.32 KB, 下載次數: 80, 下載積分: 黑幣 -5

回復

使用道具 舉報

8#
ID:99905 發表于 2015-12-25 01:17 | 只看該作者
電路圖???
回復

使用道具 舉報

9#
ID:266322 發表于 2017-12-25 09:36 | 只看該作者
謝謝lz,6666666666
回復

使用道具 舉報

10#
ID:790346 發表于 2020-6-26 16:52 | 只看該作者
可以了
回復

使用道具 舉報

11#
ID:495287 發表于 2020-6-27 11:59 | 只看該作者
謝謝樓主分享,學習ING.
回復

使用道具 舉報

12#
ID:1082860 發表于 2023-6-8 19:22 來自手機 | 只看該作者
為什么我這顯示兩個警告
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久不卡| 天堂视频一区 | 国产成人免费网站 | 精品久久久久久久久久久下田 | 高清av一区 | 亚洲成人中文字幕 | 国产精品久久久久久吹潮 | www国产精品 | 国产一区二区三区 | 一级欧美| 亚洲人成人网 | 国产98色在线 | 日韩 | 在线观看特色大片免费网站 | 欧产日产国产精品99 | 亚洲精品久久久一区二区三区 | 综合中文字幕 | 黄色一级大片在线观看 | 欧美男人的天堂 | 日本一区二区电影 | 国产在线观看网站 | 欧美日韩国产三级 | 一级毛片成人免费看a | 成人在线一区二区三区 | 成人毛片网站 | 这里只有精品999 | 亚洲午夜精品一区二区三区 | 欧美精品在线播放 | 中文字幕一区在线观看视频 | 亚洲久久在线 | h在线免费观看 | 国产成人免费观看 | 国产视频1区2区 | 国产亚洲一区二区在线观看 | 欧美精品成人 | 国产精品欧美一区二区 | 中文字幕综合 | 天天操天天拍 | 日韩一区不卡 | 国产精品视频一区二区三区 | 综合伊人 | 天堂国产 |