DS1302的困惑

[复制链接]
2985|8
 楼主| dubai 发表于 2011-4-27 20:53 | 显示全部楼层 |阅读模式
void DS1302InputByte(unsigned char d)     //实时时钟写入一字节(内部函数)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)   //相当于汇编中的 RRC
    {
        DS1302_IO = ACC0;               
        DS1302_CLK = 1;   
        DS1302_CLK = 0;         ACC = ACC >> 1;
    }
}
unsigned char DS1302OutputByte(void)     //实时时钟读取一字节(内部函数)
{
    unsigned char i;
    for(i=8; i>0; i--)  //相当于汇编中的 RRC
    {
        ACC = ACC >>1;                     
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}
lackan 发表于 2011-4-27 21:09 | 显示全部楼层
有啥困惑的?
 楼主| dubai 发表于 2011-4-27 22:52 | 显示全部楼层
本帖最后由 dubai 于 2011-4-27 22:54 编辑

读写都改成    DS1302_CLK = 0;  DS1302_CLK=1;    就无法读取数据了,为什么呢?不解.这样不也是会产生上升沿和下降沿吗。
来与君 发表于 2011-4-28 17:38 | 显示全部楼层
这个DS1302的例子程序搞了多少人啊

用C语言就不要使用类似ACC这样和硬件有关的变量吧
joyme 发表于 2011-4-28 18:09 | 显示全部楼层
CLK下降沿开始变化数据,CLK上升沿后开始读取数据,否则可能读不到数据(或不稳定),感觉你的程序有点问题,况且程序里没有一点延时。不要盲目追求代码简化,稳定才是压倒一切的。
万山21 发表于 2011-7-27 11:20 | 显示全部楼层
用C语言就不要使用类似ACC这样和硬件有关的变量吧
来与君 发表于 2011-4-28 17:38

为什么?
老鱼探戈 发表于 2011-7-27 11:52 | 显示全部楼层
本帖最后由 老鱼探戈 于 2011-7-27 14:52 编辑

C语言中最好不要用ACC做局部变量用,因为你不知道编译器会怎么做,不要控制。如果是汇编的话是比较好控制的 。
你的时序也不对。。。。

  1. //========================================
  2. //函数名称:void singlebyte_write(uchar date)
  3. //输入参数:uchar date
  4. //输出参数:无
  5. //函数功能:8位数据传送
  6. //========================================
  7. void singlebyte_write(uchar date)
  8. {
  9. uchar i;

  10. T_RST=1; //启动数据传送
  11. for(i=0;i<8;i++) //循环8次写入数据
  12. {
  13. T_SCLK=0;
  14. if(date&0x01) //从低位开始写
  15. T_IO=1;
  16. else
  17. T_IO=0;
  18. T_SCLK=1; //在时钟线的上升沿写入一位数据
  19. date=date>>1; //将高1位数据移至ACC^0
  20. // delayns();
  21. }
  22. }
  23. //========================================
  24. //函数名称:uchar singlebyte_read(void)
  25. //输入参数:无
  26. //输出参数:uchar ACC
  27. //函数功能:从DS1302读取1Byte数据
  28. //========================================
  29. uchar singlebyte_read(void) //从DS1302读取1Byte数据
  30. {
  31. uchar i,temp; //启动数据传送
  32. for(i=0; i<8; i++) //读出8位数据
  33. {
  34. T_SCLK = 0;
  35. temp = temp>>1;
  36. if(T_IO==1)
  37. temp+=0x80;
  38. T_IO=1; //P1口输入前置1
  39. T_SCLK = 1; //时钟线上升沿读出1位数据
  40. // delayns();
  41. }
  42. return(temp);
  43. }
  44. //========================================
  45. //函数名称: void write_ds1302(uchar add,uchar date)
  46. //输入参数:uchar add,uchar date
  47. //输出参数:无
  48. //函数功能:往DS1302写入数据
  49. //========================================
  50. void write_ds1302(uchar add,uchar date) //往DS1302写入数据
  51. {
  52. // T_RST = 0;
  53. T_RST = 1;
  54. // delayns();
  55. singlebyte_write(add); //地址,命令
  56. singlebyte_write(date); //写1Byte数据
  57. T_SCLK = 1;
  58. T_RST =0;
  59. }
  60. //========================================
  61. //函数名称:uchar read_ds1302(uchar add)
  62. //输入参数:uchar add
  63. //输出参数:uchar date
  64. //函数功能:从DS1302读取数据
  65. //========================================
  66. uchar read_ds1302(uchar add) //从DS1302读取数据
  67. {
  68. uchar date;
  69. T_SCLK=0;
  70. T_RST=1;

  71. singlebyte_write(add);
  72. date=singlebyte_read();
  73. T_SCLK=1;
  74. T_RST=0;
  75. return(date);
  76. }
ningling_21 发表于 2011-7-27 15:12 | 显示全部楼层
楼上正解...
goto0514 发表于 2011-8-19 13:49 | 显示全部楼层
同意七楼的,写程序就象写**一样,好的**读起来朗朗上口,意思容易让人明白。不好的**读起来费劲,而且容易让你误解。现在你的程序就是第二种,读你代码的是计算机,可惜它没读明白!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部