找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8454|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

32*32點(diǎn)陣led交通燈設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:73735 發(fā)表于 2015-2-19 01:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式



看了不少的Proteus仿真、單片機(jī)設(shè)計(jì),都沒看到有關(guān)人行道交通燈的設(shè)計(jì),針對(duì)機(jī)動(dòng)車而設(shè)計(jì)的紅綠燈倒是不少,難道就這么忽視行人的安全,所以就有了設(shè)計(jì)一個(gè)這樣的交通燈的想法。

        取材是來自水南汽車站旁邊的交通燈。
由于是仿真、資源也有限,點(diǎn)陣是用單色的,所以,“!钡男Ч缓,譯碼器用74LS154,這個(gè)太貴,實(shí)際肯定要用138了。
PS:取字模軟件是我自己破解的,所以用起來感覺很不一樣。

下面是源程序,有什么不足之處,請(qǐng)指出:

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/***************************************/
void sendbyteR(uchar temp); //發(fā)送數(shù)據(jù)
sbit RSDA=P2^4;
sbit CLK=P2^5;
sbit RCK=P2^6;
uchar code signature[][128]={    };         。。。。代碼太長(zhǎng)省略
uchar code num[][128]={      };               。。。。代碼太長(zhǎng)省略

/***************************************/
void main()
{
        P1=0x00;
        TMOD=0x01;
        TH0=0x3c;  //T0定時(shí)50ms
        TL0=0xb0;
        EA=1;
        ET0=1;
        TR0=1;
        while(1);
}
/***************************************/
void sendbyteR(uchar temp) //發(fā)送數(shù)據(jù)
{
        uchar c;
        for(c=0;c<8;c++){
                temp=temp>>1;
                RSDA=CY ;
                CLK=1 ; //上升沿
                _nop_() ;
                _nop_() ;
                CLK=0 ;
        }
}
/***************************************/
void time0()interrupt 1
{
        uchar j,k,count,count1,diff;
        uint n,n1;
        TH0=0x3c;
        TL0=0xb0;
        for(j=0;j<32;j++){
                if(diff){
                        if((n>33)){     //倒計(jì)時(shí)“5”時(shí),開始閃動(dòng)
                                if((n1%2)==0) k=3;
                                else{
                                        if((n1%4)==1) k=0;
                                        else k=1;
                                        }
                                }
                                else k=n1%2; //行走
                        }
                        else k=2;       //停
                       
                        sendbyteR(num[n][j*4+3]); //顯示數(shù)字
                        sendbyteR(num[n][j*4+2]);
                        sendbyteR(num[n][j*4+1]);
                        sendbyteR(num[n][j*4]);

                        sendbyteR(signature[k][j*4+3]);  //顯示人
                        sendbyteR(signature[k][j*4+2]);
                        sendbyteR(signature[k][j*4+1]);
                        sendbyteR(signature[k][j*4]);

                        P1=j;
                        RCK=1;
                        RCK=0;
                }
                if(j==32) j=0;
                count++;
                count1++;
                if(count==20){
                        count=0;
                        n++;    //計(jì)時(shí)1s
                }
                if(count1==5){
                        count1=0;
                        n1++;  //計(jì)時(shí)0.25s
                }
                if(n1==39) n1=0;
                if(n==39){
                        diff=!diff;  //diff "0":停 ,"1":行走
                        if(diff) n=10;
                        else n=0;
                }
}








評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
treenewbee + 5 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:73735 發(fā)表于 2015-2-19 01:03 | 只看該作者
       玩了一天的游戲,太沒意思了,無聊下就編了個(gè)AVR單片機(jī)的程序。還記得上次發(fā)表的點(diǎn)陣led交通燈,原來核心是51,這學(xué)期學(xué)的是AVR,所以就換了,改用ATmega16。
       由于是從51上移植過來的,自然思路也差不多。只是這次在中斷使用上,做了調(diào)整,使之盡可能的短!




                                           核心改變:

下面是在CVAVR下的源程序,有什么不足之處,請(qǐng)指出 :




#include <mega16.h>
#define uchar unsigned char
int time_counter1s,time_counter250ms;
bit diff;
uchar j,n,k,time250ms;
//RSDA PORTC.1;
//CLK PORTC.0;
//RCK PORTC.2;
flash uchar signature[][128]={
     .....//00: "walk1",點(diǎn)陣32x32,長(zhǎng)度128字節(jié)
     .....//02: "walk2",點(diǎn)陣32x32,長(zhǎng)度128字節(jié)
     .....//03: "stop",點(diǎn)陣32x32,長(zhǎng)度128字節(jié)
     .....//04: "blank",點(diǎn)陣32x32,長(zhǎng)度128字節(jié)
};
flash uchar num[][128]={
     .....//"39"~"1",點(diǎn)陣32x32,長(zhǎng)度128字節(jié)
};

void sendbyteR(uchar temp) //發(fā)送數(shù)據(jù)
{
        uchar c;
        for(c=0;c<8;c++)
    {
                PORTC.1=(temp)&(0x01);
                temp=temp>>1;
                PORTC.0=1; //上升沿
                PORTC.0=0;
        }
}

void display(void)  //顯示圖像
{   
    for(j=0;j<32;j++)
    {   
        if(diff)
        {
          if(n>33) //倒計(jì)時(shí)“5”時(shí),開始閃動(dòng)
          {
            if((time250ms%2)==0) k=3;
            else{
                    if((time250ms%4)==1) k=0;
                    else k=1;
                }  
          }
          else k=time250ms%2; //行走   
        }
        else k=2;            //停
        sendbyteR(num[n][j*4+3]); //顯示數(shù)字
            sendbyteR(num[n][j*4+2]);
            sendbyteR(num[n][j*4+1]);
            sendbyteR(num[n][j*4]);

            sendbyteR(signature[k][j*4+3]);  //顯示人
            sendbyteR(signature[k][j*4+2]);
            sendbyteR(signature[k][j*4+1]);
            sendbyteR(signature[k][j*4]);
            PORTA=j;
            PORTC.2=1;
            PORTC.2=0;      
    }   
}
// Timer 0 比較匹配中斷服務(wù)
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{  
    if(++time_counter1s>=500)
    {
        time_counter1s=0;
        n++;                     //計(jì)時(shí)1s
    }
    if(++time_counter250ms>=125)
    {
        time_counter250ms=0;    //計(jì)時(shí)0.25s   
        time250ms++;
    }
}

void main(void)
{
PORTA=0x00;
DDRA=0x1F;
PORTC=0x00;
DDRC=0x07;       //顯示控制I/O口初始化

// Timer/Counter 0 初始化

TCCR0=0x0B;   //內(nèi)部時(shí)鐘,64分頻,CTC模式
TCNT0=0x00;
OCR0=0x7C;   //OCR0=2ms
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

n=0;          //賦初始值
k=0;
diff=0;
#asm("sei")   //使能全局中斷
while (1)
      {
      // Place your code here
        display();    //顯示圖像
        if(n>=39)
        {   
            diff=!diff;          //diff "0":停 ,"1":行走
            if(diff) n=10;
            else n=0;
        }
        if(time250ms>=39) time250ms=0;
      }
}



回復(fù)

使用道具 舉報(bào)

板凳
ID:127379 發(fā)表于 2016-6-20 15:49 | 只看該作者
簡(jiǎn)直不要太棒了
回復(fù)

使用道具 舉報(bào)

地板
ID:104183 發(fā)表于 2016-6-25 11:17 | 只看該作者
太好了,謝謝分享了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表