版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
單片機(jī)全冊配套完整課件3單片機(jī)原理及應(yīng)用參考書:
單片機(jī)語言C51程序設(shè)計(jì)C程序設(shè)計(jì)課程的特點(diǎn):
以應(yīng)用為目的,實(shí)踐性強(qiáng)硬件與軟件緊密結(jié)合學(xué)習(xí)方法:課前預(yù)習(xí),課后復(fù)習(xí)理清概念,勤于實(shí)踐廣覽書刊、網(wǎng)絡(luò),立足實(shí)際應(yīng)用教材:
單片機(jī)原理及應(yīng)用(第2版)單片機(jī)原理及應(yīng)用(第1版)單片機(jī)語言
C51程序設(shè)計(jì)C程序設(shè)計(jì)參考書:
第1章緒論第2章80C51的結(jié)構(gòu)和原理第3章80C51的指令系統(tǒng)第4章80C51的程序設(shè)計(jì)第5章80C51的中斷系統(tǒng)及定時(shí)/計(jì)數(shù)器第6章80C51的串行接口第7章80C51的系統(tǒng)擴(kuò)展第8章80C51的測控接口第9章80C51的C語言程序設(shè)計(jì)第10章80C51應(yīng)用系統(tǒng)設(shè)計(jì)方法課程內(nèi)容:第1章緒論
前言
數(shù)制與編碼的簡單回顧1.1
電子計(jì)算機(jī)概述1.2
單片機(jī)發(fā)展過程及產(chǎn)品近況1.3
單片機(jī)的特點(diǎn)及應(yīng)用領(lǐng)域1.5
單片機(jī)應(yīng)用系統(tǒng)開發(fā)方法本章內(nèi)容:
前言
數(shù)制與編碼的簡單回顧前.1數(shù)制前.2編碼前.3計(jì)算機(jī)中帶符號數(shù)的表示數(shù)制:是計(jì)數(shù)的規(guī)則
(亦稱計(jì)數(shù)制)前.1
數(shù)制
十進(jìn)制:生活中最熟悉的進(jìn)位計(jì)數(shù)制。
符號:0,1,…,9
規(guī)則:逢十進(jìn)一
二進(jìn)制:計(jì)算機(jī)中采用的計(jì)數(shù)制
符號:0,1
規(guī)則:逢二進(jìn)一
特點(diǎn):便于實(shí)現(xiàn),不便記憶字節(jié):8個(gè)位MSBLSB
D7D6D5D4D3D2D1D0位號:字節(jié):
有28個(gè)值(0~255)
LSB:最低有效位,D0位
MSB:最高有效位,D7位字:2字節(jié),16位
有216個(gè)值(0~65535)
MSB:D15位
十六進(jìn)制:用于代碼和數(shù)據(jù)的縮寫
符號:0,1,…,9,A,B,…,F(xiàn)
規(guī)則:逢十六進(jìn)一
特點(diǎn):二進(jìn)制4位→十六進(jìn)制1位
為了區(qū)分?jǐn)?shù)的不同進(jìn)制,可在數(shù)的結(jié)尾以一個(gè)字母標(biāo)示。
十進(jìn)制:D(或不帶字母)
二進(jìn)制:B
十六進(jìn)制:HC中使用十六進(jìn)制以0X開頭
字符的編碼----ASCII碼
采用美國標(biāo)準(zhǔn)信息交換碼(即ASCII碼)前.2編碼例:字符“0”--30H
字符“A”--41H
字符“a”--61H
控制符CR-0DH
十進(jìn)制數(shù)的編碼----BCD碼
用二進(jìn)制表示十進(jìn)制數(shù)的代碼。
1個(gè)字節(jié)表示2位十進(jìn)制數(shù)的代碼,稱為壓縮的BCD碼。例:25的壓縮BCD碼為25H
(注意:其十六進(jìn)制值為19H)
非壓縮BCD碼:8位碼表示1位十進(jìn)制數(shù)(高4位填0)的編碼2個(gè)BCD碼的運(yùn)算可能出現(xiàn)非法碼,這時(shí)要對所得結(jié)果進(jìn)行調(diào)整。
采用壓縮的BCD碼比采用非壓縮的BCD碼節(jié)省存儲空間。非法碼:4位代碼在1010B~1111B范圍時(shí)。前.3計(jì)算機(jī)中帶符號數(shù)的表示
一、機(jī)器數(shù)及其真值
數(shù)在計(jì)算機(jī)內(nèi)的表示形式稱為機(jī)器數(shù)這個(gè)數(shù)本身稱為真值例:正數(shù)
+1000101B(+45H)
1000101B0
(45H)機(jī)器數(shù)真值例:負(fù)數(shù)
-1010101B(-55H)
1010101B1
(D5H)機(jī)器數(shù)真值二、原碼和反碼
原碼:最高位為符號位,數(shù)值為絕對值
反碼:正數(shù)的反碼與其原碼相同負(fù)數(shù)的反碼符號位為1,數(shù)值位為其原碼數(shù)值位逐位取反
采用原碼和反碼表示時(shí),符號位不能同數(shù)值一道參加運(yùn)算。三、補(bǔ)碼
正數(shù)的補(bǔ)碼與其原碼相同負(fù)數(shù)的補(bǔ)碼為其反碼末位加1計(jì)算機(jī)中,帶符號數(shù)的運(yùn)算均采用補(bǔ)碼。例:正數(shù)
+1000101B(+45H)
1000101B0
反碼
1000101B0
補(bǔ)碼例:負(fù)數(shù)
-1010101B(-55H)
0101010B1
反碼(AAH)
0101011B1
補(bǔ)碼(ABH)由補(bǔ)碼求其真值的方法求補(bǔ)得到原碼(符號位+數(shù)值位)依原碼求真值。如:補(bǔ)碼為:10101011B求補(bǔ)得:11010101B真值為:-55H。補(bǔ)碼的優(yōu)點(diǎn):將減法運(yùn)算轉(zhuǎn)換為加法,且數(shù)值連同符號位可一起參加運(yùn)算例:45H-55H=-10H
[45H]補(bǔ):01000101+[-55H]補(bǔ):10101011
[-10H]補(bǔ):11110000
求補(bǔ)得原碼:10010000真值:-001
0000(-10H)反碼:范圍是:+127~-127;“0”有2種表示補(bǔ)碼:范圍是:+127~-128;
“0”有1種表示1.1電子計(jì)算機(jī)的發(fā)展概述1.1.1電子計(jì)算機(jī)的問世及其經(jīng)典結(jié)構(gòu)1946年2月15日,第一臺電子數(shù)字計(jì)算機(jī)問世,標(biāo)志著計(jì)算機(jī)時(shí)代的到來。ENIAC開創(chuàng)了計(jì)算機(jī)科學(xué)技術(shù)的新紀(jì)元,對人類的生產(chǎn)和生活方式產(chǎn)生了巨大的影響。馮·諾依曼提出“程序存儲”和“二進(jìn)制運(yùn)算”的思想,構(gòu)建了計(jì)算機(jī)經(jīng)典結(jié)構(gòu):
電子計(jì)算機(jī)經(jīng)歷了五個(gè)時(shí)代:電子管計(jì)算機(jī)晶體管計(jì)算機(jī)集成電路計(jì)算機(jī)大規(guī)模集成電路計(jì)算機(jī)超大規(guī)模集成電路計(jì)算機(jī)結(jié)構(gòu)仍然沒有突破馮·諾依曼提出的計(jì)算機(jī)的經(jīng)典結(jié)構(gòu)框架1.1.2微型計(jì)算機(jī)的組成及其應(yīng)用形態(tài)一、微型計(jì)算機(jī)的組成
1971年1月,INTEL公司的特德·霍夫在與日本商業(yè)通訊公司合作研制臺式計(jì)算器時(shí),將原始方案的十幾個(gè)芯片壓縮成三個(gè)集成電路芯片。其中的兩個(gè)芯片分別用于存儲程序和數(shù)據(jù),另一芯片集成了運(yùn)算器和控制器及一些寄存器,稱為微處理器(即Intel4004)。4004微處理器
微處理器、存儲器加上I/O接口電路組成微型計(jì)算機(jī)。二、微型計(jì)算機(jī)的應(yīng)用形態(tài)可以分為2種:
桌面應(yīng)用將CPU、存儲器、I/O接口電路組裝在主板上,通過接口電路與鍵盤、顯示器鏈接,配上操作系統(tǒng)和應(yīng)用軟件構(gòu)成PC。
嵌入式應(yīng)用將CPU、存儲器、I/O接口電路集成在一片集成電路芯片形成單芯片微型計(jì)算機(jī)。如:ARM、DSP和80C51應(yīng)用形態(tài)的比較:單片機(jī)系統(tǒng)機(jī)
系統(tǒng)機(jī)(桌面應(yīng)用)屬于通用計(jì)算機(jī),主要用于數(shù)據(jù)處理、辦公自動化及輔助設(shè)計(jì)。
單片機(jī)(嵌入式應(yīng)用)屬于專用計(jì)算機(jī),主要用于智能儀表及傳感器、智能家電、智能辦公設(shè)備、汽車及軍事電子設(shè)備等系統(tǒng)。
單片機(jī)體積小、價(jià)格低、可靠性高,其非凡的嵌入式應(yīng)用形態(tài)對于滿足嵌入式應(yīng)用需求具有獨(dú)特的優(yōu)勢。1.2單片機(jī)的發(fā)展過程及產(chǎn)品近況1.2.1單片機(jī)的發(fā)展過程三個(gè)主要階段:
單芯片微機(jī)形成階段
1976年,Intel公司推出了MCS-48系列單片機(jī)。8位CPU、1K字節(jié)ROM、64字節(jié)RAM、27根I/O線和1個(gè)8位定時(shí)/計(jì)數(shù)器。
特點(diǎn):存儲器容量小,尋址范圍?。ú淮笥?K),無串行接口,指令系統(tǒng)功能不強(qiáng)。
特點(diǎn)是:結(jié)構(gòu)體系完善,性能已大大提高,面向控制的特點(diǎn)進(jìn)一步突出?,F(xiàn)在,MCS-51已成為公認(rèn)的單片機(jī)經(jīng)典機(jī)種。
性能完善提高階段
1980年,Intel公司推出了MCS-51系列單片機(jī):8位CPU、4K字節(jié)ROM、128字節(jié)RAM、4個(gè)8位并口、1個(gè)全雙工串行口、2個(gè)16位定時(shí)/計(jì)數(shù)器。尋址范圍64K,并有控制功能較強(qiáng)的布爾處理器。
微控制器化階段
特點(diǎn):片內(nèi)面向測控系統(tǒng)電路增強(qiáng),使之可以方便靈活地用于復(fù)雜的自動測控系統(tǒng)及設(shè)備?!拔⒖刂破鳌钡姆Q謂更能反應(yīng)單片機(jī)的本質(zhì)。
1982年,Intel推出MCS-96系列單片機(jī)。芯片內(nèi)集成:16位CPU、8K字節(jié)ROM、232字節(jié)RAM、5個(gè)8位并口、1個(gè)全雙工串行口、2個(gè)16位定時(shí)/計(jì)數(shù)器。尋址范圍64K。片上還有8路10位ADC、1路PWM輸出及高速I/O部件等。1.2.2單片機(jī)產(chǎn)品近況
ATMEL公司融入Flash存儲器技術(shù)的AT89系列
Philips公司的80C51、80C552系列華邦公司的W78C51、W77C51高速低價(jià)系列
ADI公司的ADμC8xx高精度ADC系列
LG公司的GMS90/97低壓高速系列
Maxim公司的DS89C420高速(50MIPS)系列
Cygnal公司的C8051F系列高速SOC單片機(jī)
80C51系列產(chǎn)品繁多,主流地位已形成,已推出的與80C51兼容的主要產(chǎn)品有:
非80C51結(jié)構(gòu)單片機(jī)新品不斷推出,給用戶提供了更為廣泛的選擇空間,近年來推出的非80C51系列的主要產(chǎn)品有:Intel的MCS-96系列16位單片機(jī)
Microchip的PIC系列RISC單片機(jī)
TI的MSP430F系列16位低功耗單片機(jī)。1.3單片機(jī)的特點(diǎn)及應(yīng)用領(lǐng)域1.3.1單片機(jī)的特點(diǎn)
控制性能和可靠性高可對I/O端口直接操作,位操作能力更是其它計(jì)算機(jī)無法比擬的。由于CPU、存儲器及I/O接口集成在同一芯片內(nèi),數(shù)據(jù)在傳送時(shí)受干擾的影響較小,且不易受環(huán)境條件的影響。體積小、價(jià)格低、易于產(chǎn)品化
應(yīng)用系統(tǒng)的印制板減小、接插件減少、安裝簡單方便。1.3.2單片機(jī)的應(yīng)用領(lǐng)域
智能儀器儀表
機(jī)電一體化產(chǎn)品實(shí)時(shí)工業(yè)控制分布式系統(tǒng)的前端模塊家用電器1.4單片機(jī)應(yīng)用系統(tǒng)開發(fā)簡介1.4.1單片機(jī)應(yīng)用系統(tǒng)的開發(fā)
單片機(jī)自身沒有開發(fā)功能,必須借助開發(fā)機(jī)來完成如下任務(wù):排除硬件故障和軟件錯誤程序固化到程序存儲器芯片中。
正確的硬件設(shè)計(jì)和良好的軟件功能設(shè)計(jì)是一個(gè)實(shí)用的單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)目標(biāo)。完成該目標(biāo)的過程稱為單片機(jī)應(yīng)用系統(tǒng)的開發(fā)。指令的表示形式指令是讓單片機(jī)執(zhí)行某種操作的命令。指令按一定的順序以二進(jìn)制碼的形式存放于程序存儲器中。如:04H:累加器A的內(nèi)容加1,難記!INCA,記憶容易。稱為符號指令。00000100B04H
匯編或編譯將匯編語言源程序(符號指令)轉(zhuǎn)換成目標(biāo)碼(機(jī)器碼)的過程稱為匯編。集成開發(fā)平臺uVision平臺匯編器A51.EXE實(shí)現(xiàn)現(xiàn)在常采用高級語言(如C51)進(jìn)行單片機(jī)應(yīng)用程序的設(shè)計(jì)。將C51語言源程序(符號指令)轉(zhuǎn)換成目標(biāo)碼(機(jī)器碼)的過程稱為編譯。集成開發(fā)平臺uVision平臺匯編器C51.EXE實(shí)現(xiàn)
連接與固化
1.匯編與編譯形成浮動地址的目標(biāo)碼
*.OBJ文件(*.LST)2.由uVision平臺連接器BL51.EXE連接生成絕對地址的目標(biāo)碼無擴(kuò)展名文件(*.M51)
3.絕對地址目標(biāo)文件由uVision平臺轉(zhuǎn)換器OH51.EXE轉(zhuǎn)換成編程器能識別的*.HEX文件。
*.HEX文件可以
寫入到ROM中
目標(biāo)碼生成工具:uVision平臺實(shí)現(xiàn)編譯、連接和.HEX轉(zhuǎn)換1.4.2單片機(jī)應(yīng)用系統(tǒng)開發(fā)工具
硬件仿真工具
軟件仿真工具Proteus仿真電路設(shè)計(jì)軟件ISIS實(shí)現(xiàn)應(yīng)用系統(tǒng)簡捷開發(fā)1.4.3應(yīng)用系統(tǒng)開發(fā)流程
常規(guī)開發(fā)流程
1.Protel99SE系統(tǒng)原理圖
PCB版圖
制作電路板焊接相關(guān)元件
2.uVision平臺開發(fā)程序
3.寫入目標(biāo)系統(tǒng),調(diào)試1.4.3應(yīng)用系統(tǒng)開發(fā)流程
簡捷開發(fā)流程
1.Proteus繪制系統(tǒng)仿真原理圖2.uVision平臺開發(fā)程序
3.將目標(biāo)程序?qū)懭敕抡嬖韴D的單片機(jī)屬性配置;運(yùn)行仿真功能觀察執(zhí)行結(jié)果并修改設(shè)計(jì)
SST公司推出的SST89C54和SST89C58芯片有SuperFLASH存儲器,利用這種存儲器可以進(jìn)行高速讀寫的特點(diǎn),能夠?qū)崿F(xiàn):
在系統(tǒng)編程(ISP)在應(yīng)用編程(IAP)。1.5單片機(jī)開發(fā)方式的發(fā)展應(yīng)用程序的編輯、匯編(或編譯)、模擬運(yùn)行,然后實(shí)現(xiàn)目標(biāo)程序的串行下載。ISP的實(shí)現(xiàn),一般通用做法是內(nèi)部的存儲器可以由上位機(jī)的軟件通過串口來進(jìn)行改寫。對于單片機(jī)來講可以通過SPI或其它的串行接口接收上位機(jī)傳來的數(shù)據(jù)并寫入存儲器中。所以即使我們將芯片焊接在電路板上,只要留出和上位機(jī)接口的這個(gè)串口,就可以實(shí)現(xiàn)芯片內(nèi)部存儲器的改寫,而無須再取下芯片。通常在用戶需要實(shí)現(xiàn)IAP功能時(shí),即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫兩個(gè)項(xiàng)目代碼,第一個(gè)項(xiàng)目程序不執(zhí)行正常的功能操作,而只是通過某種通信管道(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對第二部分代碼的更新;第二個(gè)項(xiàng)目代碼才是真正的功能代碼。這兩部分項(xiàng)目代碼都同時(shí)燒錄在UserFlash中,當(dāng)芯片上電后,首先是第一個(gè)項(xiàng)目代碼開始運(yùn)行,它作如下操作:
1)檢查是否需要對第二部分代碼進(jìn)行更新
2)如果不需要更新則轉(zhuǎn)到4)
3)執(zhí)行更新操作
4)跳轉(zhuǎn)到第二部分代碼執(zhí)行
第一部分代碼必須通過其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一道燒入,以后需要程序更新是再通過第一部分IAP代碼更新
Microchip公司推出的PIC16F87X中內(nèi)置有在線調(diào)試器ICD功能還配置了具有ICSP功能的簡單仿真器和燒寫器。通過PC機(jī)串行電纜就可以完成對目標(biāo)系統(tǒng)的仿真調(diào)試。1.第一臺計(jì)算機(jī)的問世有何意義?
2.計(jì)算機(jī)由哪幾部分組成?
3.微型計(jì)算機(jī)由哪幾部分構(gòu)成?
4.微處理器與微型計(jì)算機(jī)有何區(qū)別?
5.什么叫單片機(jī)?其主要特點(diǎn)有哪些?
6.微型計(jì)算機(jī)有哪些應(yīng)用形式?各適于什么場合?
7.當(dāng)前單片機(jī)的主要產(chǎn)品有哪些?各有何特點(diǎn)?
8.簡述單片機(jī)的開發(fā)過程。
9.常用的單片機(jī)應(yīng)用系統(tǒng)開發(fā)方法有哪些?思考題與習(xí)題2.480C51的并行口結(jié)構(gòu)與操作本章內(nèi)容:2.180C51的內(nèi)部結(jié)構(gòu)與引腳功能2.280C51單片機(jī)的CPU2.580C51單片機(jī)最小系統(tǒng)2.380C51的存儲器組織第2章80C51的結(jié)構(gòu)和原理80C51系列概述
MCS-51是Intel公司生產(chǎn)的一個(gè)單片機(jī)系列名稱。這一系列的單片機(jī)有多種,如:
8051/8751/80318052/8752/803280C51/87C51/80C3180C52/87C52/80C32等
生產(chǎn)工藝有兩種:在產(chǎn)品型號中凡帶有字母“C”的即為CHMOS芯片,CHMOS芯片的電平既與TTL電平兼容,又與CMOS電平兼容。一是HMOS工藝(高密度短溝道MOS工藝)。二是CHMOS工藝(互補(bǔ)金屬氧化物的HMOS工藝)。80C51系列
Intel:80C31、80C51、87C51,80C32、80C52、87C52等;
ATMEL:89C51、89C52、89C2051等;
Philips、華邦、Dallas、Siemens(Infineon)等公司的許多產(chǎn)品。
80C51是MCS-51系列中CHMOS工藝的一個(gè)典型品種;其它廠商以8051為基核開發(fā)出的CMOS工藝單片機(jī)產(chǎn)品統(tǒng)稱為80C51系列。常用的80C51系列產(chǎn)品有:2.180C51的內(nèi)部結(jié)構(gòu)與引腳功能2.1.180C51的內(nèi)部結(jié)構(gòu)
功能上,該系列單片機(jī)有基本型和增強(qiáng)型兩大類:
增強(qiáng)型:ROM、RAM、計(jì)數(shù)器、中斷源的差異8052/8752/803280C52/87C52/80C32
基本型:8051/8751/803180C51/87C51/80C312.1.280C51典型產(chǎn)品的資源配置80C51典型產(chǎn)品資源配置由表可見:增強(qiáng)型與基本型的幾點(diǎn)不同:
片內(nèi)ROM:從4K增加到8K
片內(nèi)RAM:從128增加到256
定時(shí)/計(jì)數(shù)器:從2個(gè)增加到3個(gè)中斷源:從5個(gè)增加到6個(gè)。
無ROM型,要在片外擴(kuò)展程序存儲器;掩膜ROM型,程序由芯片生產(chǎn)廠寫入;E(E)PROM型,程序通過寫入裝置寫入;FlashROM型,程序可電寫入(常用)。
片內(nèi)ROM的配置形式:還有OTPROM型,具有較高的可靠性。在片內(nèi)程序存儲器的配置上,該系列單片機(jī)有三種形式,即掩膜ROM、EPROM和ROMLess。如:80C51有4K字節(jié)的掩膜ROM87C51有4K字節(jié)的EPROM
80C31在芯片內(nèi)無程序存儲器。AT89C51FLASH80C51的應(yīng)用模式總線型應(yīng)用的“三總線”模式
非總線型應(yīng)用的“多I/O”模式
總線型單片機(jī)應(yīng)用模式
非總線型單片機(jī)應(yīng)用模式
引腳數(shù)減少、體積減小。對于不需進(jìn)行并行外圍擴(kuò)展,裝置的體積要求苛刻且程序量不大的系統(tǒng)極其適合。
典型產(chǎn)品,如:
AT89C2051/AT89C4051。2.1.380C51的引腳封裝總線型非總線型80C51的內(nèi)部結(jié)構(gòu)詳解RAM128BRAM地址寄存器P3口P1口P2口P0口鎖存器鎖存器鎖存器鎖存器中斷定時(shí)/計(jì)數(shù)器串行口SPBACC暫存器1暫存器2PSW指令寄存器IR指令譯碼器IDDPL緩沖器程序計(jì)數(shù)器PCPC增量器地址寄存器AR定時(shí)與控制4KROMALUDPH運(yùn)算器控制器存儲器I/O接口RSTEAALEPSENXTAL2XTAL1
80C51的內(nèi)部結(jié)構(gòu)詳解一、80C51的CPU
運(yùn)算器累加器ACC
寄存器BPSW
控制器程序計(jì)數(shù)器PC
指令寄存器IR
定時(shí)與控制邏輯一、與運(yùn)算器相關(guān)的寄存器(3個(gè))
累加器ACC,8位。提供操作數(shù),存結(jié)果;
寄存器B,8位。主要用于乘、除法運(yùn)算。
程序狀態(tài)字寄存器PSW,8位。各位含義為:
CY:進(jìn)位、借位標(biāo)志。有進(jìn)位、借位時(shí)CY=1,否則CY=0;
AC:輔助進(jìn)位、借位標(biāo)志;
F0F1:用戶標(biāo)志位,由用戶自己定義;
RS1、RS0:當(dāng)前工作寄存器組選擇位;
OV:溢出標(biāo)志位。有溢出時(shí)OV=1,否則OV=0;
P:奇偶標(biāo)志位。ACC中結(jié)果有奇數(shù)個(gè)1時(shí)P=1,否則P=0。二、指針類寄存器(3個(gè))
堆棧指針SP,8位。總是指向棧頂。遵循“后進(jìn)先出”的原則
入棧時(shí),SP先加1,數(shù)據(jù)再壓入SP指向的單元。出棧操作時(shí)先將SP指向的單元的數(shù)據(jù)彈出,然后,SP再減1,這時(shí)SP指向的單元是新的棧頂。80C51單片機(jī)的堆棧區(qū)是向地址增大的方向生成的。三、與口相關(guān)的寄存器(7個(gè))
并行I/O口P0、P1、P2、P3,均為8位;
串行口數(shù)據(jù)緩沖器SBUF;串行口控制寄存器SCON;串行通訊波特率倍增寄存器PCON,(又稱為電源控制寄存器)。
數(shù)據(jù)指針DPTR。用來存放16位的地址。它由兩個(gè)8位的寄存器DPH和DPL組成。四、片內(nèi)存儲器
程序存儲器和數(shù)據(jù)存儲器2個(gè)獨(dú)立的空間(稱為哈佛結(jié)構(gòu)):
ROM:4K
范圍是:000H~0FFFH
RAM:128字節(jié)
范圍是:00H~7FH2.380C51的存儲器組織80C51存儲器可以分成兩大類:
RAM,CPU在運(yùn)行時(shí)能隨時(shí)進(jìn)行數(shù)據(jù)的寫入和讀出,但在關(guān)閉電源時(shí),其所存儲的信息將丟失。它用來存放暫時(shí)性的輸入輸出數(shù)據(jù)、運(yùn)算的中間結(jié)果或用作堆棧。
ROM,寫入信息后不易改寫的存儲器。斷電后,其中的信息保留不變。用來存放固定的程序或數(shù)據(jù),如系統(tǒng)監(jiān)控程序、常數(shù)表格等。
2.3.180C51的程序存儲器配置PC:16位計(jì)數(shù)器,能尋址64KB的ROM。
2.3.280C51的數(shù)據(jù)存儲器配置一、工作寄存器區(qū)
低端32個(gè)字節(jié)分成4個(gè)工作寄存器組,每組8個(gè)單元。當(dāng)前工作寄存器組的機(jī)制便于快速現(xiàn)場保護(hù)。
PSW的RS1、RS0決定當(dāng)前工作寄存器組號寄存器0組:地址00H~07H;寄存器1組:地址08H~0FH;寄存器2組:地址10H~17H;寄存器3組:地址18H~1FH。二、位尋址區(qū)三、通用RAM區(qū)30H至7FH共80個(gè)字節(jié)作為數(shù)據(jù)緩沖器
操作指令豐富,數(shù)據(jù)處理方便靈活堆棧區(qū):通常在30H~7FH范圍棧頂:SP寄存器指示復(fù)位時(shí)SP的初值為07H三、I/O口及功能單元
并口:P0~P3,雙向口。每口8條I/O線
串行口:P3.0、P3.1,全雙工
定時(shí)/計(jì)數(shù)器:2個(gè),16位
中斷系統(tǒng):5個(gè)中斷源,2個(gè)優(yōu)先級
2.3.3特殊功能寄存器(SFR)
21個(gè)SFR,地址80H~FFH。只占用了80H~FFH中的21個(gè)字節(jié)單元,且這些單元是離散分布的。增強(qiáng)型單片機(jī)的SFR有26個(gè)字節(jié)單元,所增加的5個(gè)單元均與定時(shí)/計(jì)數(shù)器2相關(guān)。與中斷相關(guān)的寄存器(2個(gè))
中斷允許控制寄存器IE;中斷優(yōu)先級控制寄存器IP。
與定時(shí)器/計(jì)數(shù)器相關(guān)的寄存器(6個(gè))T0的兩個(gè)8位計(jì)數(shù)初值寄存器TH0、TL0T1的兩個(gè)8位計(jì)數(shù)初值寄存器TH1、TL1
工作方式寄存器TMOD;控制寄存器TCON。
80C51的特殊功能寄存器(SFR)2.2.280C51的時(shí)鐘與時(shí)序一、時(shí)鐘產(chǎn)生方式
內(nèi)部時(shí)鐘外部時(shí)鐘二、時(shí)鐘信號1個(gè)機(jī)器周期:12個(gè)晶蕩周期(或6個(gè)時(shí)鐘周期)
指令的執(zhí)行時(shí)間稱作指令周期(單、雙、四周期)三、80C51的典型時(shí)序指令微操作在時(shí)間上的次序,即時(shí)序。
單字節(jié)指令雙字節(jié)指令1、單周期指令時(shí)序2個(gè)機(jī)器周期中ALE有效4次,后3次讀操作無效。2、雙周期指令時(shí)序
在第二機(jī)器周期無讀操作碼的操作,而是進(jìn)行外部數(shù)據(jù)存儲器的尋址和數(shù)據(jù)選通
。ALE信號會出現(xiàn)非周期現(xiàn)象。
訪問外部RAM的雙周期指令時(shí)序
2.2.380C51單片機(jī)的復(fù)位一、復(fù)位電路復(fù)位可使單片機(jī)或系統(tǒng)部件處于確定的初始狀態(tài)。
上電復(fù)位電路按鍵與上電復(fù)位
二、單片機(jī)復(fù)位后的狀態(tài)
PC=0000H
RAM:隨機(jī)值(運(yùn)行中復(fù)位不改變RAM內(nèi)容)
SFR狀態(tài)
P0~P3=FFH
SP=07H
IP、IE和PCON:有效位為0
PSW=00H2.480C51的并行口結(jié)構(gòu)與操作2.4.1P0口、P2口的結(jié)構(gòu)
一、
P0口的結(jié)構(gòu)1、P0用作通用I/O口
系統(tǒng)不擴(kuò)展(片外ROM、片外RAM)時(shí),P0用作通用I/O口。MUX接鎖存器反相端T1截止,漏極開路此時(shí),C=0
輸出時(shí),執(zhí)行口輸出指令,數(shù)據(jù)在“寫鎖存器”信號作用下,經(jīng)鎖存器反向端送至T2,反相后送至P0.X。
輸入時(shí),數(shù)據(jù)可讀自鎖存器,也可讀自引腳。由指令是“讀鎖存器”指令還是“讀引腳”指令來決定。
“讀—修改—寫”類指令(如:ANLP0,A)產(chǎn)生“讀鎖存器”操作信號;
讀鎖存器可避免因外部電路原因使原口引腳的狀態(tài)發(fā)生變化造成的誤讀?!癕OV”類指令(如:MOVA,P0)內(nèi)部產(chǎn)生的是“讀引腳”信號。此時(shí)要先向鎖存器寫入“1”,使T2截止,讓引腳處于懸浮狀態(tài),使口處于高阻抗輸入態(tài)。
否則,在作為輸入方式之前曾向鎖存器輸出過“0”,則T2導(dǎo)通會使引腳箝位在“0”電平,使輸入高電平“1”無法讀入。因此,P0口作為通用I/O時(shí),屬于準(zhǔn)雙向口。2、P0用作地址/數(shù)據(jù)總線
系統(tǒng)進(jìn)行擴(kuò)展(片外ROM、片外RAM)時(shí),P0用作地址/數(shù)據(jù)總線。MUX接反相器T1截止與導(dǎo)通由地址/數(shù)據(jù)線的狀態(tài)決定此時(shí),C=1
執(zhí)行輸出指令時(shí),低8位地址信息和數(shù)據(jù)信息分時(shí)地出現(xiàn)在地址/數(shù)據(jù)總線上。
執(zhí)行輸入指令時(shí),首先低8位地址信息出現(xiàn)在地址/數(shù)據(jù)總線上。然后,CPU自動地使MUX撥向鎖存器,并向P0口寫入FFH,同時(shí)“讀引腳”信號有效。
P0口作為地址/數(shù)據(jù)總線使用時(shí)是一個(gè)真正的雙向口。二、
P2口的結(jié)構(gòu)P2用作通用I/O口
不擴(kuò)展ROM,或只擴(kuò)展256B的片外RAM時(shí),僅用到了地址線低8位,P2仍可作為通用I/O口。
輸出時(shí),數(shù)據(jù)由D端進(jìn)入鎖存器,經(jīng)反相器送至T,經(jīng)T反相送引腳。
輸入時(shí),數(shù)據(jù)可讀自鎖存器,也可讀自引腳。要根據(jù)輸入采用的是“讀鎖存器”還是“讀引腳”指令決定?!白x—修改—寫”類指令,鎖存器Q端數(shù)據(jù)進(jìn)入內(nèi)部數(shù)據(jù)總線,與A邏輯運(yùn)算后,結(jié)果又送回P2的鎖存器并出現(xiàn)在引腳?!癕OV”類指令,操作信號是“讀引腳”。應(yīng)先要把鎖存器寫入“1”,使引腳高阻狀態(tài)。
通用I/O口時(shí),屬于準(zhǔn)雙向口。且P2的輸出驅(qū)動有上拉電阻。P2用作地址總線
當(dāng)片外擴(kuò)展ROM或擴(kuò)展的RAM容量超過256字節(jié)時(shí),硬件使C=1,MUX開關(guān)接向地址線,這時(shí)P2.X的狀態(tài)與地址線的信息相同。2.6.2P1口、P3口的結(jié)構(gòu)
P1口的結(jié)構(gòu)P1口由一個(gè)輸出鎖存器、兩個(gè)三態(tài)輸入緩沖器和輸出驅(qū)動電路組成。輸出驅(qū)動電路與P2口相同,內(nèi)部設(shè)有上拉電阻。P1口是通用的準(zhǔn)雙向I/O口。輸出高電平時(shí),能向外提供拉電流負(fù)載,不必再接上拉電阻。當(dāng)口用作輸入時(shí),須向口鎖存器寫入1。
P3口的結(jié)構(gòu)
P3用作第一功能(通用I/O)
對P3字節(jié)或位尋址時(shí),硬件自動將W置1??诰€為通用I/O口方式。
輸出時(shí),鎖存器Q端與引腳狀態(tài)相同;輸入時(shí),先向鎖存器寫1,使引腳為高阻狀態(tài)。數(shù)據(jù)在“讀引腳”信號作用下,進(jìn)入內(nèi)部數(shù)據(jù)總線。通用I/O口時(shí),屬于準(zhǔn)雙向口。
P3用作第二功能使用
當(dāng)不對P3口尋址時(shí),口鎖存器的Q端自動置1。這時(shí)P3口作為第二功能使用
P3.0:RXDP3.1:TXDP3.2:INT0P3.3:INT1
P3.4:T0P3.5:T1P3.6:WRP3.7:RD2.6.3并行口的負(fù)載能力
P0、P1、P2、P3口的電平與CMOS和TTL電平兼容。
P0每一口線可驅(qū)動8個(gè)LSTTL負(fù)載
通用I/O時(shí),輸出驅(qū)動電路是開漏方式,OC門或漏極開路電路驅(qū)動時(shí)需外接上拉電阻;
地址/數(shù)據(jù)總線時(shí),輸出不是開漏的,無須外接上拉電阻。
P1、P2、P3口的每一位能驅(qū)動4個(gè)LSTTL負(fù)載??煞奖愕赜蒓C門或漏極開路電路驅(qū)動,而無須外接上拉電阻。
口線僅能提供幾毫安的電流,當(dāng)作為輸出驅(qū)動一般的晶體管的基極時(shí),應(yīng)在口與晶體管的基極之間串接限流電阻。
1、在功能、工藝、程序存儲器的配置上有哪些種類?2、80C51的存儲器組織采用何種結(jié)構(gòu)?存儲器地址空間如何劃分?各地址空間的地址范圍和容量如何?在使用上有何特點(diǎn)?3、P0~P3口在結(jié)構(gòu)上有何不同?在使用上有何特點(diǎn)?4、晶振為12MHz,時(shí)鐘周期、機(jī)器周期為多少?5、80C51復(fù)位后的狀態(tài)如何?復(fù)位方法有幾種?思考題與習(xí)題6、80C51的片內(nèi)、片外存儲器如何選擇?7、PSW寄存器各位標(biāo)志的意義如何?8、80C51的當(dāng)前工作寄存器組如何選擇?9、80C51的控制總線信號有哪些?各信號的作用如何?10、80C51的程序存儲器低端的幾個(gè)特殊單元的用途如何?3.1C51對標(biāo)準(zhǔn)C的擴(kuò)展本章內(nèi)容:3.2C51的指針3.3C51的函數(shù)第3章80C51的C51語言程序設(shè)計(jì)3.1C51對標(biāo)準(zhǔn)C的擴(kuò)展擴(kuò)展主要針對單片機(jī)存儲器性質(zhì)和分區(qū)特征、特殊的位尋址方式等3.1.1C51的數(shù)據(jù)類型
數(shù)據(jù):常量和變量數(shù)據(jù)類型是數(shù)據(jù)的格式,決定數(shù)據(jù)的1.值域范圍2.占用存儲單元個(gè)數(shù)3.能參與哪種運(yùn)算C51常用數(shù)據(jù)類型數(shù)據(jù)類型長度(位)取值范圍字符型signedchar8-128~127unsignedchar80~255整形singedint16-32768~32767unsignedint160~65535長整型signedlong32unsignedlong32浮點(diǎn)型float32SFR型sfr80~255sfr16160~65535位型bit10,1sbit10,11.整型默認(rèn)有符號,以補(bǔ)碼進(jìn)行存儲2.浮點(diǎn)型只有十進(jìn)制3.字符型默認(rèn)有符號,可用‘’進(jìn)行常量的賦值,字符串用“”。;某些字符有特殊含義。#include<stdio.h>voidmain(){longx,y;(有符號的長整型)inta,b,c,d;(有符號的整型)x=5;y=6;a=7;b=8;c=x+a;d=y+b;printf(“c=x+a=%d,d=y+b=%d\n”,c,d);}注:不同進(jìn)制之間可以進(jìn)行混合計(jì)算,但要注意兼容性!字符型默認(rèn)有符號,可用‘’進(jìn)行常量的賦值,字符串用“”。;某些字符有特殊含義。注:也可作為8位整型來使用!字符以ASCII碼方式表示,長度為1個(gè)字節(jié)但操作時(shí)按整型數(shù)進(jìn)行處理。對于處理大于0x80的的ASCII碼字符,要定義成unsignedchar
否則直接轉(zhuǎn)為整型變量#include<stdio.h>voidmain(){chara,b;a=‘x’;b=‘y’;a=a-32;b=b-32;printf(“%c,%c\n”,%d,%d\n”a,b,a,b);}3.1.2C51數(shù)據(jù)的存儲分區(qū)
對單片機(jī)來說,訪問片內(nèi)RAM比訪問片外RAM速度快得多,常使用的變量應(yīng)置于片內(nèi)RAM,用bdata、data、idata來定義;
片外RAM,用pdata、xdata定義
默認(rèn)編譯模式下可省略分區(qū)定義。
存儲分區(qū)對應(yīng)的存儲器及尋址方式bdata片內(nèi)RAM位尋址區(qū),共128位(也可按字節(jié)尋址)data直接尋址,共128Bidata間接尋址,共256Bpdata片外RAM分頁間址,共256Bxdata間接尋址,共64KBcodeROM間接尋址,共64KBbitdataflags;//位變量flags定位在片內(nèi)RAM位存儲區(qū)chardatavar;//字符變量var定位在片內(nèi)RAM區(qū)floatidatax,y;//字型變量x,y定位在片內(nèi)間址RAM區(qū)unsignedcharpdataz;//無符號字符變量z定位在片外分頁間址RAM區(qū)變量與常量變量的3要素:
數(shù)據(jù)類型對象名內(nèi)存存放地址自動分配或給定絕對地址int(data)lower,upper,step;//整型數(shù)據(jù)charc,name[16];//字符型數(shù)據(jù),數(shù)組常量
算數(shù)常量:整型、浮點(diǎn)型
字符常量枚舉常量變量的作用域塊結(jié)構(gòu)
以“{}”括起來的符合語句屬于塊結(jié)構(gòu)。
塊內(nèi)定義的變量作用域僅限于塊內(nèi)。
塊內(nèi)定義與塊外或外部定義具有相同的變量名,則它們沒有關(guān)系
inta=3;main(){inta=5;printf(“a=\n”,a);}自動型變量
在函數(shù)內(nèi)部定義的變量稱為自動型變量(以auto標(biāo)識,常省略),作用域定義在函數(shù)內(nèi)部。不同函數(shù)里出現(xiàn)相同名字的變量,毫不相干。
編譯程序?qū)⒆詣訛樽詣有妥兞糠峙浯鎯臻g,退出則消失。注:自動型變量與外部變量具有相同名字,函數(shù)(塊)內(nèi)自動變量起作用;退出該函數(shù)(塊)后,外部變量起作用。外部型變量
在函數(shù)外部定義的變量,可被程序中所有函數(shù)所引用。即全局變量作用域是整個(gè)程序。如有同名變量,則只有內(nèi)部變量起作用#include<stdio.h>intx=4,y=5;voidmain(){{intx=1;{intx=2;{intx=3;//:%u無符號十進(jìn)制整數(shù)printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}printf(“x=%d,&x=%u\n”,x,&x);printf(“y=%d,&y=%u\n”,y,&y);}x=3,&x=1245044y=5,&y=4338028x=2,&x=1245048y=5,&y=4338028x=1,&x=1245052y=5,&y=4338028x=4,&x=4338024y=5,&y=4338028C51的分隔符“[]”;對數(shù)組說明如:charmm[]=“ok”;“()”隔離函數(shù)名與形參s=area(r);“,”隔離變量或表達(dá)式intx,y,z;“{}”隔離復(fù)合語句for(){;;}“;”語句間隔離“:”分隔標(biāo)識符或特殊語句中使用“*”指針指向數(shù)據(jù)“&”數(shù)據(jù)所存地址“#”預(yù)處理偽指令“^”標(biāo)識特殊寄存器的位sbitP10=P1^0“…”說明函數(shù)的參數(shù)表中可能出現(xiàn)參數(shù)intAB(int,char…)操作符作用操作符作用+加,一目取正%取模-減,一目取負(fù)--減1*乘++加1/除操作符作用操作符作用&&邏輯與!邏輯非||邏輯或算術(shù)運(yùn)算符邏輯運(yùn)算符操作符作用操作符作用>大于<=小于等于>=大于等于==等于<小于!=不等于操作符作用操作符作用&按位邏輯與~按位邏輯反|按位邏輯或>>算術(shù)右移^按位邏輯異或<<算術(shù)左移關(guān)系運(yùn)算符按位運(yùn)算符邏輯運(yùn)算符與關(guān)系運(yùn)算符是真(true)假(false)的概念。true可以是非0的任何值,false為0.#include<stdio.h>unsignedmoveright(unsignedvalue,intn);unsignedmoveright(unsignedvalue,intn);voidmain(){unsigneda;intn;printf(“請輸入一個(gè)八進(jìn)制:”);scanf(“%o”,&a);printf(“請輸入要移位的位數(shù):”);scanf(“%d”,&n);if(n>0){printf(“循環(huán)右移的結(jié)果為:%o\n”,moveright(a,n));}else{n=-n;printf(“循環(huán)左移的結(jié)果為:%o\n”,moveleft(a,n));}}循環(huán)移位程序給出待移位16位整型數(shù)據(jù)a,移位數(shù)n
unsignedmoveright(unsignedvalue,intn){unsignedz;z=(value>>n)|(value<<(16-n));returnz;}unsignedmoveleft(unsignedvalue,intn){unsignedz;z=(value<<n)|(value>>(16-n));returnz;}C51的特殊運(yùn)算符(1)“?”運(yùn)算符<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>;#include<stdio.h>main(){intx,y;x=50;y=x>70?100:0;}(2)“&”,”*”運(yùn)算符“&”返回操作數(shù)地址“*”返回位于這個(gè)地址的變量值#include<stdio.h>main(){inti,j,*m;i=10;m=&i;j=*m;}(3)”,”運(yùn)算符“,”將多個(gè)表達(dá)式串在一起,“,”左邊不返回,右邊才是整個(gè)表達(dá)式的值#include<stdio.h>main(){intx,y;x=50;y=(x=x-5,x/5);}(4)sizeof運(yùn)算符返回變量或類型的字節(jié)長度sizeof(double)為8sizeof(int)為2floatf;inti;i=sizeof(f);(5)聯(lián)合操作<變量>=<變量><操作數(shù)><表達(dá)式>相當(dāng)于<變量><操作數(shù)>=<表達(dá)式>a=a+b可寫成a+=ba=a/(b-c)可寫成a/=b-c3.1.3C51的編譯模式編譯模式與變量默認(rèn)存儲分區(qū)
例charvar;//在SMALL模式,var定位于data存儲區(qū)//在COMPACT模式,var定位于pdata存儲區(qū)//在LARGE模式,var定位于xdata存儲區(qū)編譯模式默認(rèn)存儲分區(qū)特點(diǎn)SMALLdata變量在片內(nèi)RAM,空間小,速度快COMPACTpdata變量在片外RAM的一頁LARGExdata變量在片外RAM的64KB范圍uVision中,存儲模式在OptionforTarget1TargetMemoryModel中設(shè)定3.1.4用_at_定義變量絕對地址為全局變量存放首地址進(jìn)行定位idatainty_at_0x30;//idata中全局變量y首地址0x30y=0xaa;//整型變量y賦值0xaaxdatacharstring[20]_at_0x3000;//xdata中字符型數(shù)組string的首地址0x3000
對外設(shè)接口地址的定義要用volatile進(jìn)行說明,以每次重讀原始內(nèi)存地址內(nèi)容,而不適用保存在寄存器里的備份。目的是避免編譯器優(yōu)化出現(xiàn)不正確結(jié)果。3.2C51的指針對于變量a,可用&a表示a的地址。p=&a;//p為指針變量,其值為變量a的地址,即p指向a利用指針運(yùn)算符“*”,可獲得指針?biāo)缸兞康膬?nèi)容。char*p;//指針p指向字符型數(shù)據(jù)p=0x30;//指針賦值地址0x30指針也是一種變量,同樣要存儲在某一存儲器中,定義時(shí)可顯式進(jìn)行聲明。char*datap;//指針p指向字符型數(shù)據(jù),指針本身存儲在data區(qū)char*p;intdatap已定義稱為數(shù)據(jù)存儲分區(qū)的指針稱為基于存儲器的指針,在定義時(shí)就已制定了所指向的數(shù)據(jù)的存儲分區(qū)。3.2.1已定義數(shù)據(jù)存儲分區(qū)的指針charidata*datap;//指針p指向idata區(qū)的字符型數(shù)據(jù),指針本身//存儲在data區(qū)chardata*datastr;//單字節(jié)指針指向data空間的char型數(shù)據(jù)intxdata*datanum;//雙字節(jié)指針指向xdata空間的int型數(shù)據(jù)
基于存儲器的指針長度為單字節(jié)或雙字節(jié),可以節(jié)省存儲器資源。。定義指針變量時(shí),未定義它所指向的數(shù)據(jù)存儲分區(qū)的指針稱為通用指針(或一般指針),存放通用指針要占用3個(gè)字節(jié)。3.2.2未定義數(shù)據(jù)存儲分區(qū)的指針第一字節(jié)為指針?biāo)赶虻臄?shù)據(jù)存儲分區(qū)編碼第二字節(jié)為指針?biāo)赶虻臄?shù)據(jù)的高字節(jié)地址第三字節(jié)為指針?biāo)赶虻臄?shù)據(jù)的低字節(jié)地址存儲器分區(qū)bdata/data/idataxdatapdatacode編碼0x000x010xfe0xff通用指針用于存取變量而不必考慮變量在單片機(jī)內(nèi)存儲空間3.2.3利用指針實(shí)現(xiàn)絕對地址訪問unsignedchardata*p;//單字節(jié)指針p指向內(nèi)部RAM數(shù)據(jù)p=0x40;//指針p賦值,指向內(nèi)部RAM的0x40單元*p=0x55;//數(shù)據(jù)0x55送入內(nèi)部RAM的0x40單元C51提供一組宏指令定義以實(shí)現(xiàn)對80C51單片機(jī)絕對地址訪問宏定義原型放在absacc.h文件中#defineCBYTE((unsignedcharvolatilecode*)0);#defineDBYTE((unsignedcharvolatiledata*)0);(unsignedcharvolatilecode*)對地址進(jìn)行強(qiáng)制類型轉(zhuǎn)換,形成指針,指向后面給出地址。例:將30H至3FH共16個(gè)RAM單元初始化為55H#include<reg52.h>#include<absacc.h>voidmain(void){unsignedchari;for(i=0;i<=15;i++){DBYTE[0x30+i]=0x55;}while(1);}3.2.4C51程序編寫示例C:0x0000020011LJMPC:0011C:0x0003E4CLRAC:0x0004FFMOVR7,AC:0x00057430MOVA,#0x30C:0x00072FADDA,R7C:0x0008F8MOVR0,AC:0x00097655MOV@R0,#0x55C:0x000B0FINCR7C:0x000CBF10F6CJNER7,#0x10,C:0005C:0x000F80FESJMPC:000FC:0x0011787FMOVR0,#0x7FC:0x0013E4CLRAC:0x0014F6MOV@R0,AC:0x0015D8FDDJNZR0,C:0014C:0x0017758107MOVSP,#0x07C:0x001A020003LJMPC:0003復(fù)合語句用{}將一些說明和語句組合在一起,使他們在語法上等價(jià)于一個(gè)簡單語句,稱其位復(fù)合語句。條件語句if(表達(dá)式1)
語句1else(表達(dá)式2)
語句2#include<stdio.h>voidmain(){inta,b,x;a=3;b=5;if(a>b)x=a;elsex=b;printf(“x=%d\n”,x);}注意:1.條件執(zhí)行語句中“else語句2;”部分是選擇項(xiàng),可以缺省if(表達(dá)式)語句1;2.如果語句1或語句2有多于一條語句要執(zhí)行時(shí),必須使用“{}”把這些括在其中if(表達(dá)式){語句體1;}else{語句體2;}if(x>20||x<-10)if(y<=100&&y>x)printf(“good”);elseprintf(“bad”)3.條件語句可以嵌套,但注意if對應(yīng)哪個(gè)else,需要注意else與最近一個(gè)if匹配if(x>20||x<-10){if(y<=100&&y>x)printf(“good”);}elseprintf(“bad”)if(表達(dá)式1)語句1;elseif(表達(dá)式2)
語句2;elseif(表達(dá)式3)
語句3;...else
語句n#include<stdio.h>voidmain(){intscore;chargrade;scanf(“%d”,&score);if(score>94)grade=‘5’;elseif(score>79)grade=‘4’;elseif(score>59)grade=‘3’;elsegrade=‘2’;printf(“%d\n”,grade);}開關(guān)語句switch(變量){
case常量1:
語句1或空;case常量2:
語句2或空;...case常量n:
語句n或空;default:
語句n+1或空;}注意:
判斷case后面的表達(dá)式和switch后面的表達(dá)式是否相匹配,一旦case匹配,就會順序執(zhí)行后面的程序代碼,而不管后面的case是否匹配,直到遇見break。#include<reg52.h>#include<stdio.h>voidmain(void){intmonth;intday;printf(“pleaseinputthemonthnumber:”);scanf(“%d”,&month);switch(month){
case1:case3:case5:case7:case8:case10:case12:day=31;break;case4:case6:case9:
case11:day=30;break;case2:day=28;break;default:day=-1;}if(day==-1)printf(“Invalidmonthinput!\n”);elseprintf(“2015.%dhas%ddays\n”,month,day);while(1){}}跳轉(zhuǎn)語句1.break語句
常用在循環(huán)語句和開關(guān)語句中。當(dāng)用在switch中,可使程序跳出switch而執(zhí)行switch以后的語句,否則將成為死循環(huán)而無法退出。
當(dāng)用于do-while、for、while循環(huán)語句中,可使程序終止循環(huán)而執(zhí)行循環(huán)后的語句。常與if語句連在一起,即滿足條件則跳出循環(huán)。#include<stdio.h>voidmain(void){inti=0;charc;while(1){c=‘\0’;while(c!=13&&c!=27){c=getchar();printf(“%c\n”,c);}if(c==27)break;i++;printf(“TheNo.is%d\n”,i);}printf(“Theend”);}
輸入一字符并顯示,回車后顯示出輸入的字符數(shù);當(dāng)按ESC時(shí)結(jié)束字符輸入同時(shí)輸出Theendgetchar()getchar時(shí),程序就等著用戶按鍵.用戶輸入的字符被存放在鍵盤緩沖區(qū)中.直到用戶按回車為止(回車字符也放在緩沖區(qū)中).當(dāng)用戶鍵入回車之后,getchar才開始從鍵盤緩沖區(qū)中每次讀入一個(gè)字符.getchar函數(shù)的返回值是用戶輸入的字符的ASCII碼2.continue語句
continue語句的作用是跳過循環(huán)體中剩余的語句而強(qiáng)行執(zhí)行下一次循環(huán)
continue語句只用在for、while、do-while等循環(huán)體中,常與if條件語句一起使用加速循環(huán)voidmain(void){charc;while(c!=0X0D){c=getchar();if(c==0X1B)continue;printf(“%c\n”,c);}}
輸入一字符并輸出該字符,按Enter則結(jié)束輸入,如按ESC則重新輸入不顯示。3.goto語句
goto語句是一種無條件轉(zhuǎn)移語句
用法:goto標(biāo)號;
常與if條件語句連用,當(dāng)滿足某一條件,程序調(diào)到標(biāo)號處運(yùn)行。
標(biāo)號必須與goto同處于一個(gè)函數(shù)中,但可不在一個(gè)循環(huán)層中。#include<stdio.h>voidmain(void){inti=0;charc;while(1){c=‘\0’;while(c!=13){c=getchar();if(c==27)gotoquit;printf(“%c\n”,c);}i++;printf(“TheNo.is%d\n”,i);}quit:printf(“Theend”)}
循環(huán)語句for(<初始化>;<條件表達(dá)式>;<增量>)1.for語句2.while語句while(條件)
語句;3.do-while語句do
語句;while(條件)#include<stdio.h>voidmain(void){inti,j,k;printf(“ijk\n”);for(i=0;i<2;i++)for(j=0;j<2;j++)for(k=0;k<2;k++)printf(“%d%d%d\n”,i,j,k);}
ijk000001010011100101110111C51程序由主函數(shù)(唯一和程序的開始)和若干子函數(shù)構(gòu)成。3.3C51的函數(shù)C51函數(shù)函數(shù)的說明庫函數(shù)自定義函數(shù)系統(tǒng)提供若干頭文件分類實(shí)現(xiàn)系統(tǒng)提供的庫函數(shù)用戶自定義的函數(shù)主函數(shù)中聲明被調(diào)用子函數(shù)子函數(shù)開頭聲明注:中斷處理子程序在主程序中無需聲明C51語言中,函數(shù)的定義形式為:3.3.1C51函數(shù)定義
當(dāng)函數(shù)沒有返回值時(shí),要用關(guān)鍵字void明確說明。形式參數(shù)的類型要明確說明,對無形參的函數(shù),括號也要保留返回值類型函數(shù)名(形參列表)[編譯模式][reentrant][interruptn][usingn]{
函數(shù)體}例:延時(shí)毫秒函數(shù)示例(晶振11.0592MHz)voidDelayMs(unsignedintn)//延時(shí)函數(shù){unsignedcharj;while(n--){for(j=0;j<113;j++);}}
編譯模式:指定函數(shù)中局部變量和參數(shù)的存儲空間3.3.2C51函數(shù)定義的選項(xiàng)reentrant(定義重入函數(shù))SMALL模式:默認(rèn)變量在片內(nèi)RAMCOMPACT模式:默認(rèn)變量在片外RAM的頁內(nèi)LARGE模式:默認(rèn)變量在片外RAM的64KB范圍如果函數(shù)是可重入的,當(dāng)該函數(shù)正在被執(zhí)行時(shí),可以再次被調(diào)用(遞歸使用)C51函數(shù)默認(rèn)是不可重入的interruptn(定義中斷函數(shù))
中斷函數(shù)使用中要注意:中斷函數(shù)不能帶有參數(shù),也沒有返回值被中斷函數(shù)調(diào)用的函數(shù)的工作寄存器組應(yīng)與中斷函數(shù)工作寄存器組相同中斷源外中斷0定時(shí)器0外中斷1定時(shí)器1串行口定時(shí)器2中斷號012345usingn(確定中斷服務(wù)函數(shù)所使用的工作寄存器組)
n為工作寄存器組號,取值為0~3.指定后所有被中斷調(diào)用的函數(shù)都必須使用同一寄存器組。不設(shè)定時(shí),編譯系統(tǒng)會將當(dāng)前工作寄存器組8個(gè)寄存器入棧例:中斷函數(shù)定義示例#include<reg51.h>sbitP10=P1^0voidmain(void){P10=0;EX0=1EA=1;}voidEx0_Isr(void)interrupt0//延時(shí)函數(shù){P10=!P10;//對P1^0位取反}3.3.3C51的庫函數(shù)
數(shù)學(xué)運(yùn)算庫函數(shù)的參數(shù)和返回值類型為float字符屬性判斷類庫函數(shù)返回值類型由int調(diào)整為bit一些函數(shù)的參數(shù)和返回值類型由有符號定點(diǎn)數(shù)調(diào)整為無符號定點(diǎn)數(shù)見附錄C.2
main函數(shù)
主函數(shù)是一個(gè)特殊函數(shù),每個(gè)C51程序都必須有main函數(shù),程序從這里開始執(zhí)行。兩種正式原型+非正式形式intmain(void)intmain(intargc,char*argv[])//argc表示被調(diào)用程序所帶命令行參數(shù)的數(shù)目,argv指針數(shù)組,元素指向包含命令行參數(shù)的字符串
返回值作用是向系統(tǒng)返回一狀態(tài)碼對于單一程序采用非標(biāo)準(zhǔn)形式voidmain(void)intmain(intargc,char*argv[])函數(shù)的調(diào)用和返回
函數(shù)的簡單調(diào)用。C51調(diào)用函數(shù)時(shí)直接使用函數(shù)名和實(shí)參的方法。#include<stdio.h>intmaxmum(intx,inty,intz);intmain(){inti,j,k;printf(“i,j,k=?\n”);scanf(“%4d%4d%4d”,&i,&j,&k);max=maxmum(i,j,k);printf(“Themaxmumvalueofthe3datais%d\n”,max);getchar();return0}}intmaxmum(intx,inty,intz);{intmax;max=x>y?x:y;max=max>z?max:z;returnmaxC51用全程變量實(shí)現(xiàn)參數(shù)互傳#include<stdio.h>voiddisp(void);intm[10];intmain(){inti;printf(“Inmainbeforecalling\n”);for(i=0;i<10;i++){m[i]=i;printf(“%3d”,m[i]);}disp();printf(“Inmainaftercalling\n”);for(i=0;i<10;i++)printf(“%3d,m[i]”);getchar()return0}voiddisp(void);{intj;printf(insubfuncaftercalling\n)for(j=0;j<10;j++){m[j]=m[j]*10;printf(“%3d”,m[j]);}}80C51人機(jī)接口技術(shù)并行接口I/O4.1LED、數(shù)碼管接口技術(shù)單片機(jī)基本應(yīng)用系統(tǒng)常使用發(fā)光二極管LED或數(shù)碼管顯示系統(tǒng)的運(yùn)行信息使用鍵盤或按鍵輸入控制信息系統(tǒng)的設(shè)計(jì)需考慮口的驅(qū)動能力
決定與單片機(jī)系統(tǒng)元件的參數(shù)設(shè)計(jì)輸出電流與灌電流4.1.1LED接口LED是單片機(jī)常用輸出設(shè)備
結(jié)壓降1.75V,結(jié)電流10mA單個(gè)LEDLED陣列多個(gè)Led驅(qū)動,常以共陰極或共陽極形式工作#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineDataPortP0sbit
P21=P2^1;ucharcodeScanCode[]=//LED燈位掃描碼{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};voidDelayMs(uintn){
ucharj;wile(n--)//延時(shí)子程序{for(j=0;j<113;j++);}}voidmain(){
uchar
i;P21=1;while(1){for(i=0;i<8;i++){
DataPort=ScanCode[i];
DelayMs(500);}for(i=0;i<8;i++){
DataPort=ScanCode[7-i];
DelayMs(500);}}}多左右循環(huán)移動流水燈功能的實(shí)現(xiàn)間隔0.5S4.1.2七段數(shù)碼管
接口#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeSegCode[]={0xc0,0xf9,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44569.1-2024土工合成材料內(nèi)部節(jié)點(diǎn)強(qiáng)度的測定第1部分:土工格室
- 橋梁建筑工程合同書
- 來料加工終止協(xié)議書模板
- 工地安全監(jiān)控系統(tǒng)安裝合同
- 工程建設(shè)招標(biāo)投標(biāo)合同(投標(biāo)保函樣本)
- 代理合同參考樣式
- 2024年度股票托管委托協(xié)議書
- 地質(zhì)勘探合同
- 獨(dú)家代理合作協(xié)議范例
- 碎石運(yùn)輸合同協(xié)議2024年
- 會展概論-來逢波-習(xí)題答案
- 三 《聯(lián)系生活實(shí)際 弘揚(yáng)工匠精神》(教學(xué)設(shè)計(jì))-【中職專用】高二語文精講課堂(高教版2023·職業(yè)模塊)
- 數(shù)據(jù)安全與隱私保護(hù)方案
- 2023年版《中國泌尿外科疾病診斷治療指南》
- 關(guān)于課程與教材建設(shè)的研究報(bào)告
- 2022年火力發(fā)電廠焊接技術(shù)規(guī)程-電力焊接規(guī)程
- 淺談2022版新課標(biāo)第三學(xué)段表達(dá)與交流
- 安全生產(chǎn)風(fēng)險(xiǎn)分級管控與隱患排查治理雙重預(yù)防體系建設(shè)資料匯編全套
- 三明醫(yī)改績效工資方案(5篇)
- 電動汽車技術(shù)課件:電動汽車的基本結(jié)構(gòu)與工作原理
- 2023年云南楚雄市事業(yè)單位選調(diào)工作人員筆試參考題庫(共500題)答案詳解版
評論
0/150
提交評論