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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4520|回復: 10
收起左側

關于單片機驅動DS1307與數碼管顯示程序問題

[復制鏈接]
ID:709561 發表于 2020-9-24 17:15 | 顯示全部樓層 |閱讀模式
50黑幣
最近師傅交給實時時鐘學習,不講解不提示總之自己搞定,IIC協議早期學過,可是DS1307實在是頭疼得很,不知是什么原因無法在數碼管顯示正確的時間,資料也查了很多還是沒有頭緒,已陷入死胡同無法走出,已經第3天了還是束手無策,實屬無奈,望各位大師給予幫助不勝感激!!!
P0數碼管顯示,74HC595控制數碼管位碼。年,月,日,時,分,秒,星期。

單片機源程序如下:
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;//;模擬I2C 數據傳送位
sbit scl=P2^1;//;模擬I2C 時鐘控制狀態標志
sbit SER  = P1^2;    //數據輸入
sbit SCK  = P1^0;    //串行移位時鐘
sbit RCK  = P1^1;    //鎖存器時鐘
sbit tiao=P1^3;  //調節鍵
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的數據串入并出子程序
{
        uchar i;            
        for(i=0;i<8;i++)        //由高位到低位發送一個字節
        {
                Data<<=1;                //左移一位,最高位溢出到位寄存器CY
                SER=CY;                        //從位寄存器的進位標志位CY讀取
                SCK = 0;                        //串行移位
                SCK = 1;
        }
   RCK = 0;                         //鎖存
   RCK = 1;
}

uchar Decimal_to_BCD(uchar temp)//十進制轉換成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碼轉換成十進制
{
        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()//應答
{
uchar z=0;
        while((sda==1)&&(z<50))z++;//條件判斷, sda=1,則沒有應答。如果沒有應答則延時:z<50,z++;后返回
        scl=0;
        delay_5us();//5us延時
}
void write_1307(uchar slave_write_address,uchar byte_address,uchar data_data)//寫一個數據
{
uchar temp,temp1,i,ii;
        star_1307();                                //開始
        for(ii=0;ii<3;ii++)//根據 24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節地址,數據
        {
                if(ii==0)
                {
                        temp=slave_write_address;//送 器件寫地址
                        temp1=slave_write_address;
                }
                else if(ii==1)
                {
                        temp=byte_address;//送 字節地址
                        temp1=byte_address;
                }
                else if(ii==2)
                {
                        temp=data_data;//送 數據
                        temp1=data_data;
                }
                for(i=0;i<8;i++)
                {
                        scl=0;
                        delay_5us();//5us延時
                        temp=temp1;
                        temp=temp&0x80;//相 與 后,把不相關的位清零
                        if(temp==0x80)//根據前面 相 與 后,判斷 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)  //讀一個數據
{
uchar temp,temp1,i,ii,x,data_data;
        star_1307();         //開始
        for(ii=0;ii<3;ii++)  //根據 24CXX文檔資料,和時序圖,按順序送:器件寫地址,字節地址,器件讀地址
        {
                if(ii==0)
                        {
                        temp=slave_write_address;  //送 器件寫地址
                        temp1=slave_write_address;
                        }
                else if(ii==1)
                        {
                        temp=byte_address;        //送 字節地址
                        temp1=byte_address;
                        }
                else if(ii==2)
                        {
                        star_1307();              //開始
                        temp=slave_read_address;  //送 器件讀地址
                        temp1=slave_read_address;
                        }
                for(i=0;i<8;i++)              //開始讀數據
                        {
                                scl=0;
                                delay_5us();          //5us延時
                                temp=temp1;
                                temp=temp&0x80;       // 相 與 后,把不相關的位清零
                                if(temp==0x80)        //根據前面 相 與 后,判斷 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();                  //應答
        }
        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)                  //判斷 數據線是否是高電平
                data_data|=0x01;            //把讀到的數據 或 0X01
        }
        ack_1307();                     //應答
        stop_1307();                    //停止
        return data_data;               //返回讀到的數據
}
void init_1307()                    //初始化
{
        Hours=23;
        Minutes=14;
        Seconds=11;
        Year=17;   
        Month=11;
        Date=24;
        Weeks=5;        
        Seconds=Decimal_to_BCD(Seconds);  //十進制轉換成BCD碼
        Minutes=Decimal_to_BCD(Minutes);  //十進制轉換成BCD碼
        Hours=Decimal_to_BCD(Hours);      //十進制轉換成BCD碼
        Date=Decimal_to_BCD(Date);        //十進制轉換成BCD碼
        Year=Decimal_to_BCD(Year);        //十進制轉換成BCD碼
        Month=Decimal_to_BCD(Month);      //十進制轉換成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碼轉換成十進制
        Minutes=read_1307(0xd0,0x01,0xd1);          //讀分
        Minutes=BCD_to_Decimal(Minutes);     //BCD碼轉換成十進制         
        Hours=read_1307(0xd0,0x02,0xd1);          //讀時
        Hours=BCD_to_Decimal(Hours);         //BCD碼轉換成十進制

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



回復

使用道具 舉報

ID:332444 發表于 2020-9-25 10:26 | 顯示全部樓層
問題描述不是很清楚,通常寫程序或調試程序是這樣的,首先用某固定值去調好數碼管,因為是人機交互的界面,調好數碼管顯示無誤后才去調要顯示的內容,也就是分步設計或調試。
回復

使用道具 舉報

ID:332444 發表于 2020-9-25 10:28 | 顯示全部樓層
也就是功能要一塊一塊的完成,已經完成了的功能就不用去考慮有問題出現。
回復

使用道具 舉報

ID:709561 發表于 2020-9-25 11:14 | 顯示全部樓層
xianfajushi 發表于 2020-9-25 10:26
問題描述不是很清楚,通常寫程序或調試程序是這樣的,首先用某固定值去調好數碼管,因為是人機交互的界面, ...

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

使用道具 舉報

ID:332444 發表于 2020-9-25 11:29 | 顯示全部樓層
DS1307我自己沒用過,擺渡資料看也不是很理解什么叫做閏年補償,這個閏年補償是指陰歷?看資料也沒提到陰歷,若是指陽歷陽歷閏年是固定的沒什么好補償的,不是很了解這塊芯片。我說過了先用固定值去調試數碼管,完成數碼管功能塊后再去調試讀取。DS1307電路圖擺渡有,需要我幫你搜索?
回復

使用道具 舉報

ID:332444 發表于 2020-9-25 11:43 | 顯示全部樓層
其實我認為蛋騙雞只要提供標準的秒信號就可以了,目前蛋騙雞使用中斷作為計時器會受影響,因此,要外部芯片;
我的思路是蛋騙雞可設計一功能提供一不受任何影響的秒信號存儲空間,調用時就是讀取秒數據,可預制秒內容,其他的分,時,星期,日,月,年都可寫程序實現。
回復

使用道具 舉報

ID:96682 發表于 2020-9-25 15:27 來自觸屏版 | 顯示全部樓層
陽歷的閏年只是多天,農歷就不同了幾年會多一個閏月。樓主說的亂碼是否用錯數碼管?。
回復

使用道具 舉報

ID:709561 發表于 2020-9-25 16:00 | 顯示全部樓層
wc86110 發表于 2020-9-25 15:27
陽歷的閏年只是多天,農歷就不同了幾年會多一個閏月。樓主說的亂碼是否用錯數碼管?。

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

使用道具 舉報

ID:709561 發表于 2020-9-25 16:02 | 顯示全部樓層
xianfajushi 發表于 2020-9-25 10:28
也就是功能要一塊一塊的完成,已經完成了的功能就不用去考慮有問題出現。

是的,就是調試到數碼管與DS1307銜接的程序,無論如何改寫都無法顯示正確???
回復

使用道具 舉報

ID:332444 發表于 2020-9-25 16:13 | 顯示全部樓層
那就先測試讀芯片一個值測試通訊是否正確。
回復

使用道具 舉報

ID:213173 發表于 2020-9-26 09:26 | 顯示全部樓層
這是在本壇找的帖子,是一個DS1307.H文件,經移植仿真測試原作者的源碼寫得很好。只要添加按鍵和顯示函數就能成為一個萬年歷。鏈接http://www.zg4o1577.cn/bbs/dpj-152422-1.html
無標題.jpg
測試程序 仿真.zip (153.83 KB, 下載次數: 26)





回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧洲一区二区 | 成人三级视频 | 中文字幕久久精品 | 成人a免费 | 亚洲第一天堂 | 亚洲一区二区三区视频 | 亚洲国产视频一区二区 | 日本a视频| 日本午夜精品 | 久久夜视频| 日韩视频区| 丝袜久久 | 日本特黄a级高清免费大片 成年人黄色小视频 | 欧美日韩在线一区二区 | 欧美日韩一区二区在线观看 | 久久久夜| 日韩免费一区 | 久久久国产一区二区三区 | 国产精品免费在线 | 国产福利在线 | 另类专区亚洲 | 精品国产伦一区二区三区观看方式 | 欧美成人精品激情在线观看 | 人成久久| 久久av一区二区三区 | 国产精品99久久久久久宅男 | 伊人久久大香线 | 久久久久国产精品一区二区 | h片在线看 | 免费影视在线观看 | 久久久精品视 | 久久av一区二区三区 | 精品av久久久久电影 | 欧美在线一区视频 | 91精品国产91久久久久久吃药 | 日本手机在线 | 亚洲精品在线看 | 欧美韩一区二区三区 | 九九在线视频 | 国偷自产av一区二区三区 | 久久久91精品国产一区二区精品 |