找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1170|回复: 14
打印 上一主题 下一主题
收起左侧

关于DS1302与51系列单片机IO口的问题,你们遇到过吗

[复制链接]
跳转到指定楼层
楼主
ID:641483 发表于 2023-9-11 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51系统:stc12c5a60s2单片机最小系统
晶振:12M
时间模块:DS1203 连接端口:P1.5 、P1.6、P1.7
显示模块MAX7219 连接端口:P2.0、P2.1、 P2.2
按键4个 P3.2-P3.3、P3.4、P3.5
串行输入:P3.0\P3.1

用上面的连接DS1203时间模 P1.5 -1.7口作为数据输入口,所有功能正常。把P1.0-4端口设置成AD转换后,ad转换正常,除时间模块无法通讯外,其他功能都正常。

把时间模块换到P2的5-7端也是无法数据通讯的,同时刷回之前正常显示的程序也无显示(当然修改了对应的IO口)
奇怪的是换到P3和P0加上拉电阻后也一样,时间模块无法通讯 就好像没连接上一样。
疑问一:难道DS1302 与其他输出输入共用Px端口就不能通讯?如何解?
疑问二:我看了好多DS1302的例子 都是接的P1口,是这个模块接只能接这个IO吗?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2023-9-11 17:56 | 只看该作者
代码呢?
回复

使用道具 举报

板凳
ID:94031 发表于 2023-9-11 18:10 | 只看该作者
肯定DS1302可以接P1以外的其他口,但IO要初始化正确,不能与其它功能冲突。
回复

使用道具 举报

地板
ID:641483 发表于 2023-9-11 18:36 | 只看该作者
xuyaqi 发表于 2023-9-11 18:10
肯定DS1302可以接P1以外的其他口,但IO要初始化正确,不能与其它功能冲突。

是都定义了IO口 并且都设置了推挽输出 但还是不行 P0 口啥都没接  上拉4.7k电阻都还是没有数据通讯 当然端口定义和连线都检测过,难道是单片IC问题?
回复

使用道具 举报

5#
ID:213173 发表于 2023-9-11 19:25 | 只看该作者
Q__Q 发表于 2023-9-11 18:36
是都定义了IO口 并且都设置了推挽输出 但还是不行 P0 口啥都没接  上拉4.7k电阻都还是没有数据通讯 当然 ...

与DS1302连接的端口设置为准双向模式为宜,只要不与其它功能冲突,随便哪个IO口都可以正常使用。
回复

使用道具 举报

6#
ID:1085441 发表于 2023-9-12 02:02 | 只看该作者
DS1302我用过几次,可以肯定P0~P4都是可以的,我都是设置为准双向IO口,SDIO引脚必须上拉电阻,其它就没有问题了。
我估计可能还是你的初始化有问题,会不会没有把DS1302的3个引脚没有设置为准双向口?
回复

使用道具 举报

7#
ID:965189 发表于 2023-9-12 07:33 | 只看该作者
P0-P5端口随便配,估计你是端口设置的问题。
回复

使用道具 举报

8#
ID:1065084 发表于 2023-9-12 10:01 | 只看该作者
教你一个debug神技能,裁剪法 把无用代码裁剪掉,并使用比如一个led作为标志位,不断修改标志led亮起的位置,从而检查代码哪里出错了。就这么说吧,新手遇到的99.99%错误都是自己问题,和别人无关。一般我裁剪到只有某个模块核心代码位置才能找到问题。所谓的10%的时间写bug 90%时间找bug 不夸张的。
回复

使用道具 举报

9#
ID:641483 发表于 2023-9-12 10:09 | 只看该作者
cnfloatleaf 发表于 2023-9-12 02:02
DS1302我用过几次,可以肯定P0~P4都是可以的,我都是设置为准双向IO口,SDIO引脚必须上拉电阻,其它就没有 ...

谢谢,我设置过双向输出,但是还是故障依旧  我怀疑是不是我电路搭建问题,
在运行过程中,特别是显示刷新比较多的时候,会听到有细微的“吱”高频声,目前没听出是7219发出的还是 搭建的最小板发出了,我准备重新搭下电路试试
回复

使用道具 举报

10#
ID:641483 发表于 2023-9-12 10:14 | 只看该作者
cnfloatleaf 发表于 2023-9-12 02:02
DS1302我用过几次,可以肯定P0~P4都是可以的,我都是设置为准双向IO口,SDIO引脚必须上拉电阻,其它就没有 ...

其实我也想 所有端口应该是随便用都可以的,但是,试过MAX7219使用P2口 后1302也用回P2的IO口就没数据, 怀疑是电路干扰的问题,回去我贴程序出来给大家看看
回复

使用道具 举报

11#
ID:641483 发表于 2023-9-12 10:16 | 只看该作者
yuxuesuixing 发表于 2023-9-12 10:01
教你一个debug神技能,裁剪法 把无用代码裁剪掉,并使用比如一个led作为标志位,不断修改标志led亮起的位置 ...

嗯 这个方法应该很好,我回去再试试,感觉修改来修改去 越搞越糊涂了
回复

使用道具 举报

12#
ID:641483 发表于 2023-9-12 23:05 | 只看该作者

程序如下


#include "STC12C5A60S2.H"
#include "intrins.h"
#include "Max7219.h"


uchar code shuzi_1[][8]={
{0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C},//0
{0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x7E},//1
{0x3C,0x66,0x46,0x0C,0x18,0x20,0x66,0x7E},//2
{0x3C,0x66,0x06,0x18,0x0C,0x06,0x46,0x3C},//3
{0x0C,0x1C,0x2C,0x6C,0x6C,0x7E,0x0C,0x0C},//4
{0x7E,0x60,0x60,0x7C,0x06,0x46,0x66,0x3C},//5
{0x3C,0x62,0x60,0x7C,0x66,0x66,0x66,0x3C},//6
{0x7E,0x46,0x04,0x0C,0x08,0x18,0x18,0x18},//7
{0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C},//8
{0x3C,0x66,0x66,0x66,0x1E,0x06,0x46,0x3C},//9
{0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00},//:
{0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00},//-
{0x3C,0x42,0x91,0x91,0x9D,0x81,0x42,0x3C},//time
{0x20,0x7E,0x08,0x3C,0x28,0x7E,0x08,0x00},//年
{0x3E,0x22,0x3E,0x22,0x3E,0x22,0x42,0x00},//月
{0x3E,0x22,0x22,0x3E,0x22,0x22,0x3E,0x00},//日
{0x10,0x18,0x1C,0x1E,0x1C,0x18,0x10,0x00},//箭头
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//空
};


//----------------------------------------
/*声明ADC相关寄存器 */
//sfr ADC_CONTR   =   0xBC;           //ADC 控制寄存器
//sfr ADC_RES     =   0xBD;           //ADC 高8位结果寄存器
//sfr ADC_LOW2    =   0xBE;           //ADC 低2位结果寄存器
//sfr P1ASF       =   0x9D;           //P1 辅助控制寄存器

/*ADC操作的一些宏定义*/
#define ADC_POWER   0x80            //ADC power control bit
#define ADC_FLAG    0x10            //ADC complete flag
#define ADC_START   0x08            //ADC start control bit
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks



//校时按键与C51的引脚连接定义
sbit key1=P3^2;  //设置键
sbit key2=P3^3;  //加键
sbit key3=P3^4;  //减键
sbit key4=P3^5;  //减键

sbit SCLK=P2^6;          //1302引脚位变量定义
sbit IO=P2^7;
sbit RST=P2^5;

uchar a,h,ms,sec,min,shi,nian,yue,ri,xingqi,key4n,v1,tt,tt1;
uchar second,minute,hour,week,day,month,year;    //定义年,月,日,星期,时,分,秒计数变量

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

void delay(uint xms)//延时函数,有参函数
{
        uint x,y;
        for(x=xms;x>0;x--)
         for(y=110;y>0;y--);
}


//--------1302----//
void write_byte(uchar dat)//1302写一个字节
{
        ACC=dat;
        RST=1;
        for(a=8;a>0;a--)
        {
                IO=ACC0;
                SCLK=0;
                SCLK=1;
                ACC=ACC>>1;
        }
}

uchar read_byte()//1302读一个字节
{
        RST=1;
        for(a=8;a>0;a--)
        {
                ACC7=IO;
                SCLK=1;
                SCLK=0;
                ACC=ACC>>1;

        }
        return (ACC);
}

void write_1302(uchar add,uchar dat)//向1302芯片写函数
{

        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        write_byte(dat);
        SCLK=1;
        RST=0;
}


uchar read_1302(uchar add)//从1302读数据函数
{
        uchar temp;
        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        temp=read_byte();
        SCLK=1;
        RST=0;
        return(temp);
}

void ds1302_init()
回复

使用道具 举报

13#
ID:235200 发表于 2023-9-13 08:26 | 只看该作者
一是P26 P27需接上拉电阻,二是读写程序的时序必须严格,满足这两个条件后就没有问题了
回复

使用道具 举报

14#
ID:641483 发表于 2023-9-13 10:44 | 只看该作者
csmyldl 发表于 2023-9-13 08:26
一是P26 P27需接上拉电阻,二是读写程序的时序必须严格,满足这两个条件后就没有问题了

之前单独用时钟程序的时候,有显示不完整情况,http://www.51hei.com/bbs/dpj-231413-1.html有在坛里请教过,后来只是在IO引脚P27上拉电阻就显示完整了,但在p25、p26脚上拉电阻就又显示不正常
回复

使用道具 举报

15#
ID:641483 发表于 2023-9-15 10:03 | 只看该作者
终于找到问题了 是keil的版本问题,同样的程序拷贝到keil4编译后烧录就正常了,但是在keil5能正常编译,烧录后就出现上述问题。感谢各位的热情回答
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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