找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1034|回复: 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 单片机教程网

快速回复 返回顶部 返回列表