hylpro 发表于 2010-10-20 11:30:50

shiftone模块, 单线驱动74hc595, 放在小车上作声光控制还不错,省资源阿

这个电路是国外一个哥们2009年的时候发表的.
http://www.romanblack.com/shift1.htm

1跟线驱动一个74hc595, 在某些资源紧张的控制器上, 作为速度稍慢的输出扩展,用起来很方便,就一根信号线.
原理是利用阻容造成的延迟来发送1和0, 见下图.
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_591459YKJ6C3.gif
(原文件名:1.gif)

具体到实用电路,这里还有一幅具体的操作协议:

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_591460MKKOO6.gif
(原文件名:2.gif)

为了方便,也制作了一个, 放到小车上作为声光效果的扩展.电路元件稍有改动. 手头没有2n2的电容, 就用了1.2n的.可以更进一步提高操作速度. 当然顺手集成了一个buzz. 做个流水灯,暴闪灯在玩具车上这个最合适不过了.

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_591461MOV0RS.jpg
(原文件名:3.jpg)


PCB参考:
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_591462L47IFX.jpg
(原文件名:4.jpg)

最后是实物, 无图无真相.


http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_591463TXZ6NS.jpg
(原文件名:5.jpg)

dengting 发表于 2010-10-20 14:18:18

好东西!MARK

kbdcj2000 发表于 2010-10-20 14:42:28

MARK!

isme00174 发表于 2010-10-20 21:34:09

不错,学习了。。。。。。

wanpujame 发表于 2010-10-20 23:13:30

good,mark!

wkman 发表于 2010-10-21 01:14:35

论坛里面的cowboy还发表了个2line驱动1602液晶的,原理也是类似的方式。。。。。

millwood0 发表于 2010-10-22 08:49:40

"用595的话有点小问题,送Latch Command 的时候,会造成输出的最低位为0,所以只能传送七位数据"

here is a ShiftOne implementation on 8051, driving a HC164 with only one line, + a r/c network.

========code============
//sending data to hc164 via shiftone
#include <regx51.h>
#include "gpio.h"
#include "delay.h"

#define HC164_PORT                        P2
#define HC164_DDR                        P2
#define HC164_SDO                        (1<<3)        //hc164 shift1 pin
#define HC164_CLK                        (1<<0)
#define HC164_STROBE()                {IO_CLR(HC164_PORT, HC164_CLK); HC164_DELAY(); IO_SET(HC164_PORT, HC164_CLK);}        //strobe clk
#define HC164_DLY                        100                //delay
#define HC164_DLY_SET                1
#define HC164_DLY_CLR                50
#define HC164_DELAY()                {delay(HC164_DLY);}

#define SDO_SET(port, pin)        {IO_CLR(port, pin); delay(HC164_DLY_SET); IO_SET(port, pin); delay(HC164_DLY-HC164_DLY_SET);}
#define SDO_CLR(port, pin)        {IO_CLR(port, pin); delay(HC164_DLY_CLR); IO_SET(port, pin); delay(HC164_DLY-HC164_DLY_CLR);}


void hc164_init1(void) {                                //reset hc164
        IO_CLR(HC164_PORT, HC164_SDO);        //drive hc164_pin low
        IO_OUT(HC164_DDR, HC164_SDO);        //hc164 as output
}

void hc164_send1(unsigned char byte_t) {                //send a byte over hc164
        unsigned char mask=0x80;                //highest bit first
        do {
                if (mask & byte_t) SDO_SET(HC164_PORT, HC164_SDO)        //send the data
                else SDO_CLR(HC164_PORT, HC164_SDO);
                //HC164_STROBE();                                //strobe out the data
                mask = mask >> 1;                        //shift to the next bit
        } while (mask);
}

void hc164_init(void) {                                //reset hc164
        IO_CLR(HC164_PORT, HC164_SDO | HC164_CLK);        //drive hc164_pin low
        IO_OUT(HC164_DDR, HC164_SDO | HC164_CLK);        //hc164 as output
}

void hc164_send(unsigned char byte_t) {                //send a byte over hc164
        unsigned char mask=0x80;                //highest bit first
        do {
                if (mask & byte_t) IO_SET(HC164_PORT, HC164_SDO);        //send the data
                else IO_CLR(HC164_PORT, HC164_SDO);
                HC164_STROBE();                                //strobe out the data
                mask = mask >> 1;                        //shift to the next bit
        } while (mask);
}

void mcu_init(void) {                        //reset the mcu
}

int main(void) {
        mcu_init();                                        //reset mcu
        hc164_init1();                                //reset hc164
        while (1) {
                hc164_send1(0x0f);                //send something
                delay_us(100);                        //some delay
                hc164_send1(0xf5);
                delay_us(100);
        }
}

=================================

here, hc164_init1() / hc164_send1() are the pair for ShiftOne implementation. and hc164_init()/hc164_send() are the regular two line implementation, so you can see how similar they are.

enjoy.

millwood0 发表于 2010-10-22 08:53:47

here is the waveform of the code sending over ox0f using shiftone.

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_591859KC5YLE.gif
(原文件名:19. hc164 shiftone.gif)

notice how data is clocked into the hc164 with different delay lengths.

millwood0 发表于 2010-10-22 08:54:33

supposedly, this idea goes way back, into the 1950s.

hylpro 发表于 2010-10-22 09:23:42

回复【9楼】millwood0
supposedly, this idea goes way back, into the 1950s.
-----------------------------------------------------------------------

我只看到了09版...

erxun 发表于 2010-10-22 09:33:12

创意不错啊

vtte 发表于 2010-10-22 09:41:17

收藏一下
页: [1]
查看完整版本: shiftone模块, 单线驱动74hc595, 放在小车上作声光控制还不错,省资源阿