找回密碼
 註冊
12
返回列表 發新文章

求小綠人電路圖(1/13分享成功影片)

11#
stu6714x 2010-12-22 00:08 只看這個作者
謝謝各位的幫忙!

不過我還是想嘗試用IC做~(不管體積大小和複雜)

目前我的做法是~脈波產生器輸出2Hz的脈波給邏輯閘(74S138)

就像J大說的一樣,讓他輸出四種訊號,

只是讓我覺得困難的是~小綠人動手腳不動身體和頭,

以及煞車(小紅人)出現的時後關閉小綠人,

能否再請幫幫我這兩個忙~謝謝!!

即使不快樂,也要豪邁的笑。

用8051寫出來的

#include <REGX51.H>
bit         stop = 0;        //判斷暫停或開始
unsigned char        Scan = 0, Mode = 0, Seg_scan = 0;        //點矩陣掃描,選擇圖片,Seg掃描
unsigned int        Cnt = 0;        //延遲Cnt
unsigned char        Cnt_2 = 15, Cnt_3 = 0;        //兩組時間
//-----點矩陣要顯示的圖片(走動)-----//
code int        Led[5][16] = {        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x02e0, 0x04f0, 0x0588, 0x0180, 0x0280, 0x0440, 0x0820, 0x1018, 0x1000, 0x0000},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x0260, 0x02e0, 0x0590, 0x0180, 0x0240, 0x0e20, 0x0820, 0x0640, 0x0070, 0x0000},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x03e0, 0x07f0, 0x05c8, 0x01c0, 0x03c0, 0x05e0, 0x0b60, 0x1478, 0x1500, 0x0e00},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x03c0, 0x03f0, 0x01c0, 0x01c0, 0x01c0, 0x01a0, 0x0340, 0x0470, 0x0500, 0x0e00},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x00e0, 0x00e0, 0x00c0, 0x01c0, 0x01c0, 0x03a0, 0x0280, 0x0380, 0x0200, 0x0280, 0x0000}        };
//-----點矩陣要顯示的圖片(停止)-----//
code int        Led_2[16] = {        0x0000, 0x03c0, 0x03c0, 0x03c0, 0x0c30, 0x0c30, 0x17e8, 0x37ec,        0x37ec, 0x37ec, 0x37ec, 0x2664, 0x2664, 0x0660, 0x0660, 0x0660};
code char        Seg_com[4] = {0x70, 0xb0, 0xd0, 0xe0};        //七字節掃描
unsigned char        Seg_data[4] = {1, 5, 0, 0};        //要顯示的Data
//七字節解碼
const char        Seg_code[16] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xd8, 0x80, 0x98, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
void        Delay( unsigned int Value );        //延遲副程式
void main(void)
{        while(1){
                Cnt++;
                if( Cnt>250 ){
                        Cnt = 0;
                        if( stop ){
                                Cnt_3--;                //假如現在是紅燈,Cnt3開始到數
                                if( Cnt_3==0 )        stop = 0;        //假如Cnt3變為0,變成綠燈
                                Cnt_2 = 15;        //設定Cnt_2
                                Seg_data[0] = Cnt_2/10;        //把Cnt_2十位數存到Seg_data[0]
                                Seg_data[1] = Cnt_2%10; //把Cnt_2個位數存到Seg_data[0]
                                Seg_data[2] = Cnt_3/10; //把Cnt_3十位數存到Seg_data[0]
                                Seg_data[3] = Cnt_3%10; //把Cnt_3個位數存到Seg_data[0]
                                }
                        else{                //假如是綠燈
                                Mode++;                //切換圖片
                                if( Mode>=5 )        Mode = 0;
                                Cnt_2--;                //Cnt_2倒數
                                if( Cnt_2==0 )        stop = 1;        ////假如Cnt2變為0,變成紅燈
                                Cnt_3 = 15;
                                Seg_data[0] = Cnt_2/10;        //把Cnt_2十位數存到Seg_data[0]
                                Seg_data[1] = Cnt_2%10; //把Cnt_2個位數存到Seg_data[0]
                                Seg_data[2] = Cnt_3/10; //把Cnt_3十位數存到Seg_data[0]
                                Seg_data[3] = Cnt_3%10; //把Cnt_3個位數存到Seg_data[0]
                        }
                }
                P0 |= 0xf0;        關閉七段顯示器
                if(stop)        P3 = Seg_code[Seg_data[Seg_scan+2]];        //假如紅燈,顯示Cnt_3
                else        P3 = Seg_code[Seg_data[Seg_scan]];                //假如綠燈,顯示Cnt_2
                if( stop ){                //假如紅燈,顯示停止的圖片
                        P1 = ~(Led_2[Scan]&0xff);        //P1送低8位元
                        P2 = ~(Led_2[Scan]>>8);                //P2送高8位元
                }
                else{                //假如綠燈,顯示走路的圖片
                        P1 = ~(Led[Mode][Scan]&0xff); ;        //P1送低8位元
                        P2 = ~(Led[Mode][Scan]>>8);                //P2送高8位元
                }
                if(stop)        P0 = Scan + Seg_com[Seg_scan+2]; //假如紅燈,顯示Cnt_3
                else        P0 = Scan + Seg_com[Seg_scan];                //假如綠燈,顯示Cnt_2
                Scan++;        //點矩陣掃描
                if( Scan>15 )        Scan = 0;
                Seg_scan++;        //七字節掃描
                if( Seg_scan>1 )        Seg_scan = 0;
                Delay(80);        //延遲 } }
//-----延遲副程式-----//
void Delay( unsigned int Value )
{
        while( Value > 0 )        Value--;
}
13#
jks56k 2010-12-22 00:29 只看這個作者
我覺得樓主應該要先決定是要用LED排成需要的形狀
還是要用8X8矩陣
2種的作法有差

VHDL我覺得是可以找出使用邏輯閘的東西

8051真的好久沒寫了
好久之前寫好像是用組合語言吧

[ 本文章最後由 jks56k 於 2010-12-22 00:30 編輯 ]
14#
stu6714x 2010-12-22 00:42 只看這個作者
原文章由 jks56k 於 2010-12-22 00:29 發表 求小綠人電路圖(1/13分享成功影片)8412
我覺得樓主應該要先決定是要用LED排成需要的形狀
還是要用8X8矩陣
2種的作法有差

VHDL我覺得是可以找出使用邏輯閘的東西

8051真的好久沒寫了
好久之前寫好像是用組合語言吧


我是要用LED排形狀那種,不是用矩陣0.0

即使不快樂,也要豪邁的笑。
15#
mts10105 2010-12-22 00:45 只看這個作者

回覆 1# stu6714x 的文章

這個的話,搜尋一下板上的小綠人的分解圖
用循序去編排每個分解圖應該可以
不過硬體滿可觀吧,求小綠人電路圖(1/13分享成功影片)2785 同好加油啦!!
100~0!!!需要幾分秒呢!?
原文章由 沿路灑金子 於 2010-12-22 00:10 發表 求小綠人電路圖(1/13分享成功影片)5097
#include
bit         stop = 0;        //判斷暫停或開始
unsigned char        Scan = 0, Mode = 0, Seg_scan = 0;        //點矩陣掃描,選擇圖片,Seg掃描
unsigned int        Cnt = 0;        //延遲Cnt
unsigned char        Cnt_2 = 15, Cnt_3 = 0;        //兩組時間
//-----點矩陣要顯示的圖片(走動)-----//
code int        Led[5][16] = {        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x02e0, 0x04f0, 0x0588, 0x0180, 0x0280, 0x0440, 0x0820, 0x1018, 0x1000, 0x0000},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x0260, 0x02e0, 0x0590, 0x0180, 0x0240, 0x0e20, 0x0820, 0x0640, 0x0070, 0x0000},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x03e0, 0x07f0, 0x05c8, 0x01c0, 0x03c0, 0x05e0, 0x0b60, 0x1478, 0x1500, 0x0e00},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x01e0, 0x03c0, 0x03f0, 0x01c0, 0x01c0, 0x01c0, 0x01a0, 0x0340, 0x0470, 0x0500, 0x0e00},
                                        {0x0000, 0x0030, 0x0078, 0x0030, 0x0060, 0x00e0, 0x00e0, 0x00c0, 0x01c0, 0x01c0, 0x03a0, 0x0280, 0x0380, 0x0200, 0x0280, 0x0000}        };
//-----點矩陣要顯示的圖片(停止)-----//
code int        Led_2[16] = {        0x0000, 0x03c0, 0x03c0, 0x03c0, 0x0c30, 0x0c30, 0x17e8, 0x37ec,        0x37ec, 0x37ec, 0x37ec, 0x2664, 0x2664, 0x0660, 0x0660, 0x0660};
code char        Seg_com[4] = {0x70, 0xb0, 0xd0, 0xe0};        //七字節掃描
unsigned char        Seg_data[4] = {1, 5, 0, 0};        //要顯示的Data
//七字節解碼
const char        Seg_code[16] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xd8, 0x80, 0x98, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
void        Delay( unsigned int Value );        //延遲副程式
void main(void)
{        while(1){
                Cnt++;
                if( Cnt>250 ){
                        Cnt = 0;
                        if( stop ){
                                Cnt_3--;                //假如現在是紅燈,Cnt3開始到數
                                if( Cnt_3==0 )        stop = 0;        //假如Cnt3變為0,變成綠燈
                                Cnt_2 = 15;        //設定Cnt_2
                                Seg_data[0] = Cnt_2/10;        //把Cnt_2十位數存到Seg_data[0]
                                Seg_data[1] = Cnt_2%10; //把Cnt_2個位數存到Seg_data[0]
                                Seg_data[2] = Cnt_3/10; //把Cnt_3十位數存到Seg_data[0]
                                Seg_data[3] = Cnt_3%10; //把Cnt_3個位數存到Seg_data[0]
                                }
                        else{                //假如是綠燈
                                Mode++;                //切換圖片
                                if( Mode>=5 )        Mode = 0;
                                Cnt_2--;                //Cnt_2倒數
                                if( Cnt_2==0 )        stop = 1;        ////假如Cnt2變為0,變成紅燈
                                Cnt_3 = 15;
                                Seg_data[0] = Cnt_2/10;        //把Cnt_2十位數存到Seg_data[0]
                                Seg_data[1] = Cnt_2%10; //把Cnt_2個位數存到Seg_data[0]
                                Seg_data[2] = Cnt_3/10; //把Cnt_3十位數存到Seg_data[0]
                                Seg_data[3] = Cnt_3%10; //把Cnt_3個位數存到Seg_data[0]
                        }
                }
                P0 |= 0xf0;        關閉七段顯示器
                if(stop)        P3 = Seg_code[Seg_data[Seg_scan+2]];        //假如紅燈,顯示Cnt_3
                else        P3 = Seg_code[Seg_data[Seg_scan]];                //假如綠燈,顯示Cnt_2
                if( stop ){                //假如紅燈,顯示停止的圖片
                        P1 = ~(Led_2[Scan]&0xff);        //P1送低8位元
                        P2 = ~(Led_2[Scan]>>8);                //P2送高8位元
                }
                else{                //假如綠燈,顯示走路的圖片
                        P1 = ~(Led[Mode][Scan]&0xff); ;        //P1送低8位元
                        P2 = ~(Led[Mode][Scan]>>8);                //P2送高8位元
                }
                if(stop)        P0 = Scan + Seg_com[Seg_scan+2]; //假如紅燈,顯示Cnt_3
                else        P0 = Scan + Seg_com[Seg_scan];                //假如綠燈,顯示Cnt_2
                Scan++;        //點矩陣掃描
                if( Scan>15 )        Scan = 0;
                Seg_scan++;        //七字節掃描
                if( Seg_scan>1 )        Seg_scan = 0;
                Delay(80);        //延遲 } }
//-----延遲副程式-----//
void Delay( unsigned int Value )
{
        while( Value > 0 )        Value--;
}


有程式碼也要有8051相關的電路圖這會一樣吧!
17#
sspin 2010-12-27 18:50 只看這個作者
原文章由 stu6714x 於 2010-12-21 22:59 發表 求小綠人電路圖(1/13分享成功影片)4766
小弟我最近想要動手做LED尾燈,
不過一直碰壁...小綠人就是不肯給我乖乖的走求小綠人電路圖(1/13分享成功影片)8243
剎車燈是有效果,也能讓小紅人跳出來,
找了很多資料都是紅綠燈的那種小綠人,不然就是要寫程式...
想請問有沒有只用IC邏輯閘就可以做出來的小綠人電路圖,
能提供的話十分感謝!!!!


可以提供你所畫的小綠人分解圖嗎???

基本上我想只要用555和4017再加上一些二極體(N顆),,,
如果不考慮洗板的嗎?那用洞洞板來做就行了..只是會有一堆線而已..100.gif

回覆 17# sspin 的文章

謝謝幫忙!實驗已成功!101.gif

即使不快樂,也要豪邁的笑。