找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STC89C52单片机DS1302乱码 可能是什么原因导致的?

[复制链接]
跳转到指定楼层
楼主
DS1302显示乱码,位选正常,反而段选异常;后来试了下,让把有数码管输出0正常显示,请问大家是什么原因呢?自己画的板子。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2022-4-28 12:11 | 只看该作者
没有代码你等于问了个寂寞,谁知道你端口怎么配置的呢?
连个实际接线图都没有,谁知道你是怎么接线的

问题现象
可退敲出几个问题可能
1. 没有消影    2. 延时不足    3. 其他代码耗时太长

回复

使用道具 举报

板凳
ID:123289 发表于 2022-4-28 12:16 | 只看该作者
先上硬件图
回复

使用道具 举报

地板
ID:390416 发表于 2022-4-28 12:32 | 只看该作者
STC8单片机+DS1302+DS18B20+74HC595的LED16x32点阵温度万年历源代码分享
http://www.51hei.com/bbs/dpj-200968-1.html
回复

使用道具 举报

5#
ID:161164 发表于 2022-4-28 13:27 | 只看该作者
开贴一张图,代码全靠猜?
回复

使用道具 举报

6#
ID:684084 发表于 2022-4-28 14:34 | 只看该作者
搞清楚共阴共阳和分时显示就可以了
回复

使用道具 举报

7#
ID:797929 发表于 2022-4-28 14:42 | 只看该作者
哦哦,晚点放硬件和代码上来啊;我现在想想,延时不足有这个可能性
回复

使用道具 举报

8#
ID:797929 发表于 2022-4-28 14:53 | 只看该作者

原理图

12.jpg (2.09 MB, 下载次数: 16)

12.jpg
回复

使用道具 举报

9#
ID:797929 发表于 2022-4-28 20:26 | 只看该作者
angmall 发表于 2022-4-28 12:11
没有代码你等于问了个寂寞,谁知道你端口怎么配置的呢?
连个实际接线图都没有,谁知道你是怎么接线的
  1. #ifndef         _DELAY1MS_H
  2. #define  _DELAY1MS_H

  3. //包含头文件//


  4. void delay1ms(unsigned int i);


  5. #endif
  6. ///////////////////////////////////////////////////////////
  7. #include "delay1ms.h"



  8. void delay1ms(unsigned int i)
  9. {
  10.         while(i--);        
  11. }
  12. ///////////////////////////////////////////////////
  13. #ifndef __KEY_H_
  14. #define __EKY_H_

  15. #include <reg52.h>        



  16. void key_prc();

  17. sbit k1=P2^5;
  18. sbit k2=P2^6;
  19. sbit k3=P2^7;



  20. #endif

  21. //////////////////////////////////
  22. #include "key.h"
  23. #include "delay1ms.h"
  24. #include"ds1302.h"
  25. #include"display.h"

  26. unsigned char M;




  27. void key_prc()//K1,K2,K3,K4按键代码
  28. {         

  29.         if(k1==0)
  30.         {
  31.                 M++;
  32.                 TR0=1;
  33.                 delay1ms(100);
  34.                 while(!k1)
  35.                 {        
  36.                 Display();
  37.                 }
  38.                 if(M==4)
  39.                 {
  40.                         TR0=0;
  41.                         M=0;
  42.                 }

  43.                
  44.         }

  45. if(M!=0)
  46. {
  47.         
  48.         switch(M)
  49.         {
  50. case (1):
  51.                         {
  52.                         if(k2==0)
  53.                         {
  54.                                 delay1ms(10);
  55.                                 if(k2==0)
  56.                                 {
  57.                                         TIME[2]=(TIME[2]/16*10)+(TIME[2]%16);//转化为十进制
  58.                                         TIME[2]++;
  59.                                         if(TIME[2]==24)
  60.                                                 TIME[2]=0;
  61.                                 }
  62.                         TIME[2]=((TIME[2]/10)<<4)+(TIME[2]%10);//十制数转16进制,(TIME[2]/10)<<4)|(TIME[2]%10),若23TIME[2]/10=2,2-->0010,左移4位0010 0000,3-->0000 0011,0010 0000 |0000 0011=0011 0011,其中“+”与“|”运算结果一样的
  63.                                 Ds1302Write(0x8E,0X00);//打开写保护
  64.                
  65.                                 Ds1302Write(0x84,TIME[2]);//写入时数据
  66.         
  67.                                 Ds1302Write(0x8E,0x80);//关闭写保护
  68.                         while(!k2)
  69.                         {
  70.                         Display();
  71.                         }
  72.                         
  73.                                 
  74.                         }
  75.                                 if(k3==0)
  76.                                 {
  77.                                         delay1ms(10);
  78.                                         if(k3==0)
  79.                                         {
  80.                                         TIME[2]=(TIME[2]/16*10)+(TIME[2]%16);        
  81.                                                 if(TIME[2]==0)
  82.                                                         TIME[2]=24;
  83.                                         }

  84.                                         TIME[2]--;
  85.                                         TIME[2]=((TIME[2]/10)<<4)+(TIME[2]%10);
  86.                                         Ds1302Write(0x8E,0X00);
  87.                         
  88.                                         Ds1302Write(0x84,TIME[2]);
  89.         
  90.                                         Ds1302Write(0x8E,0x80);
  91.                                                 while(!k3)
  92.                                                 {
  93.                                                 Display();
  94.                                                 }
  95.         
  96.                                 }
  97. //                                if(k4==0)
  98. //                                {
  99. //                                        delay1ms(10);
  100. //                                        if(k4==0)
  101. //                                        {
  102. //                                                TR0=0;
  103. //                                                M=0;
  104. //                                                flag=0;
  105. //                                                
  106. //                                                
  107. //                                        }
  108. //                                }

  109.         }
  110. break;
  111. case (2):
  112.                         {
  113.                         if(k2==0)
  114.                         {
  115.                                 delay1ms(10);
  116.                                 if(k2==0)
  117.                                 {
  118.                                         TIME[1]=(TIME[1]/16*10)+(TIME[1]%16);
  119.                                         TIME[1]++;
  120.                                         if(TIME[1]==60)
  121.                                                 TIME[1]=0;
  122.                                 }
  123.                                 TIME[1]=((TIME[1]/10)<<4)+(TIME[1]%10);
  124.                                 Ds1302Write(0x8E,0X00);
  125.                
  126.                                 Ds1302Write(0x82,TIME[1]);
  127.         
  128.                                 Ds1302Write(0x8E,0x80);
  129.                         while(!k2)
  130.                         {
  131.                         Display();
  132.                         }
  133.                                 
  134.                         }
  135.                                 if(k3==0)
  136.                                 {
  137.                                         delay1ms(10);
  138.                                         if(k3==0)
  139.                                         {
  140.                                         TIME[1]=(TIME[1]/16*10)+(TIME[1]%16);                                                
  141.                                                 if(TIME[1]==0)
  142.                                                                 TIME[1]=60;
  143.                                                         }

  144.                                         TIME[1]--;
  145.                                         TIME[1]=((TIME[1]/10)<<4)+(TIME[1]%10);
  146.                                         Ds1302Write(0x8E,0X00);
  147.                         
  148.                                         Ds1302Write(0x82,TIME[1]);
  149.         
  150.                                         Ds1302Write(0x8E,0x80);
  151.                                                 while(!k3)
  152.                                                 {
  153.                                                 Display();
  154.                                                 }
  155.         
  156.         
  157.                                 }
  158. //                                if(k4==0)
  159. //                                {
  160. //                                        delay1ms(10);
  161. //                                        if(k4==0)
  162. //                                        {
  163. //                                                TR0=0;
  164. //                                                M=0;
  165. //                                                flag=0;
  166. //                                                
  167. //                                                
  168. //                                        }
  169. //                                }
  170.         }
  171. break;
  172. case (3):
  173.                         {
  174.                         if(k2==0)
  175.                         {
  176.                                 delay1ms(10);
  177.                                 if(k2==0)
  178.                                 {
  179.                                         TIME[0]=(TIME[0]/16*10)+(TIME[0]%16);
  180.                                         TIME[0]++;
  181.                                         if(TIME[0]==60)
  182.                                                 TIME[0]=0;
  183.                                 }
  184.                                 TIME[0]=((TIME[0]/10)<<4)+(TIME[0]%10);
  185.                                 Ds1302Write(0x8E,0X00);
  186.                
  187.                                 Ds1302Write(0x80,TIME[0]);
  188.         
  189.                                 Ds1302Write(0x8E,0x80);
  190.                         while(!k2)
  191.                         {
  192.                         Display();
  193.                         }
  194.                                 
  195.                         }
  196.                                 if(k3==0)
  197.                                 {
  198.                                         delay1ms(10);
  199.                                         if(k3==0)
  200.                                         {
  201.                                         TIME[0]=(TIME[0]/16*10)+(TIME[0]%16);                                                
  202.                                                 if(TIME[0]==0)
  203.                                                                 TIME[0]=60;
  204.                                                         }

  205.                                         TIME[0]--;
  206.                                         TIME[0]=((TIME[0]/10)<<4)+(TIME[0]%10);
  207.                                         Ds1302Write(0x8E,0X00);
  208.                         
  209.                                         Ds1302Write(0x80,TIME[0]);
  210.         
  211.                                         Ds1302Write(0x8E,0x80);
  212.                                                 while(!k3)
  213.                                                 {
  214.                                                 Display();
  215.                                                 }
  216.         
  217.         
  218.                                 }
  219. //                                if(k4==0)
  220. //                                {
  221. //                                        delay1ms(10);
  222. //                                        if(k4==0)
  223. //                                        {
  224. //                                                TR0=0;
  225. //                                                M=0;
  226. //                                                flag=0;
  227. //                                                
  228. //                                                
  229. //                                        }
  230. //                                }
  231.         }
  232. break;


  233. }
  234. }
  235. }
  236. /////////////////////////////////////////////////////
  237. #ifndef __DISPLAY_H_
  238. #define __DISPLAY_H_
  239. #include <reg52.h>        

  240. extern unsigned char DisplayData[8];
  241. extern bit flag;
  242. extern unsigned char M;
  243. //sbit LSA=P2^7;
  244. //sbit LSB=P2^6;
  245. //sbit LSC=P2^5;
  246. void Display();
  247. //void Displayflag();
  248.         
  249. #endif

  250. ////////////////////////////////////////////////////////
  251. #include "display.h"
  252. #include "delay1ms.h"
  253. #include "key.h"
  254. unsigned char i;

  255. unsigned char code weidata[8]={0x00,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0};
  256. void Display()
  257. {
  258.         if(flag==0 | M==0)
  259. {
  260.         for(i=0;i<8;i++)
  261.         {
  262.                 switch(i)         //位选,选择点亮的数码管
  263.                 {
  264.                         case(0):
  265.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第0位
  266.                         case(1):
  267.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第1位
  268.                         case(2):
  269.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
  270.                         case(3):
  271.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第3位
  272.                         case(4):
  273.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第4位
  274.                         case(5):
  275.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第5位
  276.                         case(6):
  277.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第6位
  278.                         case(7):
  279.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第7位
  280.                 }
  281.                 P1=DisplayData[i];//发送数据
  282.                 delay1ms(200); //间隔一段时间扫描        
  283.                 P1=0x00;//消隐
  284.                         
  285.         }
  286. }
  287. else
  288. {
  289.         if(M==1)
  290.         {
  291.                 for(i=2;i<8;i++)
  292.         {
  293.                 switch(i)         //位选,选择点亮的数码管,
  294.                 {
  295.                         case(2):
  296.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
  297.                         case(3):
  298.                                 P0 &=0x0f;P0 |=weidata[i];break;//显示第3位
  299.                         case(4):
  300.                                 P0 &=0x0f;P0 |=weidata[i];//显示第4位
  301.                         case(5):
  302.                                 P0 &=0x0f;P0 |=weidata[i];//显示第5位
  303.                         case(6):
  304.                                 P0 &=0x0f;P0 |=weidata[i];//显示第6位
  305.                         case(7):
  306.                                 P0 &=0x0f;P0 |=weidata[i];break;//显示第7位
  307.                 }
  308.                 P1=DisplayData[i];//发送数据
  309.                 delay1ms(100); //间隔一段时间扫描        
  310.                 P1=0x00;//消隐
  311.         }
  312.         }
  313.         if(M==2)
  314.         {
  315.                 for(i=0;i<3;i++)
  316.         {
  317.                 switch(i)         //位选,选择点亮的数码管,
  318.                 {
  319.                         case(0):
  320.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第0位
  321.                         case(1):
  322.                                 P0 &=0x0f;P0 |=weidata[i];break;//显示第1位
  323.                         case(2):
  324.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
  325.                 }
  326.                 P1=DisplayData[i];//发送数据
  327.                 delay1ms(100); //间隔一段时间扫描        
  328.                 P1=0x00;//消隐
  329.         }
  330.         for(i=5;i<8;i++)
  331.         {
  332.                 switch(i)         //位选,选择点亮的数码管,
  333.                 {
  334.                         case(5):
  335.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第5位
  336.                         case(6):
  337.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第6位
  338.                                 case(7):
  339.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第7位
  340.                 }
  341.                 P1=DisplayData[i];//发送数据
  342.                 delay1ms(100); //间隔一段时间扫描        
  343.                 P1=0x00;//消隐
  344.         }
  345.         }
  346.                 if(M==3)
  347.         {
  348.         for(i=0;i<6;i++)
  349.         {
  350.                 switch(i)         //位选,选择点亮的数码管,
  351.                 {
  352.                         case(0):
  353.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第0位
  354.                         case(1):
  355.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第1位
  356.                         case(2):
  357.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第2位
  358.                         case(3):
  359.                                 P0 &=0x0f;P0 |=weidata[i];break;//显示第3位
  360.                         case(4):
  361.                                 P0 &=0x0f;P0 |=weidata[i];break;//显示第4位
  362.                         case(5):
  363.                                 P0 &=0x0f;P0 |=weidata[i]; break;//显示第5位

  364.                 }
  365.                 P1=DisplayData[i];//发送数据
  366.                 delay1ms(100); //间隔一段时间扫描        
  367.                 P1=0x00;//消隐
  368.         }
  369.         }
  370. }
  371. }

  372. ////////////////////////////////////////////////////////////////////////////////////////////////////
  373. #ifndef __DS1302_H_
  374. #define __DS1302_H_

  375. //---包含头文件---//
  376. #include<reg52.h>
  377. #include<intrins.h>

  378. //---重定义关键词---//
  379. #ifndef uchar
  380. #define uchar unsigned char
  381. #endif

  382. #ifndef uint
  383. #define uint unsigned int
  384. #endif

  385. //---定义ds1302使用的IO口---//
  386. sbit DSIO=P3^1;
  387. sbit RST=P3^0;
  388. sbit SCLK=P3^2;
  389. //sbit DSIO=P3^4;
  390. //sbit RST=P3^5;
  391. //sbit SCLK=P3^6;
  392. //---定义全局函数---//
  393. void Ds1302Write(uchar addr, uchar dat);
  394. uchar Ds1302Read(uchar addr);
  395. void Ds1302Init();
  396. void Ds1302ReadTime();

  397. //---加入全局变量--//
  398. extern uchar TIME[7];        //加入全局变量

  399. #endif

  400. /////////////////////////////////////////////////////////////////////
  401. #include"ds1302.h"

  402. //---DS1302写入和读取时分秒的地址命令---//
  403. //---秒分时日月周年 最低位读写位;-------//
  404. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  405. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

  406. //---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
  407. //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
  408. uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};

  409. /*******************************************************************************
  410. * 函 数 名         : Ds1302Write
  411. * 函数功能                   : 向DS1302命令(地址+数据)
  412. * 输    入         : addr,dat
  413. * 输    出         : 无
  414. *******************************************************************************/

  415. void Ds1302Write(uchar addr, uchar dat)
  416. {
  417.         uchar n;
  418.         RST = 0;
  419.         _nop_();

  420.         SCLK = 0;//先将SCLK置低电平。
  421.         _nop_();
  422.         RST = 1; //然后将RST(CE)置高电平。
  423.         _nop_();

  424.         for (n=0; n<8; n++)//开始传送八位地址命令
  425.         {
  426.                 DSIO = addr & 0x01;//数据从低位开始传送
  427.                 addr >>= 1;
  428.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  429.                 _nop_();
  430.                 SCLK = 0;
  431.                 _nop_();
  432.         }
  433.         for (n=0; n<8; n++)//写入8位数据
  434.         {
  435.                 DSIO = dat & 0x01;
  436.                 dat >>= 1;
  437.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  438.                 _nop_();
  439.                 SCLK = 0;
  440.                 _nop_();        
  441.         }        
  442.                  
  443.         RST = 0;//传送数据结束
  444.         _nop_();
  445. }

  446. /*******************************************************************************
  447. * 函 数 名         : Ds1302Read
  448. * 函数功能                   : 读取一个地址的数据
  449. * 输    入         : addr
  450. * 输    出         : dat
  451. *******************************************************************************/

  452. uchar Ds1302Read(uchar addr)
  453. {
  454.         uchar n,dat,dat1;
  455.         RST = 0;
  456.         _nop_();

  457.         SCLK = 0;//先将SCLK置低电平。
  458.         _nop_();
  459.         RST = 1;//然后将RST(CE)置高电平。
  460.         _nop_();

  461.         for(n=0; n<8; n++)//开始传送八位地址命令
  462.         {
  463.                 DSIO = addr & 0x01;//数据从低位开始传送
  464.                 addr >>= 1;
  465.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  466.                 _nop_();
  467.                 SCLK = 0;//DS1302下降沿时,放置数据
  468.                 _nop_();
  469.         }
  470.         _nop_();
  471.         for(n=0; n<8; n++)//读取8位数据
  472.         {
  473.                 dat1 = DSIO;//从最低位开始接收
  474.                 dat = (dat>>1) | (dat1<<7);
  475.                 SCLK = 1;
  476.                 _nop_();
  477.                 SCLK = 0;//DS1302下降沿时,放置数据
  478.                 _nop_();
  479.         }

  480.         RST = 0;
  481.         _nop_();        //以下为DS1302复位的稳定时间,必须的。
  482.         SCLK = 1;
  483.         _nop_();
  484.         DSIO = 0;
  485.         _nop_();
  486.         DSIO = 1;
  487.         _nop_();
  488.         return dat;        
  489. }

  490. /*******************************************************************************
  491. * 函 数 名         : Ds1302Init
  492. * 函数功能                   : 初始化DS1302.
  493. * 输    入         : 无
  494. * 输    出         : 无
  495. *******************************************************************************/

  496. void Ds1302Init()
  497. {
  498.         uchar n;
  499.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  500.         for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
  501.         {
  502.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  503.         }
  504.         Ds1302Write(0x8E,0x80);                 //打开写保护功能
  505. }

  506. /*******************************************************************************
  507. * 函 数 名         : Ds1302ReadTime
  508. * 函数功能                   : 读取时钟信息
  509. * 输    入         : 无
  510. * 输    出         : 无
  511. *******************************************************************************/

  512. void Ds1302ReadTime()
  513. {
  514.         uchar n;
  515.         for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
  516.         {
  517.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  518.         }
  519.                
  520. }

  521. //////////////////////////////////////////////////////////////////////////////////////////////////////////


  522. #include "ds1302.h"        
  523. #include "display.h"
  524. #include "key.h"

  525. typedef unsigned int u16;          //对数据类型进行声明定义
  526. typedef unsigned char u8;
  527. unsigned char DisplayData[8];


  528. char num=0;
  529. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  530. bit flag=0;

  531. u16 t;

  532. void datapros();         




  533. /*******************************************************************************
  534. * 函 数 名       : main
  535. * 函数功能                 : 主函数
  536. * 输    入       : 无
  537. * 输    出             : 无
  538. *******************************************************************************/
  539. void main()
  540. {        
  541.         Ds1302Init();           //第一次初始化后就可以注释该条语句,这样下次重启就不会再次初始化了
  542.                 TMOD=0X01;                        
  543.                 TH0=(65536-46080)/256;
  544.                 TL0=(65536-46080)%256;
  545.                 EA=1;
  546.                 ET0=1;
  547.         while(1)
  548.         {
  549.                 datapros();         //数据处理函数
  550.                 Display();//数码管显示函数               
  551.           key_prc();
  552.         }               
  553. }

  554. void datapros()         
  555. {
  556.   Ds1302ReadTime();
  557.         DisplayData[0] = smgduan[TIME[2]/16];                                //时
  558.         DisplayData[1] = smgduan[TIME[2]&0x0f];                                 
  559.         DisplayData[2] = 0x40;
  560.         DisplayData[3] = smgduan[TIME[1]/16];                                //分
  561.         DisplayData[4] = smgduan[TIME[1]&0x0f];        
  562.         DisplayData[5] = 0x40;
  563.         DisplayData[6] = smgduan[TIME[0]/16];                                //秒
  564.         DisplayData[7] = smgduan[TIME[0]&0x0f];
  565. }


  566. void timer0() interrupt 1 //定时器1中断函数代码
  567. {
  568.         
  569.         TH0=(65536-46080)/256;//定时50ms
  570.         TL0=(65536-46080)%256;
  571.         t ++;

  572.         if(t==5)//0.25秒=0.25秒
  573.         {
  574.                 t=0;
  575.                 flag=~flag;
  576.         }
  577.         
  578. }
复制代码
回复

使用道具 举报

10#
ID:229502 发表于 2022-4-28 23:20 | 只看该作者
P05P06P07加上上拉电阻试试。
回复

使用道具 举报

11#
ID:625730 发表于 2022-4-28 23:26 | 只看该作者

导致P1赋值不遵循0-10的变化,检查一下datapros函数中的displaydata的取值是不是有问题。
回复

使用道具 举报

12#
ID:401564 发表于 2022-4-28 23:40 | 只看该作者
自己画板,这个板子能改进的地方太多了
单片机可以STC8A4K的,这个也是8051单片机,内置上拉电阻,不需要复位电路,不需要晶振,不需要那两个数字IC
整个电路只需要:1片STC8A4K,1个DS1302,6个电容,一个CR2032,再加上按键就行了,电路简单到不行
不喜欢的话,就当我没说
你这个程序可以自己调试的,不用太多时间的
1,先搞定显示部分的,不要读取时钟芯片的数据,只要显示程序显示一个变量就行,从0-9每次烧录验证
2,调试按键,在显示正常之后,按键暂时不需要写入,调试好按键功能,按一下变量加1或者减1,然后送显示,每次烧录验证
3,按键功能正常之后,再对时钟芯片进行读写验证
回复

使用道具 举报

13#
ID:797929 发表于 2022-4-29 09:18 来自手机 | 只看该作者
Y_G_G 发表于 2022-4-28 23:40
自己画板,这个板子能改进的地方太多了
单片机可以STC8A4K的,这个也是8051单片机,内置上拉电阻,不需要复位 ...

业余的啊,自己画来玩玩的,多赐教。显示部分,调试过直接输出赋值0,八位数码管都能正常显示。在开发板上11.0592MHz下载这代码,能正常工作,只是端口配置不一样。不会是时钟模块坏了吧。
回复

使用道具 举报

14#
ID:797929 发表于 2022-4-29 09:22 来自手机 | 只看该作者
Y_G_G 发表于 2022-4-28 23:40
自己画板,这个板子能改进的地方太多了
单片机可以STC8A4K的,这个也是8051单片机,内置上拉电阻,不需要复位 ...

在keil中,调试模式下,看了输出段显,只高三位(P1.6~P1.8)有高低电平变化
回复

使用道具 举报

15#
ID:401564 发表于 2022-4-29 10:01 | 只看该作者
k21992 发表于 2022-4-29 09:22
在keil中,调试模式下,看了输出段显,只高三位(P1.6~P1.8)有高低电平变化

不要仿真,只看烧录结果
直接赋值显示能正常的话,就说明你显示部分是对的
去论坛下载一个DS1302的代码,读写看一下
我没有DS1302,没法测试你的代码
回复

使用道具 举报

16#
ID:797929 发表于 2022-4-29 10:16 | 只看该作者
Y_G_G 发表于 2022-4-29 10:01
不要仿真,只看烧录结果
直接赋值显示能正常的话,就说明你显示部分是对的
去论坛下载一个DS1302的代码, ...

好的,可以试试,多谢啊!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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