找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6757|回復(fù): 24
打印 上一主題 下一主題
收起左側(cè)

初學51單片機之點燈程序詳解

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1110945 發(fā)表于 2024-2-15 21:52 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
  對于單片機的學習,很多人都是從點燈程序開始的,這里我找到
了一個之前做實驗的小板子,MCU是STC8H1K08,P54引腳接了一個
發(fā)光管經(jīng)過電阻到地。由于P54引腳要拉高才能點亮發(fā)光管,所以端
口模式要設(shè)置成推挽模式,因此最最最簡單的C語言點燈程序是下面的
樣子:


  看起來是不是很簡單?全部加起來包括花括號只有7行代碼,其中第一
行是文件包含偽指令,它把STC公司提供的對應(yīng)“頭文件”包含到此程序
中來,下面六行是一個C語言函數(shù)的標準寫法,只是名為“main”的函
數(shù)很特殊,它是必須的,不能被別的函數(shù)調(diào)用,所以沒有返回值,也不
需要參數(shù)!皏oid”是C語言中“無類型”關(guān)鍵字,“main”左邊的
“void”代表“main”函數(shù)的返回值是“無類型”!癿ain”右邊的
小括號中的“void”是它的參數(shù)的類型。緊跟著的一對“花括號”中間
裝的是“main”函數(shù)的具體內(nèi)容,它里面有三個分號,C語言語句以分
號結(jié)尾,前兩句用于設(shè)置P54端口為推挽模式,第三句才是拉高P54引腳
真正實現(xiàn)點亮發(fā)光管的語句,當然也可以在前兩句中把端口設(shè)置為準雙
向口模式也是可以點亮的,但是沒有前兩句的話則是不能點亮的。經(jīng)過編
譯,上圖中可以看到生成了24字節(jié)的代碼,沒有錯誤和警告,下載到實驗
板上實測能點亮發(fā)光管。
  再來看這三句C語言語句,中間都有“等號”,它可不是我們生活中
的“等于”的意思!暗忍枴庇疫吘褪菙(shù)字,只是它的寫法不常見,“等號”
左邊是STC8H1K08這個芯片中寄存器的名字,它們都是在“頭文件”中定
義的,大家可以用記事本或其它程序打開“頭文件”仔細研究研究。什么是
寄存器?我們可以很形象的打個比方,說墻上有很多燈開關(guān),其中一個叫
“P54”,我們在程序中把數(shù)字“1”寫進“P54”這個開關(guān)中,然后燈這亮了,
也可以把數(shù)字“0”寫進“P54”中,然后燈就滅了,所以這三個語句都是
把“等號”右邊的數(shù)字寫進左邊的寄存器中,從而實現(xiàn)我們想要的結(jié)果。
  除了頭文件外,單片機的制造商還會提供對應(yīng)單片機的參考手冊和數(shù)據(jù)
手冊,STC則很獨特的把這兩個文件外加例程都寫進了一個PDF文件中,目前
這個“STC8H技術(shù)參考手冊”達到了1640頁。想要學好用好這個單片機就要
認真閱讀此手冊。
  再來看一看“0x10”這個數(shù)字,其前綴“0x”代表它是16進制的數(shù)字,
翻譯成常見的十進制的寫法是“16”這個數(shù)字,同樣的“0x00”就是十進制
的“0”,寫成那樣有強調(diào)它是一個8位數(shù)的意思,因為“等號”左邊的
“P5M1”寄存器有8個位,語句的結(jié)果是要把8個位都寫成“0”,而實際上
只需要把它的“4位”寫成“0”就行了,其它的7個位最好是“保持原樣”,
但是很遺憾,“等號”這種直接賦值的方式不能使其左邊寄存器內(nèi)的其它位
“保持原樣”,必須得換一種寫法才行,雖然“P54”可以直接賦值而不影響
其它“位”,但為了適應(yīng)其它不支持“位操作”的單片機,我盡量少用這種
“位操作”的寫法。同樣的程序我改成了如下的樣子:

#include  "STC8Hxx.h"
#define    BIT4    (0x10)//定義“4位”,注意這句沒有分號!
void  main(void)
{
P5M1  &=~(BIT4);//拉低復(fù)位
P5M0    |=  BIT4;//拉高置位
P5         |=  BIT4;//P54拉高置位
}
 
  其中“BIT4”對于單片機來說就是數(shù)字“0x10”,但是我們在讀這個程
序的時候一眼就能看出是要對寄存器的哪一位做怎樣的處理而不需要特別注明
語句的具體含義。我們要特別的記住“|=”是拉高某位(或某幾位)而其它位保
持原樣,“&=~”則是拉低某位(或某幾位同時拉低的話要加圓括號括起來)而
其它位保持原樣。
  當然,實際的程序不可能只是這么簡單,比如“#define”這樣的位定義就
有8行(或更多),
#define    BIT0    (0x01)
#define    BIT1    (0x02)
#define    BIT2    (0x04)
#define    BIT3    (0x08)
#define    BIT4    (0x10)
#define    BIT5    (0x20)
#define    BIT6    (0x40)
#define    BIT7    (0x80)
  我們可把這些(或更多的內(nèi)容)寫進我們自己的“Ext.h”這樣一個頭文件中,
然后包含進程序中,當然還要加上傳說中的“大循環(huán)”:

#include  "STC8Hxx.h"
#include  "Ext.h"
void  main(void)//程序從主函數(shù)開始執(zhí)行
{
P5M1  &=~(BIT4);//只運行一次的程序
P5M0    |=  BIT4;  //寫這這里,
P5         |=  BIT4;  //比如初始化程序
while(1)//大循環(huán)
    {
    ;//要循環(huán)運行的語句寫這里
    }
}//主程序結(jié)束
//中斷函數(shù)可以寫在下面

  今天就聊到這里,不足之處,歡迎指正。



評分

參與人數(shù) 2黑幣 +55 收起 理由
SDDQ + 5 對新人非常友好,贊一個
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂12 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:192020 發(fā)表于 2024-2-23 18:26 | 只看該作者
這種沒有while循環(huán)的結(jié)束main后不知MCU處在什么狀態(tài)?運行的什么語句呢?
回復(fù)

使用道具 舉報

板凳
ID:1110945 發(fā)表于 2024-2-24 21:50 | 只看該作者
qq475878026 發(fā)表于 2024-2-23 18:26
這種沒有while循環(huán)的結(jié)束main后不知MCU處在什么狀態(tài)?運行的什么語句呢?

為幫助初學習者理解而省略了大循環(huán)的一個鮒程而已,
實際情況是它能編譯通過并下載到單片機運行,也能成
功點亮發(fā)光管。我所知道的沒有例外的都有大循環(huán)在主
函數(shù)中使程序“永遠”運行下去。
也許,單片機的生產(chǎn)廠家能回答這樣的問題,但這個問
題的答案對于我這樣一般的單片機使用者來說好象沒有
什么用處。
回復(fù)

使用道具 舉報

地板
ID:961114 發(fā)表于 2024-3-28 09:47 | 只看該作者
初學應(yīng)該學STC8H8K64U啊   有硬件USB,直接仿真啊
回復(fù)

使用道具 舉報

5#
ID:1115793 發(fā)表于 2024-4-8 19:03 | 只看該作者
請問一下初學單片機應(yīng)該如何入手?
回復(fù)

使用道具 舉報

6#
ID:1116590 發(fā)表于 2024-4-14 16:28 | 只看該作者
不錯降低了很多
回復(fù)

使用道具 舉報

7#
ID:1117351 發(fā)表于 2024-4-19 16:10 | 只看該作者
對新人非常友好
回復(fù)

使用道具 舉報

8#
ID:1118442 發(fā)表于 2024-4-26 17:17 | 只看該作者
如果學單片機直接,案列對著程序?qū)W習這樣會不會學的快點
回復(fù)

使用道具 舉報

9#
ID:1100807 發(fā)表于 2024-4-27 15:33 | 只看該作者
學習了,感謝分享。
回復(fù)

使用道具 舉報

10#
ID:876947 發(fā)表于 2024-5-7 13:38 | 只看該作者
fan523709338 發(fā)表于 2024-4-26 17:17
如果學單片機直接,案列對著程序?qū)W習這樣會不會學的快點

同感,同樣的任務(wù)語句卻也不同,有些迷糊。
回復(fù)

使用道具 舉報

11#
ID:60122 發(fā)表于 2024-5-14 22:51 | 只看該作者
我能點亮的是單片機本體,算不算單片機點燈大師,
回復(fù)

使用道具 舉報

12#
ID:61997 發(fā)表于 2024-5-19 21:54 | 只看該作者
這是STC最基礎(chǔ)的單片機么
回復(fù)

使用道具 舉報

13#
ID:1123146 發(fā)表于 2024-5-31 15:09 | 只看該作者
之前做的led循環(huán),用的是while(1)循環(huán),led流水燈的實驗,你的這篇文章確實給我很大啟發(fā)
回復(fù)

使用道具 舉報

14#
ID:1123631 發(fā)表于 2024-6-4 00:42 | 只看該作者
對新人非常友好
回復(fù)

使用道具 舉報

15#
ID:1126717 發(fā)表于 2024-6-24 11:51 | 只看該作者
學習了,摸索中,
回復(fù)

使用道具 舉報

16#
ID:1127864 發(fā)表于 2024-7-2 10:27 | 只看該作者
學習了,感謝
回復(fù)

使用道具 舉報

17#
ID:1131387 發(fā)表于 2024-9-4 19:41 | 只看該作者
你們有沒有買開發(fā)板呢?
回復(fù)

使用道具 舉報

18#
ID:1126656 發(fā)表于 2024-9-22 17:56 | 只看該作者
萬千的程序,目的只有一個,點燈,第一步,哪種最簡潔,最容易掌握和理解就是最好的
回復(fù)

使用道具 舉報

19#
ID:1126656 發(fā)表于 2024-9-22 17:57 | 只看該作者
發(fā)表于 2024-9-4 19:41
你們有沒有買開發(fā)板呢?

我買了,能直觀一些吧
回復(fù)

使用道具 舉報

20#
ID:1132706 發(fā)表于 2024-9-28 10:57 | 只看該作者
相當?shù)牟诲e!
回復(fù)

使用道具 舉報

21#
ID:1134561 發(fā)表于 2024-10-24 13:43 | 只看該作者

初學應(yīng)該學STC8H8K64U
回復(fù)

使用道具 舉報

22#
ID:1135137 發(fā)表于 2024-10-31 12:32 | 只看該作者
非常棒的文章,解決了我的問題
回復(fù)

使用道具 舉報

23#
ID:1135214 發(fā)表于 2024-11-1 23:10 | 只看該作者
對初學者有一點幫助
回復(fù)

使用道具 舉報

24#
ID:1004615 發(fā)表于 2024-11-23 03:31 | 只看該作者
Graves 發(fā)表于 2024-2-23 18:26
這種沒有while循環(huán)的結(jié)束main后不知MCU處在什么狀態(tài)?運行的什么語句呢?

同問~~~~~~~~~~~
回復(fù)

使用道具 舉報

25#
ID:390416 發(fā)表于 2024-12-4 13:59 | 只看該作者
發(fā)表于 2024-4-8 19:03
請問一下初學單片機應(yīng)該如何入手?

去B站 直接搜索《人人學會單片機》,直接看這套課程學習就行了,PCB已經(jīng)開源,你可以自己做WQX開發(fā)板。千萬不要花冤枉錢去買那些老掉牙的開發(fā)板。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表