magiccar 發表於 2010-1-21 17:59

單晶片魔法車01-電子走馬燈

第一個實驗我們要練習的是如何用C語言控制89C2051的輸出功能:
實驗一:電子走馬燈
使用材料:科學魔法車*1、89C2051*1、LED*3、石英振盪晶體*1、電容(20pf*2、100uf*1)、電阻(300*3、10K*1)、導線*6
電路照片:


以下是程式範例共有兩個,第一個比較容易看懂,第二種寫法則需要具備一些程式語言的基礎喔:
/*實驗一:走馬燈*/

#include <AT89x051.h>

void delay(unsigned char tmp);    //延時函數

void main(void)                  //程式開始
{
    while(1){                  //無限循環   

      P1_0=0;                  //P2第一腳輸出"0"(用共陽極接法,所以用"0"驅動LED)
      delay(100);                //呼叫延時函數,讓第一個LED亮一段時間,可改變參數來設定時間長短
      P1_0=1;                  //第一個LED熄滅

         P1_1=0;                  //第二個LED點亮
         delay(100);                //延遲一段時間
      P1_1=1;                  //第二個LED熄滅

         P1_2=0;                  //第三個LED點亮
         delay(100);                //延遲一段時間
      P1_2=1;                  //第三個LED熄滅

         P1_1=0;                  //回到第二個LED點亮
         delay(100);                //延遲一段時間
      P1_1=1;                  //第二個LED熄滅
    }
}
void delay(unsigned char tmp)    //延時函數內容,改變參數大小,可調整時間
{
    unsigned char i,j;            //宣告使用到的變數
    i=tmp;                        //把呼叫程式式中的參數100指定給變數i
    while(i)                  //只要i不為0,
    {                            //就執行{...}中的指令
      i--;                  //把i值減1
      j=255;                   // <-+
      while(j)               //   |
      {                        // 用j值讓程式執行256次的迴圈,到延時效果
             j--;                //   |
      }                        // <-+
    }
}
編譯完成的檔案,可下載直接燒錄


/*實驗一:走馬燈 進階版*/

#include <reg51.h>


void delay(unsigned char tmp);    //延時函數
code unsigned char tmpled={0X01,0X02,0X04,0X02};
                              //定義發光二極體的輸出資料的常數。前面加"code"表示比此資料
                              //只在程式代碼中存放,不會占用到晶片中占記憶體空間
                              // 0x01: 00000001 =>2第一個bit為1
                              // 0x02: 00000010 =>2第二個bit為1
                              // 0x04: 00000100 =>2第三個bit為1
void main(void)                  //程式開始
{
    unsigned char i;            //定義變數
    while(1){                  //無限循環   
      for(i=0;i<4;i++){      //連續輸出4個資料
            P1=~tmpled;      //"~"這個符號是反相,因發光二極體採用共陽極,所以將資料反相再輸出
            delay(100);            //調用延時函數,改變參數大小,調整變化的速度
      }
    }
}
void delay(unsigned char tmp)    //延時函數內容,改變參數大小,可調整時間
{
    unsigned char i,j;            //宣告使用到的變數
    i=tmp;                        //把呼叫程式式中的參數100指定給變數i
    while(i)                  //只要i不為0,
    {                            //就執行{...}中的指令
      i--;                  //把i值減1
      j=255;                   // <-+
      while(j)               //   |
      {                        // 用j值讓程式執行256次的迴圈,到延時效果
             j--;                //   |
      }                        // <-+
    }
}

進階版編譯完成的檔案

曹齊平 發表於 2010-1-22 08:41

周老師   真是棒, 太感謝你了, 我將會在我的網頁上做一個標明單晶片學習的
聯結到你這裡. 希望能幫助更多的人學習單晶片(微控制器)
建議您將每一個程式取一個不同的名稱,

陕大鹍 發表於 2011-7-31 02:24

谢谢周老师!
頁: [1]
查看完整版本: 單晶片魔法車01-電子走馬燈