找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2131|回复: 9
收起左侧

单片机+DS1302时钟编程报错

[复制链接]
ID:717594 发表于 2020-4-26 23:52 | 显示全部楼层 |阅读模式
参考普中单片机编写的一个时钟程序,
编译的时候显示ds1302文件报错如下,搞了半天没闹明白,请问各位大神哪里出了问题。。。
51hei图片_20200426234758.png

ds1302.h文件
#ifndef _DS1302_H_
#define _DS1302_H_
#include "reg52.h"
#include "intrins.h"
#ifndef uint
#define uint unsigned int
#endif
#ifndef uchar
#define uchar unsighed uchar
#endif
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
void Ds1302Write(uchar addr,uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();
extern uchar TIME[7];   //??????
#endif

ds1302.c文件
#include "ds1302.h"
uchar TIME[7]=(0,0,0X12,0X07,0X05,0X06,0X16);  //????????16??????????5??7??
uchar code READ_RTC_ADDR[7]=(0X81;0X83,0X85,0X87,0X89,0X8b,0X8d);  //???????д????????1λ???1
uchar code WRITE_RTC_ADDR[7]=(0x90,0x82,0x84,0x86,0x88,0x8a,0x8c);
void Ds1302Write(uchar addr,uchar dat)
{
  uchar n;
  RST=0;
  _nop_();
  SCLK=0;
  _nop_();
  RST=1;
  _nop_();
  for(n=0;n<8;n++) //??????
  {
    DSIO=addr&0x01;
addr>>=1;
SCLK=1;   //????????????
_nop_();
SCLK=0;
_nop_();
}
  for(n=0;n<8;n++)    //????????
  {
    DSIO=dat&0x01;
dat>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
   }
   RST=0;   //???????????
   _nop_();
  }
uchar Ds1302Read(uchar addr)
{
  uchar n, dat, dat1;
  RST=0;
  _nop_();
  SCLK=0;
  _nop_();
  RST=1;    //CE????
  _nop_();
  for(n=0;n<8;n++)
  {
   DSIO=addr&0x01;  //??????λ??????
   addr>>=1;
   SCLK=1;      // ????????????
   _nop_();
   SCLK=0;  //????????????
   _nop_();
  }
  _nop_();
  for(n=0;n<8;n++)
  {
    dat1=DSIO;
dat=(dat>>1)|(dat1<<7);  //dat?????λ??dat1?????λ
SCLK=1;      // ????????????
    _nop_();
    SCLK=0;  //????????????
    _nop_();
   }
   RST=0;
   _nop_();  //δDS1302??λ????????????????
   SCLK=1;
   _nop_();
   DSIO=0;
   _nop_();
   DSIO=1;
   _nop_();
   return dat;
}
void Ds1302Init()
{
  uchar n;
  Ds1302Write(0x8E,0x00);    //???д?????????д????????
  for(n=0;n<7;n++)
  {
    Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]); //д??7????????????
   }
   Ds1302Write(0x8E,0x80);  //??д????????

}
void Ds1302ReadTime()
{
  uchar n;
  for(n=0;n<7;n++)
  {
  TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);
  }
}


主文件
#include "reg52.h"
#include "ds1302.h"
typedef unsigned int u16;
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 DisplayData[8];
void delay(u16 i)
{
   while(i--);
}
  
void datapros()
{
   Ds1302ReadTime();
   DisplayData[0]=smgduan[TIME[2]/16];   //??? ??????????????????
   DisplayData[1]=smgduan[TIME[2]&0X0f];
   DisplayData[2]=0x40;       //?????
   DisplayData[3]=smgduan[TIME[1]/16];   //??
   DisplayData[4]=smgduan[TIME[1]&0X0f];
   DisplayData[5]=0x40;
   DisplayData[6]=smgduan[TIME[0]/16];   //??
   DisplayData[7]=smgduan[TIME[0]&0x0f];
}
void DigDisplay()
{
  u8 i;
  for(i=0;i<8;i++)
  { switch(i)
  { case(0):
    LSA=0;LSB=0;LSC=0;break; //?????0λ,??????
case(1):
LSA=1;LSB=0;LSC=0;break;
case(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
    case(6):
LSA=1;LSB=1;LSC=0;break;
case(7):
LSA=1;LSB=1;LSC=1;break;
    }
P0=DisplayData[7-i];
delay(100);
P0=0x00;
  }
}
void main()
{
   Ds1302Init();
   while(1)
   {
    datapros();
DigDisplay();
}
}


回复

使用道具 举报

ID:658665 发表于 2020-4-27 00:31 | 显示全部楼层
今天太晚了,我没有时间仔细看你的程序,如果你急用的话,先参考我的吧 DS1302模块.rar (30.72 KB, 下载次数: 10)
回复

使用道具 举报

ID:170318 发表于 2020-4-27 09:12 | 显示全部楼层
uchar code READ_RTC_ADDR[7]=(0X81;0X83,0X85,0X87,0X89,0X8b,0X8d);  括号中的0x81后面改成逗号
回复

使用道具 举报

ID:452950 发表于 2020-4-27 09:27 | 显示全部楼层
1.#define uchar unsighed char
2.#ifndef uint去掉
3#ifndef uchar去掉
4.#endif只留最后一个
5.引用函数最好加上extern
回复

使用道具 举报

ID:584814 发表于 2020-4-27 09:34 | 显示全部楼层
如果玩不好头文件,直接在程序里定义uchar或写全。
回复

使用道具 举报

ID:70069 发表于 2020-4-27 10:37 | 显示全部楼层
#ifndef uchar
#define uchar unsigned char
#endif
回复

使用道具 举报

ID:717594 发表于 2020-4-28 09:26 | 显示全部楼层
benclee 发表于 2020-4-27 10:37
#ifndef uchar
#define uchar unsigned char
#endif

发现了问题了,define里面把char 写成了uchar, unsigned 写成了unsighed
回复

使用道具 举报

ID:717594 发表于 2020-4-28 09:26 | 显示全部楼层
pengxxx 发表于 2020-4-27 00:31
今天太晚了,我没有时间仔细看你的程序,如果你急用的话,先参考我的吧

非常感谢
回复

使用道具 举报

ID:717594 发表于 2020-4-28 09:27 | 显示全部楼层
jhczy 发表于 2020-4-27 09:12
uchar code READ_RTC_ADDR[7]=(0X81;0X83,0X85,0X87,0X89,0X8b,0X8d);  括号中的0x81后面改成逗号

这里确实有问题,谢谢
回复

使用道具 举报

ID:717594 发表于 2020-4-28 09:27 | 显示全部楼层
xxpp2011 发表于 2020-4-27 09:27
1.#define uchar unsighed char
2.#ifndef uint去掉
3#ifndef uchar去掉

非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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