搜索
bottom↓
回复: 105

普通LED用于指示和数据通讯(附:电路、源代码、视频)

[复制链接]

出0入0汤圆

发表于 2007-12-8 19:50:02 | 显示全部楼层 |阅读模式
在两个普通LED间进行数据通讯的原理我就不说了,如果还有不知道的请搜索论坛上LED用做传感器的相关帖子。我使用的是两个高亮LED,通讯距离没有测过,我个人认为没有必要,视频里面的距离大概在8cm左右。这只是一个简单的演示,如果你采用的LED和我不一样,程序可能需要改变一些参数。

MEGA16上的代码:
//===============================================
//               两个LED间数据通讯
//               =================
//    该代码在MEGA16上实现了通过一个普通LED接收数
//据包,并通过该LED发送应答包。代码重在描述普通LED
//间实现通讯的原理,并不能在任意种类的两个LED间进行
//数据通讯,如果要实现将任何一个LED作为一个通讯端口,
//就要采用自适应算法。这个技术应用得好的话,你就不
//需要为你的产品留通讯接口了,再也不需要为产品调试
//或设置参数预留接口了,再也不用拆机或连线了,一切
//都可以通过一个电源灯或指示灯完成于无形之中。
//
//  电路:PA0---[+LED-]---[R300]---PA1
//
//
//                           by:xingcn 点点星尘
//                                    2007.11.08
//===============================================
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <avr/interrupt.h>

#define TRUE                        1
#define FALSE                        0
#define SBIT(x,y)                (x|=(1<<y))
#define CBIT(x,y)                (x&=~(1<<y))
#define BIT(x,y)                (x&(1<<y))
#define LED_ON(x)                CBIT(PORTD, x)
#define LED_OFF(x)                SBIT(PORTD, x)
#define B_9600                        51
#define B_38400                        12
#define LED_PORT                PORTA
#define LED_DDR                        DDRA
#define LED_PIN                        PINA
#define LED_N                        PA0                                        //LED+
#define LED_P                        PA1                                        //LED-
#define LED_N_OUT()                SBIT(LED_DDR, LED_N)
#define LED_P_OUT()                SBIT(LED_DDR, LED_P)
#define LED_N_IN()                CBIT(LED_DDR, LED_N)
#define LED_P_IN()                CBIT(LED_DDR, LED_P)
#define LED_N_HIG()                SBIT(LED_PORT, LED_N)
#define LED_N_LOW()                CBIT(LED_PORT, LED_N)
#define LED_P_HIG()                SBIT(LED_PORT, LED_P)
#define LED_P_LOW()                CBIT(LED_PORT, LED_P)
#define PACK_SIZE                18
#define PB_FUNC(x)                (x[0] >> 4)
#define PB_DATN(x)                (x[0] & 0x0F)

//--------------------------------------------------------
void                 delay_ms(unsigned int);
void                 port_init(void);
void                 usart_init(unsigned int);
unsigned char        led_light_recv(void);
unsigned char        led_send_char(const unsigned char);
void                 led_send_pack(const char, const void *, const char);

//--------------------------------------------------------
unsigned char rs,rb,rn,ln,bn,ro,pack[PACK_SIZE],rb_event;
//--------------------------------------------------------
//===============================================
//名称:delay_ms
//功能:毫秒延时
//参数:unsigned int ms    要延时的毫秒数
//返回:无
//备注:无
//===============================================
void delay_ms(unsigned int ms)
{
        unsigned int i=0x0000;
       
        while(i < ms)
        {
                _delay_loop_2(10*25 *4);
                i++;
        }
}

//===============================================
//名称:usart_init
//功能:串口初始化
//参数:unsigned int baud    波特率
//返回:无
//备注:无
//===============================================
void usart_init(unsigned int baud)
{
        UBRRH = (unsigned char)(baud >> 8);
        UBRRL = (unsigned char)baud;
       
        UCSRA = 0x02;                                        //U2X = 1

        UCSRB = (1<<RXEN)|(1<<TXEN);
       
        UCSRC = (1<<URSEL)|0x06;
}
//===============================================
//名称:port_init
//功能:端口初始化
//参数:无
//返回:无
//备注:无
//===============================================
void port_init(void)
{
        PORTA = 0xFF;
        PORTB = 0xFF;
        PORTC = 0xFF;
        PORTD = 0xFF;
       
       
        //做输入用
        DDRA = 0x00;
        DDRB = 0x00;
        DDRC = 0x00;
        DDRD = 0xFE;
        cli();
       
}

//===============================================
//名称:led_light_recv
//功能:检测LED受光状态
//参数:无
//返回:光照达到给定亮度返回 TRUE
//      光照达不到给定亮度返回 FALSE
//备注:无
//===============================================
unsigned char led_light_recv(void)
{
        unsigned char i;
       
        LED_P_OUT();
        LED_N_OUT();
        LED_N_HIG();
        LED_P_LOW();
        delay_ms(1);

        LED_N_LOW();
        LED_P_HIG();
        delay_ms(1);

        LED_P_IN();
        LED_P_LOW();
        LED_N_LOW();
        for(i = 0x00; i < 0x03; i++)
        {
                delay_ms(1);
                if(!BIT(LED_PIN, LED_P))
                        return TRUE;
        }
        return FALSE;
}
//===============================================
//名称:led_send_char
//功能:通过LED发送一个字节
//参数:unsigned char c    要发送的字节
//返回:发送的字节
//备注:无
//===============================================
unsigned char led_send_char(const unsigned char c)
{
        unsigned char i;

        for(i = 0; i < 8; i++)
        {
                LED_N_OUT();
                LED_P_OUT();
                LED_N_HIG();
                LED_P_LOW();
               
                if(BIT(c, ( 7 - i )))                                                // 高位在前
                        delay_ms(30);
                else
                        delay_ms(15);

                LED_N_LOW();
                delay_ms(15);
        }
        return c;
}

//===============================================
//名称:led_send_pack
//功能:通过LED发送一个数据包
//参数:char c       功能号
//      void *dat    数据
//      char dn             数据量       
//返回:无
//备注:数据包格式"功能号(高4位)|数据量(低4位)+
//      数据+(8bit)LRC校验",允许发送空数据。
//===============================================
void led_send_pack(const char func, const void *dat, const char dn)
{
        unsigned char n,lrc = 0;
        unsigned char *p = (unsigned char *)dat;

        //发送接收识别头
        LED_N_OUT();
        LED_P_OUT();
        LED_N_HIG();
        LED_P_LOW();
        delay_ms(60);
        LED_N_LOW();
        delay_ms(15);
       
        //每个包最多发送16个字节
        n = (func << 4) | ((p) ? (dn & 0x0F) : 0x00);
        lrc += led_send_char(n);
        for(n = 0; p != NULL && n < (dn & 0X0F); n++)
        {
                lrc += led_send_char(p[n]);
        }
       
        //发送校验字节
        led_send_char(lrc);
}
//============================================
//名称:main
//功能:主函数
//参数:无
//返回:1
//备注:无
//============================================
int main(void)
{
        unsigned char lrc,i;
       
        port_init();
        usart_init(B_9600);

        ln = 0;
        rb_event = FALSE;
        for(;;)
        {
                rs = led_light_recv();
                if(rs)
                {
                        ln++;
                }
                else
                {
                        if(ln >= 0x0F && ln <= 0x12)
                        {
                                bn = 0;
                                rb = 0;
                                ln = 0;
                                rn = 0;
                                ro = 0;
                                while(1)
                                {
                                        rs = led_light_recv();
                                        if(rs)
                                        {
                                                ln++;
                                        }
                                        else
                                        {
                                                if(ln >= 0x04 && ln <= 0x06)                //收到0
                                                {
                                                        rb <<= 1;
                                                        bn++;
                                                        ro = 0;
                                                }
                                                else if(ln >= 0x08 && ln <= 0x0A)        //收到1
                                                {
                                                        rb <<= 1;
                                                        rb++;
                                                        bn++;
                                                        ro = 0;
                                                }
                                                else                                 //接收错误
                                                {
                                                        if(++ro > 0x03)
                                                                break;
                                                }

                                                if(bn == 0x08)                        //收到一个字节
                                                {
                                                        bn = 0;
                                                        pack[rn++] = rb;
                                                        rb = 0;
                                                        if(rn == PB_DATN(pack) + 2)        //收到一个数据包
                                                        {
                                                                rb_event = TRUE;
                                                                break;
                                                        }
                                                }
                                                ln = 0;
                                        }
                                }
                        }
                        ln = 0;
                }
               
                //事件处理
                if(rb_event)
                {
                        rb_event = FALSE;
                        lrc = 0;
                        for(i = 0; i < (PB_DATN(pack) + 1); i++)
                                lrc += pack;
                        if(lrc == pack)
                        {
                                if(PB_FUNC(pack) == 1)
                                {
                                        for(i = 1; i < (PB_DATN(pack) + 1); i++)        //将收到数据发送到PC
                                        {
                                                while( !(UCSRA & (1<<UDRE)) );
                                                UDR = pack;
                                        }
                                        delay_ms(20);
                                        led_send_pack(2,NULL,0);                        //发送接收成功应答包
                                }
                        }
                }
        }
        return 1;
}

TINY13上的代码:
//===============================================
//               两个LED间数据通讯
//               =================
//    该代码在TINY13实现了将数据以包的形式通过一个
//普通LED发送出去,并通过该LED接收数据。代码重在描
//述普通LED间实现通讯的原理,并不能在任意种类的两个
//LED间进行数据通讯,如果要实现将任何一个LED作为一
//个通讯端口,就要采用自适应算法。这个技术应用得好
//的话,你就不需要为你的产品留通讯接口了,再也不需
//要为产品调试或设置参数预留接口了,再也不用拆机或
//连线了,一切都可以通过一个电源灯或指示灯完成于无
//形之中。
//
//  电路:PB0---[+LED-]---[R300]---PB1
//
//
//                           by:xingcn 点点星尘
//                                    2007.11.08
//===============================================
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
//===============================================
#define TRUE                        1
#define FALSE                        0
#define SBIT(x,y)                (x|=(1<<y))
#define CBIT(x,y)                (x&=~(1<<y))
#define BIT(x,y)                (x&(1<<y))
#define LED_ON(x)                CBIT(PORTB, x)
#define LED_OFF(x)                SBIT(PORTB, x)
#define LED_PORT                PORTB
#define LED_DDR                        DDRB
#define LED_PIN                        PINB
#define LED_N                        PB0                                        //LED+
#define LED_P                        PB1                                        //LED-
#define LED_N_OUT()                SBIT(LED_DDR, LED_N)
#define LED_P_OUT()                SBIT(LED_DDR, LED_P)
#define LED_N_IN()                CBIT(LED_DDR, LED_N)
#define LED_P_IN()                CBIT(LED_DDR, LED_P)
#define LED_N_HIG()                SBIT(LED_PORT, LED_N)
#define LED_N_LOW()                CBIT(LED_PORT, LED_N)
#define LED_P_HIG()                SBIT(LED_PORT, LED_P)
#define LED_P_LOW()                CBIT(LED_PORT, LED_P)
#define PACK_SIZE                18
#define PB_FUNC(x)                (x[0] >> 4)
#define PB_DATN(x)                (x[0] & 0x0F)
//===============================================
void                 delay_ms(unsigned int);
unsigned char        led_light_recv(void);
unsigned char        led_send_char(const unsigned char);
void                 led_send_pack(const char, const void *, const char);
//--------------------------------------------
unsigned char rb,rn,ln,bn,ro,rs,pack[PACK_SIZE],rb_event;
//============================================
//名称:delay_ms
//功能:毫秒延时
//参数:unsigned int ms    要延时的毫秒数
//返回:无
//备注:无
//============================================
void delay_ms(unsigned int ms)
{
        unsigned int i=0;
       
        while(i < ms)
        {
                _delay_loop_2(240);
                i++;
        }
}
//===============================================
//名称:led_light_recv
//功能:检测LED受光状态
//参数:无
//返回:光照达到给定亮度返回 TRUE
//      光照达不到给定亮度返回 FALSE
//备注:无
//===============================================
unsigned char led_light_recv(void)
{
        unsigned char i;
       
        LED_P_OUT();
        LED_N_OUT();
        LED_N_HIG();
        LED_P_LOW();
        delay_ms(1);

        LED_N_LOW();
        LED_P_HIG();
        delay_ms(1);

        LED_P_IN();
        LED_P_LOW();
        LED_N_LOW();
        for(i = 0x00; i < 0x03; i++)
        {
                delay_ms(1);
                if(!BIT(LED_PIN, LED_P))
                        return TRUE;
        }
        return FALSE;
}
//===============================================
//名称:led_send_char
//功能:通过LED发送一个字节
//参数:unsigned char c    要发送的字节
//返回:发送的字节
//备注:无
//===============================================
unsigned char led_send_char(const unsigned char c)
{
        unsigned char i;

        for(i = 0; i < 8; i++)
        {
                LED_N_OUT();
                LED_P_OUT();
                LED_N_HIG();
                LED_P_LOW();
               
                if(BIT(c, ( 7 - i )))                                // 高位在前
                        delay_ms(30);
                else
                        delay_ms(15);

                LED_N_LOW();
                delay_ms(15);
        }
        return c;
}

//===============================================
//名称:led_send_pack
//功能:通过LED发送一个数据包
//参数:char c       功能号
//      void *dat    数据
//      char dn             数据量       
//返回:无
//备注:数据包格式"功能号(高4位)|数据量(低4位)+
//      数据+(8bit)LRC校验",允许发送空数据。
//===============================================
void led_send_pack(const char func, const void *dat, const char dn)
{
        unsigned char n,lrc = 0;
        unsigned char *p = (unsigned char *)dat;

        //发送接收识别头
        LED_N_OUT();
        LED_P_OUT();
        LED_N_HIG();
        LED_P_LOW();
        delay_ms(60);
        LED_N_LOW();
        delay_ms(15);
       
        //每个包最多发送16个字节
        n = (func << 4) | ((p) ? (dn & 0x0F) : 0x00);
        lrc += led_send_char(n);
        for(n = 0; p != NULL && n < (dn & 0X0F); n++)
        {
                lrc += led_send_char(p[n]);
        }
       
        //发送校验字节
        led_send_char(lrc);
}

//============================================
//名称:main
//功能:主函数
//参数:无
//返回:1
//备注:无
//============================================
int main(void)
{
        unsigned char lrc,i;

        SBIT(PORTB, PB2);
        SBIT(DDRB, PB2);
        SBIT(PORTB, PB3);
        SBIT(DDRB, PB3);
        ln = 0;
        rb_event = FALSE;
       
        for(;;)
        {
                //数据接收
                rs = led_light_recv();
                if(rs)
                {
                        ln++;
                }
                else
                {
                        if(ln >= 0x19 && ln <= 0x1C)
                        {
                                bn = 0;
                                rb = 0;
                                ln = 0;
                                rn = 0;
                                ro = 0;
                                while(1)
                                {
                                        rs = led_light_recv();
                                        if(rs)
                                        {
                                                ln++;
                                        }
                                        else
                                        {
                                                if(ln >= 0x06 && ln <= 0x09)
                                                {
                                                        rb <<= 1;
                                                        bn++;
                                                        ro = 0;
                                                }
                                                else if(ln >= 0x0D && ln <= 0x10)
                                                {
                                                        rb <<= 1;
                                                        rb++;
                                                        bn++;
                                                        ro = 0;
                                                }
                                                else
                                                {
                                                        if(++ro > 0x03)
                                                                break;
                                                }

                                                if(bn == 0x08)                                //接收到一个字节
                                                {
                                                        bn = 0;
                                                        pack[rn++] = rb;
                                                        rb = 0;
                                                        if(rn == PB_DATN(pack) + 2)
                                                        {
                                                                rb_event = TRUE;
                                                                break;
                                                        }
                                                }
                                                ln = 0;
                                        }
                                }
                        }
                ln = 0;
                }
               
                //事件处理
                if(rb_event)
                {
                        rb_event = FALSE;
                        lrc = 0;
                        for(i = 0; i < (PB_DATN(pack) + 1); i++)
                                lrc += pack;
                        if(lrc == pack)
                        {
                                if(PB_FUNC(pack) == 2)
                                {
                                        //点亮指示LED,表示收到正确数据包
                                        LED_ON(PB3);
                                        delay_ms(50);
                                        LED_OFF(PB3);
                                }
                        }
                }
               
                //按键发送
                if(!BIT(PINB, PB2))
                {
                        delay_ms(10);
                        if(!BIT(PINB, PB2))
                        {
                                strcpy((char *)&pack[1], "www.ouravr.com\n");
                                led_send_pack(1, &pack[1], strlen((char *)&pack[1]));
                        }
                }
        }
        return 1;
}

演示视频:
普通LED用于指示和数据通讯(视频)(文件大小:9.32M)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2007-12-8 20:36:21 | 显示全部楼层
有点意思,可靠性和通讯速率能保证正确吗?

出0入0汤圆

发表于 2007-12-8 20:38:48 | 显示全部楼层
楼主动手快。我苦苦看英文文档中。
学习。

一楼
可用。EDA有详细论文。
http://www.edn.com/article/CA6475381.html?text=&text=wimax%2C+%2C+%2C+wimax%2C+wimax%2C+wimax%2C+wimax&text=led
要超高亮度切透明封装的LED效果好些。
论坛有相关链接
头像被屏蔽

出0入0汤圆

发表于 2007-12-8 20:58:45 | 显示全部楼层
谢谢。cool !

出0入0汤圆

 楼主| 发表于 2007-12-8 21:05:13 | 显示全部楼层
早知道当年就得多背点单词,现在E文糟透了。高亮度透明封装LED只要互相照得到,应该就可以传送数据。程序是在看了这个视频之后写的  http://www.youtube.com/watch?v=O3Pf4TZ_vOE

出0入0汤圆

发表于 2007-12-8 21:30:19 | 显示全部楼层
楼主厉害啊

出0入0汤圆

发表于 2007-12-8 22:52:16 | 显示全部楼层
hehe
我的链接就是这个类似文章,我还翻译了前八页。
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=865694&bbs_page_no=2&bbs_id=9999
按钮,双机通信。。遥控锁。
另一个:
按钮
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=865018&bbs_page_no=2&bbs_id=9999

出0入0汤圆

发表于 2007-12-9 11:48:55 | 显示全部楼层
厉害

出0入0汤圆

发表于 2007-12-9 20:59:39 | 显示全部楼层
有点意思。

出0入0汤圆

发表于 2007-12-9 21:04:52 | 显示全部楼层
就像youtube视频里说的那样,这是一个使用前景十分广泛的应用方案。
    我用汇编多一些,看C语言有些费力,论坛里其他相关的介绍也看了,但还是希望xingcn 能说一下程序的流程,重点是发射和接收,可以吗?
    LED好像是需要先施加反向电压对LED充电,然后再测量LED自放电时间,通过放电时间的长短表示接收的是0还是1。这就是说LED不能一直处于接收状态,哪如何保证发射和接受的同步呢?

出0入0汤圆

 楼主| 发表于 2007-12-9 22:34:36 | 显示全部楼层
程序在LED的控制部分和下面这个图差不多,不同的只是最后一步(第4步:<----------),程序并不是通过测量LED自放电时间的长短来判断接收的是0或1的。而是通过设定一个时间阀值来判断是否有光照,如果有光照就用一个变量来累加光照时间(这里只是函数调用次数,实际应用应该设法取得这个时间,对于相同条件来说,不同的LED的自放电时间是不一样的,在我的程序中ln的值就不一样,如果能取得这个时间,那么采用不同LED得到的光照时间还是一样的,还是那句话,这个程序仅仅为了说明原理,虽然它从没向PC传错一个字节,但应用还是需要更好的算法--通用),这样就可以分辨出“0”、“1”、“无光照”了。如果没有按钮按下,LED将一直处于接收状态。

出0入0汤圆

发表于 2007-12-9 23:39:55 | 显示全部楼层
还是有些不明白啊!
    按你所说,你是用光照时间的长短来表示0和1的,这就要求你的接受端必须与发射同步(至少不能差太多时间),在发射端发射的时候,接收LED正好开始接受信号。这个如何实现呢?不然的话,比如:发射已经开始发光了,接受却还在充电状态;等LED开始接收了,发射已经发完了,接收端就以为是0或是无光照。如何能保证接收无误?
    红外的数据传输做过,上图中所示过程明白(因为有老外写的对应的PIC BASIC语言的程序,而我的PIC是用BASIC语言入的门,所以能看明白),就是不明白如何连续的接收信号,因为中间有一个充电的时间,这里就搅乱了时序。
    很想把这个用到自己的电路里,但一直想不明白,请教,感谢。

出0入0汤圆

 楼主| 发表于 2007-12-10 00:10:33 | 显示全部楼层
请仔细看这个函数void led_send_pack(const char func, const void *dat, const char dn) ,每个数据包的开始都有一个60ms的识别头用于接收同步。接收时检测到这个头之后就可以开始接收数据了。

出0入0汤圆

发表于 2007-12-10 12:06:08 | 显示全部楼层
占个位置先,顶下。

出0入0汤圆

发表于 2007-12-10 16:37:07 | 显示全部楼层
好东东!

出0入0汤圆

发表于 2007-12-10 17:43:52 | 显示全部楼层
记号

出0入12汤圆

发表于 2007-12-10 21:21:09 | 显示全部楼层
有意思
省钱

出0入0汤圆

发表于 2007-12-10 22:16:08 | 显示全部楼层
虽然不知道是干什么用的,但c代码的风格我喜欢啊~

出0入0汤圆

发表于 2007-12-11 10:50:51 | 显示全部楼层
很有价值啊!认真学习.

出0入0汤圆

发表于 2007-12-11 11:35:30 | 显示全部楼层
貌视那个视频是2002年的实验。。。

出0入0汤圆

发表于 2007-12-26 14:24:22 | 显示全部楼层
有点意思。好

出0入0汤圆

发表于 2007-12-29 10:42:49 | 显示全部楼层
如果用lcd应该可以更远一些吧

出0入4汤圆

发表于 2007-12-29 11:18:18 | 显示全部楼层
看了视频,好玩,好玩!

出0入0汤圆

发表于 2007-12-29 11:52:00 | 显示全部楼层
這樣用的話還不如直接用紅外對管.........

出0入0汤圆

发表于 2007-12-29 20:33:50 | 显示全部楼层
紅外對管比LED贵好几倍!

出0入0汤圆

发表于 2007-12-29 21:17:35 | 显示全部楼层
好简单的通讯方式,值得学习。 顶死拉到。

出0入0汤圆

 楼主| 发表于 2007-12-29 21:19:06 | 显示全部楼层
【23楼】:红外线肉眼是看不见的,根本就不能用于指示。

出0入0汤圆

发表于 2007-12-30 00:17:29 | 显示全部楼层
看上去挺时髦的,就不知道可靠性如何.

出0入0汤圆

 楼主| 发表于 2007-12-30 01:04:28 | 显示全部楼层
在通讯物理链路可行的情况下,其通讯的可靠性与算法和环境有关,现在对于任意LED的通用算法正在完善当中,如果你希望将它应用到你的产品,你可以在进行通信的时候给它创造一个比较有利的环境,做一个如图装置,这样环境对通信的干扰就比较小了(可以忽略),至少通过实验我是这么认为。

出0入0汤圆

发表于 2008-6-20 15:48:50 | 显示全部楼层
俺08年才知道有这回事,感谢各位!

出0入0汤圆

发表于 2008-8-6 07:29:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-6 07:54:00 | 显示全部楼层
这个技术如果做好了,将是电子产品设计里面的一个具有里程碑的技术,因为这将给产品的生产中带来非常大的变革空间。哈哈

出0入0汤圆

发表于 2008-8-6 08:54:57 | 显示全部楼层
回家不用带钥匙了。

出0入0汤圆

发表于 2008-8-11 16:26:12 | 显示全部楼层
通信距离能达多少?
要是才8cm有意义吗?

出0入0汤圆

发表于 2008-8-21 23:09:44 | 显示全部楼层
頂頂

出0入0汤圆

发表于 2008-8-22 10:44:12 | 显示全部楼层
呵呵,看不懂耶!

出0入0汤圆

发表于 2008-8-22 16:36:58 | 显示全部楼层
老弟的贴子又被顶出来了,继续顶顶

出0入0汤圆

发表于 2008-8-22 17:46:58 | 显示全部楼层
强贴留名.....

出0入0汤圆

发表于 2008-8-22 17:53:27 | 显示全部楼层

出0入0汤圆

发表于 2008-12-29 10:22:01 | 显示全部楼层
顶出来..想做成触摸的按键..怎么办?

出0入0汤圆

发表于 2008-12-29 12:17:03 | 显示全部楼层
这么全的资料要记号。

出0入0汤圆

发表于 2008-12-29 14:21:15 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-12-29 18:17:25 | 显示全部楼层
mark

出0入70汤圆

发表于 2008-12-29 20:41:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-12-29 21:47:09 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-12-29 23:24:38 | 显示全部楼层
长见识来了

出0入0汤圆

发表于 2008-12-29 23:41:23 | 显示全部楼层
占位

出0入0汤圆

发表于 2009-1-5 09:45:16 | 显示全部楼层
今天才知道这们的技术!真的是牛年牛人啊

出0入0汤圆

发表于 2009-1-5 10:24:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-2-20 15:39:35 | 显示全部楼层
做个标记,慢慢研究

出0入0汤圆

发表于 2009-2-20 16:45:42 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-2-21 08:41:55 | 显示全部楼层
LED反相充电有道理吗?
我认为应该是PWM显示LED,在低电平时候检测外界握手信号。
握手信号对了,就进入通讯状态。

出0入0汤圆

发表于 2009-5-23 23:51:32 | 显示全部楼层
有创造,才有发展,楼主真的很棒啊

出0入0汤圆

发表于 2009-5-24 00:13:45 | 显示全部楼层
有实际意义吗? 我认为没有。

出0入0汤圆

发表于 2009-6-2 11:51:28 | 显示全部楼层
<font color=green>正需要这个,谢谢分享!

出0入0汤圆

发表于 2009-6-2 12:03:20 | 显示全部楼层
把LED当光敏二极管用。要实现可靠的通讯,应该加上调整和解调电路,否则只是玩具。环境光影响很大。

出0入0汤圆

发表于 2009-6-2 21:36:47 | 显示全部楼层
LED应用越来越高级了

出0入0汤圆

发表于 2009-6-2 22:03:18 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-6-2 23:05:43 | 显示全部楼层
好贴要顶!

出0入0汤圆

发表于 2009-6-3 01:50:30 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-6-3 10:43:29 | 显示全部楼层
顶一下,笔记!

出0入0汤圆

发表于 2009-6-3 11:27:59 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2009-6-6 13:54:11 | 显示全部楼层
you 意思

出0入0汤圆

发表于 2009-6-6 22:56:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-7 09:46:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-7 09:49:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-7 11:51:24 | 显示全部楼层
有意思,Mark

出0入0汤圆

发表于 2009-6-7 13:18:18 | 显示全部楼层
感觉有点意思!!

出0入0汤圆

发表于 2009-6-14 09:10:33 | 显示全部楼层

出0入0汤圆

发表于 2009-8-8 22:44:51 | 显示全部楼层
收藏收藏

出0入0汤圆

发表于 2009-8-8 23:50:13 | 显示全部楼层
有意思,但还不知道实际用途

出0入0汤圆

发表于 2009-8-8 23:57:36 | 显示全部楼层
jh

出0入0汤圆

发表于 2009-8-9 00:35:15 | 显示全部楼层
很棒啊

出0入0汤圆

发表于 2010-4-18 18:33:18 | 显示全部楼层
回复【楼主位】xingcn 星尘
-----------------------------------------------------------------------

敢问楼主  制作时有用到外部晶振没?

出0入0汤圆

 楼主| 发表于 2010-4-18 18:45:35 | 显示全部楼层
回复【73楼】laoqiang  
回复【楼主位】xingcn 星尘
-----------------------------------------------------------------------
敢问楼主  制作时有用到外部晶振没?
----------------------------------------------------------------------
通讯与晶振无关

出0入264汤圆

发表于 2010-4-18 18:52:28 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-4-18 20:15:41 | 显示全部楼层
mark!~

出0入0汤圆

发表于 2010-4-19 00:22:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-28 16:48:50 | 显示全部楼层
有意思!是在同一块实验板上实现的吗?能做成两个相同的板之间进行传输码?

出0入0汤圆

发表于 2010-4-28 17:03:15 | 显示全部楼层
很感兴趣.

出0入0汤圆

发表于 2010-5-16 12:50:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-20 09:52:19 | 显示全部楼层
LZ你能再贴一次接收的代码吗?我发现你的代码有错!

出0入0汤圆

发表于 2010-5-21 01:09:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-21 07:13:29 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-5-21 08:14:28 | 显示全部楼层
怎么计算有效传输距离啊?

出0入0汤圆

发表于 2010-5-21 09:12:20 | 显示全部楼层
这个貌似有用哦,例如在做产品时,使用可自编程的MCU,就可以使用指示灯传输程序升级了。
呵呵,这个可以在产品宣传中可以作为亮点宣传一下,让外行人以为这是“高高科技”

出0入0汤圆

发表于 2010-5-21 12:09:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-21 18:53:58 | 显示全部楼层
好东西,应该很有前景。

出0入0汤圆

发表于 2010-5-21 22:53:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-21 23:31:49 | 显示全部楼层
光隔也省了!?

出0入0汤圆

发表于 2010-5-21 23:58:25 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-5-22 01:19:28 | 显示全部楼层
把视频连接也放上来:http://v.youku.com/v_show/id_XMTUyNDk5MzE2.html

已应用在一些工业产品上,用于读取报警信息和修改参数,现场调试也很方便。

出0入149汤圆

发表于 2010-5-22 01:25:27 | 显示全部楼层
hehe!~

出0入0汤圆

发表于 2010-5-22 07:35:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-27 11:02:20 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-6-21 09:40:04 | 显示全部楼层
xingcn 星尘
-----------------------------------------------------------------------
在接收的过程中,在这一步:
for(i = 0x00; i < 0x03; i++)
{
delay_ms(1);
if(!BIT(LED_PIN, LED_P))
return TRUE;
}
return FALSE;
}
如果IO为高阻态,无论如何不能读到0,如果接下拉电阻,又很难读到1,我用的下拉是200K-1M,都有试,请问楼主是为什么?

出0入0汤圆

发表于 2011-6-21 10:17:26 | 显示全部楼层
-----------------------------------------------------------------------
我已经知道原因了,是二极管的原因

出0入0汤圆

发表于 2014-1-20 14:07:08 | 显示全部楼层
好贴收藏了

出0入0汤圆

发表于 2014-1-20 14:39:06 | 显示全部楼层
收藏,学习学习.

出0入0汤圆

发表于 2014-1-20 15:09:57 | 显示全部楼层
谢谢,收藏学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表