專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

學(xué)習(xí)單片機的日記

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2013年10月21日   【字體:
   經(jīng)歷了大一上學(xué)期我覺得大學(xué)其實好壞不在于學(xué)校而是在于個人,學(xué)校之間的差距只是在于可利用的教學(xué)資源以及環(huán)境,最重要的還是自己。個人覺得我大一要學(xué)的課程真正有用的不多,現(xiàn)在我是電子信息工程的一名大學(xué)生,大一所學(xué)課程有高數(shù),大學(xué)物理,英語,體育,近代史,思修,大學(xué)物理實驗,電路分析,C語言。呵呵,只有C語言,電路,高數(shù),英語有用。其他科目我只是應(yīng)付下考試,不會真心去學(xué),因為沒有興趣。興趣是最好的老師,沒有它我覺得做什么事情都毫無意義,這就是我這個人的怪癖。利用所有閑下來的時間我準備學(xué)習(xí)單片機,單片機雖然是大二下學(xué)期的內(nèi)容但我覺得它至關(guān)重要。
   為什么我們要學(xué)習(xí)單片機呢?他是個什么東西呢?單片機就是一塊集成芯片,但這塊集成芯片具有一些特殊的功能,而它的功能的實現(xiàn)要靠我們使用者自己來編程完成。我們編程的目的就是控制這塊芯片的各個引腳在不同時間輸出不同的電平(高電平或低電平),進而控制與單片機各個引腳相連接的外圍電路的電氣狀態(tài)。編程時我們就需要C語言,這是最快捷的編程方法。學(xué)習(xí)單片機不要一開始就翻書死學(xué),學(xué)習(xí)他的內(nèi)部結(jié)構(gòu),這樣你怎么也學(xué)不好,而是要一開始就編程,在編程的過程中了解到它的內(nèi)部結(jié)構(gòu),所以說C語言的學(xué)習(xí)是很關(guān)鍵的。很多同學(xué)都會說C語言好無聊,你是你不懂他最后有什么用處,只要你在學(xué)習(xí)C語言的過程中一同學(xué)習(xí)單片機,你會發(fā)現(xiàn)很多樂趣與成就感,因為興趣是最好的老師。并不要害怕單片機,不要以為需要很多知識才可以駕馭它,它雖然關(guān)系到數(shù)字電路以及模擬電路的知識(大二上學(xué)期學(xué)),但是涉及的還是不多,最主要的還是C語言的運用。忘了說單片機的前景,現(xiàn)在所有電子產(chǎn)品與設(shè)備幾乎全都涉及到單片機,經(jīng)常是核心,所以學(xué)好它對就業(yè)以及未來有很好的發(fā)展。
   那如何來學(xué)習(xí)單片機呢? 學(xué)習(xí)單片機之前你需要一塊開發(fā)板,51單片機開發(fā)板。在淘寶上就可以買到,一開始不要買有很多系統(tǒng)的,什么嵌入式系統(tǒng),AVR,ARM等等。咱們先學(xué)好51單片機,不急不急。價格在100左右就行,我買的開發(fā)板是東流電子的開發(fā)板,163(包括了彩屏,以及AVR),大家可以試試郭天祥開發(fā)板,不錯的。大家買完開發(fā)板肯定有附帶光盤教學(xué)視頻資料,但我還建議可以看網(wǎng)上的郭天祥十天學(xué)習(xí)單片機的視頻,講述的很不錯。
    大家利用好現(xiàn)在的大學(xué)時光,它不是一個娛樂輕松的場所,而是為將來打拼做準備的場所。有很多人會說對自己專業(yè)沒興趣,那我勸告下趕快去轉(zhuǎn)專業(yè),別浪費時光。還有你以為誰天生就對什么有興趣,那都是要靠自己探索培養(yǎng)的,要多多想想自己的將來,四年是學(xué)習(xí)的時間,你可以讓這四年讓你變成金。還有說下我這個專業(yè)的同志們,電子信息專業(yè)是很好就業(yè)的,哪里沒有電子的身影,但學(xué)好才可以成功。
  單片機的學(xué)習(xí)內(nèi)容;
  1首先你要掌握keil軟件的運用,它是編程的環(huán)境 2.學(xué)習(xí)以下實驗(流水燈的控制,數(shù)碼管的顯示原理和實現(xiàn)鍵盤檢測原理,AD工作原理定時器計數(shù)器,中斷系統(tǒng),串行口運用,等等)這些郭天祥都會講到。今天寫到這里,我去學(xué)單片機了。。。。。。
三月30日:今天是利用定時器0和1以及中斷系統(tǒng)控制數(shù)碼管以及流水燈;
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P3^7;
sbit wela=P2;
uchar temp,t0,t1,flag1,bai,shi,ge,flag;
uint shu;
void init();
void delay(uint z);
void display(uchar aa,uchar bb,uchar cc,uchar bai ,uchar shi,uchar ge);

 
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x79,0x38,0x3f};

 
void main()
{  
  init();
  while(1)
   {   
       if(flag1!=1)
       display(7,6,5,bai,shi,ge);
       else
        display(16,17,18,18,19,20);

 
   
    }
  
}
void init()
{   
   shu=432;
   temp=0xfe;
   P0=temp;
   TMOD=0x11;
   TH0=0x4c;
   TL0=0x00;
   TH1=0x4c;
   TL1=0x00;   
   EA=1;
   ET0=1;
   ET1=1;   
   TR0=1;
   TR1=1;

 

 
}
void timer0() interrupt 1
{
    TH0=0x4c;
    TL0=0x00;
    t0++;
    if(flag!=1)
   {
    if(t0==10)
    {
       t0=1;
       temp=_crol_(temp,1);
       P0=temp;
    }
   }
   else
   {
      if(t0%4==0)
          {
               P0=~P0;
               if(t0==60)
               TR0=0;
               P0=0xff;
                flag1=1;
           }
    }

 
}

 
void timer1() interrupt 3
{
    TH1=0x4c;
    TL1=0x00;
    t1++;
    if(t1=2)
    {   
        t1=0;
        shu--;
        bai=shu/100;
        shi=shu%100/10;
        ge=shu%10;
        if(shu==398)
         {
             TR0=0;
             TH0=0x4c;
             TL0=0x00;
             TR0=1;
             flag=1; 
             t0=0;  
             P0=0xff;   
             TR1=0;
          }
    }
}
void display(uchar aa,uchar bb,uchar cc,uchar bai ,uchar shi,uchar ge)

 
{
   dula=1;
     P0=table[aa];
     dula=0;
     P2=0;
     delay(5);

 
     dula=1;
     P0=table[bb];
     dula=0;
     P2=1;
     delay(5);
     
     dula=1;
     P0=table[cc];
     dula=0;
     P2=2;
     delay(5);
 
    
     dula=1;
     P0=table[bai];
     dula=0;
     P2=3;
     delay(5);

 
     dula=1;
     P0=table[shi];
     dula=0;
     P2=4;
     delay(5);
     
     dula=1;
     P0=table[ge];
     dula=0;
     P2=5;
     delay(5);
    

 

 
}

 
void delay(uint z)
{
   uint x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--);

 
}


 

 
三月31日:今天學(xué)完矩陣鍵盤,終于會編了,弄了好久。。。。(今天開始記錄思想,幫我加強記憶并自己再理解一遍)

 
#include <reg52.h>                                                                      /reg52.h是頭文件,包含了下列關(guān)鍵字
#define uint unsigned int                                                              /定義無符號型整數(shù)
#define uchar unsigned char                                                        /定義無符號型字符型
sbit dula=P3^7;                                                                             /數(shù)碼管的段是由P3.7引腳控制,位聲明下
sbit wela=P2;                                                                                /數(shù)碼管的位選是由P2引腳控制,東流電子的板子位選是由譯碼器控制
uchar temp,num;

 
void delay(uint z);                                                                        /延時函數(shù)聲明

 
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,        / 數(shù)碼管的數(shù)組
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

 
void main()                                                                              /主函數(shù)
{  
    dula=1;                                                                              /首先將數(shù)碼管不顯示,段選是由鎖存器控制,將鎖存器賦值1打開鎖存器,    
    P0=0;                                                                               / 往里面輸入數(shù)據(jù)再賦值0關(guān)閉鎖存器
    dula=0;
    P2=0;                                  /我的板子的數(shù)碼管是由譯碼器控制,通過向P2口輸入不同的值進而控制不同數(shù)碼管,0代表第一個數(shù)碼管
  while(1)                                          /主循環(huán),while語句當(dāng)()里的值為1是一直循環(huán){  }里的語句,不為1則跳出語句
   {   
        P1=0xfe;                           /如上圖所示P1指的是第一行鍵盤,矩陣鍵盤的檢測是給除了第一行賦值0外全部賦值為1,也就是111111       
        temp=P1;                          10,再將P1值賦給temp,讓后temp和0xf0(11110000)與(邏輯與)原理是:先掃描第一行,將其他端
        temp=temp&0xf0;    /口賦值1,當(dāng)有按鍵按下時有一列為0,列是在高四位如果是第一個鍵按下就是0111 0111和0xf0與下就不為0xf0
        if(temp!=0xf0)                     /如果temp不為0xfo(就相當(dāng)于有按鍵被按下)
     {   
          delay(10);                                           延時消抖
          temp=P1;                                            再將P1值賦給temp
          temp=temp&0xf0;                               再和0xf0邏輯與
        if(temp!=0xf0)                                       再判斷是否按鍵
         { 
             temp=P1;                                        將P1值重新賦給temp 
        switch(temp)                                         swith語句是多條件語句,()中temp是表達式,case(表達式):對應(yīng)語句,。break是停止
            {                                                       switch語句跳出
               
                case 0xee:num=1;                       如果是按第一個鍵就在數(shù)碼管上顯示0(為啥不是1?下面解釋)
                   break;
                case 0xde:num=2;                       如果按第一行第二個鍵在數(shù)碼管上顯示1
                   break;
                case 0xbe:num=3;
                   break;
                case 0x7e:num=4;
                   break;
             }
    dula=1;
    P0=table[num-1];                                 數(shù)碼管顯示[ ]中是上面聲明數(shù)組中的值,num-1對應(yīng)數(shù)組的值(num為1則代表數(shù)組的0)
    dula=0;
         }
     }
        P1=0xfd;
        temp=P1;                                           以下就是不同行數(shù)的檢測,檢測第二行就給P1.2賦值0,改變下P1的值和num值就可以進行第
        temp=temp&0xf0;                           二行以及第三第四行的鍵盤是否按下
        if(temp!=0xf0) 
     {   
          delay(10);
          temp=P1;
          temp=temp&0xf0;
        if(temp!=0xfe)
         {
             temp=P1; 
        switch(temp)
            {   
               
                case 0xed:num=5;
                   break;
                case 0xdd:num=6;
                   break;
                case 0xbd:num=7;
                   break;
                case 0x7d:num=8;
                   break;
             }
    dula=1;
    P0=table[num-1];
    dula=0;
          }
     }
        P1=0xfb;
        temp=P1;
        temp=temp&0xf0;
        if(temp!=0xf0) 
     {   
          delay(10);
          temp=P1;
          temp=temp&0xf0;
        if(temp!=0xfe)
         {
             temp=P1; 
        switch(temp)
            {   
               
                case 0xeb:num=9;
                   break;
                case 0xdb:num=10;
                   break;
                case 0xbb:num=11;
                   break;
                case 0x7b:num=12;
                   break;
             }
    dula=1;
    P0=table[num-1];
    dula=0;
          }
    }
        P1=0xf7;
        temp=P1;
        temp=temp&0xf0;
        if(temp!=0xf0) 
     {   
          delay(10);
          temp=P1;
          temp=temp&0xf0;
        if(temp!=0xfe)
         {
             temp=P1; 
        switch(temp)
            {   
               
                case 0xe7:num=13;
                   break;
                case 0xd7:num=14;
                   break;
                case 0xb7:num=15;
                   break;
                case 0x77:num=16;
                   break;
             }
    dula=1;
    P0=table[num-1];
    dula=0;
          }
     }

 
  }
}
  
 

 
void delay(uint z)                                         延時函數(shù)
{
   uint x,y;
    for(x=z;x>0;x--)
      for(y=110;y>0;y--);

 
}
啊哈,清明結(jié)束,把串口和AD轉(zhuǎn)換學(xué)完了,但是都是晚上學(xué)完的,沒網(wǎng)絡(luò)寫,那兩個以后復(fù)習(xí)的時候再補上,花了兩天學(xué)完液晶。話說最近課還真緊,剩下課余時間來完成吧?创笕龓熜謧兌荚趯W(xué)一種芯片,STM32(一種高性能的ARM)芯片,比51單片機先進多了,好想學(xué)啊,但是我一定要先精通51,學(xué)完我要做很多基于51的產(chǎn)品,學(xué)會制作PCB板,每天慢慢試著學(xué)模電和數(shù)電,好興奮啊。加油了!!
   液晶是什么東西呢?大家也都懂得,他是一種高分子材料,今天我就簡單的介紹下1602液晶的程序控制
1602液晶有16個引腳每個引腳都有自己的作用 ,突然覺得要介紹好多東西,有線沒錢了,無線圖片上傳不了,以后再補上思想
 
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^7;      
 sbit lcdrs=P2^5;
 sbit rw=P2^6;
 uchar code  table[]="Oh! my baby!";
uchar code table1[]="WWW.TXMCU.COM";
uchar num,num1; 
  void delay(uint z)
  {
         uint x,y;
              for(x=z;x>0;x--)
                    for(y=110;y>0;y--);
  }
  void write_com(uchar com)
         {
 
         lcdrs=0;
rw=0;  
         P0=com;
        delay(5);
         lcden=1;
         delay(5);
        lcden=0;
       }
         void write_data(uchar date)
        {
 
        lcdrs=1;
rw=0;
        P0=date;
        delay(5);
         lcden=1;
         delay(5);
         lcden=0;
        }
         void init()
       {
         
         lcden=0;
         write_com(0x38);
         write_com (0x0e);
         write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
        
      }
          void main()
      {
          init();
 for(num=0;num<12;num++)
  {
 write_data(table[num]);
 delay(5);  
        }
 
write_com(0x80+0x53);
for(num=0;num<13;num++)
  {
 write_data(table1[num]);
 delay(5);  
        } 
for(num=0;num<16;num++)
{
  write_com(0x18);
  delay(20);
}
 
   while(1);
      }
今天4月14號,今天看了I^2C總線,感覺挺難的,好不容易編出來個程序但是竟然無法執(zhí)行,唉。。。最近覺得芯片時序圖對于編程很重要,慢慢來吧,太晚了,今天也沒時間寫思想了
 
#include <reg52.h>
#define uchar unsigned char
sbit sda=P3^6;
sbit scl=P1^5;
uchar a;
void delay( )
{ ;; }
 void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}

 
void start()
{
  sda=1;
  delay();
  scl=1;
  delay();
  sda=0;
  delay();
   
}
void stop()
{
   sda=0;
   delay();
   scl=1;
   delay();
   sda=1;
   delay();
}
void respons()
{
   uchar i;
   scl=1;
   delay();
   while((sda==1)&&(i<250))i++;
   scl=0;
   delay();
}
void init()
{
  sda=1;
  delay();
  scl=1;
  delay();
}
void write_byte(uchar date)
{
    uchar i,temp;
temp=date;

 

 
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
   delay();
sda=CY;
delay();
scl=1;
delay();
// scl=0;
     //   delay();
}
scl=0;
delay();
sda=1;
delay();
}

 

 
uchar read_byte()
{
   uchar i,j,k;
   scl=0;
   delay();
   sda=1;
   delay();
   for(i=0;i<8;i++)
   {
      scl=1;
 delay();
 if(sda==1)
    j=1;
 else 
    j=0;
      k=(k<<1)|j;
 scl=0;
 delay();
   }
    return k;
}
 

 
void main()
{
   init();
   start();
   write_byte(0xa0);
   respon();
   write_byte(3);
   respon();
   write_byte(0xfe);
   respons();
   stop();

 
   delay1(100);
   start();
   write_byte(0xa0);
   respon();
   write_byte(3);
   respon();
   start();
   write_byte(0xa1);
   respon();
   a=read_byte();
   stop();
   P0=a+5;
   while(1);

 
}
關(guān)閉窗口

相關(guān)文章