久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3386|回復: 7
收起左側

51單片機學習之路(更新2)

  [復制鏈接]
ID:812295 發表于 2020-8-7 22:36 | 顯示全部樓層 |閱讀模式
接上篇帖子(本文選自網絡),單片機這種東西,如果是用來考試,翻翻書大概就可以了,如果是拿來開發一些小的作品,自學2個月,也不會太難,因為現在開發板也是很多的,資料也很豐富,如果你是想找工作,想獨立開發產品,這個,對于一個剛畢業的人來說,就比較難了,不吹不黑,我見過很多半途而廢的人,因為學習走到了死胡同,再也走不出來了,其中有一個是我們另一個部門一個部長,模電數電基礎還可以,自學了幾年,就是不入門,后來我教他2個星期,帶他入門了,所以并不是說單片機入門有多么難,很大的原因,是走了彎路,而且沿著彎路一直走了下去。我們希望分享一些有用的東西,實用的東西,讓新手少走些彎路,如果每個坑都重踩一遍,這得浪費多少時間啊。
    言歸正傳,單片機是必須要親自動手敲代碼才能學會的,所以從這一章節開始,我們會分享一些例程,并詳細解析,希望能給新手帶來幫助,還是那句話,本人水平有限,老手輕拍,有錯誤請指出,有事請留言。
    一個經典的例程,點亮你的LED
我以手里的這塊STC15W1K16PWM芯片為例來寫例子,這塊芯片至少還有一些人用來開發產品,學習了至少還有一定實用價值,如果你手里有同類型的芯片,那就更方便學習了,不管干什么,都是從簡單到復雜的,比如學計算機,第一句就是“HELLO WORLD”,那么學習單片機,就是點亮你的LED了先把原理圖上傳,單片機是軟硬結合的東西,硬件為主,軟件為輔,所以需要看原理圖編程。
    新建一個KEIL4工程,把下面代碼敲進去,就可以實現LED的閃爍了,但是還是需要解釋下一下代碼。
  1. /*******************************************************************
  2. * 文件名  LED0 500MS閃爍
  3. * 描述:        點亮LED
  4. * 調試通過
  5. * 功能  入門模板
  6. ********************************************************************/
  7. #include "config.h"
  8. #include "intrins.h"


  9. /*******************************************************************
  10. * 文件名 變量重新定義區域
  11. * 描述:        
  12. * 功 能
  13. ********************************************************************/

  14. typedef unsigned char uint8;//無符號字符型
  15. typedef unsigned int  uint16;//無符號整型
  16. typedef unsigned long uint32;//無符號長整型


  17. /*******************************************************************
  18. * 文件名:位重新定義區域 函數前置聲明
  19. * 描述:        
  20. * 功 能
  21. ********************************************************************/
  22. void Delay500ms();                //@11.0592MHz
  23. void MCU_Port_Init(void);


  24. sbit LED0 = P1^0;
  25. sbit LED1 = P1^1;
  26. sbit LED2 = P1^2;
  27. sbit LED3 = P1^3;
  28. sbit LED4 = P1^4;
  29. sbit LED5 = P3^2;
  30. sbit LED6 = P0^0;
  31. sbit LED7 = P0^1;


  32. /*******************************************************************
  33. * 文件名 main函數入口
  34. * 描述:        
  35. * 功 能
  36. ********************************************************************/
  37. void main(void)
  38. {
  39.         MCU_Port_Init();//端口模式初始化函數
  40.         //上電IO默認是0
  41.         LED0 = 1;//輸出1
  42.         LED1 = 0;
  43.         LED2 = 0;
  44.         LED3 = 0;
  45.         LED4 = 0;
  46.         LED5 = 0;
  47.         LED6 = 0;
  48.         LED7 = 0;//

  49.         while(1)
  50.         {
  51.              P2 = 0XFE;//1111_1110;
  52.                  Delay500ms();//500ms延時 11.0592MHZ
  53.                  P2 = 0XFF;//1111_1111;
  54.                  Delay500ms();//500ms延時 11.0592MHZ
  55.         }
  56. }

  57. /*******************************************************************
  58. * 文件名:void MCU_Port_Init(void)
  59. * 描述:        MCU端口上電初始化函數
  60. * 功 能
  61. ********************************************************************/
  62. void MCU_Port_Init(void)
  63. {
  64.         //第0 和1位配置推完輸出模式,大電流
  65.         P0M1 = 0XFC; //        1111_1100
  66.         P0M0 = 0X03; // 0000_0011

  67.         //第01234位配置推完輸出模式,大電流,567配置高阻輸入,用于ADC
  68.         P1M1 = 0XE0; //1110_0000        
  69.         P1M0 = 0X1F; //0001_1111

  70.         //P2配置位準雙向口
  71.         P2M1 = 0X00; //0000_0000        
  72.         P2M0 = 0X00; //0000_0000

  73.         P2 = 0XFF;//P2口初始化為1

  74.         //P5配置位準雙向口
  75.         P5M1 = 0X00; //0000_0000        
  76.         P5M0 = 0X00; //0000_0000

  77.         P5 = 0XFF;//P5口初始化為1

  78.         //P3 23467推完輸出
  79.         P3M1 = 0X00; //0000_0000        
  80.         P3M0 = 0XFC; //1101_1100

  81.         P3 = 0X23;  //0010_0011
  82.                
  83. }
  84. /*******************************************************************
  85. * 文件名:void Delay500ms()
  86. * 描述:        通用延時函數
  87. * 功 能
  88. ********************************************************************/
  89. void Delay500ms()                //@11.0592MHz
  90. {
  91.         unsigned char i, j, k;

  92.         _nop_();
  93.         _nop_();
  94.         i = 22;
  95.         j = 3;
  96.         k = 227;
  97.         do
  98.         {
  99.                 do
  100.                 {
  101.                         while (--k);
  102.                 } while (--j);
  103.         } while (--i);
  104. }

復制代碼
  頭文件 #include "config.h"這個頭文件是我們新建的,這里面是STC15W系列的寄存器地址定義等等,就好比學STC89C52RC那樣,先包含頭文件#include "reg52.h"一樣,因為STC15W系列的不是標準的51,所以不能用REG52.H這個頭文件,需要我們自己去新建一個,然后把官網的頭文件復制過來就好了。
  typedef 的作用
typedef是用來聲明新類型名的,也即是說我覺得unsigned char 太長了,記不住,或者每次都寫很繁瑣怎么辦?另外起一個名字,typedef就是起到這個作用,而且用typedef定義過的是可以參與系統編譯的,如果編譯錯誤,那么編譯器是提醒你的,如果你是用#define來定義,也可以,除非你保證自己的程序沒有錯誤,如果出錯,不小心把unsigned char寫unsigned charr也是會通過的,因為#define知識簡單的替換,并不參與系統編譯。typedef的詳細用法請參考C語言第四版326頁,非常詳細。

關于無符號字符型的定義,無符號字符型占1個字節,取值范圍在0-255之間,無符號基本整型占2個字節,取值范圍是0-65535,但是在STM32上,我記得是unsigned short ,即無符號短整型,一直混用,當時搞得好混,后來看C語言,發現可以同時用,unsigned long,即無符號長整型,取值范圍是0-4294967295,我們暫時就用到這3種類型的數據變量,至于更具體的請翻閱C語言第44頁。
   關于函數前置聲明
   函數如果在MAIN函數前面定義,是不要函數前置聲明的,但是如果在MAIN后面定義,那就一定需要了,不然會報錯的。
   用sbit定義引腳
比如sbit LED0 = P1^0;,P1^0必須要大寫而且必須要加一個分號,sbit定義是51單片機獨有的,STM32就沒有這個東西,直接初始化用就好了。
   main入口函數
   統一規定的,就這么個寫法,第一個void指的是函數沒有返回值,第二個void指的是函數沒有形參調用,在STM32里面,就不是這樣的,int main(void),是一個基本整型的變量作為返回值的。里面是一個while(1)的大循環,這沒啥好說的。
  關于端口配置
   如果是用STC89C52的話,不需要端口配置的,除了P0是開漏輸出,其他普通IO都是準雙向口,直接賦值即可,但是STC89C52的IO驅動能力是有限的,LED小燈是一個耗電大戶,必須要加一個三極管才可以,STC15W則不需要,IO可以配置位4種模式,準雙向口,開漏輸出,推挽輸出,高阻輸入4種模式,前2個沒什么分別,推挽輸出是大電流,可以直接驅動LED,最大可以達到20MA,但是根據使用經驗,最好是灌入電流,也就是IO是0的時候,點亮LED,至于拉電流,IO上拉15MA可能就極限了。

程序中的寄存器定義P0M0 P0M1的配置,就是參照這個表格配置出來的,因為好多引腳還用在了別的上面,實現別的功能。請注意,P0M0和P0M1只是設定IO端口的工作類型,至于輸出IO是低電平還是高電平,仍然是需要你自己決定的 ,不然達不到你要實現的效果。我們只是想點亮第一組LED的第一個燈,那么選擇LED = 1;就可以了,然后在主循環中延時閃爍就好了。
   關于二進制和16進制
   我們在循環中,寫P2 = 0XFE,這兒是將P2端口的最低位清零,換算成二進制也就是1111_1110,這個0就代表了P2口的最低位,也就是原理圖中的DB0,如果我們不想并口操作IO,可以用sbit DB0 = P2^0;這樣定義就可以將P2 = 0XFE,替換成DB = 0;P2 = 0XFF;替換DB0 = 1;就可以實現同樣的效果,我們稱這樣的叫做可位操作,隨著以后的學習深入,你會發現有很多寄存器不支持位操作,這就要想辦法了。二進制怎么轉換成16進制?16進制怎么轉換成二進制呢?答案很簡單,用計算器如下圖WINDOWS自帶的非常好用,還有就是自己算,也比較簡單,0XFF 換成二級制也就是1111_1111,
16進制最大計數到F,從0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,共計16個數,比如一個0XFE,是一個8位數,1111是高4位 ,1110看成低四位,從左到右,依次看過去的1對應的是8421,低四位也一樣,也是8421,8*1+4*1+2*1+1*1 = 15,也就是16進制的F,8*1+4*1+2*1+1*0 = 14,也就是16進制的E,就是這樣算,當然我覺得還是計算器最好用。
  關于delay延時函數
還記得我剛開始學的時候,就是不知道這個DELAY函數是怎么來的,在那里苦思冥想,也得不到結果。如果你是一個剛入門的新手,那么這個DELAY函數也不要去研究了,直接用STC的客戶端配置好就完事了,注意選擇好對應的內核就好了。這樣的函數,沒有參考的價值,沒有研究意義。要定時精準,還是要用定時器來做。

好了,就到這里吧,未完待續。。。
   


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:255559 發表于 2020-8-8 01:06 | 顯示全部樓層
學習了,講的不錯
回復

使用道具 舉報

ID:833307 發表于 2020-10-25 07:25 | 顯示全部樓層
學習了,菜鳥一只,就是喜歡,就是入迷
回復

使用道具 舉報

ID:578842 發表于 2020-10-25 08:56 | 顯示全部樓層
這個要支持,初學者最需要這一類的知識,
回復

使用道具 舉報

ID:834253 發表于 2020-10-25 11:24 | 顯示全部樓層
剛剛準備學習單片機,終于找到了一個靠譜的網站
回復

使用道具 舉報

ID:834389 發表于 2020-10-25 18:00 | 顯示全部樓層
學習了,講的不錯
回復

使用道具 舉報

ID:834899 發表于 2020-10-26 22:10 來自觸屏版 | 顯示全部樓層
學習學習!希望今年能學會
回復

使用道具 舉報

ID:333678 發表于 2020-11-17 20:13 | 顯示全部樓層
學習了,講的不錯,很實用。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一区在线 | 日韩精品视频在线观看一区二区三区 | 中文区中文字幕免费看 | 天堂网中文| 日本天天操 | 亚洲性在线 | 亚洲韩国精品 | 天天爱天天操 | 99久久精品视频免费 | 欧美一级二级在线观看 | 亚洲成人自拍 | 欧美福利在线 | 国产精品久久久久久久久久久久午夜片 | 国产视频在线观看一区二区三区 | 国产精品99久久久久久www | 中国免费黄色片 | 人妖一区 | 欧洲国产精品视频 | 中文字幕一区二区三区在线视频 | 中文字幕国产一区 | 日本福利视频 | 午夜精品一区二区三区在线视频 | 欧美在线综合 | 国产小视频在线 | 国产成人网 | 久久精品一级 | 日韩午夜场 | 久久精品成人一区 | 先锋资源站 | 99久久免费精品视频 | 日韩欧美高清 | 亚洲免费福利视频 | 精品乱码一区二区三四区视频 | 91精品国产一区二区三区 | 天天综合永久入口 | 国产精品成人在线播放 | 色先锋影音 | 91精品国产一区二区三区 | 亚洲网站在线播放 | 五月天国产视频 | 亚洲在线一区二区 |