|
雖然學(xué)習(xí)這一門(mén)新的語(yǔ)言充滿種種困難,但是只有困難的東西才值得去學(xué)習(xí),去突破,由學(xué)習(xí)知識(shí)到熱愛(ài)知識(shí)再到使用知識(shí),掌握一門(mén)有區(qū)分度的知識(shí)這才是以后工作的堅(jiān)實(shí)后盾,加油!
第一部分基礎(chǔ)知識(shí)
1單片機(jī)定義
2單片機(jī)結(jié)構(gòu)
3基本的關(guān)系與計(jì)算
4基本數(shù)據(jù)類型
5基本語(yǔ)句
必會(huì)知識(shí)點(diǎn):
1掌握單片機(jī)最小系統(tǒng)運(yùn)作的必要條件(電源 晶振 復(fù)位電路)
2掌握對(duì)單片機(jī)I/O接口的操作(輸出控制電平高低 輸入檢測(cè)電平高低)
3定時(shí)器 (重點(diǎn)掌握最常用方式2)
4中斷 (掌握外部中斷,定時(shí)中斷,串口中斷)
5串口通信(掌握單片機(jī)之間的通信,單片機(jī)與計(jì)算機(jī)之間的通信)
第一部分——基礎(chǔ)
1單片機(jī)定義:?jiǎn)纹瑱C(jī)就是在一片硅片上集成微處理器,存儲(chǔ)器及各種輸入輸出端口芯片,這塊芯片具有計(jì)算機(jī)的屬性所以被稱為單片微型計(jì)算機(jī),簡(jiǎn)稱單片機(jī)。
解釋:通俗地講就是一塊集成芯片,但這個(gè)集成芯片有特殊功能,這些功能的實(shí)現(xiàn)是靠使用者自己來(lái)編程控制各個(gè)引腳在不同時(shí)候輸出不同電平,進(jìn)而控制外圍電路電氣狀態(tài)。
2各類有代表性的51芯片
公司
| 產(chǎn)品
| AT(Atmel)
| AT89C51 AT89C52
| Intel(英特爾)
| i87C54 i87C58
| STC
| STC89C51RC STC89C52RC
| 芯片標(biāo)號(hào)解釋:STC89C51RC 40C-PDIP 0707CU813.00D
STC——表示STC公司的產(chǎn)品
8——表示該芯片為8051內(nèi)核芯片
9——內(nèi)部含有flash 存儲(chǔ)器 0表示內(nèi)部含有Mask ROM存儲(chǔ)器 7表示內(nèi)含有紫外線可擦除存儲(chǔ)器
C——表示該器件為CMOS 產(chǎn)品 LV和LE表示該芯片為低壓產(chǎn)品 S表示含有可串行下載flash存儲(chǔ)器
5——固定不變
1——表示該芯片內(nèi)部程序存儲(chǔ)空間大小1位4KB,2為8KB,程序存儲(chǔ)空間(ROM)=n乘4KB
RC——內(nèi)部隨機(jī)讀寫(xiě)存儲(chǔ)器(RAM)為512B RD+表示內(nèi)部RAM為1280B
40——芯片外最高接入40MHZ晶振 AT單片機(jī)一般是24
C——產(chǎn)片級(jí)別 C表示商業(yè)級(jí),溫度范圍0-70 I表示工業(yè)級(jí),溫度范圍-40-85
A表示汽車用產(chǎn)品 溫度范圍-40-125 M 軍用產(chǎn)品 溫度范圍-55-150
PDIP——雙列直插式封裝 PLCC 塑料封裝 QFP,PFP塑料扁平式封裝 PGA 插針網(wǎng)絡(luò)陣列封裝 BGA 球柵陣列封裝
單片機(jī)應(yīng)用:
智能儀表:數(shù)字示波器 數(shù)字萬(wàn)用表 通信:手機(jī) 小靈通
武器裝備:飛機(jī) 軍艦 坦克 魚(yú)雷制導(dǎo)
單片機(jī)學(xué)習(xí)方法:
1首先51單片機(jī)作為入門(mén)芯片,適合初學(xué)者學(xué)。
2只用軟件仿真是學(xué)不會(huì)單片機(jī)的,要把硬件擺在面前(開(kāi)發(fā)板)親自操作,體會(huì)。
3不能只看書(shū),也不能不看書(shū),需要大致了解單片機(jī)各個(gè)引腳功能,了解寄存器。
4實(shí)踐最重要,自己買一塊單片機(jī)開(kāi)發(fā)板只需要有流水燈,數(shù)碼管,鍵盤(pán)(獨(dú)立,矩陣),A\D,D\A轉(zhuǎn)換,液晶,I2R總線,USB擴(kuò)展就夠了
單片機(jī)有40個(gè)引腳,按照功能可以分為三類:
電源及時(shí)鐘引腳:VCC GND XTAL1 XTAL2(必會(huì))
I/O口引腳: P1 P2 P3 四組8位I/O接口(必會(huì))
編程控制引腳:RST PSEN ALE\PROG EA/VPP(了解)
XTAL1 片內(nèi)振蕩電路輸入端,XTAL2 片內(nèi)振蕩電路輸出端
8051芯片時(shí)鐘振蕩有兩種方式:
1片內(nèi)振蕩 兩個(gè)引腳接石英晶體振蕩器和電容(10PF-30PF)
2外部時(shí)鐘 外部時(shí)鐘信號(hào)從XTAL2進(jìn) XTAL1 接地
I/O口引腳——P0口 P1口 P2口 P3口
P0口(39腳-32腳)
| 每個(gè)口可獨(dú)立控制,無(wú)內(nèi)置上拉電阻,使用時(shí)需要外接
| P1口(1腳-8腳)
| 每個(gè)口可獨(dú)立控制, 內(nèi)置上拉電阻 ,使用時(shí)需要進(jìn)行寫(xiě)1操作
| P2口(21腳-28腳)
| 同P0口
| P3口(10腳-17腳
| 同P1口
| P3引腳第二功能定義
標(biāo)號(hào) | 引腳 | 第二功能
| 說(shuō)明
| P3.0 | 10 | RXD
| 串行輸入
| P3.1 | 11 | TXD
| 串行輸出
| P3.2 | 12 | TNT0\
| 外部中斷0
| P3.3 | 13 | TNT1\
| 外部中斷1
| P3.4 | 14 | T0
| 定時(shí)器/計(jì)數(shù)器0外部輸入端
| P3.5 | 15 | T1
| 定時(shí)器/計(jì)數(shù)器1外部輸入端
|
電平特性
數(shù)字電路只有兩種電平高電平1和低電平0
TTL型集成:+5V為1 0V為0
CMOS型集成:VCC可達(dá)12V,高電平為0.9VCC 低電平為0.1VCC
二進(jìn)制和十六進(jìn)制
十進(jìn)制 | 二進(jìn)制 | 十六進(jìn)制 | 十進(jìn)制 | 二進(jìn)制 | 十六進(jìn)制 | 0 | 0 | 0 | 8 | 1000 | 8 | 1 | 1 | 1 | 9 | 1001 | 9 | 2 | 10 | 2 | 10 | 1010 | A | 3 | 11 | 3 | 11 | 1011 | B | 4 | 100 | 4 | 12 | 1100 | C | 5 | 101 | 5 | 13 | 1101 | D | 6 | 110 | 6 | 14 | 1110 | E | 7 | 111 | 7 | 15 | 1111 | F | 二進(jìn)制邏輯運(yùn)算
與
必須都有,否則就沒(méi)有 C語(yǔ)言中的符號(hào) & 運(yùn)算規(guī)則:0&0=0&1=1&0=0 1&1=1
或
只要其中之一有就有 C語(yǔ)言中的符號(hào) | 運(yùn)算規(guī)則: 0|1=1|0=1|1=1 0|0=0
非
求反運(yùn)算 C語(yǔ)言中的符號(hào) ! 運(yùn)算規(guī)則: !1=0 !0=1
C51中的基本數(shù)據(jù)類型
作用:設(shè)定變量前要聲明這個(gè)變量類型,好讓單片機(jī)分配合適的存儲(chǔ)空間
數(shù)據(jù)類型 | 關(guān)鍵字 | 所占位數(shù) | 表示數(shù)范圍 | 無(wú)符號(hào)字符型 | unsigned char | 8 | 0-255 | 有符號(hào)字符型 | char | 8 | -128-127 | 無(wú)符號(hào)整型 | unsigned int | 16 | 0-65535 | 有符號(hào)整型 | int | 16 | -32768-32767 | 無(wú)符號(hào)長(zhǎng)整型 | Unsigned long | 32 |
| 無(wú)符號(hào)長(zhǎng)整型 | long | 32 |
| 單精度實(shí)型 | float | 32 |
| 雙精度實(shí)型 | double | 64 |
| 位類型 | bit | 1 | 0-1 |
二進(jìn)制兩個(gè)數(shù)每個(gè)數(shù)所占空間就是1位(b)位也是單片機(jī)存儲(chǔ)器最小的單位 字節(jié)B(1B=8b)
float和double區(qū)別:float只能提供7位有效數(shù)字,double可以提供6位有效數(shù)字。
數(shù)據(jù)類型擴(kuò)充定義:
背景:當(dāng)我們需要在程序中操作這些特殊功能寄存器時(shí),必須在程序最前面將這些名稱加以聲明,就是把寄存器器地址編碼賦給這個(gè)名稱,這樣編譯器才認(rèn)識(shí)。
sbit ——特殊功能位聲明,聲明某個(gè)特殊寄存器的某一位
C51中的運(yùn)算符
分為算術(shù)運(yùn)算符 邏輯運(yùn)算符 位運(yùn)算符
算術(shù)運(yùn)算符 | 邏輯運(yùn)算符 | 位運(yùn)算符 | 算術(shù)運(yùn)算符 | 含義 | 邏輯運(yùn)算符 | 含義 | 位運(yùn)算符 | 含義 | + | 加 | > | 大于 | & | 邏輯與 | - | 減 | < | 小于 | ! | 邏輯或 | * | 乘 | >= | 大于等于 | ^ | 異或 | / | 除 | <= | 小于等于 | ~ | 取反 | ++ | 自加 | == | 測(cè)試相等 | >> | 左移 | -- | 自減 | != | 測(cè)試不等 | << | 右移 | % | 求余 | & & | 按位與 |
|
|
|
| || | 按位或 |
|
|
|
| ! | 非 |
|
| C51中的基礎(chǔ)語(yǔ)句
語(yǔ)句 | 類型 | If | 選擇語(yǔ)句 | while | 循環(huán)語(yǔ)句 | for | 循環(huán)語(yǔ)句 | switch/case | 多分支選擇語(yǔ)句 | do-while | 循環(huán)語(yǔ)句 | for 語(yǔ)句
格式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{語(yǔ)句(可以為空)}
執(zhí)行過(guò)程:
1求解第一次表達(dá)式1
2求解表達(dá)式2,若為真則執(zhí)行for中的語(yǔ)句,然后執(zhí)行第3步,否則結(jié)束for語(yǔ)句,直接跳出,不執(zhí)行第3步
3第三步:求解表達(dá)式3
第4步:跳到第2步重復(fù)執(zhí)行
delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--); //延時(shí)xms秒
}
while()語(yǔ)句
格式:while(表達(dá)式)
{內(nèi)部語(yǔ)句(內(nèi)容可為空)}
特點(diǎn):先判斷表達(dá)式,后執(zhí)行語(yǔ)句
原則:若表達(dá)式不為0即為真,執(zhí)行語(yǔ)句,否則跳出while循環(huán),執(zhí)行后面語(yǔ)句
應(yīng)用:1讓程序停止 while(1);
2不停地執(zhí)行某段程序
while(1)
{
P0=0xfe;
}
If語(yǔ)句
格式:if(表達(dá)式)
{內(nèi)部語(yǔ)句}
特點(diǎn):如果條件表達(dá)式為真(非0值),就執(zhí)行后面的語(yǔ)句;如果條件表達(dá)式為假(0值),就不執(zhí)行后面的語(yǔ)句
解釋:使用條件語(yǔ)句if可以構(gòu)成分支結(jié)構(gòu),它通過(guò)用戶給定的條件進(jìn)行判斷,根據(jù)判斷的結(jié)果決定執(zhí)行不同的分支程序
if(key1=0) //如果key=1(按下S2鍵)
{
delayms(10); //延時(shí)去抖
if(key1=0); //再次檢測(cè)按鍵是否按下,如果按下
{
num++; //數(shù)字自加1
if(num=60) //如果數(shù)字與60測(cè)試相等
num=0; //則回到0
while(!key1); //等待按鍵釋放
}
}
switch-case語(yǔ)句
背景;if語(yǔ)句一般用來(lái)處理兩個(gè)分支,處理多個(gè)分支需要用if—else—if結(jié)構(gòu),但若分支較多,就要用switch語(yǔ)句,又稱開(kāi)關(guān)語(yǔ)句,switch語(yǔ)句可以直接處理多個(gè)分支
格式:
switch(表達(dá)式)
{
case常量表達(dá)式1:(注意這里是“:”) 執(zhí)行過(guò)程:
語(yǔ)句1; 首先計(jì)算switch后面表達(dá)式的值
break; 用此值一次與各個(gè)case后常量表達(dá)式比較
case常量表達(dá)式2: 如果此值與某個(gè)case后面常量表達(dá)式值相等就執(zhí)行此case后語(yǔ)句
語(yǔ)句2; 當(dāng)執(zhí)行遇到break語(yǔ)句就退出switch語(yǔ)句
break; 若表達(dá)式值與所有case后面表達(dá)式都不相等則執(zhí)行default后語(yǔ)句并退出
......
case常量表達(dá)式n:
語(yǔ)句n;
break;
default:
語(yǔ)句n+1;
break;
}
應(yīng)用:根據(jù)輸入考試成績(jī)的等級(jí),輸出百分制分?jǐn)?shù)段
switch(grade)
{
case‘A’:
printf(“85-100\n”)
break;
case‘B’:
printf(“70-84\n”);
break;
case‘C’:
printf(“60-69\n”);
break;
case‘D’:
printf(“<60\n”);
break;
default:
printf(“error!\n”);
}
|
評(píng)分
-
查看全部評(píng)分
|