一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2378|回复: 1

帮忙看看这个时钟程序什么问题,显示都是T5 55 65...

[复制链接]
发表于 2011-8-27 11:22 | 显示全部楼层 |阅读模式
本帖最后由 adsl865 于 2011-8-27 11:24 编辑

20110904(009).jpg 20110904.jpg

用的是贴片的  STC89C52RC
  1. //DS1302管脚定义
  2. sbit T_CLK = P3^4; //ds1302_clk(时钟线)
  3. sbit T_IO = P3^5; //ds1302_dat(数据线)
  4. sbit T_RST = P3^6; //ds1302_Rst(复位线)

  5. sbit ACC0 = ACC^0;
  6. sbit ACC1 = ACC^1;
  7. sbit ACC2 = ACC^2;
  8. sbit ACC3 = ACC^3;
  9. sbit ACC4 = ACC^4;
  10. sbit ACC5 = ACC^5;
  11. sbit ACC6 = ACC^6;
  12. sbit ACC7 = ACC^7;

  13. #define uchar unsigned char
  14. #define uint unsigned int

  15. unsigned second,minute,hour,day,month,week,year;

  16. //时钟数据(7字节BCD码)格式为: 秒 分 时 日 月星期 年-----------------------------
  17. unsigned char idata Time[7];


  18. /*******************************************************************************************
  19. * 函数名: BCD2HEX
  20. * 功能描述: BCD码转换成十进制
  21. * 入口参数: 无
  22. * 出口参数: 无
  23. *******************************************************************************************/
  24. unsigned char BCD2HEX(unsigned char BCDChar)
  25. {
  26. unsigned char temp;
  27. temp=(BCDChar/16*10+BCDChar%16);
  28. return temp;
  29. }
  30. /*******************************************************************************************
  31. * 函数名: HEX2BCD
  32. * 功能描述: 十进制转换成BCD码
  33. * 入口参数: 无
  34. * 出口参数: 无
  35. *******************************************************************************************/
  36. unsigned char HEX2BCD(unsigned char HEXChar)
  37. {
  38. unsigned char temp;
  39. temp=(HEXChar/10*16+HEXChar%10);
  40. return temp;
  41. }
  42. /*******************************************************************************************
  43. * 函数名: WriteByteDS1302
  44. * 功能描述:
  45. * 入口参数: 无
  46. * 出口参数: 无
  47. *******************************************************************************************/
  48. void WriteByteDS1302(unsigned char Data)
  49. {
  50. unsigned char i;
  51. ACC = Data;
  52. for(i=8; i>0; i--)
  53. {
  54. T_IO = ACC0;
  55. T_CLK = 1;
  56. T_CLK = 0;
  57. ACC = ACC >> 1;
  58. }
  59. }
  60. /*******************************************************************************************
  61. * 函数名: ReadByteDS1302
  62. * 功能描述:
  63. * 入口参数: 无
  64. * 出口参数: 无
  65. *******************************************************************************************/
  66. unsigned char ReadByteDS1302(void)
  67. {
  68. unsigned char i;
  69. for(i=8; i>0; i--)
  70. {
  71. ACC = ACC >>1;
  72. ACC7 = T_IO;
  73. T_CLK = 1;
  74. T_CLK = 0;
  75. }
  76. return(ACC);
  77. }
  78. /*******************************************************************************************
  79. * 函数名: WriteDS1302
  80. * 功能描述:
  81. * 入口参数: 无
  82. * 出口参数: 无
  83. *******************************************************************************************/
  84. void WriteDS1302(unsigned char Addr,unsigned char Data)
  85. {
  86. T_RST = 0;
  87. T_CLK = 0;
  88. T_RST = 1;
  89. WriteByteDS1302(Addr);
  90. WriteByteDS1302(Data);
  91. T_CLK = 1;
  92. T_RST = 0;
  93. }
  94. /*******************************************************************************************
  95. * 函数名: ReadDS1302
  96. * 功能描述:
  97. * 入口参数: 无
  98. * 出口参数: 无
  99. *******************************************************************************************/
  100. unsigned char ReadDS1302(unsigned char Addr)
  101. {
  102. unsigned char Data;
  103. T_RST = 0;
  104. T_CLK = 0;
  105. T_RST = 1;
  106. WriteByteDS1302(Addr);
  107. Data = ReadByteDS1302();
  108. T_CLK = 1;
  109. T_RST = 0;
  110. return(Data);
  111. }

  112. /******************************************************************/

  113. /*******************************************************************************************
  114. * 函数名: Set
  115. * 功能描述:
  116. * 入口参数: 无
  117. * 出口参数: 无
  118. *******************************************************************************************/
  119. /*void Set(unsigned char sel,unsigned char selby)
  120. {
  121. unsigned char address,item;
  122. unsigned char max,min;

  123. if(sel==0) {address=0x80; max=59;min=0;} //秒
  124. if(sel==1) {address=0x82; max=59;min=0;} //分钟
  125. if(sel==2) {address=0x84; max=23;min=0;} //小时
  126. if(sel==3) {address=0x86; max=31;min=1;} //日
  127. if(sel==4) {address=0x88; max=12;min=1;} //月
  128. if(sel==5) {address=0x8a; max=7; min=1;} //星期
  129. if(sel==6) {address=0x8c; max=99;min=0;} //年
  130. if(sel==7) {address=0xc0; max=59;min=0;} //闹钟分钟
  131. if(sel==8) {address=0xc2; max=23;min=0;} //闹钟小时

  132. item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16;
  133. if (selby==0) item++; else item--;
  134. if(item>max) item=min;
  135. if(item<min) item=max;

  136. WriteDS1302(0x8e,0x00);
  137. WriteDS1302(address,item/10*16+item%10);
  138. WriteDS1302(0x90,0xa5);
  139. WriteDS1302(0x8e,0x80);
  140. }
  141. */
  142. /*******************************************************************************************
  143. * 函数名: SetTime
  144. * 功能描述:
  145. * 入口参数: 无
  146. * 出口参数: 无
  147. *******************************************************************************************/
  148. /*void SetTime(unsigned char *pClock)
  149. {
  150. unsigned char h;
  151. unsigned char Addr=0x80;
  152. WriteDS1302(0x8e,0x00);
  153. for(h=7; h>0; h--)
  154. {
  155. WriteDS1302(Addr,*pClock);
  156. pClock++;
  157. Addr+=2;
  158. }
  159. WriteDS1302(0x90,0xa5);
  160. WriteDS1302(0x8e,0x80);
  161. }*/
  162. /*******************************************************************************************
  163. * 函数名: ReadTime
  164. * 功能描述:
  165. * 入口参数: 无
  166. * 出口参数: 无
  167. *******************************************************************************************/
  168. void ReadTime()
  169. {
  170. second = BCD2HEX(Time[0]=ReadDS1302(0x81));
  171. minute = BCD2HEX(Time[1]=ReadDS1302(0x83));
  172. hour = BCD2HEX(Time[2]=ReadDS1302(0x85));
  173. day = BCD2HEX(Time[3]=ReadDS1302(0x87));
  174. month = BCD2HEX(Time[4]=ReadDS1302(0x89));
  175. year = BCD2HEX(Time[5]=ReadDS1302(0x8d));
  176. week = BCD2HEX(Time[6]=ReadDS1302(0x8b));
  177. }
  178. /*******************************************************************************************
  179. * 函数名: WriteTime
  180. * 功能描述:
  181. * 入口参数: 无
  182. * 出口参数: 无
  183. *******************************************************************************************/
  184. void WriteTime()
  185. {
  186. WriteDS1302(0x8e,0x00);
  187. WriteDS1302(0x80,0x00); //WriteDS1302(0x80,HEX2BCD(second));
  188. WriteDS1302(0x82,0x024); //WriteDS1302(0x82,HEX2BCD(minute));
  189. WriteDS1302(0x84,0x09); //WriteDS1302(0x84,HEX2BCD(hour));
  190. WriteDS1302(0x86,0x11); //WriteDS1302(0x86,HEX2BCD(day));
  191. WriteDS1302(0x88,0x07); //WriteDS1302(0x88,HEX2BCD(month));
  192. WriteDS1302(0x8A,0x2); //WriteDS1302(0x8A,HEX2BCD(week));
  193. WriteDS1302(0x8C,0x11); //WriteDS1302(0x8C,HEX2BCD(year));
  194. WriteDS1302(0x90,0xa5);
  195. WriteDS1302(0x8e,0x80);
  196. }
复制代码



  1. #include<reg52.h>
  2. #include<absacc.h>
  3. #include"zimo.h"
  4. #include"DS1302.h"
  5.    
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. unsigned char idata Dis[6];
  9. sbit ST=P0^0;
  10. sbit DS=P0^1;
  11. sbit SH=P0^2;
  12. /*******************************************************************************************
  13. *  函数名: Delay   
  14. *  功能描述:  
  15. *  入口参数:  无
  16. *  出口参数:  无
  17. *******************************************************************************************/
  18. void Delay(unsigned int i)
  19. {
  20.   unsigned int j;
  21. for(j=0;j<i;j++);
  22. }
  23. /*******************************************************************************************
  24. *  函数名:init   
  25. *  功能描述:读取时间  
  26. *  入口参数:  无
  27. *  出口参数:  无
  28. *******************************************************************************************/
  29. void init(void)
  30. {
  31.     ReadTime();//读取时间
  32. //Delay(1000);
  33.     Dis[0]=hour/10; //取小时的十位数
  34. Dis[1]=hour%10; //取小时的个位数
  35.     Dis[2]=minute/10;//取分钟的十位数
  36.     Dis[3]=minute%10;//取分钟的个位数
  37. Dis[4]=second/10;//取秒的十位数
  38. Dis[5]=second%10;//取秒的个位数
  39. }

  40. /*******************************************************************************************
  41. *  函数名: send_1   
  42. *  功能描述:显示时,分,秒时595锁存数据   
  43. *  入口参数:  无
  44. *  出口参数:  无
  45. *******************************************************************************************/
  46. void send_1(uchar temp)
  47. {
  48. uchar i;
  49. for (i=0;i<5;i++)
  50. {
  51.   temp=temp<<1;
  52.   DS=CY;
  53.   SH=1;
  54.   SH=0;
  55. }
  56. }

  57. /*******************************************************************************************
  58. *  函数名: mode_2 (显示时,分,秒)   
  59. *  功能描述:静态显示小时,分钟,秒  
  60. *  入口参数:  无
  61. *  出口参数:  无
  62. *******************************************************************************************/
  63. void mode_2(void)
  64. {
  65. uchar i,j,temp2;   
  66. for(i=0;i<7;i++)
  67.   {
  68.     for(j=0;j<6;j++)
  69.    {
  70.    if(j==0||j==1||j==3)
  71.     temp2=g_no[Dis[j]*7+i];   //加載小時的十位數和個位數,分钟的个位数
  72.    else
  73.    {
  74.     if(j==2)
  75.       {
  76.        if(i==2||i==4)  //加載分鍾的十位數和冒號
  77.         temp2=(g_no[Dis[j]*7+i])>>1;   //当到分的时候全部右移一位
  78.        else
  79.          temp2=((g_no[Dis[j]*7+i])>>1)|0X80;  //加載分鍾的十位數,当到分的时候全部右移一位
  80.       }
  81.      if(j==4)
  82.       {
  83.         if(i==3||i==5)  //加載秒的十位數和冒號
  84.         temp2=(s_no[Dis[j]*7+i])>>1;   //当到分的时候全部右移一位
  85.       else
  86.         temp2=((s_no[Dis[j]*7+i])>>1)|0X80;  //加載秒的十位數,当到分的时候全部右移一位
  87.       }
  88.      if(j==5)
  89.       {
  90.         temp2=s_no[Dis[j]*7+i];   //加載秒的個位數
  91.       }
  92.      }
  93.     send_1(temp2);
  94.    }
  95.     P2=0XFF;    //消隐
  96.    P2=P2^(1<<i);
  97.    ST=1;
  98.    Delay(170); //155
  99.    ST=0;
  100.   }
  101. }

  102. /*******************************************************************************************
  103. *  函数名: main   
  104. *  功能描述:  
  105. *  入口参数:  无
  106. *  出口参数:  无
  107. *******************************************************************************************/  
  108. void main (void)
  109. {
  110. uint  r;
  111. init();
  112. // Delay(5000);
  113. P2=0XFF;
  114. init();
  115. // WriteTime();
  116. while(1)
  117.   {
  118.   init();
  119.   mode_2();
  120. }
  121. }
复制代码
发表于 2011-8-29 19:14 | 显示全部楼层
给他固定显示个数字看看正常不,确定下是不是1302读出来的数据的问题。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-12-18 12:25 , Processed in 0.031763 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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