国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

第8章 函數進階與按鍵(8.1 8.2)

137933yu ? 來源:137933yu ? 作者:137933yu ? 2025-12-18 11:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

用戶與單片機之間的信息交互需要依賴于兩類設備:輸入設備和輸出設備。前邊講的LED小燈、數碼管、點陣都是輸出設備,本章就來學習一下最常用的輸入設備——按鍵,同時還會學到一些硬件電路的基礎知識與C語言函數的一些進階知識。
8.1單片機最小系統解析
8.1.1電源
學習過程中,很多指標都是直接用的概念指標,比如說+5V代表1,GND代表0等等。但在實際電路中的電壓值并不是完全精準的,那這些指標允許范圍是什么呢?隨著學習的內容不斷增多,大家要慢慢培養一種閱讀數據手冊的能力。
比如,使用STC89C52RC單片機的時候,找到它的數據手冊第11頁,看第二項——工作電壓:5.5V~3.4V(5V單片機),此處就說明這個單片機正常的工作電壓是個范圍值,只要電源VCC在5.5V~3.4V之間都可以正常工作,電壓超過5.5V是絕對不允許的,會燒壞單片機,電壓如果低于3.4V,單片機不會損壞,但是也不能正常工作。而在這個范圍內,最典型、最常用的電壓值就是5V,這就是后面括號里“5V單片機”這個名稱的由來。除此之外,還有一種常用的工作電壓范圍是2.7V~3.6V、典型值是3.3V的單片機,也就是所謂的“3.3V單片機”。日后隨著大家接觸更多的器件,對這點會有更深刻的理解。
打開74HC138的數據手冊,會發現74HC138手冊的第二頁也有一個表格,上邊寫了74HC138的工作電壓范圍,最小值是4.75V,額定值是5V,最大值是5.25V,可以得知它的工作電壓范圍是4.75V~5.25V。獲取器件工作參數的一個最重要、也是最權威的途徑,就是查閱該器件的數據手冊。
8.1.2晶振
晶振通常分為無源晶振和有源晶振兩種類型,無源晶振一般稱之為crystal(晶體),而有源晶振則叫做oscillator(振蕩器)。
有源晶振是一個完整的諧振振蕩器,它是利用石英晶體的壓電效應來起振,所以有源晶振需要供電,當把有源晶振電路做好后,不需要外接其它器件,只要給它供電,它就可以主動產生振蕩頻率,并且可以提供高精度的頻率基準,信號質量也比無源信號要好。
無源晶振自身無法振蕩起來,它需要芯片內部的振蕩電路一起工作才能振蕩,它允許不同的電壓,但是信號質量和精度較有源晶振差一些。相對價格來說,無源晶振要比有源晶振價格便宜很多。無源晶振兩側通常都會有個電容,一般其容值都選在10pF~40pF之間,如果手冊中有具體電容大小的要求則要根據要求來選電容,如果手冊沒有要求,用20pF就是比較好的選擇,這是一個長久以來的經驗值,具有極其普遍的適用性。
來認識下比較常用的兩種晶振的樣貌,如圖8-1和圖8-2所示。

wKgZPGlDdBuAEm6sAAF2sN_iaAk633.png圖8-1 ?有源晶振實物圖

wKgZO2lDdCKAYLCWAAEwWQsPX6Y254.png圖8-2 ?無源晶振實物圖


有源晶振通常有4個引腳,VCC,GND,晶振輸出引腳和一個沒有用到的懸空引腳(有些晶振也把該引腳作為使能引腳)。無源晶振有2個或3個引腳,如果是3個引腳的話,中間引腳接是晶振的外殼,使用時要接到GND,兩側的引腳就是晶體的2個引出腳了,這兩個引腳作用是等同的,就像是電阻的2個引腳一樣,沒有正負之分。對于無源晶振,單片機上的兩個晶振引腳接上去即可;而有源晶振,只接到單片機的晶振的輸入引腳上,輸出引腳上不需要接,如圖8-3和圖8-4所示。

wKgZO2lDdE6AXOtdAAA0ionKO-s893.png圖8-3 ?無源晶振接法wKgZPGlDdFWAPaoHAAA3TWvN9sg343.png圖8-4 ?有源晶振接法


8.1.3復位電路
分析一下Kingst51開發板上的復位電路,如圖8-5所示。

wKgZPGlDdH6AYMhuAAA0P7NfXAo802.png圖8-5 ?單片機復位電路


當這個電路處于穩態時,電容起到隔離直流的作用,隔離了+5V,而左側的復位按鍵是彈起狀態,下方電路就沒有電壓差的產生,所以按鍵和電容C11以下部分的電位都是和GND相等的,即0V。單片機是高電平復位,低電平正常工作,正常工作的電壓是0V。
從沒有電到上電的瞬間,電容C11上方電壓是5V,下方是0V,根據初中所學的知識,電容C11要進行充電,正離子從上往下充電,負電子從GND往上充電,這個時候電容對電路來說相當于一根導線,全部電壓都加在了R31這個電阻上,那么RST端口位置的電壓就是5V,隨著電容充電越來越多,即將充滿的時候,電流會越來越小,那RST端口上的電壓值等于電流乘以R31的阻值,也就會越來越小,一直到電容完全充滿后,線路上不再有電流,這個時候RST和GND的電位就相等了也就是0V了。
8.2函數的調用
在一個程序的編寫過程中,隨著代碼量的增加,如果把所有的語句都寫到main函數中,一方面程序會顯得的比較亂;另一方面,當同一個功能需要在不同地方執行時,就得再重復寫一遍相同的語句。此時,如果把一些零碎的功能單獨寫成一個函數,在需要它們時只需進行一些簡單的函數調用,這樣既有助于程序結構的清晰條理,又可以避免大塊的代碼重復。
在實際工程項目中,一個程序通常都是由很多個子程序模塊組成的,一個模塊實現一個特定的功能,在C語言中,這個模塊就用函數來表示。一個C程序一般由一個主函數和若干個其他函數構成。主函數可以調用其它函數,其它函數也可以相互調用,但其它函數不能調用主函數。在51單片機程序中,還有中斷服務函數,是當相應的中斷到來后自動調用的,不需要也不能由其它函數來調用。
函數調用的一般形式是:
函數名 (實參列表)
函數名就是需要調用的函數名稱,實參列表是根據實際需求調用函數要傳遞給被調用函數的參數列表,不需要傳遞參數時只保留括號,傳遞多個參數時參數之間要用逗號隔開。
那么先舉例看一下函數調用使程序結構更加條理清晰方面的作用?;仡櫼幌聢D6-1所示的程序流程圖和為實現它而編寫的程序代碼,相對來說這個主函數的結構就比較復雜了,很難一眼看清楚它的執行流程。那么如果把其中最重要的兩件事——秒計數和數碼管動態掃描功能都用單獨的函數來實現會怎樣呢?來看以下程序。
#include

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code LedChar[] = { //數碼管顯示字符轉換表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { //數碼管顯示緩沖區,初值0xFF確保啟動時都不亮
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

void SecondCount();
void LedRefresh();

void main()
{
ENLED = 0; //使能U3,選擇控制數碼管
ADDR3 = 1; //因為需要動態改變ADDR0-2的值,所以不需要再初始化了
TMOD = 0x01; //設置T0為模式1
TH0 = 0xFC; //為T0賦初值0xFC67,定時1ms
TL0 = 0x67;
TR0 = 1; //啟動T0

while (1)
{
if (TF0 == 1) //判斷T0是否溢出
{
TF0 = 0; //T0溢出后,清零中斷標志
TH0 = 0xFC; //并重新賦初值
TL0 = 0x67;
SecondCount(); //調用秒計數函數
LedRefresh(); //調用顯示刷新函數
}
}
}
/* 秒計數函數,每秒進行一次秒數+1,并轉換為數碼管顯示字符 */
void SecondCount()
{
static unsigned int cnt = 0; //記錄T0中斷次數
static unsigned long sec = 0; //記錄經過的秒數

cnt++; //計數值自加1
if (cnt >= 1000) //判斷T0溢出是否達到1000次
{
cnt = 0; //達到1000次后計數值清零
sec++; //秒計數自加1
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
}
/* 數碼管動態掃描刷新函數 */
void LedRefresh()
{
static unsigned char i = 0; //動態掃描的索引

switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;
default: break;
}
}
看一下,主函數的結構是不是清晰的多了——每隔1ms就去干兩件事,至于這兩件事是什么交由各自的函數去實現。還請大家注意一點:原來程序中的i、cnt、sec這三個變量在放到單獨的函數中后,都加了static關鍵字而變成了靜態變量。
當然,這里刻意把程序功能做了這樣的劃分,主要目的還是來講解函數的調用,對于這個程序即使不劃分函數也復雜不到哪里去,但繼續學下去就能領會到劃分功能函數的必要了?,F在還是把注意力放在學習函數調用上,有以下幾點需要注意:
1、函數調用的時候,不需要加函數類型。在主函數內調用SecondCount()和LedRefresh()時都沒有加void。
2、調用函數與被調用函數的位置關系,C語言規定:函數在被調用之前,必須先被定義或聲明。意思就是說:在一個文件中,一個函數應該先定義,然后才能被調用,也就是調用函數應位于被調用函數的下方。但是作為一種通常的編程規范,推薦main函數寫在最前面(因為它起到提綱挈領的作用),其后再定義各個功能函數,而中斷函數則寫在最后。那么主函數要調用定義在它之后的函數怎么辦呢?就在文件開頭,所有函數定義之前,開辟一塊區域,叫做函數聲明區,用來把被調用的函數聲明一下,該函數就可以被隨意調用了。如上述例程所示。
3、函數聲明的時候必須加函數類型,函數的形式參數,最后加上一個分號表示結束。函數聲明行與函數定義行的唯一區別就是最后的分號,其它的都必須保持一致。這點請尤其注意,初學者很容易因粗心大意而搞錯分號或是修改了定義行中的形參卻忘了修改聲明行中的形參,導致程序編譯不過。


審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 無源晶振
    +關注

    關注

    1

    文章

    888

    瀏覽量

    17850
  • 晶振
    +關注

    關注

    35

    文章

    3560

    瀏覽量

    73435
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【「Linux 設備驅動開發( 2 版)」閱讀體驗】+讀內核處理的核心輔助函數

    “處理內核的核心輔助函數”進行學習。 3又是以5個主題展開討論學習,①、Linux內核加鎖機制和共享資源;②、處理內核等待、睡眠和延遲機制;③、深入理解Linux內核時間管理;④、實現工作延遲機制
    發表于 01-10 22:08

    7 變量進階與點陣LED(7.3 7.4)

    習LED點陣就要輕松得多了。一個數碼管是8個LED組成,同理,一個8*8的點陣就是由64個LED小燈組成。圖7-1就是一個點陣LED最小單元,即一個8*
    的頭像 發表于 12-11 14:56 ?666次閱讀
    <b class='flag-5'>第</b>7<b class='flag-5'>章</b> 變量<b class='flag-5'>進階</b>與點陣LED(7.3 7.4)

    7 變量進階與點陣LED(7.1 7.2)

    走在馬路上的時候,經常會看到馬路兩側有一些LED點陣的廣告牌,這些廣告牌看起來絢爛奪目,非常吸引人,而且還會變化很多種不同的顯示方式。本章就會學習到點陣LED的控制方式,同時也會學習C語言變量的進階
    的頭像 發表于 12-10 16:25 ?353次閱讀

    如何進行按鍵檢測

    KEY_T,讓每個按鍵對應1個全局的結構體變量。 typedef struct { /* 下面是一個函數指針,指向判斷按鍵手否按下的函數 */ uint
    發表于 12-10 06:03

    【迅為工業RK3568穩定可靠】itop-3568開發板驅動開發4驅動模塊傳參實驗

    【迅為工業RK3568穩定可靠】itop-3568開發板驅動開發4驅動模塊傳參實驗
    的頭像 發表于 11-06 14:25 ?372次閱讀
    【迅為工業RK3568穩定可靠】itop-3568開發板驅動開發<b class='flag-5'>第</b>4<b class='flag-5'>章</b>驅動模塊傳參實驗

    嵌入式從入門到進階,怎么學?

    ); 驅動開發字符設備驅動(LED 驅動)、設備樹(描述硬件)、GPIO 控制(按鍵中斷驅動); 實踐寫一個 控制 LED 的驅動模塊,實現用戶態控制; 內核進階內核裁剪(瘦身系統)、內存管理
    發表于 09-02 09:44

    Key_Scan按鍵掃描函數詳解

    按鍵程序設計思路可以非常簡單:想要知道某個按鍵是否被按下,只需檢測連接到改按鍵的IO引腳是高電平還是低電平,若是低電平,說明按鍵正處于被按下的狀態。
    的頭像 發表于 08-04 14:01 ?1942次閱讀

    現代集成電路半導體器件

    ——按比例縮小、漏電及其他問題8?雙極型晶體管附錄A?態密度的推導附錄B?FeimiDirac分布函數的推導 附錄C?少數載流子假設的自洽性 部分習題的答案 索引 獲取完整文
    發表于 07-12 16:18

    RK3568驅動指南|第十二篇 GPIO子系統-130 GPIO的調試方法

    RK3568驅動指南|第十二篇 GPIO子系統-130 GPIO的調試方法
    的頭像 發表于 06-03 11:32 ?1287次閱讀
    RK3568驅動指南|第十二篇 GPIO子系統-<b class='flag-5'>第</b>130<b class='flag-5'>章</b> GPIO的調試方法

    RK3568驅動指南|第十二篇 GPIO子系統-135 GPIO子系統與pinctrl子系統相結合實驗

    RK3568驅動指南|第十二篇 GPIO子系統-135 GPIO子系統與pinctrl子系統相結合實驗
    的頭像 發表于 05-23 13:47 ?1015次閱讀
    RK3568驅動指南|第十二篇 GPIO子系統-<b class='flag-5'>第</b>135<b class='flag-5'>章</b> GPIO子系統與pinctrl子系統相結合實驗

    第六 GPIO輸入——按鍵檢測

    本篇文章講述了如何在W55MH32上實現按鍵輸入檢測,以及按鍵輸入檢測的注意事項、實現方式和代碼講解等。掌握了按鍵檢測方式之后,我們就可以用按鍵控制我們想要實現的其他功能啦。
    的頭像 發表于 05-22 16:41 ?975次閱讀
    第六<b class='flag-5'>章</b> GPIO輸入——<b class='flag-5'>按鍵</b>檢測

    RK3568驅動指南|驅動基礎進階篇-進階7 向系統中添加一個系統調用

    RK3568驅動指南|驅動基礎進階篇-進階7 向系統中添加一個系統調用
    的頭像 發表于 05-21 14:15 ?709次閱讀
    RK3568驅動指南|驅動基礎<b class='flag-5'>進階</b>篇-<b class='flag-5'>進階</b>7 向系統中添加一個系統調用

    單片機外圍電路設計 (2版)

    及智能傳感器的接口技術。4闡述單片機測控系統的設計。5闡述數據采集系統及新穎檢測電路的設計。6
    發表于 04-18 16:16

    【北京迅為】iTOP-RK3568開發板OpenHarmony系統南向驅動開發-4 UART基礎知識

    【北京迅為】iTOP-RK3568開發板OpenHarmony系統南向驅動開發-4 UART基礎知識
    的頭像 發表于 03-17 15:50 ?1034次閱讀
    【北京迅為】iTOP-RK3568開發板OpenHarmony系統南向驅動開發-<b class='flag-5'>第</b>4<b class='flag-5'>章</b> UART基礎知識

    【北京迅為】itop-3568 開發板openharmony鴻蒙燒寫及測試-2OpenHarmony v3.2-Beta4版本測試

    【北京迅為】itop-3568 開發板openharmony鴻蒙燒寫及測試-2OpenHarmony v3.2-Beta4版本測試
    的頭像 發表于 03-05 10:53 ?1060次閱讀
    【北京迅為】itop-3568 開發板openharmony鴻蒙燒寫及測試-<b class='flag-5'>第</b>2<b class='flag-5'>章</b>OpenHarmony v3.2-Beta4版本測試