找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 534|回复: 1
收起左侧

Protues中DS1302仿真效果不正确,哪个大神能帮忙看看什么原因?

[复制链接]
闫新净 发表于 2019-11-27 15:29 | 显示全部楼层 |阅读模式

仿真图

仿真图

/*主函数*/
  1. #include<reg52.h>

  2. extern void Init_1602();
  3. extern void ShowStr_1602(unsigned char x,unsigned char y,unsigned char *str);

  4. extern void Init_ds1302();
  5. extern unsigned char Read_ds1302(unsigned char reg);

  6. bit flag200ms=0;
  7. unsigned char cnt;
  8. unsigned char time[8];
  9. unsigned char str[12];
  10. unsigned char stmp=0xAA;

  11. void Init_time0();

  12. void main()
  13. {
  14.         unsigned char i;

  15.         Init_time0();
  16.         Init_ds1302();
  17.         Init_1602();
  18.         
  19.         while(1)
  20.         {
  21.                 if(flag200ms)
  22.                 {
  23.                         flag200ms=0;
  24.                         for(i=0;i<7;i++)
  25.                         {
  26.                                 time[i]=Read_ds1302(i);
  27.                         }
  28.                         if(stmp!=time[0])
  29.                         {
  30.                                 str[0]='2';
  31.                                 str[1]='0';
  32.                                 str[2]=(time[6]>>4)+'0';
  33.                                 str[3]=(time[6]&0x0F)+'0';
  34.                                 str[4]='-';
  35.                                 str[5]=(time[4]>>4)+'0';
  36.                                 str[6]=(time[4]&0x0f)+'0';
  37.                                 str[7]='-';
  38.                                 str[8]=(time[3]>>4)+'0';
  39.                                 str[9]=(time[3]&0x0f)+'0';
  40.                                 str[10]='\0';
  41.                                 ShowStr_1602(0,0,str);

  42.                                 ShowStr_1602(0,1,"Week:");
  43.                                 str[0]=(time[5]&0x0f)+'0';
  44.                                 str[1]='\0';
  45.                                 ShowStr_1602(5,1,str);

  46.                                 str[0]=(time[2]>>4)+'0';
  47.                                 str[1]=(time[2]&0x0f)+'0';
  48.                                 str[2]=':';
  49.                                 str[3]=(time[1]>>4)+'0';
  50.                                 str[4]=(time[1]&0x0f)+'0';
  51.                                 str[5]=':';
  52.                                 str[6]=(time[0]>>4)+'0';
  53.                                 str[7]=(time[0]&0x0f)+'0';
  54.                                 str[8]='\0';
  55.                                 ShowStr_1602(8,1,str);

  56.                                 stmp=time[0];
  57.                         }                                
  58.                 }               
  59.         }                        
  60. }

  61. void Init_time0()
  62. {
  63.         TMOD = 0x01;
  64.     TH0 = 0x0DC;
  65.     TL0 = 0x00;
  66.     EA = 1;
  67.     ET0 = 1;
  68.     TR0 = 1;
  69. }

  70. void interrupttime0()interrupt 1
  71. {
  72.         TH0 = 0x0DC;
  73.     TL0 = 0x00;

  74.         cnt++;

  75.         if(cnt>=2)
  76.         {
  77.                 cnt=0;
  78.                 flag200ms=1;
  79.         }
  80. }
  81. /*DS1302*/[/i][i]#include<reg52.h>

  82. sbit DS1302_RST=P2^1;
  83. sbit DS1302_IO=P2^2;
  84. sbit DS1302_SCLK=P2^3;

  85. void WriteByte_ds1302(unsigned char dat)
  86. {
  87.         unsigned char mask;
  88.         for(mask=0x01;mask!=0;mask<<=1)
  89.         {
  90.                  if(mask&dat!=0)
  91.                          DS1302_IO=1;
  92.                  else
  93.                          DS1302_IO=0;
  94.                  DS1302_SCLK=1;
  95.                  DS1302_SCLK=0;
  96.         }        
  97. }
  98. void Write_ds1302(unsigned char reg,unsigned char dat)
  99. {
  100.         DS1302_RST=1;
  101.         WriteByte_ds1302((reg<<1)|0x80);
  102.         WriteByte_ds1302(dat);        
  103.         DS1302_RST=0;               
  104. }
  105. unsigned char ReadByte_ds1302()
  106. {
  107.         unsigned char date;
  108.         unsigned char mask;
  109.         for(mask=0x01;mask!=0;mask<<=1)
  110.         {
  111.                 if(DS1302_IO!=0)
  112.                 {
  113.                         date|=mask;
  114.                 }        
  115.                 DS1302_SCLK=1;
  116.                 DS1302_SCLK=0;
  117.         }        
  118.         return date;        
  119. }

  120. unsigned char Read_ds1302(unsigned char reg)
  121. {
  122.         unsigned char date;

  123.         DS1302_RST=1;
  124.         WriteByte_ds1302(reg<<1|0x81);
  125.         date=ReadByte_ds1302();
  126.         DS1302_RST=0;
  127.         
  128.         return date;        
  129.                         
  130. }
  131. void Init_ds1302()
  132. {
  133.         unsigned char time[]={0x10,0x3,0x11,0x27,0x15,0x25,0x30};
  134.         unsigned char i;
  135.         
  136.         
  137.         DS1302_RST=0;
  138.         DS1302_SCLK=0;
  139.         i=Read_ds1302(0);
  140.         if((i&0x80)!=0)
  141.         {
  142.                 Write_ds1302(7,0x00);
  143.                 for(i=0;i<7;i++)
  144.                 {
  145.                         Write_ds1302(i,time[i]);
  146.                 }        
  147.         }        
  148. }
复制代码
回复

使用道具 举报

wc86110 发表于 2019-11-27 18:02 来自手机 | 显示全部楼层
复位电路实物上有点不妥,注入 1302 旁边那设备信号能没事么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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