日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

從零開始,記錄每天學(xué)單片機(jī),菜鳥一枚,勿噴!

首先,在論壇上發(fā)這帖子只是單純的為了學(xué)習(xí),沒別意思,一來起到監(jiān)督自己的作用,二來也希望廣大大神可以指導(dǎo)指導(dǎo)!首先發(fā)個自己用萬用板焊的簡易開發(fā)板。使用STC89C52單片機(jī)。以后涉及到其他電子元件再補(bǔ)上去!

IMG_20140714_192537

IMG_20140718_101525

IMG_20140718_101518

全部回復(fù)(16)
正序查看
倒序查看
2014-07-18 11:05
就愛看這種學(xué)習(xí)記錄帖,可以陪著大家一起成長!加油哦。每天我都會來關(guān)注的。
0
回復(fù)
李丶四
LV.2
3
2014-07-21 09:34
周末回家了,家里沒電腦!...今天正式開始!
0
回復(fù)
李丶四
LV.2
4
2014-07-21 10:07
公司電腦沒法使用protel   等晚上回宿舍再補(bǔ)上原理圖。
0
回復(fù)
李丶四
LV.2
5
2014-07-21 10:14
簡單說一下:首先8個LED燈的負(fù)極是通過HC245連到單片機(jī)的P0口,245的作用是防止電流過大燒毀單片機(jī),恩,我的理解是這樣的;然后LED燈的正極是由三極管9012加上38譯碼器的Y6腳控制,38譯碼器的作用是節(jié)省單片機(jī)的IO口,38譯碼器的A0,A1,A2分別接到單片機(jī)的P1^0,P1^1,P1^2,使能端E3接P1^3,E1,E2接P1^4。
0
回復(fù)
李丶四
LV.2
6
2014-07-21 10:16
好吧  沒有原理圖果然很難說清楚,硬件方面的搭建因?yàn)楸容^簡單,沒太大問題,接下來我要說編程。使用當(dāng)然是Keil。
0
回復(fù)
2014-07-21 10:19
@李丶四
簡單說一下:首先8個LED燈的負(fù)極是通過HC245連到單片機(jī)的P0口,245的作用是防止電流過大燒毀單片機(jī),恩,我的理解是這樣的;然后LED燈的正極是由三極管9012加上38譯碼器的Y6腳控制,38譯碼器的作用是節(jié)省單片機(jī)的IO口,38譯碼器的A0,A1,A2分別接到單片機(jī)的P1^0,P1^1,P1^2,使能端E3接P1^3,E1,E2接P1^4。
樓主不錯,記錄下的成長 以后看起來也有意義呢 加油哈~~~
0
回復(fù)
李丶四
LV.2
8
2014-07-21 10:25

最簡單,點(diǎn)亮第一個LED,綠燈。P0^0置0即可。看程序:

#include

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ADDR4=P1^4;

sbit LED_on=P0^0;

 

void main()

{

    ADDR0=0;

    ADDR1=1;

    ADDR2=1;//因?yàn)長ED正極是利用三極管9012和138的Y6口,所以Y6口必須為0,所以A0,A1,A2分別為0.1.1

    ADDR3=1;

    ADDR4=0;//138使能端,E1,E2低電平有效,E3高電平有效。    

    while(1)

    {

        LED_on=0;

    }

}

0
回復(fù)
李丶四
LV.2
9
2014-07-21 19:41
附上原理圖。同樣的,以后學(xué)新元件再加上去!

0
回復(fù)
李丶四
LV.2
10
2014-07-21 20:23

LED點(diǎn)亮后,接下來就使它有間隔的亮,需要加個延時,單片機(jī)可以利用的延時有兩種!一種可以在程序上設(shè)計(jì),利用循環(huán)函數(shù),當(dāng)?shù)揭欢〞r間后跳出來,但不精確。另外一種可以利用單片機(jī)的定時器中斷,到我們需要的時間后就中斷。嗯,這里我先利用簡單的,就是第一種。程序:

#include

#define uchar unsigned char

#define uint  unsigned int

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ADDR4=P1^4;

sbit LED_on=P0^0;

void delay(uint x)     //延時子程序。

{

    uchar i; 

    while(x--) 

     {  

         for(i=0;i<120;i++);

    }

void main()

{   

     ADDR0=0;    

    ADDR1=1;    

    ADDR2=1;    //因?yàn)長ED正極是利用三極管9012和138的Y6口,所以Y6口必須為0,所以A0,A1,A2分別為0.1.1    

    ADDR3=1;    

    ADDR4=0;//138使能端,E1,E2低電平有效,E3高電平有效。       

     while(1)    

    {        

        LED_on=0;

        delay(100);

        LED_on=1;

        delay(100);   

     }

}

0
回復(fù)
李丶四
LV.2
11
2014-07-21 20:26

記錄學(xué)習(xí),當(dāng)然有自己錯誤的時候,我也把它列出來,一開始我程序的出現(xiàn)個錯誤,是error C267: 'delay': requires ANSI-style prototype

不懂自然區(qū)百度,發(fā)現(xiàn)別人說都是把延遲放到最前面,我試了一下,確實(shí)可以。但我覺得主程序是不是應(yīng)該放最前面才合適呢,這樣看起來像一個目錄。希望大神能告知。

0
回復(fù)
李丶四
LV.2
12
2014-07-21 20:45

先放一邊,接下來就是簡單的走馬燈程序:

#include

#define uchar unsigned char

#define uint  unsigned int

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ADDR4=P1^4;

void delay(uint x)     //延時子程序。

{

    uchar i; 

    while(x--) 

     {  

         for(i=0;i<120;i++);

    }  

void main()

{   

    uchar cnt=0;    //LED指針 

    ADDR0=0;    

    ADDR1=1;    

    ADDR2=1;    //因?yàn)長ED正極是利用三極管9012和138的Y6口,所以Y6口必須為0,所以A0,A1,A2分別為0.1.1    

    ADDR3=1;    

    ADDR4=0;    //138使能端,E1,E2低電平有效,E3高電平有效。       

     while(1)    

    {       

         P0=~(0x01<

        delay(100); 

        cnt++;

        if(cnt>=8)

        {

            cnt=0;

        }  

     }

}

0
回復(fù)
李丶四
LV.2
13
2014-07-21 20:52
個人感覺實(shí)現(xiàn)LED的這些功能,就是為了理解單片機(jī)的IO口,當(dāng)然,我學(xué)的還是很皮毛,P0口是沒有內(nèi)置上拉電阻的,所以電路設(shè)計(jì)上需要另外加!嗯,接下來去了解定時器,單片機(jī)有兩個定時器,要使它們工作,我們要在程序上編寫一些條件,比如要使用定時器0,我們要這樣寫:TR0=1,這樣定時器0就會工作,但它有很多種工作方式,準(zhǔn)確說是4種,但我們一般都需要第一種,于是我們這樣寫:TMOD=0x01; 這樣定時器就會以第一種方式進(jìn)行定時,說來慚愧,學(xué)到這里我才理解位尋址是怎么用的,因?yàn)槲野l(fā)現(xiàn)為什么要TR0=1,然后又有TMOD=0x01這樣來設(shè)置定時器呢,哦,原來一個可以位尋址,一個不可以,嗯,又學(xué)到點(diǎn)東西!
0
回復(fù)
李丶四
LV.2
14
2014-07-22 19:40

現(xiàn)在利用定時器0進(jìn)行定時,就是LED之間隔一秒亮,我使用的是12M的晶振,一個時鐘周期就是1/12*106,一個機(jī)械周期是12個時鐘周期,1ms等于x個機(jī)械周期,算出x等于1000,65536減去1000再用16進(jìn)制表示得FC18,所以我們的定時器初定值為 TH0=0xFC,TL0=0x18.程序如下:

#include

#define uchar unsigned char

#define uint  unsigned int

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ADDR4=P1^4;

 

void main()

{

    uchar cnt=0;    //LED指針

    uint T=0;    //定時器溢出次數(shù)

    ADDR0=0;

    ADDR1=1;

    ADDR2=1;    //因?yàn)長ED正極是利用三極管9012和138的Y6口,所以Y6口必須為0,所以A0,A1,A2分別為0.1.1

    ADDR3=1;

    ADDR4=0;    //138使能端,E1,E2低電平有效,E3高電平有效。

    TMOD=0x01;    //定時器選擇工作模式1

    TH0=0xFC;

    TL0=0x18;    //賦予初值

    TR0=1;        //開定時器0

    while(1)

    {

    if(TF0==1)

    {

        TF0=0;

        T++;  

        TH0=0xFC;

        TL0=0x18;    //重新賦值 

    }

    if(T>=1000)

    {

        T=0;

         P0=~(0x01<

        cnt++;

        if(cnt>=8)

        {

            cnt=0;

        }

    }

    }

}

0
回復(fù)
李丶四
LV.2
15
2014-07-23 19:45

LED可以衍生到數(shù)碼管,我暫時使用的是4個共陰的數(shù)碼管,分別接到38譯碼器的Y0,Y1,Y2,Y3口,首先令一個數(shù)碼管靜態(tài)顯示,我們在數(shù)碼管看到的1,2,3,4.....9,0,是利用數(shù)碼管的相對應(yīng)LED組合而成,因?yàn)槭枪碴?,所以?dāng)我們P0口給“1”的時候,LED亮??匆韵鲁绦?,我想實(shí)現(xiàn)的功能是秒數(shù)計(jì)數(shù):

#include

#define uchar unsigned char

#define uint  unsigned int

uchar LedChar[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//數(shù)碼管輸出0,1,2,3,4,5,6,7,8,9

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ADDR4=P1^4;

 

void main()

{

    uchar cnt=0;    //秒數(shù)指針

    uint T=0;    //定時器溢出次數(shù)

    P0=0x00;    //初始化不顯示

    ADDR0=1;

    ADDR1=1;

    ADDR2=0;    //因?yàn)閿?shù)碼管陰極是138的Y4口,所以Y3口必須為0,所以A0,A1,A2分別為1.1.0

    ADDR3=1;

    ADDR4=0;    //138使能端,E1,E2低電平有效,E3高電平有效。

    TMOD=0x01;    //定時器選擇工作模式1

    TH0=0xFC;

    TL0=0x18;    //賦予初值

    TR0=1;        //開定時器0

    while(1)

    {

    if(TF0==1)

    {

        TF0=0;

        T++;  

        TH0=0xFC;

        TL0=0x18;    //重新賦值 

    }

    if(T>=1000)

    {

        T=0;

         P0=LedChar[cnt];

        cnt++;

        if(cnt>=10)

        {

            cnt=0;

        }

    }

    }

}

0
回復(fù)
李丶四
LV.2
16
2014-07-23 20:40

有靜態(tài)顯示,自然有動態(tài)顯示,因?yàn)閱纹瑘?zhí)行指令的時候是一條一條的執(zhí)行,那我們是是如何實(shí)現(xiàn)4個數(shù)碼管同時顯示呢,其實(shí)是利用人的錯覺,但閃爍間隔為10mS時,我們是不會感覺閃爍的,根據(jù)這個原理,我們讓4個數(shù)碼管同時顯示:

#include

#define uchar unsigned char

#define uint  unsigned int

uchar LedChar[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//數(shù)碼管輸出0,1,2,3,4,5,6,7,8,9

uchar Ledsta[]={0x00,0x00,0x00,0x00};

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ADDR4=P1^4;

 uint T=0;

void main()

{

    uint cnt=0;    //秒數(shù)指針

    uint T=0;    //定時器溢出次數(shù)

    P0=0x00;    //初始化不顯示

    EA=1;        //中斷總開關(guān)

    ADDR3=1;

    ADDR4=0;    //138使能端,E1,E2低電平有效,E3高電平有效。

    TMOD=0x01;    //定時器選擇工作模式1

    TH0=0xFC;

    TL0=0x18;    //賦予初值

    TR0=1;        //開定時器0

    ET0=1;        //定時器中斷0開關(guān)

    while(1)

    {

        if(T>=1000)

        {

            cnt++;

            Ledsta[0]=LedChar[cnt%10];

            Ledsta[1]=LedChar[cnt/10%10];

            Ledsta[2]=LedChar[cnt/100%10];

            Ledsta[3]=LedChar[cnt/1000%10];

        }

    }

}

void InterruptTimer0() interrupt 1

{

    static uchar i=0;

    T++;  

    TH0=0xFC;

    TL0=0x18;

    switch(i)

    {

        case 0: ADDR0=1;ADDR1=1;ADDR2=0;i++;P0=Ledsta[0];break;

        case1:  ADDR0=0;ADDR1=1;ADDR2=0;i++;P0=Ledsta[1];break;

        case2:  ADDR0=1;ADDR1=0;ADDR2=0;i++;P0=Ledsta[2];break;

        case3:  ADDR0=0;ADDR1=0;ADDR2=0;i=0;P0=Ledsta[3];break;

        default:break;

    }

}

0
回復(fù)
2014-08-19 10:05
@李丶四
有靜態(tài)顯示,自然有動態(tài)顯示,因?yàn)閱纹瑘?zhí)行指令的時候是一條一條的執(zhí)行,那我們是是如何實(shí)現(xiàn)4個數(shù)碼管同時顯示呢,其實(shí)是利用人的錯覺,但閃爍間隔為10mS時,我們是不會感覺閃爍的,根據(jù)這個原理,我們讓4個數(shù)碼管同時顯示:#include#defineucharunsignedchar#defineuint unsignedintucharLedChar[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//數(shù)碼管輸出0,1,2,3,4,5,6,7,8,9ucharLedsta[]={0x00,0x00,0x00,0x00};sbitADDR0=P1^0;sbitADDR1=P1^1;sbitADDR2=P1^2;sbitADDR3=P1^3;sbitADDR4=P1^4; uintT=0;voidmain(){  uintcnt=0;  //秒數(shù)指針  uintT=0;  //定時器溢出次數(shù)    P0=0x00;  //初始化不顯示  EA=1;      //中斷總開關(guān)    ADDR3=1;    ADDR4=0;    //138使能端,E1,E2低電平有效,E3高電平有效。  TMOD=0x01;  //定時器選擇工作模式1  TH0=0xFC;  TL0=0x18;  //賦予初值  TR0=1;      //開定時器0  ET0=1;      //定時器中斷0開關(guān)    while(1)    {      if(T>=1000)      {          cnt++;          Ledsta[0]=LedChar[cnt%10];          Ledsta[1]=LedChar[cnt/10%10];          Ledsta[2]=LedChar[cnt/100%10];          Ledsta[3]=LedChar[cnt/1000%10];      }  }}voidInterruptTimer0()interrupt1{  static uchari=0;  T++;      TH0=0xFC;  TL0=0x18;  switch(i)  {      case0:ADDR0=1;ADDR1=1;ADDR2=0;i++;P0=Ledsta[0];break;      case1: ADDR0=0;ADDR1=1;ADDR2=0;i++;P0=Ledsta[1];break;      case2: ADDR0=1;ADDR1=0;ADDR2=0;i++;P0=Ledsta[2];break;      case3: ADDR0=0;ADDR1=0;ADDR2=0;i=0;P0=Ledsta[3];break;      default:break;  }}
樓主還在么 繼續(xù)啊
0
回復(fù)
發(fā)