找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1382|回復(fù): 2
收起左側(cè)

單片機(jī)DS3231做的仿真的計時器,但運(yùn)行之后始終沒有正常顯示,請大家看看問題到底出?

[復(fù)制鏈接]
ID:978558 發(fā)表于 2022-4-17 19:07 | 顯示全部樓層 |閱讀模式
O91OS5RB`0LX@T)E8B01N_H.png
#include <reg52.h>     
#include "Delay.h"         
#include "19264ZK.h"
#include "19264.h"   
#include "3231.h"
#include "SpendandMeleage.h"
//#define uchar unsigned char  //宏定義無符號字符形數(shù)據(jù)類型進(jìn)行聲明定義 定義名稱uchar 所占位數(shù)8位 范圍0~255
//#define uint unsigned int    //宏定義無符號整形數(shù)據(jù)類型進(jìn)行聲明定義 定義名稱uint 所占位數(shù)16位 范圍0~65535


/************************函數(shù)聲明***********************************************/
void DelayM(uint);
//void ds_w(void);
uchar m,date,month,year,hour,minute,second;
void Conver_week(bit c,uchar year,uchar month,uchar day);

        
void displaytime(void)
{
        

    year=read_random(DS3231_YEAR);//調(diào)用3231時鐘數(shù)據(jù)中的年數(shù)據(jù),從地址0x8d中

        Disp_8x16(1,0,1,ZM_8x16[(year/10)]);        
        Disp_8x16(2,0,1,ZM_8x16[(year%10)]);
        
        month=read_random(DS3231_MONTH);//調(diào)用3231時鐘數(shù)據(jù)中的月數(shù)據(jù),從地址0x05中
        Disp_8x16(4,0,1,ZM_8x16[(month/10)]);         
        Disp_8x16(5,0,1,ZM_8x16[(month%10)]);
               
        date=read_random(DS3231_DAY);//從3231芯片中讀取日數(shù)據(jù),從地址0x04中
        Disp_8x16(7,0,1,ZM_8x16[(date/10)]);
        Disp_8x16(8,0,1,ZM_8x16[(date%10)]);
        


        hour =read_random(DS3231_HOUR);        //從3231芯片中讀取小時數(shù)據(jù),從地址0x02中
        Disp_8x16(1,1,0,ZM_8x16[(hour/10)]);
        Disp_8x16(2,1,0,ZM_8x16[(hour%10)]);                                        //小時個位


        minute= read_random(DS3231_MINUTE); //從3231芯片中讀取分鐘數(shù)據(jù),從地址0x01中
        Disp_8x16(4,1,1,ZM_8x16[(minute/10)]);                                        //分鐘十位
        Disp_8x16(5,1,1,ZM_8x16[(minute%10)]);                                        //分鐘個位
        
        second =read_random(DS3231_SECOND); //從3231芯片中讀取秒鐘數(shù)據(jù),從地址0x01中
        Disp_8x16(7,1,1,ZM_8x16[(second/10)]);                                        //秒鐘十位
        Disp_8x16(8,1,1,ZM_8x16[(second%10)]);                                        //秒鐘個位

}


/*主函數(shù)--------------------------------------------------------------------*/
void main()
  {

        Time0_Time1_init();//定時器0、計數(shù)器1初始化子程序
        Init19264LCD(); //19264屏初始化LCD函數(shù)
  while(1)
    {         
                displayspeed();//速度顯示
           }
         

}
#ifndef __DS3231_h__
#define __DS3231_h__

#include <intrins.h>                //加載頭文件
sbit SCL=P1^7;                        //DS3231數(shù)據(jù)接口
sbit SDA=P1^6;                        //DS3231數(shù)據(jù)接口

#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //時
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
/********************************************************************************************************
**         DS3231常數(shù)定義
********************************************************************************************************/
#define DS3231_WriteAddress 0xD0    //器件寫地址
#define DS3231_ReadAddress  0xD1    //器件讀地址

#define NACK    1
#define ACK     0



/********************************************************************************************************

********************************************************************************************************/
bit        ack;                                                        //應(yīng)答標(biāo)志位

uchar        BCD2HEX(uchar val)
{
        return        ((val>>4)*10)+(val&0x0f);
}

/*uchar        HEX2BCD(uchar val)
{
        return        (((val%100)/10)<<4)|(val%10);
}
   */
void        Delay5US()           //@12.000MHz           延時5us
{
    _nop_();
}

void Start_I2C()
{
    SDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號
    SCL=1;
    Delay5US();             //起始條件建立時間大于4.7us,延時     
    SDA=0;                  //發(fā)送起始信號
    Delay5US();             // 起始條件鎖定時間大于4μs                        
    SCL=0;                  //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}                                                                                                   

void Stop_I2C()
{
    SDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號
    SCL=1;                  //結(jié)束條件建立時間大于4us
    Delay5US();                                                                                             
    SDA=1;                  //發(fā)送I2C總線結(jié)束信號
}                                                                                                   

void SendByte(uchar c)
{
    uchar BitCnt;

    for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長度為8位
    {
        if((c<<BitCnt)&0x80)
            SDA=1;                          //判斷發(fā)送位
        else
            SDA=0;     
        SCL=1;                            //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
        Delay5US();                       //保證時鐘高電平周期大于4μs   
        SCL=0;
    }
    SDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
    SCL=1;
    Delay5US();
    if(SDA==1)
        ack=0;   
    else
        ack=1;                              //判斷是否接收到應(yīng)答信號
    SCL=0;
    Delay5US();                                                                 //延時
}           

uchar RcvByte()
{
   uchar retc;
   uchar BitCnt;

   retc=0;
   SDA=1;                           //置數(shù)據(jù)線為輸入方式
   for(BitCnt=0;BitCnt<8;BitCnt++)
   {
        SCL=0;                      //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位      
        Delay5US();                 //時鐘低電平周期大于4.7μs                       
        SCL=1;                      //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
        Delay5US();
        retc=retc<<1;
        if(SDA==1)
            retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
        Delay5US();
   }
   SCL=0;
   return(retc);
}                           

void Ack_I2C(bit a)
{
        SDA        =        a;  
    SCL=1;                     
    Delay5US();             //時鐘低電平周期大于4us   
    SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續(xù)接收
    Delay5US();   
}                                            

uchar write_byte(uchar addr, uchar write_data)
{
    Start_I2C();
    SendByte(DS3231_WriteAddress);
    if (ack == 0)
        return 0;

    SendByte(addr);   
    if (ack == 0)
        return 0;

    SendByte(write_data);
    if (ack == 0)
        return 0;

    Stop_I2C();
    Delay5US();      
    Delay5US();      
    return 1;
}                                          

uchar read_current()
{
    uchar read_data;
    Start_I2C();
    SendByte(DS3231_ReadAddress);
    if(ack==0)
        return(0);              
    read_data = RcvByte();
    Ack_I2C(1);
    Stop_I2C();
    return read_data;
}                                                

uchar read_random(uchar random_addr)
{
    uchar Tmp;
        Start_I2C();
    SendByte(DS3231_WriteAddress);
    if(ack==0)
        return(0);            
    SendByte(random_addr);
    if(ack==0)
        return(0);
        Tmp=read_current();
        if(random_addr==DS3231_HOUR)
                Tmp&=0x3f;
                                            
    return(BCD2HEX(Tmp));//都轉(zhuǎn)10進(jìn)制輸出
}                                 

/*void ModifyTime(uchar address,uchar num)
{
    uchar temp=0;
           if(address>6 && address <0) return;
    temp=HEX2BCD(num);
        write_byte(address,temp);
}
        */

         #endif
回復(fù)

使用道具 舉報

ID:230742 發(fā)表于 2022-4-18 00:27 | 顯示全部樓層
程序我也沒仔細(xì)看,看電路圖,9腳的復(fù)位電路要接一下。31腳接電源正極在試一下。
回復(fù)

使用道具 舉報

ID:16255 發(fā)表于 2022-4-18 16:19 | 顯示全部樓層
啤酒瓶子老大 發(fā)表于 2022-4-18 00:27
程序我也沒仔細(xì)看,看電路圖,9腳的復(fù)位電路要接一下。31腳接電源正極在試一下。

他的程序已經(jīng)運(yùn)行起來了(屏幕已經(jīng)顯示了)。我以前使用仿真軟件時不畫復(fù)位電路依然能跑(實(shí)際真實(shí)電路當(dāng)然要畫)。
我大概估計他是讀取3231的代碼不對,才導(dǎo)致讀不出來。(實(shí)際我也沒認(rèn)真看程序,別人寫的程序自己不容易看通。)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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