<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 第十一節:一個在單片機上練習 C 語言的模板程序 ## 【11.1 一套完整的模板源代碼。】 先給大家附上一套完整的模板源代碼,后面章節練習 C 語言的模板程序就直接復制此完整的源代碼,此源代碼適合的單片機型號是 STC89C52RC,晶振是 11.0592MHz,串口波特率是 9600,初學者只需修改代碼里從 “C 語言學習區域的開始” 到 “C 語言學習區域的結束” 的區域,其它部分不要更改。可復制的源代碼請到網上論壇原貼處直接下載本教程的文件壓縮包,解壓文件壓縮包后,直接用 WPS 辦公軟件打開 “可編輯的 WPS 文檔教程” 這個文檔,就可以復制里面相關章節的源代碼。在網上搜索 “從單片機基礎到程序框架” 就可以找到論壇原貼的出處,也可以直接到我的個人網站那里下載(www.dumenmen.com)。一套完整的模板源代碼如下: ```c #include "REG52.H" void View (unsigned long u32ViewData); void to_BufferData (unsigned long u32Data, unsigned char *pu8Buffer, unsigned char u8Type); void SendString (unsigned char *pu8String); /*---C 語言學習區域的開始。-----------------------------------------------*/ void main () // 主函數 { unsigned char a; // 定義一個變量 a。 unsigned int b; // 定義一個變量 b。 unsigned long c; // 定義一個變量 c。 a = 100; // 給變量 a 賦值。 b = 10000; // 給變量 b 賦值。 c = 1000000000; // 給變量 c 賦值。 View (a); // 把第 1 個數 a 發送到電腦端的串口助手軟件上觀察。 View (b); // 把第 2 個數 b 發送到電腦端的串口助手軟件上觀察。 View (c); // 把第 3 個數 c 發送到電腦端的串口助手軟件上觀察。 while (1) { } } /*---C 語言學習區域的結束。-----------------------------------------------*/ void View (unsigned long u32ViewData) { static unsigned char Su8ViewBuffer [43]; code unsigned char Cu8_0D_0A [] = {0x0d, 0x0a, 0x00}; code unsigned char Cu8Start [] = {"開始..."}; static unsigned char Su8FirstFlag = 0; static unsigned int Su16FirstDelay; if (0 == Su8FirstFlag) { Su8FirstFlag = 1; for (Su16FirstDelay = 0; Su16FirstDelay < 10000; Su16FirstDelay++) ; SendString (Cu8Start); SendString (Cu8_0D_0A); SendString (Cu8_0D_0A); } to_BufferData (u32ViewData, Su8ViewBuffer, 1); SendString (Su8ViewBuffer); to_BufferData (u32ViewData, Su8ViewBuffer, 2); SendString (Su8ViewBuffer); to_BufferData (u32ViewData, Su8ViewBuffer, 3); SendString (Su8ViewBuffer); to_BufferData (u32ViewData, Su8ViewBuffer, 4); SendString (Su8ViewBuffer); SendString (Cu8_0D_0A); } void to_BufferData (unsigned long u32Data, unsigned char *pu8Buffer, unsigned char u8Type) { code unsigned char Cu8Array1 [] = {0xB5, 0xDA, 0x4E, 0xB8, 0xF6, 0xCA, 0xFD, 0x00}; code unsigned char Cu8Array2 [] = "十進制:"; code unsigned char Cu8Array3 [] = "十六進制:"; code unsigned char Cu8Array4 [] = "二進制:"; static unsigned char Su8SerialNumber = 1; static unsigned int Su16BufferCnt; static unsigned int Su16TempCnt; static unsigned int Su16TempSet; static unsigned long Su32Temp1; static unsigned long Su32Temp2; static unsigned long Su32Temp3; static unsigned char Su8ViewFlag; if (1 == u8Type) { for (Su16BufferCnt = 0; Su16BufferCnt < 7; Su16BufferCnt++) { pu8Buffer [Su16BufferCnt] = Cu8Array1 [Su16BufferCnt]; } pu8Buffer [2] = Su8SerialNumber + '0'; pu8Buffer [Su16BufferCnt] = 0x0d; pu8Buffer [Su16BufferCnt + 1] = 0x0a; pu8Buffer [Su16BufferCnt + 2] = 0; Su8SerialNumber++; return; } else if (2 == u8Type) { for (Su16BufferCnt = 0; Su16BufferCnt < 7; Su16BufferCnt++) { pu8Buffer [Su16BufferCnt] = Cu8Array2 [Su16BufferCnt]; } Su32Temp1 = 1000000000; Su32Temp2 = 10; Su16TempSet = 10; } else if (3 == u8Type) { for (Su16BufferCnt = 0; Su16BufferCnt < 9; Su16BufferCnt++) { pu8Buffer [Su16BufferCnt] = Cu8Array3 [Su16BufferCnt]; } Su32Temp1 = 0x10000000; Su32Temp2 = 0x00000010; Su16TempSet = 8; } else { for (Su16BufferCnt = 0; Su16BufferCnt < 7; Su16BufferCnt++) { pu8Buffer [Su16BufferCnt] = Cu8Array4 [Su16BufferCnt]; } Su32Temp1 = 0x80000000; Su32Temp2 = 0x00000002; Su16TempSet = 32; } Su8ViewFlag = 0; for (Su16TempCnt = 0; Su16TempCnt < Su16TempSet; Su16TempCnt++) { Su32Temp3 = u32Data / Su32Temp1 % Su32Temp2; if (Su32Temp3 < 10) { pu8Buffer [Su16BufferCnt] = Su32Temp3 + '0'; } else { pu8Buffer [Su16BufferCnt] = Su32Temp3 - 10 + 'A'; } if (0 == u32Data) { Su16BufferCnt++; break; } else if (0 == Su8ViewFlag) { if ('0' != pu8Buffer [Su16BufferCnt]) { Su8ViewFlag = 1; Su16BufferCnt++; } } else { Su16BufferCnt++; } Su32Temp1 = Su32Temp1 / Su32Temp2; } pu8Buffer [Su16BufferCnt] = 0x0d; pu8Buffer [Su16BufferCnt + 1] = 0x0a; pu8Buffer [Su16BufferCnt + 2] = 0; } void SendString (unsigned char *pu8String) { static unsigned int Su16SendCnt; static unsigned int Su16Delay; SCON = 0x50; TMOD = 0X21; TH1 = TL1 = 256 - (11059200 / 12 / 32 / 9600); TR1 = 1; ES = 0; TI = 0; for (Su16SendCnt = 0; Su16SendCnt < 43; Su16SendCnt++) { if (0 == pu8String [Su16SendCnt]) { break; } else { SBUF = pu8String [Su16SendCnt]; for (Su16Delay = 0; Su16Delay < 800; Su16Delay++) ; TI = 0; } } } ``` 【11.2 模板程序的使用說明。】 ![](https://img.kancloud.cn/a0/9d/a09df4b7c62f66eefe6c05b535fda28d_877x559.png) 圖 11.2.1 帶串口的單片機最小系統 大多數初學者在學習 C 語言的時候,往往是在電腦端安裝上 VC 平臺軟件來練習 C 語言,這種方法只要在代碼里調用 printf 語句,編譯后就可以看到被 printf 語句調用的變量,挺方便的。本教程沒有用這種方法,既然本教程的 C 語言主要針對單片機,所以我想出了另外一種方法,這種方法就是直接在單片機上練習 C 語言,這樣會讓初學者體驗更深刻。這種方法對硬件平臺要求不高,只要 51 學習板上有一個 9 針的串口就可以,這個串口既可以用來燒錄程序,也可以用來觀察代碼里的某個變量,只要在代碼里調用 View 函數就可以達到類似 VC 平臺軟件下 printf 語句的效果,View 函數可以向串口輸出某個變量的十進制,十六進制和二進制,大家只要在電腦端的串口助手軟件就可以看到某個變量的這些信息,View 函數能查看的變量最大數值范圍是 4 個字節的 unsigned long 變量,十進制的范圍是從 0 到 4294967295,也可以查看 unsigned int 和 unsigned char 的類型變量(數據的進制以及 long,int,char 等知識點大家目前還沒接觸到,因此不懂也沒關系,當前只要有個大概的認識就可以,暫時不用深入理解,后面章節還會詳細介紹)。View 函數是我整個模板程序的其中一部分,所以要用這種方法就必須先復制我整個模板程序,初學者練習代碼的活動范圍僅僅局限于模板程序里的 “C 語言學習區域”,在此區域里有一個 main 主函數,main 主函數內有一個初始化區域,初學者往往在這個初始化區域里練習 C 語言就夠了,初學者最大的活動范圍不能超過從 “C 語言學習區域的開始” 到 “C 語言學習區域的結束” 這個范圍, 這個范圍之外其它部分的代碼主要用來實現數據處理和串口發送的功能,大家暫時不用讀懂它,直接復制過來就可以了。比如: ```c /*---C 語言學習區域的開始。-----------------------------------------------*/ void main () // 主函數 { //... 初始化區域,也就是主要用來給初學者學習 C 語言的區域。 while (1) { } } /*---C 語言學習區域的結束。-----------------------------------------------*/ ``` 上述例子中,初學者練習代碼只能在從 “C 語言學習區域的開始” 到 “C 語言學習區域的結束” 這個范圍,此范圍外的代碼直接復制過來不要更改。我們再來分析分析下面節選的 main 函數源代碼: ```c /*---C 語言學習區域的開始。-----------------------------------------------*/ void main () // 主函數 { unsigned char a; // 定義一個變量 a。 unsigned int b; // 定義一個變量 b。 unsigned long c; // 定義一個變量 c。 a = 100; // 給變量 a 賦值。 b = 10000; // 給變量 b 賦值。 c = 1000000000; // 給變量 c 賦值。 View (a); // 在電腦串口端查看第 1 個數 a。 View (b); // 在電腦串口端查看第 2 個數 b。 View (c); // 在電腦串口端查看第 3 個數 c。 while (1) { } } /*---C 語言學習區域的結束。-----------------------------------------------*/ ``` 上述節選的 main 函數代碼里,比如 “a=100; // 給變量 a 賦值。” 這行代碼,所謂的 “賦值” 就是 “=” 這個語句,它表面上像我們平時用的等于號,實際上不是等于號,而是代表 “給” 的意思,把 “=” 符號右邊的數復制一份給左邊的變量,比如 “a=100;” 就是代表把 100 這個數值復制一份給變量 a,執行這條指令后,a 就等于 100 了。這里的分號 “;” 代表一條程序指令的結束。 而雙斜線 “//” 是注釋語句,雙斜線 “//” 這行后面的文字或字符都是用來注釋用的,編譯器會忽略雙斜線 “//” 這一行后面的文字或字符,編譯器不把注釋文字或字符列入源代碼,也就是 “//” 這一行中后面的文字或字符是不占單片機內存的。當然 “//” 僅僅局限于當前一行代碼。上面除了 “//” 是注釋語句外,上面的 “/*” 和 “*/” 之間也是注釋語句,跟”//” 的作用一樣,只不過 “/*” 是注釋開始,“*/” 是注釋結束,它們的范圍不局限于一行,而是從 “/*” 到 “*/” 的范圍,因此可以用于注釋連著的多行文字或者字符。 接著在分析上述代碼中最重要的函數,也是本節最核心最重要的函數 View (某個變量)。比如 “ View (a); ” 這行代碼,View (a) 就是要把變量 a 的十進制,十六進制和二進制的數值都發送到串口,我們通過 USB 轉串口線讓學習板連接上電腦,在電腦串口助手軟件上就能看到被 View 函數調用的變量 a 的信息。 【11.3 如何在電腦上使用串口助手軟件查看被 View 函數調用的變量?】 前面章節在講燒錄程序時提到一個叫 “stc-isp-15xx-v6.85I” 的上位機軟件,這個軟件除了用來燒錄程序,還集成了串口助手軟件的功能。所以本節直接共用燒錄程序時的 USB 轉串口線和 “stc-isp-15xx-v6.85I” 軟件就可以了,無需額外再購買新的 USB 轉串口線和下載其它串口助手軟件,但是如何設置這個 “stc-isp-15xx-v6.85I” 上位機軟件,還是有一些需要特別注意的地方的,現在把這個詳細的步驟介紹給大家。 第一步:設置燒錄軟件的選項。 按前面章節介紹燒錄程序時所需的步驟,用 USB 轉串口線連接 51 學習板和電腦,記錄 COM 號,打開 “stc-isp-15xx-v6.85I” 軟件,選擇單片機型號,選擇對應的串口號(COM 號),設置最低波特率和最高波特率,這部分的內容跟燒錄程序時的配置步驟是一樣的,唯一必須要特別注意的是最高波特率必須選擇 9600!最低波特率建議選擇 2400。否則在燒錄完程序后,當上位機集成軟件自動切換到串口助手軟件窗口時,接收區域顯示的一些漢字信息可能會出現亂碼。 \---------------------------------- 步驟之間的分割線 ---------------------------------------- ![](https://img.kancloud.cn/f9/21/f921b839dd01a82e8c67cbe99ac5f73a_683x446.jpeg) 圖 11.3.2 設置上位機的串口助手選項 第二步:設置串口助手軟件的選項。 先點擊右上方選中 “串口助手” 選項切換到串口助手的窗口,接收緩沖區選擇 “文本模式”,串口選擇匹配的 COM 號(跟燒錄軟件一致的 COM 號),波特率必須選擇 9600,勾選上 “編程完成后自動打開串口” 選項,最后點擊 “打開串口” 按鈕使之切換到顯示 “關閉串口” 的文字狀態,至此串口助手軟件的設置完畢。接下來就是按燒錄程序的流程,打開新的 HEX 程序文件,程序燒錄完成后上位機軟件會自動切換到串口助手的串口,就可以觀察到 View 函數從單片機上發送過來的某個變量的十進制,十六進制,二進制的信息了。接收緩沖區的窗口比較小,如果收到的信息比較多,只要在上下方向拖動窗口右邊的滑塊就可以依次看到全部的信息。如果想讓單片機重新發送數據,只要讓 51 學習板斷電重啟就可以重發一次數據,當串口助手的接收區接收的信息太多影響觀察時,大家可以點擊 “清空接收區” 的按鈕來清屏,然后斷電重啟讓它再重發一次數據。在電腦的串口助手軟件里觀察到的數據格式大概是什么樣子的呢?比如編譯完本章節上述完整的模板源代碼程序后,會在串口助手軟件里看到 a,b,c 三個變量的信息如下: 開始... 第 1 個數 十進制:100 十六進制:64 二進制:1100100 第 2 個數 十進制:10000 十六進制:2710 二進制:10011100010000 第 3 個數 十進制:1000000000 十六進制:3B9ACA00 二進制:111011100110101100101000000000 多說一句,燒錄程序后,當軟件自動切換到串口助手軟件選項的窗口時,串口助手窗口顯示單片機返回的信息,這時有可能第一行的文字 “開始...” 會丟失或者顯示不出來,但是后面其它的關鍵信息不受影響,我猜測可能是串口助手軟件本身的某個環節存在的小 bug,跟我們沒關系,我們不用深究原因,因為不會影響我們的使用,此時也有一種解決辦法,就是只要讓單片機斷電重啟重發一次數據就可以正確地看到第一行的文字 “開始...”。 【11.4 如何利用現有的工程編輯編譯新的源代碼?】 本教程后面有很多章節的源代碼,是不是每個章節都要重新建一個工程?其實不用。我們只要用一個工程就可以編譯編輯本教程所有章節的源代碼。方法很簡單,就是打開一個現有的工程,用快捷組合鍵 “Ctrl+A” 把原工程里面的 C 源代碼全部選中,再按 “Backspace” 清空原來的代碼,然后再復制本教程相關章節的代碼粘貼到工程的 C 文檔里,重新編譯一次就可以得到對應的 Hex 格式的燒錄文件。用這種方法的時候,建議大家做好每個程序代碼的備份。每完成一個項目的小進度,都要及時把源代碼存儲到電腦硬盤里,電腦硬盤里每個項目對應一個項目文件夾,每個項目文件夾里包含很多不同版本編號的源代碼文件,每個源代碼文件名都有流水編號,方便識別最新版本的程序,每天下班前都要把最新版本的源代碼文件上傳到自己的網盤里備份,在互聯網時代,把源代碼存到自己的網盤,可以隨時異地存取,即使遇到電腦故障損壞也不擔心數據永久丟失。 【11.5 編輯源代碼的 5 個常用快捷鍵。】 介紹一下常用的快捷鍵,好好利用這 5 個快捷鍵,會讓你在編輯源代碼時效率明顯提高。 (1)選中整篇所有的內容:組合鍵 Ctrl+A。 (2)把選中的內容復制到臨時剪貼板:組合鍵 Ctrl+C。 (3)把臨時剪貼板的內容粘貼到光標開始處:組合鍵 Ctrl+V。 (4)把選中的一行或者幾行內容整體往右邊移動:單鍵 Tab。每按一次就移動幾個空格,很實用。 (5)把選中的一行或者幾行內容整體往左邊移動:組合鍵 Shift+Tab。每按一次就移動幾個空格,很實用。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看