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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用DS1302的burst模式讀寫,但會顯示錯誤

[復制鏈接]
跳轉到指定樓層
樓主
ID:474005 發表于 2019-2-17 18:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/***************************DS1302.c**************************************************/
#include "DS1302.h"
#define uc unsigned char

sbit CE = P1^3;
sbit SCK = P1^7;
sbit SDA = P2^3;

void DS_write(uc dat);                 //單字節寫入DS1302
uc DS_read(void);                         //單字節讀DS1302
void DS_register_write(uc addr,uc dat);   //向DS1302的寄存器中寫入一個字節
uc DS_register_read(uc addr);                                 //讀取指定寄存器中的一個字節并返回那個字節
void init_DS(void);                                                 //初始化DS1302
void DS_BURST_WRITE(uc *dat);    //連續寫8個字節
void DS_BURST_READ(uc *dat);      //連續讀8個字節      

void DS_write(uc dat)                 //DS1302在SCK上升沿時讀取單片機發送的數據,單片機在SCK下降沿發送數據相當于SPI中MOSI變化
{
        uc mask;
        for (mask=0x01; mask!=0; mask<<=1)            
        {
                if ((dat & mask) != 0)                   //如果是==1,只顯示秒鐘
                        SDA = 1;
                else
                        SDA =0;
                SCK = 1;
                SCK = 0;

        }
        //SDA = 1;                                //釋放數據引腳
}

uc DS_read()                                //單片機在SCK上升沿讀取DS1302發送的數據,DS1302在SCK下降沿發送數據相當于SPI中MISO變化
{
        uc dat=0,mask;
        for (mask=0x01; mask!=0; mask<<=1)
        {
                if (SDA !=0 )
                {
                        dat |= mask;   //讀取到的數據是1
                }
                SCK = 1;
                SCK = 0;
        }
        SDA = 0;                          //加了這個后就不會出現兩個豎桿跳動地情況
        return dat;
}

void DS_register_write(uc addr,uc dat)
{
        CE = 0;
        SCK = 0;
       
        CE = 1;
        addr &= 0xFE;
        DS_write(addr);
        DS_write(dat);
        CE = 0;
}

uc DS_register_read(uc addr)
{
        uc dat;
        CE = 0;
        SCK = 0;

        CE = 1;
        addr |= 0x01;
        DS_write(addr);
        dat = DS_read();
        CE = 0;
        return dat;
}

void init_DS(void)                                                //無錯
{
        /*用數組實現初始化*/
//        uc code init_time[] = {0x00,0x40,0x15,0x14,0x02,0x2019};       
//        uc i;                       
        CE = 0;                                   //初始化通信引腳
        SCK = 0;

//        i = DS_register_read(0); //讀取秒寄存器          CT107D沒有備用電源,可以不判斷這一位
//        if ((i & 0x80) != 0) //由秒寄存器最高位 CH 的值判斷 DS1302 是否已停止
//        {
//                DS_register_write(7, 0x00); //撤銷寫保護以允許寫入數據
//                for (i=0; i<7; i++) //設置 DS1302 為默認的初始時間
//                {
//                        DS1302SingleWrite(i, init_time[i]);
//                }
//        }
       
        DS_register_write(0x8E,0x00);  //撤銷寫保護
        /*初始化年份2019*/
        //DS_register_write(0x8C,0x19);
        /*初始化月份2*/
        //DS_register_write(0x88,0x02);
        /*初始化日14*/
        //DS_register_write(0x86,0x14);
        /*初始化時15*/
        DS_register_write(0x84,0x23);
        /*初始化分40*/
        DS_register_write(0x82,0x59);
        /*初始化秒00*/
        DS_register_write(0x80,0x55);

        DS_register_write(0x8E,0x80);
}
void set_sfm(unsigned char shi,unsigned char  fen,unsigned char  miao)
{
DS_register_write(0x8e,0);
DS_register_write(0x80,(miao/10)*16+miao%10);
DS_register_write(0x82,(fen/10)*16+fen%10);
DS_register_write(0x84,(shi/10)*16+shi%10);
DS_register_write(0x8e,0x80);
}

void DS_BURST_WRITE(uc *dat)        //給要寫入的時分秒數組
{
        uc i;
        CE = 1;
        DS_register_write(0x8E,0x00);           //撤銷寫保護
        DS_write(0xBE);
        for (i=0; i<8; i++)
        {
                DS_write(dat[i]);       
        }
        CE = 0;
}

void DS_BURST_READ(uc *dat)   //給數組
{
        uc i;
        CE = 1;
        DS_register_write(0x8E,0x00);
        DS_write(0xBF);
        for (i=0; i<8; i++)
        {
                dat[i] = DS_read();
        }
        CE = 0;
}


/**************************************************DS1302.h***********************************/
#include <reg52.h>
#include <intrins.h>
#include "DS1302.h"

unsigned char time[8];
unsigned char code T_display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};         //段選
unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                                                 //位選


#define FOSC 11059200L

#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode

void configureT0(unsigned int ms);

bit flag200ms;
unsigned char shi,fen,miao;
unsigned char count = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;

void interruptTime0(void) interrupt 1
{
        static unsigned char i;
        static unsigned char tmr200ms;
        TH0 = T0RH;
        TL0 = T0RL;
        tmr200ms++;
        if (count-- == 0)
        {                  
                count = 1;
                P2 = 0xE0;                             //數碼管段選,位選顯示1ms掃描
                P0 = ~T_display[time[i]];
                P2 = 0x00;
                P2=0xc0;P0=T_COM[i];P2=0;
                i++;   
                if(i == 8)
                        i = 0;
        }
        if (tmr200ms >= 200)
        {
                flag200ms = 1;
                tmr200ms = 0;
        }
}

void configureT0(unsigned int ms)           //T0RL,T0RH有錯
{
        unsigned long tmp;

        tmp = 11059200 / 12;
        tmp = (tmp * ms) / 1000;                  //只保留了整數
        tmp = 65536 - tmp;
       
        T0RH = (unsigned char)(tmp >> 8); //優先級問題,當tmp>>8不加括號就會閃爍.用仿真這個表達式和打括號的表達式一樣.但是顯示的效果是跑馬燈一樣的.
        T0RL = (unsigned char)tmp;
        TMOD &= 0xF0;
        TMOD = 0x01;
        TH0 = T0RH;
        TL0 = T0RL;
        ET0 = 1;
        TR0 = 1;         
}



void main()                                        //burst模式
{
        unsigned char dat[8] = {0x23,0x55,0x55,0x23,0x23,0x23,0x23,0x23};
        EA = 1;
        configureT0(1);
        DS_BURST_WRITE(dat);
        while (1)
        {
                if (flag200ms)
                        DS_BURST_READ(dat);
                time[0] = dat[0]>>4;
                time[1] = dat[0]&0x0F;
                time[2] = 10;
                time[3] = dat[1]>>4;
                time[4] = dat[1]&0x0f;
                time[5] = 10;
                time[6] = dat[2]/16;
                time[7] = dat[2]%16;       
        }
}

/*******************************************DS1302.h************************************/
#ifndef  _DS1302_h_
#define  _DS1302_h_

#include<reg52.h>
#include<intrins.h>

#define uc unsigned char

void DS_write(uc dat);                 //單字節寫入DS1302
unsigned char DS_read(void);                         //單字節讀DS1302
void DS_register_write(uc addr,uc dat);   //向DS1302的寄存器中寫入一個字節
uc DS_register_read(uc addr);                                 //讀取指定寄存器中的一個字節并返回那個字節
void init_DS(void);                                                 //初始化DS1302
void DS_BURST_WRITE(uc *dat);    //連續寫8個字節
void DS_BURST_READ(uc *dat);      //連續讀8個字節
void set_sfm(unsigned char shi,unsigned char  fen,unsigned char  miao);

#endif



QQ3401224322,歡迎一起討論工程

DS1302.zip

42.62 KB, 下載次數: 2

上電那一刻會顯示初始值,但立馬會跳變

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费xxxxx在线视频 | 欧美精品综合在线 | 成人免费网站在线 | 精品免费| 亚洲国产网址 | 黄色一级大片视频 | 一区二区在线免费观看视频 | 91精品国产日韩91久久久久久 | 中文成人无字幕乱码精品 | 天堂一区| 国产免费va | 中文字幕日本一区二区 | 青青99 | 亚洲午夜精品久久久久久app | 999观看免费高清www | 成人免费淫片aa视频免费 | 成人久久久 | 成人做爰www免费看视频网站 | 久久精品成人 | 日韩综合在线播放 | 视频在线一区二区 | 日韩视频在线播放 | 日本欧美国产在线观看 | 国产不卡一区 | 中文字幕亚洲一区 | 中文字幕国产精品 | 欧美日韩一区精品 | 九九九视频在线 | 中文字幕一区二区三区精彩视频 | 日韩国产中文字幕 | 亚洲精品乱码久久久久久久久 | 精品国产精品国产偷麻豆 | 91在线免费视频 | 久久大陆 | 国产高清在线精品一区二区三区 | 99精品福利视频 | 不卡一区二区三区四区 | 手机av网| 国产免费又黄又爽又刺激蜜月al | 成人一区二区视频 | 免费电影av |