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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2274|回復: 0
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:474005 發(fā)表于 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);                 //單字節(jié)寫入DS1302
uc DS_read(void);                         //單字節(jié)讀DS1302
void DS_register_write(uc addr,uc dat);   //向DS1302的寄存器中寫入一個字節(jié)
uc DS_register_read(uc addr);                                 //讀取指定寄存器中的一個字節(jié)并返回那個字節(jié)
void init_DS(void);                                                 //初始化DS1302
void DS_BURST_WRITE(uc *dat);    //連續(xù)寫8個字節(jié)
void DS_BURST_READ(uc *dat);      //連續(xù)讀8個字節(jié)      

void DS_write(uc dat)                 //DS1302在SCK上升沿時讀取單片機發(fā)送的數(shù)據(jù),單片機在SCK下降沿發(fā)送數(shù)據(jù)相當于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;                                //釋放數(shù)據(jù)引腳
}

uc DS_read()                                //單片機在SCK上升沿讀取DS1302發(fā)送的數(shù)據(jù),DS1302在SCK下降沿發(fā)送數(shù)據(jù)相當于SPI中MISO變化
{
        uc dat=0,mask;
        for (mask=0x01; mask!=0; mask<<=1)
        {
                if (SDA !=0 )
                {
                        dat |= mask;   //讀取到的數(shù)據(jù)是1
                }
                SCK = 1;
                SCK = 0;
        }
        SDA = 0;                          //加了這個后就不會出現(xiàn)兩個豎桿跳動地情況
        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)                                                //無錯
{
        /*用數(shù)組實現(xiàn)初始化*/
//        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); //撤銷寫保護以允許寫入數(shù)據(jù)
//                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)        //給要寫入的時分秒數(shù)組
{
        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)   //給數(shù)組
{
        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;                             //數(shù)碼管段選,位選顯示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;                  //只保留了整數(shù)
        tmp = 65536 - tmp;
       
        T0RH = (unsigned char)(tmp >> 8); //優(yōu)先級問題,當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);                 //單字節(jié)寫入DS1302
unsigned char DS_read(void);                         //單字節(jié)讀DS1302
void DS_register_write(uc addr,uc dat);   //向DS1302的寄存器中寫入一個字節(jié)
uc DS_register_read(uc addr);                                 //讀取指定寄存器中的一個字節(jié)并返回那個字節(jié)
void init_DS(void);                                                 //初始化DS1302
void DS_BURST_WRITE(uc *dat);    //連續(xù)寫8個字節(jié)
void DS_BURST_READ(uc *dat);      //連續(xù)讀8個字節(jié)
void set_sfm(unsigned char shi,unsigned char  fen,unsigned char  miao);

#endif



QQ3401224322,歡迎一起討論工程

DS1302.zip

42.62 KB, 下載次數(shù): 2

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

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠婷婷综合久久久久久妖精 | 久久高清精品 | 99看片网| 国产伦精品一区二区三区高清 | 欧美在线一区二区三区 | 国产午夜精品视频 | 久久精品国产99国产精品 | 国产色网 | 好好的日在线视频 | 成人国产精品入口免费视频 | 自拍偷拍亚洲一区 | 一级午夜aaa免费看三区 | 黄色在线观看网站 | 国产精品一区在线观看 | 涩涩导航 | 精品国产乱码久久久久久88av | 精品www| 91久久精品一区二区二区 | 在线观看日韩精品视频 | 一级毛片在线看 | 亚洲成人免费视频 | 国产不卡视频 | 综合国产第二页 | 亚洲午夜视频在线观看 | 午夜欧美日韩 | 免费激情 | 欧美久久久网站 | 亚洲成人午夜电影 | 精品少妇v888av | 热久久久| av片在线观看网站 | 国产日韩精品一区二区 | 国产激情视频在线观看 | 欧美黑人狂野猛交老妇 | 日韩欧美精品一区 | 国产你懂的在线观看 | 日本成人区 | 天天射天天干 | 日韩一区二区三区四区五区 | 色伊人| 岛国视频 |