欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
32*32點陣led交通燈設計
[打印本頁]
作者:
huge
時間:
2015-2-19 01:00
標題:
32*32點陣led交通燈設計
http://player.youku.com/player.php/sid/XNDQxODE4MDAw/v.swf
看了不少的Proteus仿真、單片機設計,都沒看到有關人行道交通燈的設計,針對機動車而設計的紅綠燈倒是不少,難道就這么忽視行人的安全,所以就有了設計一個這樣的交通燈的想法。
取材是來自水南汽車站旁邊的交通燈。
由于是仿真、資源也有限,點陣是用單色的,所以,“停”的效果不好,譯碼器用74LS154,這個太貴,實際肯定要用138了。
PS:取字模軟件是我自己破解的,所以用起來感覺很不一樣。
下面是源程序,有什么不足之處,請指出:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/***************************************/
void sendbyteR(uchar temp); //發送數據
sbit RSDA=P2^4;
sbit CLK=P2^5;
sbit RCK=P2^6;
uchar code signature[][128]={ };
。。。。代碼太長省略
uchar code num[][128]={ };
。。。。代碼太長省略
/***************************************/
void main()
{
P1=0x00;
TMOD=0x01;
TH0=0x3c; //T0定時50ms
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while(1);
}
/***************************************/
void sendbyteR(uchar temp) //發送數據
{
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)){ //倒計時“5”時,開始閃動
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]); //顯示數字
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++; //計時1s
}
if(count1==5){
count1=0;
n1++; //計時0.25s
}
if(n1==39) n1=0;
if(n==39){
diff=!diff; //diff "0":停 ,"1":行走
if(diff) n=10;
else n=0;
}
}
作者:
huge
時間:
2015-2-19 01:03
玩了一天的游戲,太沒意思了,無聊下就編了個AVR單片機的程序。還記得上次發表的點陣led交通燈,原來核心是51,這學期學的是AVR,所以就換了,改用ATmega16。
由于是從51上移植過來的,自然思路也差不多。只是這次在中斷使用上,做了調整,使之盡可能的短!
核心改變:
下面是在CVAVR下的源程序,有什么不足之處,請指出 :
#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",點陣32x32,長度128字節
.....//02: "walk2",點陣32x32,長度128字節
.....//03: "stop",點陣32x32,長度128字節
.....//04: "blank",點陣32x32,長度128字節
};
flash uchar num[][128]={
.....//"39"~"1",點陣32x32,長度128字節
};
void sendbyteR(uchar temp) //發送數據
{
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) //倒計時“5”時,開始閃動
{
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]); //顯示數字
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 比較匹配中斷服務
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
if(++time_counter1s>=500)
{
time_counter1s=0;
n++; //計時1s
}
if(++time_counter250ms>=125)
{
time_counter250ms=0; //計時0.25s
time250ms++;
}
}
void main(void)
{
PORTA=0x00;
DDRA=0x1F;
PORTC=0x00;
DDRC=0x07; //顯示控制I/O口初始化
// Timer/Counter 0 初始化
TCCR0=0x0B; //內部時鐘,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;
}
}
作者:
蟲子哥哥
時間:
2016-6-20 15:49
簡直不要太棒了
作者:
leileiq910
時間:
2016-6-25 11:17
太好了,謝謝分享了。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1