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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主

#include <reg52.h>     
#include "Delay.h"         
#include "19264ZK.h"
#include "19264.h"   
#include "3231.h"
#include "SpendandMeleage.h"
//#define uchar unsigned char  //宏定義無符號字符形數據類型進行聲明定義 定義名稱uchar 所占位數8位 范圍0~255
//#define uint unsigned int    //宏定義無符號整形數據類型進行聲明定義 定義名稱uint 所占位數16位 范圍0~65535


/************************函數聲明***********************************************/
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);//調用3231時鐘數據中的年數據,從地址0x8d中

        Disp_8x16(1,0,1,ZM_8x16[(year/10)]);        
        Disp_8x16(2,0,1,ZM_8x16[(year%10)]);
        
        month=read_random(DS3231_MONTH);//調用3231時鐘數據中的月數據,從地址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芯片中讀取日數據,從地址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芯片中讀取小時數據,從地址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芯片中讀取分鐘數據,從地址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芯片中讀取秒鐘數據,從地址0x01中
        Disp_8x16(7,1,1,ZM_8x16[(second/10)]);                                        //秒鐘十位
        Disp_8x16(8,1,1,ZM_8x16[(second%10)]);                                        //秒鐘個位

}


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

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

}
#ifndef __DS3231_h__
#define __DS3231_h__

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

#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常數定義
********************************************************************************************************/
#define DS3231_WriteAddress 0xD0    //器件寫地址
#define DS3231_ReadAddress  0xD1    //器件讀地址

#define NACK    1
#define ACK     0



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

********************************************************************************************************/
bit        ack;                                                        //應答標志位

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;                  //發送起始條件的數據信號
    SCL=1;
    Delay5US();             //起始條件建立時間大于4.7us,延時     
    SDA=0;                  //發送起始信號
    Delay5US();             // 起始條件鎖定時間大于4μs                        
    SCL=0;                  //鉗住I2C總線,準備發送或接收數據
}                                                                                                   

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

void SendByte(uchar c)
{
    uchar BitCnt;

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

uchar RcvByte()
{
   uchar retc;
   uchar BitCnt;

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

void Ack_I2C(bit a)
{
        SDA        =        a;  
    SCL=1;                     
    Delay5US();             //時鐘低電平周期大于4us   
    SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續接收
    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));//都轉10進制輸出
}                                 

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

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

使用道具 舉報

沙發
ID:230742 發表于 2022-4-18 00:27 | 只看該作者
程序我也沒仔細看,看電路圖,9腳的復位電路要接一下。31腳接電源正極在試一下。
回復

使用道具 舉報

板凳
ID:16255 發表于 2022-4-18 16:19 | 只看該作者
啤酒瓶子老大 發表于 2022-4-18 00:27
程序我也沒仔細看,看電路圖,9腳的復位電路要接一下。31腳接電源正極在試一下。

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本 欧美 国产 | 欧美v免费 | 日韩伦理电影免费在线观看 | 一区二区中文 | 亚州中文 | 国产目拍亚洲精品99久久精品 | 日韩欧美国产一区二区三区 | 黄页网址在线观看 | 日韩精品免费在线观看 | 日韩在线视频免费观看 | 国产精品色婷婷久久58 | 日本黄色高清视频 | 亚洲视频免费在线观看 | www久久久| 亚洲乱码一区二区 | 精品日本久久久久久久久久 | 看av网 | 国产伦精品一区二区三区精品视频 | 日韩av免费在线电影 | 9999精品视频 | 欧美一区二区视频 | 91麻豆精品国产91久久久更新资源速度超快 | 美日韩免费视频 | 国产精品入口麻豆www | 古装人性做爰av网站 | 精品国产第一区二区三区 | 国产精品我不卡 | 三级免费| 久久av网| 一级毛片免费 | 人成在线| 午夜小视频在线观看 | 在线观看视频91 | 三级视频网站 | 在线免费毛片 | 国产在线永久免费 | 国产精品九九九 | 伊人精品久久久久77777 | 久久久人成影片一区二区三区 | 一片毛片 | 日本中文字幕日韩精品免费 |