找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)講義6:#define與typedef 軟件延時(shí)If For語句 按鍵講解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:250285 發(fā)表于 2017-11-19 01:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
第六講 實(shí)驗(yàn)5實(shí)驗(yàn)8
知識(shí)點(diǎn):
1、 學(xué)會(huì)畫程序流程圖
2、 流程控制語句 if(){}else{}用法
3、 操作符 ”~ ”、“!”、“&&”含義
4、 帶參函數(shù)
5、 函數(shù)調(diào)用
6、 理解宏定義 #define “替換”作用
7、 循環(huán)語句 for 的用法
8、 庫函數(shù) unsigned char_cror_ (unsigned char, unsigned char);
unsigned char _crol_ (unsignedchar, unsigned char);含義
9、 C51 擴(kuò)展類型 code含義
10、   流程控制語句:switchcase 用法
11、   數(shù)組定義、引用方式
12、   延時(shí)函數(shù)


一、51單片機(jī)軟件延時(shí):
1、 幾種周期介紹
  周期名稱
  
  描述
  
  時(shí)間
  
  振蕩
  
  機(jī)時(shí)號(hào)
  的振蕩源的周期
  
  T=1/f
  
  狀態(tài)
  
  經(jīng)
  
  
  2T
  
  機(jī)器
  
  CPU 可以完成一個(gè)獨(dú)立操
  作所需要的周期
  
  12T
  
  指令
  
  指 CPU 完成一條操作所需
  的全部時(shí)間
  
  n*12T
  


2、指令:
1、MUL、DIV:僅有的 4 周期指令
2、包含 DPTR 和 PC 的指令均為 2 周期指令
3、所有的絕對(duì)跳轉(zhuǎn)和條件轉(zhuǎn)移指令,均為 2 周期指令
4、所有包括 A 寄存器的指令,均為單周期指令
5、位操作指令中,ANL 和 ORL 是 2 周期指令
6、所有包含立即地址的指令,除 INC direct 及 DEC direct 外,均為 2 周期指令
7、剩下的均為單周期指令。如:
voiddelay(uint z)
{
uinti ,j;
for(i = z; i> 0;i--)


for(j =0; j < 921; j++)
}


分析:
1.先計(jì)算你單片機(jī)的振蕩(時(shí)鐘)周期 T=1/晶振(11.0592MHZ)
2.一次 i--操作為 12T
3.忽略變量定義,上述延時(shí)函數(shù)共需時(shí)間:921*z*12T
4.帶入 T:921*12*T*z 約為 z us
3、計(jì)算誤差出現(xiàn)的原因:
1.軟件仿真時(shí),函數(shù)調(diào)用的時(shí)候入棧出棧操作的耗時(shí)。
2.指令周期隨指令的不同而不同導(dǎo)致的誤差。
3.中斷的影響。
4.變量的范圍超過,從而與預(yù)計(jì)時(shí)間不一樣。


while(i--):如果 i 為 char 型,執(zhí)行一次大概為 5us 左右;如果 i 為 int 型則執(zhí)行一次大概為 10us 左右。注意:軟件延時(shí)通常用于時(shí)序要求較高的編程中,其它需延時(shí)較長的地方必須采用單片機(jī)內(nèi)部定時(shí)器。

二、#define與 typedef 區(qū)別
1、typedef 的用法

在 C 語言中,typedef 常用來定義一個(gè)標(biāo)識(shí)符及關(guān)鍵字的別名,它是語言編譯過程的一部分, 但它并不實(shí)際分配內(nèi)存空間,
如:typedef    int       INT;

2、#define 的用法
#define 為一宏定義語句,通常用它來定義常量(包括無參量與帶參量),以及用來實(shí)現(xiàn)那些 “表面似和善、背后一長串”的宏,它本身并不在編譯過程中進(jìn)行,而是在這之前(預(yù)處理過程)就已經(jīng)完成了,但也因此難以發(fā)現(xiàn)潛在的錯(cuò)誤及其它代碼維護(hù)問題,如:

#define   INT    int
#define   TRUE   1
#define   Add(a,b)     ((a)+(b));
#define   Loop_10    for (inti=0; i<10; i++)

3、typedef 與#define 的區(qū)別
從以上的概念便也能基本清楚,typedef 只是為了增加可讀性而為標(biāo)識(shí)符另起的新名稱(僅僅只是個(gè)別名),而#define原本在 C 中是為了定義常量,到了 C++,const、enum、 inline 的出現(xiàn)使它也漸漸成為了起別名的工具。有時(shí)很容易搞不清楚與 typedef 兩者到 底該用哪個(gè)好,如#define INT int 這樣的語句,用 typedef 一樣可以完成,用哪個(gè)好 呢?我主張用 typedef,因?yàn)樵谠缙诘脑S多 C 編譯器中這條語句是非法的,只是現(xiàn)今的 編譯器又做了擴(kuò)充。

為了盡可能地兼容,一般都遵循#define 定義“可讀”的常量以及一些宏語句的任務(wù), 而 typedef 則常用來定義關(guān)鍵字、冗長的類型的別名。

宏定義只是簡單的字符串代換(原地?cái)U(kuò)展),而 typedef 則不是原地?cái)U(kuò)展,它的新名字具 有一定的封裝性,以致于新命名的標(biāo)識(shí)符具有更易定義變量的功能。請(qǐng)看上面第一大點(diǎn) 代碼的第三行:typedef    (int*)  pINT;以及下面這行:#define               pINT2 int*效果相同?實(shí)則不同!實(shí)踐中見差別:pINT a,b;的效果同 int *a;int *b;表示定 義了兩個(gè)整型指針變量。而 pINT2 a,b;的效果同 int*a, b;表示定義了一個(gè)整型指針 變量 a 和整型變量 b。

typedef 的四個(gè)用途和兩個(gè)陷阱
用途一: 定義一種類型的別名,而不只是簡單的宏替換
用途二: 用在舊的 C 代碼中(具體多舊沒有查),幫助 struct。

typedef   struct   tagPOINT
{
int   x;
int   y;
}POINT;

POINT   p1;   //   這樣就比原來的方式少寫了一個(gè) struct,比較省事,尤其在大量 使用的時(shí)候 或許,在 C++中,typedef 的這種用途二不是很大,但是理解了它,對(duì)掌握 以前的舊代碼還是有幫助的,畢竟我們?cè)陧?xiàng)目中有可能會(huì)遇到較早些年代遺留下來的代 碼。

用途三: 用 typedef 來定義與平臺(tái)無關(guān)的類型。用途四:為復(fù)雜的聲明定義一個(gè)新的簡單的別名。

陷阱一: 記住,typedef 是定義了一種類型的新別名,不同于宏,它不是簡單的字符串替換。字符串替換就行。



陷阱二: typedef 在語法上是一個(gè)存儲(chǔ)類的關(guān)鍵字(如 auto、extern、mutable、static、 register 等一樣),雖然它并不真正影響對(duì)象的存儲(chǔ)特性,如: typedef   static   intINT2;  //不可行 編譯將失敗,會(huì)提示“指定了一個(gè)以上的存儲(chǔ)類”。



三、按鍵:
按鍵是單片機(jī)系統(tǒng)中最常用的器件。各種儀器儀表、家用電器操作面板上都離不開按鍵,是最基本的輸入部件。因此,掌握按鍵輸入電路設(shè)計(jì)、按鍵驅(qū)動(dòng)程序設(shè)計(jì)是十分必要的。按鍵的分類:從單片機(jī)獲取按鍵信號(hào)類型的角度來講,可以分為模擬按鍵和數(shù)字按鍵;從按鍵與單片機(jī)IO 端口對(duì)應(yīng)關(guān)系上來講,可以分為獨(dú)立按鍵和矩陣式按鍵。獨(dú)立按鍵很簡單,就是一個(gè)按鍵對(duì)應(yīng)一個(gè) IO 端口;而矩陣式按鍵則相對(duì)復(fù)雜一些,通過行與列的交叉組合成 i 行*j 列個(gè) 按鍵。

按鍵的有效方式:
按下有效、按下松開(抬起)有效、長按 n 秒有效、連按 n 次有效、組合按鍵有效等。按鍵驅(qū)動(dòng)程序設(shè)計(jì)步驟:
讀取鍵值—按鍵消抖—鍵值處理


四、cror 與 crol 的區(qū)別
循環(huán)右移與循環(huán)左移



這是以前給小學(xué)生培訓(xùn)單片機(jī)做的一套講義,盡可能的做到了通俗易懂,現(xiàn)分享給大家,絕對(duì)的純?cè)瓌?chuàng)資料.
全部資料下載地址(共15章,pdf格式):http://www.torrancerestoration.com/bbs/dpj-98524-1.html




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

使用道具 舉報(bào)

板凳
ID:8222 發(fā)表于 2021-12-13 10:27 | 只看該作者
謝謝樓主詳細(xì)解釋。
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:635120 發(fā)表于 2019-11-12 20:47 來自手機(jī) | 只看該作者
謝謝         
回復(fù)

使用道具 舉報(bào)

樓主
ID:610271 發(fā)表于 2019-9-11 08:15 | 只看該作者
謝謝樓主
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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