欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4915|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機驅(qū)動DS1307與數(shù)碼管顯示程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:709561 發(fā)表于 2020-9-24 17:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
最近師傅交給實時時鐘學(xué)習(xí),不講解不提示總之自己搞定,IIC協(xié)議早期學(xué)過,可是DS1307實在是頭疼得很,不知是什么原因無法在數(shù)碼管顯示正確的時間,資料也查了很多還是沒有頭緒,已陷入死胡同無法走出,已經(jīng)第3天了還是束手無策,實屬無奈,望各位大師給予幫助不勝感激!!!
P0數(shù)碼管顯示,74HC595控制數(shù)碼管位碼。年,月,日,時,分,秒,星期。

單片機源程序如下:
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;//;模擬I2C 數(shù)據(jù)傳送位
sbit scl=P2^1;//;模擬I2C 時鐘控制狀態(tài)標(biāo)志
sbit SER  = P1^2;    //數(shù)據(jù)輸入
sbit SCK  = P1^0;    //串行移位時鐘
sbit RCK  = P1^1;    //鎖存器時鐘
sbit tiao=P1^3;  //調(diào)節(jié)鍵
sbit jia =P1^4;  //按鍵+
sbit jian=P1^5;  //按鍵-
uchar Hours,Minutes,Seconds,Year,Month,Date,Weeks;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar data dis_buf[]={0,0,0xbf,0,0,0xbf,0,0};//顯示緩存

void hc595(uchar Data)//74HC595的數(shù)據(jù)串入并出子程序
{
        uchar i;            
        for(i=0;i<8;i++)        //由高位到低位發(fā)送一個字節(jié)
        {
                Data<<=1;                //左移一位,最高位溢出到位寄存器CY
                SER=CY;                        //從位寄存器的進(jìn)位標(biāo)志位CY讀取
                SCK = 0;                        //串行移位
                SCK = 1;
        }
   RCK = 0;                         //鎖存
   RCK = 1;
}

uchar Decimal_to_BCD(uchar temp)//十進(jìn)制轉(zhuǎn)換成BCD碼
{
uchar a,b,c;
        a=temp;
        b=0;
        while(a>=10)
                {
                        a=a-10;
                        b=b+16;
                        c=a+b;
                        temp=c;
                }         
        return temp;
}
uchar BCD_to_Decimal(uchar temp)//BCD碼轉(zhuǎn)換成十進(jìn)制
{
        uchar a,b,c;
        a=temp;
        b=0;
        while(a>=16)
                {
                        a=a-16;
                        b=b+10;
                        c=a+b;
                        temp=c;
                }         
        return temp;
}
void delay_5us()//5us延時
{
        _nop_();
        _nop_();
        _nop_();
}
void star_1307()//開始
{
        sda=1;
        delay_5us();//5us延時
        scl=1;
        delay_5us();//5us延時
        sda=0;
        delay_5us();//5us延時
}
void stop_1307()//停止
{
        sda=0;
        delay_5us();//5us延時
        scl=1;
        delay_5us();//5us延時
        sda=1;
        delay_5us();//5us延時
}
void ack_1307()//應(yīng)答
{
uchar z=0;
        while((sda==1)&&(z<50))z++;//條件判斷, sda=1,則沒有應(yīng)答。如果沒有應(yīng)答則延時:z<50,z++;后返回
        scl=0;
        delay_5us();//5us延時
}
void write_1307(uchar slave_write_address,uchar byte_address,uchar data_data)//寫一個數(shù)據(jù)
{
uchar temp,temp1,i,ii;
        star_1307();                                //開始
        for(ii=0;ii<3;ii++)//根據(jù) 24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節(jié)地址,數(shù)據(jù)
        {
                if(ii==0)
                {
                        temp=slave_write_address;//送 器件寫地址
                        temp1=slave_write_address;
                }
                else if(ii==1)
                {
                        temp=byte_address;//送 字節(jié)地址
                        temp1=byte_address;
                }
                else if(ii==2)
                {
                        temp=data_data;//送 數(shù)據(jù)
                        temp1=data_data;
                }
                for(i=0;i<8;i++)
                {
                        scl=0;
                        delay_5us();//5us延時
                        temp=temp1;
                        temp=temp&0x80;//相 與 后,把不相關(guān)的位清零
                        if(temp==0x80)//根據(jù)前面 相 與 后,判斷 temp是否等于0x80,是則該位為 1                        
                                sda=1;
                        else
                                sda=0;
                        
                        delay_5us();//5us延時
                        scl=1;
                        delay_5us();//5us延時
                        scl=0;
                        delay_5us();//5us延時
                        temp1=temp1<<1;//向左移出1位
                        
                }
                sda=1;
                delay_5us();//5us延時
                scl=1;
                delay_5us();//5us延時
                ack_1307();
        }
        stop_1307();//停止
}
uchar read_1307(uchar slave_write_address,uchar byte_address,uchar slave_read_address)  //讀一個數(shù)據(jù)
{
uchar temp,temp1,i,ii,x,data_data;
        star_1307();         //開始
        for(ii=0;ii<3;ii++)  //根據(jù) 24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節(jié)地址,器件讀地址
        {
                if(ii==0)
                        {
                        temp=slave_write_address;  //送 器件寫地址
                        temp1=slave_write_address;
                        }
                else if(ii==1)
                        {
                        temp=byte_address;        //送 字節(jié)地址
                        temp1=byte_address;
                        }
                else if(ii==2)
                        {
                        star_1307();              //開始
                        temp=slave_read_address;  //送 器件讀地址
                        temp1=slave_read_address;
                        }
                for(i=0;i<8;i++)              //開始讀數(shù)據(jù)
                        {
                                scl=0;
                                delay_5us();          //5us延時
                                temp=temp1;
                                temp=temp&0x80;       // 相 與 后,把不相關(guān)的位清零
                                if(temp==0x80)        //根據(jù)前面 相 與 后,判斷 temp是否等于0x80,是則該位為 1
                                
                                sda=1;
                                else
                                sda=0;
                                
                                delay_5us();          //5us延時
                                scl=1;
                                delay_5us();          //5us延時
                                scl=0;
                                delay_5us();          //5us延時
                                temp1=temp1<<1;       //向左移出1位
                        }
                sda=1;
                delay_5us();                 //5us延時
                scl=1;
                delay_5us();                 //5us延時
                ack_1307();                  //應(yīng)答
        }
        for(x=0;x<8;x++)
        {
                data_data=data_data<<1;     //向左移入1位
                sda=1;
                delay_5us();                //5us延時
                scl=0;
                delay_5us();                //5us延時
                scl=1;
                delay_5us();                //5us延時
                if(sda==1)                  //判斷 數(shù)據(jù)線是否是高電平
                data_data|=0x01;            //把讀到的數(shù)據(jù) 或 0X01
        }
        ack_1307();                     //應(yīng)答
        stop_1307();                    //停止
        return data_data;               //返回讀到的數(shù)據(jù)
}
void init_1307()                    //初始化
{
        Hours=23;
        Minutes=14;
        Seconds=11;
        Year=17;   
        Month=11;
        Date=24;
        Weeks=5;        
        Seconds=Decimal_to_BCD(Seconds);  //十進(jìn)制轉(zhuǎn)換成BCD碼
        Minutes=Decimal_to_BCD(Minutes);  //十進(jìn)制轉(zhuǎn)換成BCD碼
        Hours=Decimal_to_BCD(Hours);      //十進(jìn)制轉(zhuǎn)換成BCD碼
        Date=Decimal_to_BCD(Date);        //十進(jìn)制轉(zhuǎn)換成BCD碼
        Year=Decimal_to_BCD(Year);        //十進(jìn)制轉(zhuǎn)換成BCD碼
        Month=Decimal_to_BCD(Month);      //十進(jìn)制轉(zhuǎn)換成BCD碼

        write_1307(0xd0,0x00,Seconds);    //寫入秒
        write_1307(0xd0,0x01,Minutes);    //寫入分
        write_1307(0xd0,0x02,Hours);      //寫入時
        write_1307(0xd0,0x03,Weeks);      //寫入星期
        write_1307(0xd0,0x04,Date);       //寫入日期
        write_1307(0xd0,0x05,Month);      //寫入月         
        write_1307(0xd0,0x06,Year);       //寫入年
}
void read_time_1307()
{
        Seconds=read_1307(0xd0,0x00,0xd1);          //讀秒
        Seconds=BCD_to_Decimal(Seconds);     //BCD碼轉(zhuǎn)換成十進(jìn)制
        Minutes=read_1307(0xd0,0x01,0xd1);          //讀分
        Minutes=BCD_to_Decimal(Minutes);     //BCD碼轉(zhuǎn)換成十進(jìn)制         
        Hours=read_1307(0xd0,0x02,0xd1);          //讀時
        Hours=BCD_to_Decimal(Hours);         //BCD碼轉(zhuǎn)換成十進(jìn)制

        Year=read_1307(0xd0,0x06,0xd1);          //讀年
        Year=BCD_to_Decimal(Year);           //BCD碼轉(zhuǎn)換成十進(jìn)制
        Date=read_1307(0xd0,0x04,0xd1);          //讀日
        Date=BCD_to_Decimal(Date);           //BCD碼轉(zhuǎn)換成十進(jìn)制
        Month=read_1307(0xd0,0x05,0xd1);     //讀月
        Month=BCD_to_Decimal(Month);         //BCD碼轉(zhuǎn)換成十進(jìn)制
        Weeks=read_1307(0xd0,0x03,0xd1);         //讀周
}



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

使用道具 舉報

沙發(fā)
ID:332444 發(fā)表于 2020-9-25 10:26 | 只看該作者
問題描述不是很清楚,通常寫程序或調(diào)試程序是這樣的,首先用某固定值去調(diào)好數(shù)碼管,因為是人機交互的界面,調(diào)好數(shù)碼管顯示無誤后才去調(diào)要顯示的內(nèi)容,也就是分步設(shè)計或調(diào)試。
回復(fù)

使用道具 舉報

板凳
ID:332444 發(fā)表于 2020-9-25 10:28 | 只看該作者
也就是功能要一塊一塊的完成,已經(jīng)完成了的功能就不用去考慮有問題出現(xiàn)。
回復(fù)

使用道具 舉報

地板
ID:709561 發(fā)表于 2020-9-25 11:14 | 只看該作者
xianfajushi 發(fā)表于 2020-9-25 10:26
問題描述不是很清楚,通常寫程序或調(diào)試程序是這樣的,首先用某固定值去調(diào)好數(shù)碼管,因為是人機交互的界面, ...

是的,就是調(diào)試的時候數(shù)碼管不是沒有顯示就是亂碼,還是DS1307與數(shù)碼管程序銜接的問題是自己沒有辦法解決,理解的不夠透徹,才導(dǎo)致問題產(chǎn)生無法解決,是否有文獻(xiàn)或參考類給予借鑒,不勝感激!!!
回復(fù)

使用道具 舉報

5#
ID:332444 發(fā)表于 2020-9-25 11:29 | 只看該作者
DS1307我自己沒用過,擺渡資料看也不是很理解什么叫做閏年補償,這個閏年補償是指陰歷?看資料也沒提到陰歷,若是指陽歷陽歷閏年是固定的沒什么好補償?shù)模皇呛芰私膺@塊芯片。我說過了先用固定值去調(diào)試數(shù)碼管,完成數(shù)碼管功能塊后再去調(diào)試讀取。DS1307電路圖擺渡有,需要我?guī)湍闼阉鳎?/td>
回復(fù)

使用道具 舉報

6#
ID:332444 發(fā)表于 2020-9-25 11:43 | 只看該作者
其實我認(rèn)為蛋騙雞只要提供標(biāo)準(zhǔn)的秒信號就可以了,目前蛋騙雞使用中斷作為計時器會受影響,因此,要外部芯片;
我的思路是蛋騙雞可設(shè)計一功能提供一不受任何影響的秒信號存儲空間,調(diào)用時就是讀取秒數(shù)據(jù),可預(yù)制秒內(nèi)容,其他的分,時,星期,日,月,年都可寫程序?qū)崿F(xiàn)。
回復(fù)

使用道具 舉報

7#
ID:96682 發(fā)表于 2020-9-25 15:27 來自觸屏版 | 只看該作者
陽歷的閏年只是多天,農(nóng)歷就不同了幾年會多一個閏月。樓主說的亂碼是否用錯數(shù)碼管?。
回復(fù)

使用道具 舉報

8#
ID:709561 發(fā)表于 2020-9-25 16:00 | 只看該作者
wc86110 發(fā)表于 2020-9-25 15:27
陽歷的閏年只是多天,農(nóng)歷就不同了幾年會多一個閏月。樓主說的亂碼是否用錯數(shù)碼管?。

數(shù)碼管是對的我確定沒有使用錯誤,就是提取DS1307的時間年月日就是無法顯示正確
回復(fù)

使用道具 舉報

9#
ID:709561 發(fā)表于 2020-9-25 16:02 | 只看該作者
xianfajushi 發(fā)表于 2020-9-25 10:28
也就是功能要一塊一塊的完成,已經(jīng)完成了的功能就不用去考慮有問題出現(xiàn)。

是的,就是調(diào)試到數(shù)碼管與DS1307銜接的程序,無論如何改寫都無法顯示正確???
回復(fù)

使用道具 舉報

10#
ID:332444 發(fā)表于 2020-9-25 16:13 | 只看該作者
那就先測試讀芯片一個值測試通訊是否正確。
回復(fù)

使用道具 舉報

11#
ID:213173 發(fā)表于 2020-9-26 09:26 | 只看該作者
這是在本壇找的帖子,是一個DS1307.H文件,經(jīng)移植仿真測試原作者的源碼寫得很好。只要添加按鍵和顯示函數(shù)就能成為一個萬年歷。鏈接http://www.raoushi.com/bbs/dpj-152422-1.html

測試程序 仿真.zip (153.83 KB, 下載次數(shù): 26)





回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表