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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
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);         //讀周
}



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

使用道具 舉報

沙發
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與數碼管程序銜接的問題是自己沒有辦法解決,理解的不夠透徹,才導致問題產生無法解決,是否有文獻或參考類給予借鑒,不勝感激!!!
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

7#
ID:96682 發表于 2020-9-25 15:27 來自手機 | 只看該作者
陽歷的閏年只是多天,農歷就不同了幾年會多一個閏月。樓主說的亂碼是否用錯數碼管?。
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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





回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年人网站国产 | 污书屋 | 国产免费拔擦拔擦8x高清 | 亚洲精品99999 | 亚洲欧美日韩在线一区二区 | 欧美黄a| 天天艹天天干天天 | 免费精品视频 | 欲色av| 嫩草伊人| 国产欧美一区二区三区免费 | 韩国av网站在线观看 | 国产成人精品一区二区 | 久久精品一区二区三区四区 | 国产精品揄拍一区二区久久国内亚洲精 | 欧美极品一区二区 | 国产成人精品高清久久 | 欧美精品一区二区三区在线 | 日韩一区二区在线免费观看 | 精品96久久久久久中文字幕无 | 欧美福利一区 | 国产高清性xxxxxxxx | 色女人天堂 | 日韩精品在线免费 | 国产在线一区二 | 欧洲av一区 | 日韩一区二区免费视频 | 久久99精品久久久水蜜桃 | 中文字幕精品视频在线观看 | 国产日产精品一区二区三区四区 | 九色91视频 | 久久久久久中文字幕 | 男女羞羞视频在线观看 | 青青草原综合久久大伊人精品 | 欧美色图另类 | 日韩电影中文字幕 | 超碰520| 懂色av色香蕉一区二区蜜桃 | 欧美中文字幕一区二区三区亚洲 | 日韩在线中文 | 中文字幕 在线观看 |