简单的DS12C887摩托罗拉总线读写函数,有一句话不知道为什么要添加。
时间:10-02
整理:3721RD
点击:
今天下午,把以前从maxim官网上申请的样片,焊在了洞洞板上,附上一张照片和效果图啊:由于线太短了,图片拍的不好,请见谅啊:
并写了程序(最开始是按照摩托罗拉总线写的),依照如下的时序图:
写的读写函数如下:
- void wtdata(unsigned char add, unsigned char cm)
- {
- RW = 0;
- DS = 0;
- AS = 1;
- P1 = add;
- CS = 0;
- delay1us();
- AS = 0;
- delay1us();
-
- DS = 1;
- P1 = cm;
- delay1us();
- DS = 0;
- AS = 1;
- }
- unsigned char rddata(unsigned char add)
- {
- unsigned char time;
- RW = 0;
- DS = 0;
- AS = 1;
- P1 = add;
- CS =0;
- delay1us();
- AS = 0;
- RW = 1;
- delay1us();
- DS = 1;
- P1 = 0XFF; /*这句话超级重要?*/
- delay1us();
- time = P1;
- DS = 0;
- AS = 1;
-
- return time;
- }
然后,我就以为是我没有复位引脚没有接高电平,导致我的程序现象不对的,遗憾的是,我把DS12C887的复位引脚接了高电平,实验证明, 我的程序依旧是不对的。接着,我继续修改我的摩托罗拉总线函数,还是不对,索性,我按照intel 总线的时序,他们的读写时序图分别如下:
写了我的读写函数的代码,如下所示(事后证明错误是一个,都是少了P1=0XFF;不知道为什么?):
- void wtdata(unsigned char add, unsigned char cm)
- {
- AS = 0;
- DS = 0;
- RW = 0;
- RW = 1;
- DS = 1;
- AS = 1;
- CS = 0;
- P1 = add;
- AS = 0;
- RW = 0;
- P1 = cm;
- RW = 1;
- AS = 1;
- CS = 1;
- }
- unsigned char rddata(unsigned char add)
- {
- unsigned char time;
- AS = 0;
- DS = 0;
- RW = 0;
- RW = 1;
- DS = 1;
- AS = 1;
- CS = 0;
- P1 = add;
- AS = 0;
- DS = 0;
- P1 = 0XFF;/*超级重要,为什么呢?从芯片手册里可以看出来吗?*/
- time = P1;
- DS = 1;
- AS = 1;
- CS = 1;
- return time;
- }
这个问题很简单,与时许没有直接关系,而是与51的IO口读操作有关。51单片机的IO是准双向口,即可以做输出口也可以做双向口。做输出时,端口的状态是被输出寄存器锁存的。如果你先把一个IO做输出,之后再做输入,那么读到的端口值取决于两方面,一是外部电路的电平,这是你真正想要的。二是端口输出寄存器的电平,如果寄存器为0,即使你外部电路是高电平,读到的也是0。所以在使用传统51单片机时,要记住的一点是:读某个端口之前,先向该端口写1,目的是使端口的输出寄存器输出1,此时该端口是弱上拉,可以被外部电路拉低。当然,如果你能保证它始终为1(只用该端口做输入),可省略写1这一步。今年来有很多增强型的1单片机,是可以配置IO的模式的,达到真正的双向口,此时可省去读之前先写1的步骤。具体要看芯片的数据手册
谢谢你,真的是这样。
摩托罗拉 相关文章: