2018年5月15日 星期二

8051 (6) 紅外線避障模組控制LED七段顯示器。



這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數,

到第5次時會讓紅色LED燈發光。



程式如下:

#include <reg52.h>

unsigned char seg[5]={0xf9,0xa4,0xb0,0x99,0x92}; //七段顯示器0~4。
sbit Sensor=P2^0;
sbit LED=P2^1;
void delay(unsigned int);
int seven_count=0;//LED7計數器。
void main()
{
 while(1)
 {
  if(Sensor==0){  //感測器是觸發給低電位。
P1=~seg[seven_count];//一開始是"0",所以LED7會先顯示"0"。
delay(20000);
seven_count++;//計數器先加1,再度觸發時就會顯示+1後的數值。。
}
if(seven_count>=5){
LED=0;//計數器為5的時候亮紅色燈泡。
delay(30000);
seven_count=0;//清除計數器。
if(seven_count<5){//計數器小於5的時候紅色燈泡不亮。
LED=1;
  delay(5000);
}
}
  }
 }   

void delay( unsigned int count)
{
 unsigned int i;
 for(i=0;i<count;i++);
}

我本來想再加一些功能,就是如果數到5以下時過了5秒會自動清除計數器,

這我還在試...

2018年5月10日 星期四

8051 (5) 外部中斷實驗。

使用5顆燈泡和1個按鈕,

按鈕按下後燈泡換切換觸發I/O埠低電位。




程式如下 :

#include <reg52.h>
unsigned char LED_P1=0x15;//P1二進制10101。
unsigned char LED_P2=0x06;//P2二進制110。
void delay(unsigned int);
char a;

void main()
{
 SP=0x60;
 EA=1;//打開中斷功能。
 EX0=1;//外部中斷0。
 IT0=1;//負緣觸發。
 a=1;//按鈕預設1,功能等同Boolean。

 while(1)
 {
  if(a==1){//按下次數雙數狀態。
   P1=~LED_P1;
   P2=LED_P2;
  }
  if(a==0){//按下次數單數狀態。
   P1=LED_P1;
   P2=~LED_P2;
  }
delay(10000);
 } 
}


void delay( unsigned int count)
{
 unsigned int i;
 for(i=0;i<count;i++);
}

void EX0_INT(void) interrupt 0 //外部中斷0的function,按鈕狀態切換。
{
 a=!a;
}

8051 (4) 七段顯示器。(TIMER)

這篇也沒什麼重點,就簡單的顯示1~0,做個紀錄囉。


程式如下 :

#include "reg52.h"


void main(){
int count=0;
int i=0;
unsigned char seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定義1~0陣列。
TMOD=0x01;
TH0=0xB8;
TL0=0x00;
TR0=1;
while(1){
if(TF0==1){
TF0=0;
TH0=0xB8;
      TL0=0x00;
count++;
if(count>=20){
count=0;
P1=~seg[i];
i++;
if(i>=10){
i=0;
}
}
}
}
}
後面整段"TIMER"就跟第2篇的51很像,這邊就不另外標註了。

8051 (3) 霹靂燈。


霹靂燈,就像是小時候看的霹靂遊俠車頭的排序燈。

這篇沒什麼重點,只是Arduino沒有去寫霹靂燈,用51補上囉。

程式如下 :

#include <reg52.h>

void delay(int );//Delay寫成function。

main()
{
    char code led[]={0x01,0x02,0x04,0x08,0x10};//一樣是P1.0~P1.4。
    int i;
    P1=0xff;
    while(1)
    {
        for(i=0;i<4;i++)
        {
        P1=~led[i];//陣列0~4負電位觸發。
        delay(50);
        }
for(i=4;i>0;i--)
        {
        P1=~led[i];//陣列4~0負電位觸發。
        delay(50);
        }
       
    }
}

void delay(int x)
{
    int i,j;
    for(i=0;i<x;i++)
        for(j=0;j<600;j++);}

2018年5月8日 星期二

8051 (2) 單向跑馬燈。(TIMER版本)

影片範例跟上一篇差不多,故不另行貼上了。

程式如下 :

#include "reg52.h"


void main(){
int count=0;
int i=0;
unsigned char seg[]={0x01,0x02,0x04,0x08,0x10};  //I/O輸出陣列P1.0~P1.4。
TMOD=0x01;  //模式選擇16位元計時器。
TH0=0xB8;  //設高低8位(20ms)。
TL0=0x00;
TR0=1; //啟動計時器。
while(1){
if(TF0==1){  //溢位旗標。
TF0=0;  //清除旗標。
TH0=0xB8;//重設高低8位。
                        TL0=0x00;
count++; //溢位1次計數+1。
if(count>=20){//20X20ms=400,400ms執行如下。
count=0;  //計數計清除。
P1=~seg[i];//低電位觸發,"i"從0開始每400ms增加。
i++;
if(i>=5){//第5顆燈點亮後"i"清0。
i=0;
}
}
}
}
}

看起來有點複雜,但是不難,整合進計時器功能而已,說是會比較準,我倒沒什麼感覺。

8051 (1) 單向跑馬燈。(Shift版本)


玩過 Arduino後再回頭寫8051,感覺Arduino人性化非常多,而且我手上這組8051,不是開發板,只能玩數位訊號,並沒有加AD轉換器,因為功能有限,就簡單寫幾篇囉。

上面這張板子是跟同事借的,單純只有I/O,而且這Layout有問題,怎麼I/O是沒規則的亂跳呢??

最大的好處是這張有ISP轉USB,這樣燒錄就很方便了!!

這篇就先來寫個最簡單的跑馬燈吧!!!

因為我這張8051最好是用低電位觸發,所以我都寫成低電為觸發囉。

就這樣,慢慢依序亮滅亮滅。

程式如下 :


#include "reg51.h"

unsigned int i;
unsigned char count=0; //計數器預設0。
void main()
{
while(1)   //Arduino的Loop,無限迴圈。
{
  P1=~(0X01<<count); //P1埠(00000001),P1.0為HIGH,"~"反向低電位觸發,位移1位。
                                      
for(i=0;i<20000;i++);//延遲。
count++;//每次延遲後位移+1。
if(count>=5){//如果位移達5次清除計數器。
count=0;
    }
  }
}

沒難度,超簡單跑馬燈完成!!

如果你要0X01、0X02、0X04、0X08..........輪者亮也可以,不過這樣的程式會很長,用位移是最理想的。



8051 (6) 紅外線避障模組控制LED七段顯示器。

這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數, 到第5次時會讓紅色LED燈發光。 程式如下: #include <reg52.h> unsigned char seg[5]={0xf9,...