新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > DS1302時鐘芯片顯示時間C51程序

        DS1302時鐘芯片顯示時間C51程序

        作者: 時間:2012-11-10 來源:網絡 收藏

        /*
        程序效果:通過芯片,本程序主要是要理解
            芯片的協議,這樣便于編寫程序。
            當然時間顯示也可以用單片機的定時器來控制,比起延時
            子函數來說較精準。
        */
        #includereg52.h> //頭文件
        #includeintrins.h>
        #define uchar unsigned char //宏定義
        sbit scl2=P1^3; //位聲明
        sbit sda2=P1^4;
        sbit rst2=P1^5;
        uchar tmpdata[8]={0x00,0x3b, //顯示的時間值
        0x17,0x1f,0x0c,0x08,0x09,0x00};
        uchar tmpdisplay[8];
        code uchar write_rtc_address[7]={ //寫入時間的地址
        0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
        code uchar read_rtc_address[7]={ //讀取時間的地址
        0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
        code unsigned char table[]={
        0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07,0x7f,0x6f, //共陰數碼管 0-9
        0x40,0x00}; // '-' '熄滅‘表
        void delay();
        void display(uchar *lp,uchar lc); //顯示子函數
        void write_ds1302(uchar address,uchar dat); //寫子函數
        uchar read_ds1302(uchar address);//讀子函數
        void read_rtc();
        void set_rtc();
        void main()
        {
          rst2=0;
          set_rtc();
          while(1)
          {
            read_rtc();
            switch(tmpdata[0]/5) // 設計每隔5秒交替顯示年月日 時分秒
            {  
              case 0: //顯示時分秒
              case 2:
              case 4:
              case 6:
              case 8:
              case 10:
                  tmpdisplay[0]=tmpdata[2]/16;
                  tmpdisplay[1]=tmpdata[2]0x0f;
                  tmpdisplay[2]=10; //在時與分之間加一個“-”
                  tmpdisplay[3]=tmpdata[1]/16;
                  tmpdisplay[4]=tmpdata[1]0x0f;
                  tmpdisplay[5]=10;
                  tmpdisplay[6]=tmpdata[0]/16;
                  tmpdisplay[7]=tmpdata[0]0x0f;
                  break;
              case 1: //顯示年月日
              case 3:
              case 5:
              case 7:
              case 9:
              case 11:
                  tmpdisplay[0]=tmpdata[6]/16;
                  tmpdisplay[1]=tmpdata[6]0x0f;
                  tmpdisplay[2]=10;
                  tmpdisplay[3]=tmpdata[4]/16;
                  tmpdisplay[4]=tmpdata[4]0x0f;
                   tmpdisplay[5]=10;
                  tmpdisplay[6]=tmpdata[3]/16;
                  tmpdisplay[7]=tmpdata[3]0x0f;
                  break;
              default :
                break;
              }
            display(tmpdisplay,8);
          }
        }
        void display(uchar *lp,uchar lc) //lp為數組的首地址,lc為顯示的個數
        {
          uchar i; //定義局部變量
          P2=0; //清零端口,準備顯示
          P1=P10xf8; //不影響P1口的高5位,低三位用于控制哪個數碼管亮
          for(i=0;ilc;i++) //循環顯示
          {
            P2=table[lp[i]];//查表獲得相應的數值
            delay(); //延時,使數碼管更加亮
            P2=0; //清零端口,準備顯示下一位
            P1++; //點亮下一個數碼管
          }
        }
        void delay() //延時子函數
        {
          uchar i; //i的值的大小可以決定數碼管的亮暗的程度
          for(i=20;i>0;i--); //但i的值要適中,并不是越大越好
        }
        void write_ds1302_byte(uchar temp) //寫子函數
        {
          uchar i;
          for(i=0;i8;i++) //循環8次,寫入數據
          {
            scl2=0;
            sda2=temp0x01; //每次傳輸低字節
            temp>>=1; //右移一位
            scl2=1;
          }
        }
        void write_ds1302(uchar address,uchar dat) //根據ds1302協議編寫的程序
        {
          rst2=0;
          _nop_();
          scl2=0;
          _nop_();
          rst2=1;
          _nop_(); //從此后開始發送數據
          write_ds1302_byte(address);//發送地址
          write_ds1302_byte(dat); //發送數據
          rst2=0; //停止發送數據
        }
        uchar read_ds1302(uchar address) //根據ds1302編寫的程序
        {
          uchar i,temp=0;
          rst2=0;
          _nop_();
          scl2=0;
          _nop_();
          rst2=1;
          _nop_();
          write_ds1302_byte(address);
          for(i=0;i8;i++) //循環8次,讀取數據
          {
            scl2=1;
            _nop_();
            if(sda2)
            temp|=0x80;//每次傳輸低字節
            scl2=0;
            temp>>=1; // 右移一位
          }
          rst2=0;
          _nop_();
          scl2=1;
          sda2=0;
          return temp; //返回 temp值
        }
        void read_rtc() //讀取日歷
        {
          uchar i,*p;
          p=read_rtc_address; //傳遞地址
          for(i=0;i7;i++) //分七次讀取年月日 時分秒 星期
          {
            tmpdata[i]=read_ds1302(*p);
            p++;
          }
        }
        void set_rtc() //設定日歷
        {
          uchar i,*p,tmp;
          for(i=0;i7;i++)
        {
          tmp=tmpdata[i]/10;
          tmpdata[i]=tmpdata[i]%10;
          tmpdata[i]=tmpdata[i]+tmp*16;
        }
          write_ds1302(0x8e,0x00);

          p=write_rtc_address; //傳遞地址
           for(i=0;i7;i++) //分七次寫入年月日 時分秒星期
          {
            write_ds1302(*p,tmpdata[i]);
            p++;
          }
          write_ds1302(0x8e,0x80);
        }

        萬能遙控器相關文章:萬能遙控器代碼




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 荣成市| 兴隆县| 土默特右旗| 邵阳市| 江陵县| 太湖县| 麟游县| 桐柏县| 根河市| 庐江县| 长垣县| 浪卡子县| 白山市| 沅江市| 遂宁市| 富民县| 边坝县| 江川县| 襄城县| 确山县| 庆安县| 昌图县| 呼和浩特市| 大洼县| 乌恰县| 桃江县| 巴彦县| 台南县| 张家界市| 商都县| 兴业县| 霍林郭勒市| 鄂托克旗| 金昌市| 新昌县| 揭西县| 新和县| 平顺县| 呼玛县| 虎林市| 靖江市|