微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 简单的DS12C887摩托罗拉总线读写函数,有一句话不知道为什么要添加。

简单的DS12C887摩托罗拉总线读写函数,有一句话不知道为什么要添加。

时间:10-02 整理:3721RD 点击:

今天下午,把以前从maxim官网上申请的样片,焊在了洞洞板上,附上一张照片和效果图啊:由于线太短了,图片拍的不好,请见谅啊:

并写了程序(最开始是按照摩托罗拉总线写的),依照如下的时序图:

写的读写函数如下:

  1. void wtdata(unsigned char add, unsigned char cm)
  2. {
  3.     RW = 0;
  4.         DS = 0;
  5.         AS = 1;
  6.         P1 = add;
  7.         CS = 0;
  8.         delay1us();
  9.         AS = 0;
  10.         delay1us();
  11.         
  12.         DS = 1;
  13.         P1 = cm;
  14.         delay1us();
  15.         DS = 0;
  16.         AS = 1;
  17. }

复制代码

  1. unsigned char rddata(unsigned char add)
  2. {
  3.     unsigned char time;
  4.         RW = 0;
  5.         DS = 0;
  6.         AS = 1;
  7.         P1 = add;
  8.         CS =0;
  9.         delay1us();
  10.         AS = 0;
  11.         RW = 1;
  12.         delay1us();

  13.         DS = 1;
  14.         P1 = 0XFF; /*这句话超级重要?*/
  15.         delay1us();
  16.         time = P1;
  17.         DS = 0;
  18.         AS = 1;
  19.         
  20.         return time;
  21. }

复制代码

刚开始的时候,没有添加上面红色的部分:P1=0XFF;实验现象就是不正确,都会来的数总是不变,然后,我从网上看了,别人写的读写函数,直接复制粘贴过来了,现象就有了。(复位引脚要接高电平,最开始我没有接)。
然后,我就以为是我没有复位引脚没有接高电平,导致我的程序现象不对的,遗憾的是,我把DS12C887的复位引脚接了高电平,实验证明, 我的程序依旧是不对的。接着,我继续修改我的摩托罗拉总线函数,还是不对,索性,我按照intel 总线的时序,他们的读写时序图分别如下:



写了我的读写函数的代码,如下所示(事后证明错误是一个,都是少了P1=0XFF;不知道为什么?):

  1. void wtdata(unsigned char add, unsigned char cm)
  2. {
  3. AS = 0;
  4. DS = 0;
  5. RW = 0;
  6. RW = 1;
  7. DS = 1;
  8. AS = 1;        
  9. CS = 0;
  10. P1 = add;

  11. AS = 0;
  12. RW = 0;
  13. P1 = cm;
  14. RW = 1;
  15. AS = 1;
  16. CS = 1;
  17. }

复制代码

  1. unsigned char rddata(unsigned char add)
  2. {
  3. unsigned char time;
  4. AS = 0;
  5. DS = 0;
  6. RW = 0;
  7. RW = 1;
  8. DS = 1;
  9. AS = 1;
  10. CS = 0;
  11. P1 = add;

  12. AS = 0;
  13. DS = 0;         
  14. P1 = 0XFF;/*超级重要,为什么呢?从芯片手册里可以看出来吗?*/
  15. time = P1;
  16. DS = 1;
  17. AS = 1;
  18. CS = 1;
  19. return time;
  20. }

复制代码

刚开始的时候,还是不行,我就继续修改,因为我是为了锻炼我看时序图的能力,所以我不看别人的程序,实在是想不出来是什么问题了,我看我自己的代码和别人的差别,谁知道就是少了:P1=0XFF;这是为什么呢?为什么读取数据之前,要先写入0xff呢?这个可以从手册上面找出对应的话吗?求指导啊,,,,,





这个问题很简单,与时许没有直接关系,而是与51的IO口读操作有关。51单片机的IO是准双向口,即可以做输出口也可以做双向口。做输出时,端口的状态是被输出寄存器锁存的。如果你先把一个IO做输出,之后再做输入,那么读到的端口值取决于两方面,一是外部电路的电平,这是你真正想要的。二是端口输出寄存器的电平,如果寄存器为0,即使你外部电路是高电平,读到的也是0。所以在使用传统51单片机时,要记住的一点是:读某个端口之前,先向该端口写1,目的是使端口的输出寄存器输出1,此时该端口是弱上拉,可以被外部电路拉低。当然,如果你能保证它始终为1(只用该端口做输入),可省略写1这一步。今年来有很多增强型的1单片机,是可以配置IO的模式的,达到真正的双向口,此时可省去读之前先写1的步骤。具体要看芯片的数据手册

谢谢你,真的是这样。

上一篇:帮忙看下原理图
下一篇:蓝牙测试问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top