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) 好东西!MARK MARK! 不错,学习了。。。。。。 good,mark! 论坛里面的cowboy还发表了个2line驱动1602液晶的,原理也是类似的方式。。。。。 "用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. 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. supposedly, this idea goes way back, into the 1950s. 回复【9楼】millwood0
supposedly, this idea goes way back, into the 1950s.
-----------------------------------------------------------------------
我只看到了09版... 创意不错啊 收藏一下
页:
[1]