




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2008年12月16日C51單片機(jī)技術(shù)教程 田希暉 薛亮儒 人民郵電出版社第1 章 C51單片機(jī)的組成及結(jié)構(gòu)第2 章 C51單片機(jī)指令系統(tǒng)第3 章 單片機(jī)的C程序設(shè)計(jì)第4 章 C51單片機(jī)內(nèi)部資源第5 章 單片機(jī)的系統(tǒng)擴(kuò)展第6 章 單片機(jī)的機(jī)間通信第7 章 單片機(jī)人機(jī)交互的C編程第8 章 Keil C51上機(jī)指南第9 章 單片機(jī)系統(tǒng)綜合實(shí)例筆記 不是把所有知識(shí)點(diǎn)都記下。 而是 記那些需要學(xué)習(xí)的,或者總結(jié)得很好的東西。/指令系統(tǒng)的尋址方式和尋址空間序號(hào)尋址方式使用符號(hào)和變量尋址空間1立即數(shù)#data, #data16程序存儲(chǔ)器片內(nèi)片外64KB2直接direct或data, #data16內(nèi)部RA
2、M 128B 數(shù)據(jù)存儲(chǔ)器片外RAM64KB訪問SFR 的唯一方法3寄存器R0R7, A, B, Cy, DPTR片內(nèi)RAM 128B4寄存器間接R0, R1, SP片內(nèi)RAM 128BR0, R1, DPTR數(shù)據(jù)存儲(chǔ)器片外RAM64KB5相對(duì)PC+rel(偏移量)程序存儲(chǔ)器片內(nèi)片外64KB6變址A+DPTR, A+PC同上7位bit內(nèi)部RAM20H2FH,SFR內(nèi)部RAM數(shù)據(jù)傳送指令示意圖C51的數(shù)據(jù)類型1、基本類型、構(gòu)造類型、指針類型、空類型2、基本類型:位型bit、字符型char)、整型int、長(zhǎng)整型long、浮點(diǎn)型float、雙精度浮點(diǎn)型double)3、構(gòu)造類型:數(shù)組類型、結(jié)構(gòu)體、共用
3、體、枚舉C51系列單片機(jī)將int型變量的 高 位字節(jié)數(shù)存放在 低 地址字節(jié)中。浮點(diǎn)數(shù)存儲(chǔ)格式 IEEE754標(biāo)準(zhǔn)。24位精度,尾數(shù)的最高位始終為“1”,因而不保存,內(nèi)存中字節(jié)存儲(chǔ)順序 如下:1位符號(hào)位、8位指數(shù)位、23位尾數(shù)地址+0+1+2+3內(nèi)容MMMMEMMSEE其中, S符號(hào)位,E階碼,M尾數(shù)C51的變量的存儲(chǔ)類型存儲(chǔ)類型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪問速度快128Bbdata可位尋址片內(nèi),允許位與字節(jié)混合訪問16Bidata間接尋址片內(nèi),可訪問片內(nèi)全部RAM地址空間256Bpdata分頁尋址片外256Bxdata片外64KBcode程序存儲(chǔ)器64KB變量說明舉例
4、:data char var; / 字符變量var 定位在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)char code MSG="PARAMETER" / 字符數(shù)組MSG 定位在程序存儲(chǔ)區(qū)unsigned long xdata array100; / 無符號(hào)長(zhǎng)整型數(shù)組 定位在片外RAM區(qū)bit lock;unint xdata vector1044;sfr P0=0x80;char bdata flags;sbit flag0=flags0;指針變量說明舉例:long xdata *px; / 指針px指向long型 xdata區(qū),指針本身位于在默認(rèn)存儲(chǔ)區(qū),指針長(zhǎng)度為2Bchar xdata *dat
5、a pd; / 指針pd指向字符型 xdata區(qū), 自身在data區(qū), 長(zhǎng)度為2Bdata char xdata *pd; / 同上等效data int *pn; / 和int *data pn及intr *pn等效,定義一個(gè)類型為int型的通用型指針,指針本身在data區(qū),長(zhǎng)度為3B。說明:指針指向的存儲(chǔ)類型,即 指向哪個(gè)存儲(chǔ)區(qū)。 存儲(chǔ)類型的聲明位置在數(shù)據(jù)類型和指針名如*px)之間,如無此項(xiàng)聲明,則此指針型變量為通用型。 指針變量自身的存儲(chǔ)類型,即指針處于什么區(qū)與自身的長(zhǎng)度無關(guān),該聲明可位于聲明語句的開關(guān),也可在"*"和變量名之間。#include <reg51.h
6、> 特殊功能寄存器定義#include <absacc.h> 絕對(duì)地址定義位變量及其定義1、 位變量C51定義 一般語法格式:bit 位變量名; 如:bit lock_bit;2、 采用字節(jié)尋址變量.位 的方法。 如:bdata int ibase; sbit mybit=ibase15;3、 函數(shù)可包含類型為bit的參數(shù),也可將其作為返回值。 但注意,使用#pragma disable)或包含明確的寄存器組切換(using n)的函數(shù)不能返回位值。4、 對(duì)特殊功能寄存器的位的定義。例:#include <reg51.h>sbit P1_1=P11; / 無名位s
7、bit ac=ACC7; / 無名位RS1=1; RS0=0; / 有名位 sbit OV=0xD02;sbit CY=PSW7; 5、 對(duì)位變量定義的限制。位變量不能定義為指針、數(shù)組。<< 左移>> 邏輯右移 或 算術(shù)右移, 取決于電腦系統(tǒng)。/ 看懂下面的就很容易理解 頭文件<absacc.h>中的絕對(duì)地址訪問了。一般指針包括3字節(jié):2字節(jié)偏移和1字節(jié)存儲(chǔ)器類型:即地址+0+1+2內(nèi)容存儲(chǔ)器類型偏移量高位偏移量低位其中, 存儲(chǔ)器類型編碼如下:存儲(chǔ)器類型idataxdatapdatadatacode編碼值12345例,以xdata類型的0x1234地址作為指
8、針可以表示如下:地址+0+1+2內(nèi)容0x020x120x34常數(shù)作指針時(shí),必須注意正確定義存儲(chǔ)類型和偏移。 例:把常數(shù)0x40寫入地址為0x8000的外部數(shù)據(jù)存儲(chǔ)器。#define XBYTE ( (char *) 0x20000L )XBYTE0x8000=0x40;其中, XBYTE被定義為(char *)0x20000L, 0x20000L為一般指針,其存儲(chǔ)類型為2,偏移量為0x0000, 這樣XBYTE成為指向xdata零地址的指針,而XBYTE0x8000則是外部數(shù)據(jù)存儲(chǔ)器的0x80000絕對(duì)地址。/ 后面還有頭文件<absacc.h>中其化存儲(chǔ)區(qū)的絕對(duì)地址訪問定義共用體
9、變量可在不同時(shí)間內(nèi)保存不同類型和長(zhǎng)度的數(shù)據(jù),從而提供了在同一存儲(chǔ)單元中可以分時(shí)操作不同類型數(shù)據(jù)的功能。union Uuint word;struct uchar hi; uchar lo; bytes;union U newcount;unit oldcount;newcount.bytes.hi=TH1;newcount.bytes.lo=TL1;oldcount=newcount.word;這樣,定時(shí)器的計(jì)數(shù)值即可以按字節(jié)使用,也可以按字使用。函數(shù)“聲明”和“定義”:“定義”是指對(duì)函數(shù)功能確實(shí)定,包括指定函數(shù)名、函數(shù)值類型,形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位;而“聲明”
10、的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以使在調(diào)用該函數(shù)時(shí)系統(tǒng)按此對(duì)照檢查。函數(shù)指針 即函數(shù)入口地址。對(duì)用函數(shù)的指針變量調(diào)用函數(shù)可歸納為如下幾點(diǎn):(1) 指向函數(shù)的指針變量的一般定義形式為:函數(shù)值返回類型 *指針變量名函數(shù)形參表;(2) 在給函數(shù)指針變量賦值時(shí),只需給出函數(shù)名。(3) 對(duì)指向函數(shù)的指針變量進(jìn)行諸如p+n, p+, p-的運(yùn)算是沒有意義的。C51的庫函數(shù)1 字符函數(shù)庫 CTYPE.H extern bit F(char);其中,F(xiàn)可以為 isalpha/ isalnum/ iscntrl/ islower/ isupper/ isdigital e
11、xtern char F(char);其中,F(xiàn)可以為 toint/ toupper/ tolower2 標(biāo)準(zhǔn)函數(shù)庫 STDLIB.H extern T atoX(char *S); 其中,T可以是float/long/int,X與T對(duì)應(yīng)分別為f/l/i void *malloc(unsigned int size); / 申請(qǐng)內(nèi)存 void free(void *p); / 釋放內(nèi)存 void init mempool(void *p, unsigned int size); / 清零內(nèi)存區(qū)3 數(shù)學(xué)函數(shù)庫 MATH.H extern T abs(T val); 其中,T可以是float/lon
12、g/int/char extern float exp(float x); / e的指數(shù) extern float log/log10(float x); / e或10的對(duì)數(shù) extern float sqrt(float x); / 平方根 extern float sin/cos/tan(float x);/ 三角函數(shù) extern float pow(float x, float y); / x的y次方4 絕對(duì)地址訪問頭文件 ABSACC.H#define XBYTE( (unsigned char *) 0x20000L; PBYTE 3 DBYTE 4 CBYTE 5以上定義用來對(duì)C
13、51系列單片機(jī)的存儲(chǔ)空間進(jìn)行地址訪問,以字節(jié)為單位尋址。只需將BYTE換成WORD,就可以實(shí)現(xiàn)以字為單位尋址。5 內(nèi)部函數(shù)庫 INTRINS.H/ 將變量循環(huán)左/右移n位unsigned char _crol_(unsigned char val, unsigned char n); int _irol_ int long _lrol_ longunsigned char _cror_(unsigned char val, unsigned char n); int _iror_ int long _lror_ long/ 對(duì)應(yīng)匯編的NOP指令,延時(shí)一個(gè)機(jī)器周期void _nop_(void)
14、; / 測(cè)試給定的位參數(shù)x是否為1。假設(shè)為1,返回1,同時(shí)將該位復(fù)位為0;否則返回0。bit _testbit_(bit x);6 訪問SFR和SFR_bit地址頭文件REGxxx.H頭文件reg51.h、reg52.h等文件中定義了C51單片機(jī)中的SFR寄存器名和相關(guān)的位變量名。編程舉例循環(huán)隊(duì)列是一種FIFO存儲(chǔ)結(jié)構(gòu),在單片機(jī)應(yīng)用程序中經(jīng)常使用。隊(duì)列需要隊(duì)頭指針 listhead、隊(duì)尾指針listtail、隊(duì)列長(zhǎng)度listlen、隊(duì)列空標(biāo)志listempty和隊(duì)列滿標(biāo)志listfull。初始時(shí),listhead=listtail=0, listempty=listfull=0。需要定義兩個(gè)函
15、數(shù),操作隊(duì)列 listwrite()、listread()。iswrite()函數(shù)的操作思路:if(隊(duì)列滿 / 退出;else/ 將數(shù)據(jù)寫入listtail指向的數(shù)組單元listtail+;if(listtail=listlen)listtail=0;listempty=0;if(listhead=listtail) listfull=1;listread() / 函數(shù)的操作思路:if(隊(duì)列空 / 退出else/ 將listtail指向的數(shù)組單元的內(nèi)容讀出;listhead+;if(listhead=listlen)listhead=0;listfull=0;if(listtail=listh
16、ead)listempty=1;函數(shù)的實(shí)現(xiàn):#define listlen=10;unsigned char listlistlen;char listwrite(char x)if(listfullreturn 0;else/ 將數(shù)據(jù)寫入listtail指向的數(shù)組單元listtail+;if(listtail=listlen)listtail=0;listempty=0;if(listhead=listtail) listfull=1;return 1;char listread(char *x)if(listemptyreturn 0;else/ 將listtail指向的數(shù)組單元的內(nèi)容讀出
17、;listhead+;if(listhead=listlen)listhead=0;listfull=0;if(listtail=listhead)listempty=1;return 1;習(xí)題與思考:挑了幾個(gè)問答1. C語言中的類型是怎么分配的? 什么是賦值操作?2. C語言的函數(shù)有什么特性?函數(shù)的存儲(chǔ)類型和數(shù)據(jù)類型的意義是什么?3. 當(dāng)一個(gè)函數(shù)需要返回多個(gè)值時(shí),可以怎么做?4. 編寫把字符串s逆轉(zhuǎn)的函數(shù)reverse()5. 把上面的函數(shù)寫成遞歸函數(shù)。第4章 C51單片機(jī)的內(nèi)部資源重點(diǎn)及難點(diǎn)單片機(jī)中斷和定時(shí)與單片機(jī)通信的基本概念、單片機(jī)的中斷系統(tǒng)、單片機(jī)的定時(shí)/計(jì)數(shù)器、單片機(jī)外部中斷源的擴(kuò)
18、展、數(shù)據(jù)傳遞的方式、串行通信控制寄存器、MCS51串行通信工作方式及其應(yīng)用?;疽?. 掌握單片機(jī)中斷和定時(shí)與單片機(jī)通信的基本概念2. 掌握單片機(jī)的中斷源、中斷控制、中斷響應(yīng)過程的基本概念及單片機(jī)系統(tǒng)的功能和使用方法3. 掌握單片機(jī)的定時(shí)/計(jì)數(shù)器的初值計(jì)算、工作方式控制寄存器的初始化、程序的設(shè)計(jì)方法和步驟4. 串行通信的基本方式、數(shù)據(jù)傳送的次序、串行通信控制器的每一位的定義、串行通信的四種工作方式5. 了解單片機(jī)外部中斷源擴(kuò)展的常用方法和步驟教學(xué)內(nèi)容1、 中斷系統(tǒng)2、 定時(shí)/計(jì)數(shù)器3、 串行通信接口無條件傳送方式、程序查詢方式、中斷傳送方式中斷系統(tǒng):中斷的基本概念、中斷源、外部中斷、內(nèi)部中斷
19、、中斷入口地址中斷控制:TCON、IE、IP,SCON中斷控制寄存器匯總寄存器名稱D7D6D5D4D3D2D1D0定時(shí)/計(jì)數(shù)器TCON88HTF1TR1TF0TR0IE1IT1IE0IT0位地址略串行口控制寄存器SCON98HSM0SM1SM2RENTB8RB8TIRI位地址略中斷允許寄存器IEA8HEA/ESET1TX1ET0EX0位地址略中斷優(yōu)先級(jí)寄存器IPB8H/PSPT1PX1PT0PX0位地址略中斷響應(yīng):中斷響應(yīng)的條件、中斷響應(yīng)的過程、中斷響應(yīng)時(shí)間、中斷請(qǐng)求的撤銷、寄存器組切換/ 下面的話讓人暈 是他沒講清,還是我沒搞清呢 不要緊 看懂后面的就可以了。寄存器組切換,在匯編語言中由編程
20、者選擇。但對(duì)混合語言編程的連接器,匯編程序使用的組可被選定,因而連接器不能像普通存儲(chǔ)器那樣分配寄存器組。在C51中,寄存器組選擇取決于特定的編譯器指令。高優(yōu)先組中斷可以中斷正在處理的低優(yōu)先級(jí)程序,因而必須注意寄存器組。除非可以確定未使用R0R7用匯編程序,最好給每種優(yōu)先級(jí)程序分配不同的寄存器組。中斷不允許用于外部函數(shù),它對(duì)函數(shù)目標(biāo)代碼影響有收下幾點(diǎn):(1) 當(dāng)調(diào)用函數(shù)時(shí),SFR的ACC、B、DPH、DPL、PSW當(dāng)需要時(shí)入棧。(2) 如果不使用寄存器組切換,甚至中斷函數(shù)所需的所有工作寄存器都入棧。(3) 函數(shù)退出前,所有的寄存器內(nèi)容出棧。(4) 函數(shù)由8051的指令RETI終止。中斷服務(wù)程序使
21、用的任何程序也使用一寄存器組。 遞歸程序可以使用,它們自己調(diào)用自己是因?yàn)樗鼈円蕾嚩褩?。在中斷程序的編寫中?yīng)該注意以下幾點(diǎn):(1) 采用開中斷總控制開關(guān)EA置位中斷源的中斷允許位;(2) 對(duì)外部中斷INT0、INT1應(yīng)選擇中斷觸發(fā)方式;(3) 對(duì)于多個(gè)中斷源中斷,應(yīng)設(shè)定中斷優(yōu)先級(jí)和預(yù)置IP;(4) 編寫中斷服務(wù)程序應(yīng)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng),以免中斷返回時(shí)喪失原寄存器、累加器中的信息; 具體要保護(hù)哪些東西 視CPU中斷機(jī)制和需要而定(5) 假設(shè)要在掛靠當(dāng)前中斷程序時(shí)禁止更高優(yōu)先級(jí)中斷,可以采用軟件關(guān)CPU中斷或禁止某中斷源中斷,在中斷返回前再開放中斷。中斷服務(wù)程序的完整語法如下:返回值 函數(shù)名 參
22、數(shù)模式重入interrupt n using ndate:2008年12月17日要畫圖 ! 如果通用語言簡(jiǎn)述就好了,但要描述準(zhǔn)確哦。電腦畫圖麻煩。但要做筆記,還怕麻煩?EG:圖 P1.4P1.7接4個(gè)LED即發(fā)光二極管,P1.0P1.3接4個(gè)KEY即開關(guān),消抖電路用于產(chǎn)生中斷請(qǐng)求信號(hào),通過/INT0/ 負(fù)電平輸入不方便。 要求:開始時(shí)LED全黑;每中斷一次,開關(guān)狀態(tài)反映到LED上,且開關(guān)斷開時(shí)對(duì)應(yīng)LED亮。#include <reg51.h>sbit P1_0=P10;sbit P1_7=P17;unsigned char breaks;bit flag;void sevice_i
23、nt0()interrupt 0 using 2/ INT0中斷服務(wù)程序,使用第2組寄存器flag=1;/ 置標(biāo)志breaks=P1; / 存狀態(tài)void main()IP=0x01; / 置INT0高優(yōu)先級(jí)中斷IE0x81; / INT0開中斷, CPU開中斷for(;)if(flag) / 查詢方式P1_4=P1_0;P1_5=P1_1;P1_6=P1_2;P1_7=P1_3;flag=0; / 處理完成清除標(biāo)志4.3 定時(shí)/計(jì)數(shù)器不管是獨(dú)立的定時(shí)器芯片還是單片機(jī)內(nèi)的定時(shí)器都 有以下特點(diǎn):(1) 定時(shí)/計(jì)數(shù)有多種方式, 可以是計(jì)數(shù)方式也可以是定時(shí)方式。(2) 計(jì)數(shù)初值可設(shè)定,計(jì)數(shù)溢出時(shí)發(fā)出
24、中斷申請(qǐng)。51單片機(jī)有兩個(gè)加1計(jì)數(shù)器T0、T1。分別由兩個(gè)8位寄存器構(gòu)成。 由TMOD、TCON設(shè)定工作方式。 兩個(gè)定時(shí)器都有定時(shí)或事件計(jì)數(shù)功能,可用于定時(shí)控制、對(duì)外部事件計(jì)數(shù)和檢測(cè)等場(chǎng)合。1 定時(shí)工作方式計(jì)數(shù)機(jī)周期fosc/122 計(jì)數(shù)工作方式通過T0P3.4和T1P3.5對(duì)外部脈沖信號(hào)計(jì)數(shù)。當(dāng)檢測(cè)到下降沿時(shí),計(jì)數(shù)器加1.由于檢測(cè)一個(gè)1到0的跳變需要2個(gè)機(jī)器周期,故最高計(jì)數(shù)頻率為fosc/24。雖然對(duì)輸入信號(hào)占空比無特殊要求,但為了確保某個(gè)電平在變化之前至少被采樣一次要求電平保持時(shí)間至少是一個(gè)完整的機(jī)器周期。4.3.1 TCON和TMODTCON:TF1 TR1 TF0 TR0 IE1 IT
25、1 IE0 IT0TMOD:GATE C/T M1 M0 工作方式: 013位計(jì)數(shù)器低5位,高8位1 16位。2初值自動(dòng)重裝8位3 2個(gè)8位,僅適用于T0/ 下面描述得很好工作方式3下,T0被拆成2個(gè)獨(dú)立的8位計(jì)數(shù)器TL0和TH0。其中TL0即可以計(jì)數(shù)使用,又可以定時(shí)使用,使用T0的控制位和控制引腳信號(hào)。在方式3下,T0、T1的設(shè)置和使用是不同的。(1) T0方式3TL0:使用T0原有控制資源控制位和引腳信號(hào)TH0:借用T1的TR1、TF1,只能作8位定時(shí)器。(2) T0方式3下的T1T0方式3時(shí),T1仍然可工作于方式02. C/T控制位仍可使T1工作在定時(shí)器或計(jì)數(shù)器方式,只是由于其TR1、T
26、F1被T0的TH0占用,因而沒有計(jì)數(shù)溢出標(biāo)志可供使用,計(jì)數(shù)溢出時(shí)只能將輸出結(jié)果送到串行口,即用作串行口波特率發(fā)生器。 T0方式3下的T1方式2,因定時(shí)初值能自動(dòng)恢復(fù),用作波特率發(fā)生器更合適。定時(shí)/計(jì)數(shù)器的應(yīng)用實(shí)例EG:設(shè)單片機(jī)的fosc=12MHz, 要求在P1.0腳上輸出周期為2ms的方波。分析:周期為2ms的方波要求定時(shí)時(shí)間間隔1ms,每次時(shí)間到P1.0取反。定時(shí)器計(jì)數(shù)率fosc/12, 機(jī)器周期12/fosc1us計(jì)數(shù)次數(shù)1000/(12/fosc)1000/1=1000定時(shí)初值 -1000(1) 用定時(shí)器0的方式1編程,采用查詢方式#include <reg51.h>sbi
27、t P1_0=P10;void main()TMOD=0x01; / T0 方式1TR0=1;/ 啟動(dòng)T0for(;)TH0=-(1000/256);TL0=-(1000%256);while(!TF0); / 查詢等待TF0置位P1_0=!P1_0; / TF0=0; / 軟件清TF0(2) 用定時(shí)器0的方式1編程,采用中斷方式void include <reg51.h>sbit P1_0=P10;void timer0()interrupt 1 using 1P1_0=!P1_0; / TH0=-(1000/256);TL0=-(1000%256);void main()TMO
28、D=0x01;TH0=-(1000/256);TL0=-(1000%256);EA=1;ET0=1;TR0=1;dowhile(1);。EG:采用10MHz晶振,在P1.0腳上輸出周期為2.5s,占空比20%的脈沖信號(hào)。分析:由于采用10MHz晶振,使用定時(shí)器最大定時(shí)幾十ms。即10ms定時(shí),周期2.5s需要250次中斷,占空比20%,高電平應(yīng)為50次中斷。采用10ms定時(shí),晶振fosc=10MHz,因此需定時(shí)器計(jì)數(shù)次數(shù)8333#include <reg51.h>#define unchar unsigned charuchar time;/ 計(jì)數(shù)中斷次數(shù)uchar period=
29、250; / 周期為2.5s,中斷周期10ms, 250次uchar high=50; / 占空比20%void timer0()interrupt 1 using 1TH0=-8333/256;TL0=-8333%256;if(+time=high)P1=0;else if(time=period)time=0;P1=1;void main()TMOD=0x01;TH0=-8333/256;TL0=-8333%256;EA=1;ET0=1;TR0=1;while(1);。EG:設(shè)P1口的P1.0和P1.1上有2個(gè)開關(guān)S1和S2,周期開始時(shí)全關(guān)。 2s以后S1開,0.1s后S2開,S1保持開2
30、.0s,S2保持開2.4s,周而復(fù)始。 采用10MHz晶振。分析:根據(jù)要求,P1.0和P1.1開始順序?yàn)椋宏P(guān)關(guān)2s后關(guān)開0.1s后開開1.9s后開關(guān)0.5s后關(guān)關(guān)采用10MHz晶振,每10ms中斷一次,0.1s對(duì)應(yīng)10次,開關(guān)變化對(duì)應(yīng)的中斷次數(shù)位置為0、200、210、400、450;相應(yīng)的P1.0輸出0、1、3、2#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar i;/ 當(dāng)前狀態(tài)uint time;/ 中斷次數(shù)code struct int position;char patte
31、rn;next=/ 采用結(jié)構(gòu)數(shù)組定義時(shí)間和輸出的對(duì)應(yīng)關(guān)系0, 0X00, 200, 0X01, 210, 0X03, 400, 0X02, 450, 0XFF;void time0() interrupt 1 using 1TH0=-8333/256;TL0=-8333%256;time+;if(time=nexti.position)if(nexti.pattern=0xff) i=time=0; / 以0XFF判斷周期的結(jié)束P1=nexti+.pattern;void main()P1=0;time=0;i=1;TMOD=0x01;TH0=-8333/256;TL0=-8333%256;E
32、A=1;ET0=1;TR0=1;for(;)4.4 串行通信接口4.4.1串行通信基礎(chǔ)知識(shí)1. 數(shù)據(jù)通信的基本概念通信是指CPU與外圍設(shè)備之間的數(shù)據(jù)傳送、轉(zhuǎn)換和處理。數(shù)據(jù)通信方式有兩種:并行數(shù)據(jù)通信和串行數(shù)據(jù)通信。串行數(shù)據(jù)通信 是指數(shù)據(jù)按位順序進(jìn)行傳送的通信方式。其特點(diǎn)是數(shù)據(jù)傳送是一位一位進(jìn)行傳送的,最少只需要一根傳輸線即可完成,成本低但速度慢。并行數(shù)據(jù)通信 是指數(shù)據(jù)的各位同時(shí)進(jìn)行傳送的通信方式。其特點(diǎn)是各數(shù)據(jù)位同時(shí)傳送,傳送速度快、效率高。2. 異步通信和同步通信 異步串行通信 以字符為單位。/*串行異步傳送的字符格式*/ / 書上有,網(wǎng)上有,理解了才是實(shí)在。對(duì)異步串行通信 的字符格式 作如
33、下說明:起始位、數(shù)據(jù)位低位在前/左、奇偶校驗(yàn)位、停止位、空閑位 同步通信 收發(fā)時(shí)鐘同步,字符與字符之間沒有間隙,也不用起始位和停止位,僅在數(shù)據(jù)塊開始時(shí)用同步字符SYNC來指示。3. 串行通信的數(shù)據(jù)通路形式單工Simplex)形式、全雙工Full-duplex形式、半雙工Half-duplex)形式。4. 串行接口的基本任務(wù)在串行通信中,通信雙方都按通信協(xié)議進(jìn)行。 所謂通信協(xié)議 就是通信雙方必須共同遵守的一種約定,約定包括數(shù)據(jù)的格式、同步的方式、傳送的步驟、檢糾錯(cuò)方式及控制字符的定義等。串行接口的任務(wù)主要包括以下幾個(gè)方面。(1) 實(shí)現(xiàn)數(shù)據(jù)格式化(2) 進(jìn)行串、并轉(zhuǎn)換(3) 控制數(shù)據(jù)的傳輸速率(4
34、) 進(jìn)行傳送錯(cuò)誤檢測(cè)5. 波特率和接收/發(fā)送時(shí)鐘異步串行通信的傳送速率一般為509600波特,常用于電腦到CRT終端和字符打印機(jī)之間的通信、直通電報(bào)以及無線電通信的數(shù)據(jù)發(fā)送等。4.4.2 C51串行接口C51單片機(jī)有一個(gè)強(qiáng)編程的全雙工異步串行通信接口,它可作UART用,也可作同步移位寄存器,其幀格式可有8位、10位或11位,并能設(shè)置各種波特率,給使用者帶來很大的設(shè)計(jì)靈活性。1. 串行口寄存器結(jié)構(gòu) 2. 串行接口控制SBUFSCON:SM0 SM1 SM2 REM TB8 RB8 TI RIPCON:SMOD / / / GF1 GF0 PD IDL 由于PCON寄存器不能進(jìn)行位尋址,因此,表中
35、寫出的是“位序”而不是“位地址”3. 串行接口的工作方式方式0 8位同步移位寄存器,串行數(shù)據(jù)通過RXD輸入/輸出,TXD輸出移位時(shí)鐘脈沖。固定波特率fosc/12方式1 10位異步通信方式,1位起始位0、8位數(shù)據(jù)位和1位停止位1。方式2和3 9位異步通信接口,一幀信息由11位組成。多機(jī)通信4. 波特率的設(shè)計(jì)方式0、2波特率固定;方式1、3波特率由定時(shí)器T1的溢出率確定。(1) 方式0的波特率不受SMOD位的影響。 固定為fosc/12(2) 方式2的波特率2smod*fosc/64 (3) 方式1、3的波特率2smod*定時(shí)器T1的溢出率T1的溢出周期12/fosc*(M-X)5. 串行口初始
36、化(1) 串行口波特率串行口波特率常用于和微機(jī)的通信,選用晶振和波特率都相對(duì)固定。表串行口常用的波特率及相應(yīng)的設(shè)置串行口的常用波特率串行口工作方式波特率fosc=6MHzfosc=12MHzfosc=11.059MHzSMOD TMOD TH1SMOD TMOD TH1SMOD TMOD TH1方式01MHz× × ×方式2375k1 × ×187.5k1 × ×0 × ×方式1或方式362.5k1 20 FFH19.2k1 20 FDH9.6k0 20 FDH4.8k1 20 F3H0 20 FAH2.
37、4k1 20 F3H1 20 F3H0 20 F4H1.2k1 20 FFH0 20 E6H0 20 F8H6001 20 E6H0 20 CCH0 20 D0H3000 20 CCH0 20 98H0 20 A0H137.51 20 1DH0 20 1DH0 20 2EH1100 20 E6H0 10 FEEBH0 10 FEFFH(2) 初始化步驟 確定定時(shí)器T1的工作方式,即編程TMOD寄存器; 計(jì)算定時(shí)器T1的初值,即裝載TH1、TL1; 啟動(dòng)定時(shí)器T1,即編程TCON中的TR1位; 確定串行口的控制,即編程SCON; 串行口中中斷方式工作時(shí),須開CPU和源中斷,即編程IE寄存器。6.
38、 串行口的應(yīng)用編程 EG:?jiǎn)纹瑱C(jī)fosc=11.0592MHz,波特率9600, 各設(shè)置32個(gè)字節(jié)的隊(duì)列緩沖區(qū)用于發(fā)送接收。 設(shè)計(jì)單片機(jī)和終端或另一電腦通信的程序。分析:?jiǎn)纹瑱C(jī)串行口初始化為9600波特,中斷程序雙向處理字符,程序雙向緩沖字符。背景程序可以“放入”和“提取”在緩沖區(qū)的字符串,而實(shí)際傳入和傳出SBUF的動(dòng)作由中斷完成。Loadmsg函數(shù)加載緩沖數(shù)組,標(biāo)志發(fā)送開始。緩沖區(qū)分為發(fā)(t)和收(r)緩沖。緩沖區(qū)通過兩種指示進(jìn)in和出out和一些標(biāo)志滿full、空empty、完成done管理。隊(duì)列緩沖區(qū)32字節(jié)長(zhǎng)為循環(huán)隊(duì)列,由簡(jiǎn)單的邏輯與(&)操作管理,它比取模(%)操作運(yùn)行更快。
39、當(dāng)r_in=r_out接收緩沖(r_buf)區(qū)滿,不能再有字符插入;當(dāng)t_in=t_out,發(fā)送緩沖區(qū)(t_buf)空,發(fā)送中斷清除,停止UART請(qǐng)求。 具體程序如下:#include <reg51.h>#define uchar unsigned charuchar xdata r_buf32;/ 背景程序“放入”和“提取”字符的隊(duì)列緩沖區(qū)uchar xdata t_buf32;uchar r_in, r_out, t_in, t_out; / 隊(duì)列指針bit r_full, t_empty, t_done;/ 緩沖區(qū)狀態(tài)標(biāo)志code uchar m="this is
40、a test programrn"void serial() interrupt 4 using 1/*串行口中斷服務(wù)程序,從RI、TI判別接收或發(fā)送中斷,由軟件清除。判別緩沖區(qū)狀態(tài)滿full和空empty和全部發(fā)送完成(done);*/if(RI && !r_full)r_bufr_in=SBUF;RI=0;r_in=+r_in&0x1f;if(r_in=r_out)r_full=1;else if(TI && !t_empty)SBUF=t_buft_out;TI=0;t_out=+t_out&0x1f;if(t_out=t_in)
41、t_empty=1;else if(TI)TI=0;t_done=1;void loadmsg(uchar code *msg)/*此函數(shù)把字符放入發(fā)送緩沖區(qū),準(zhǔn)備發(fā)送*/while( (*msg!=0) && (t_in+1)t_out)&0x1f)!=0)/*測(cè)試緩沖區(qū)滿*/t_buft_in=*msg;msg+;t_in=+t_in&0x1f;if(t_done)TI=1;t_empty=t_done=0; /*假設(shè)完成重新開始*/void process(uchar ch)return;/*接收字符的處理程序,實(shí)際應(yīng)用自定義*/void processm
42、sg(void)/*此函數(shù)逐一處理接收緩沖區(qū)的字符*/while(r_out)+1)r_in)!=0)/*接收緩沖區(qū)非空*/process(r_bufr_out);r_out=+r_out&0x1f;void main()/*主程序即背景程序,進(jìn)行串行口的初始化、載入字符、處理接收的字符串。*/TMOD=0x20;/ T0 方式2TH1=0xfd;/ 9600波特 11.0592MHzTCON=0x40;/ 啟動(dòng)T1SCON=0x50;/ 允許接收IE=0x90;/ 允許串行口中斷t_empty=t_done=1;r_full=0;r_out=t_in=t_out=0;r_in=1;/
43、 接收緩沖區(qū)和發(fā)送緩沖區(qū)置空for(;)loadmsg(&m);/ &m ?processmsg();習(xí)題和思考題:1. C51系列單片機(jī)有幾個(gè)中斷源,各中斷標(biāo)志是如何產(chǎn)生的,又是如何清0的?CPU響應(yīng)中斷時(shí),它們的中斷矢量地址分別是多少?2. C51系列單片機(jī)有幾個(gè)中斷優(yōu)先級(jí)?如何設(shè)定?3. 設(shè)fosc=6MHz,外部中斷采用電平觸發(fā)方式,那么中斷請(qǐng)求信號(hào)的低電平至少應(yīng)持續(xù)多少us?4. 希望8051單片機(jī)定時(shí)器T0的定時(shí)值以內(nèi)部RAM的20H單元的內(nèi)容為條件而可變:當(dāng)20H00H時(shí),定時(shí)值為10ms;當(dāng)20H01H時(shí),定時(shí)值為20ms。請(qǐng)根據(jù)以上要求對(duì)定時(shí)器T0初始化。設(shè)f
44、osc=12MHz。5. 串行接口有哪幾種工作方式?各有什么特點(diǎn)?6. 假設(shè)異步通信接口按方式3傳送,已知每分鐘傳送3600個(gè)字符,其波特率是多少?C51單片機(jī)的系統(tǒng)擴(kuò)展重點(diǎn)與難點(diǎn)單片機(jī)系統(tǒng)擴(kuò)展的基本概念、程序存儲(chǔ)器擴(kuò)展、數(shù)據(jù)存儲(chǔ)器擴(kuò)展、I/O口擴(kuò)展?;疽?. 掌握單片機(jī)系統(tǒng)擴(kuò)展的基本概念2. 掌握程序存儲(chǔ)器擴(kuò)展方法3. 掌握數(shù)據(jù)存儲(chǔ)器擴(kuò)展方法4. 掌握常用擴(kuò)展芯片8255、8253、8155、I2C接口芯片24C02、SPI接口芯片X5045和單片機(jī)配置FPGA的使用方法本章內(nèi)容1. 系統(tǒng)擴(kuò)展概述2. 程序存儲(chǔ)器的擴(kuò)展3. 數(shù)據(jù)存儲(chǔ)器的擴(kuò)展4. 可編程外圍并行接口82555. 可編程外圍
45、定時(shí)器82536. 可編程并行接口芯片81557. I2C接口芯片AT24C018. SPI接口芯片X50459. 單片機(jī)配置FPGA5.1 系統(tǒng)擴(kuò)展概述1C51單片機(jī)的最小系統(tǒng)2系統(tǒng)擴(kuò)展結(jié)構(gòu):系統(tǒng)總線AB、DB、CB和總線構(gòu)造單片機(jī)沒有提供專用的地址線和數(shù)據(jù)線,而是采用I/O口線的復(fù)用技術(shù),把I/O口改造為總線“構(gòu)造”總線的具體方法包括以下幾個(gè)方面: 以P0口的8位口線作地址/數(shù)據(jù)線 以P2口的口線作高位地址線 控制信號(hào)線:使用ALE作地址鎖存的選通信號(hào),以實(shí)現(xiàn)低8位地址的鎖存;以/PSEN信號(hào)作擴(kuò)展程序存儲(chǔ)器的讀選通信號(hào);以/EA信號(hào)作內(nèi)外程序存儲(chǔ)器的選通信號(hào);以/RD和/WR作為擴(kuò)展數(shù)據(jù)
46、存儲(chǔ)器和I/O端口的讀寫選通信號(hào)。(3) 單片機(jī)的串行擴(kuò)展技術(shù)串行接口可以減少封裝引腳,降低成本,簡(jiǎn)體系統(tǒng)結(jié)構(gòu),增加系統(tǒng)擴(kuò)展的靈活性。5.1.3 C51單片機(jī)存儲(chǔ)器擴(kuò)展與編址技術(shù)1單片機(jī)存儲(chǔ)器系統(tǒng)圖單片機(jī)系統(tǒng)的存儲(chǔ)器結(jié)構(gòu)和存儲(chǔ)空間分配2擴(kuò)展存儲(chǔ)器編址技術(shù)線選法、譯碼法常用譯碼芯片有74LS139雙24譯碼器和74LS13838譯碼器等,它們的CMOS型芯片分別是74HC139和74HC138.5.2 程序存儲(chǔ)器的擴(kuò)展1. 單片程序存儲(chǔ)器擴(kuò)展EPROM是單片機(jī)最常選用的程序存儲(chǔ)器芯片,它是一種紫外線可擦除、電可編程的存儲(chǔ)器,最經(jīng)常使用是的27C系統(tǒng)的EPROM,如27C162K、27C324K、
47、27C648K、27C12816K、27C25632K,其芯片引腳如圖略 A0Ax、O0O8、/CE、/OE、Vcc、GND。 除了27C16和27C32為24腳外,其余均為28腳。 芯片型號(hào)的高兩位數(shù)字27表示EPROM,位數(shù)字表示存儲(chǔ)容量的Kbit值。2. 多片程序存儲(chǔ)器擴(kuò)展/ 這個(gè)很簡(jiǎn)單的5.2.2 擴(kuò)展E2PROME2PROM是一種電可編程的存儲(chǔ)器,最經(jīng)常使用的并口E2PROM有高壓編程的28C162K、28C172K和28C648K,低壓編程的28C16A2K、28C17A2K和28C64A8K等;最經(jīng)常使用的串口E2PROM有24C011K、24C022K、24C044K等,它們將
48、在5.7節(jié)中進(jìn)行介紹。其中,28C16和28C17都是2K的存儲(chǔ)器,它們的區(qū)別在于:一種有28個(gè)引腳,另一種只有24個(gè)引腳;另外28C17增加了一種檢測(cè)寫周期結(jié)束的方法,利用增加的引腳RDY/BUSY來表示寫操作何時(shí)完成。當(dāng)寫操作開始后,該引腳輸出為低電平,當(dāng)寫操作結(jié)束時(shí),該引腳輸出高電平,這樣通過該引腳的信號(hào)就可以指示與其接口的微處理器進(jìn)行合適的操作。當(dāng)使用E2PROM作為存儲(chǔ)器使用時(shí),它與CPU的接線和使用EPROM的擴(kuò)展接線非常相似,也是按照三總線的擴(kuò)展原則進(jìn)行接線,不同之處在于為了在線改寫,單片機(jī)的/WR端與E2PROM的/WE端相接。5.3 數(shù)據(jù)存儲(chǔ)器的擴(kuò)展隨機(jī)存儲(chǔ)器Random A
49、ccess Memory簡(jiǎn)稱為RAM,在單片機(jī)系統(tǒng)中用于存放可隨機(jī)修改的數(shù)據(jù),因此在單片機(jī)領(lǐng)域中也稱為數(shù)據(jù)存儲(chǔ)器。 按照半導(dǎo)體工藝,RAM分為MOS型和雙極型兩種,MOS集成度高、功耗低、價(jià)格廉價(jià),但速度慢,而雙極型的特點(diǎn)則正好相反。在單片機(jī)系統(tǒng)中使用的大多數(shù)是MOS型的RAM,它們的輸入輸出信號(hào)能與TTL相兼容,所以在擴(kuò)展信號(hào)連接時(shí)很方便。數(shù)據(jù)存儲(chǔ)器擴(kuò)展常使用RAM芯片,用得較多的是Intel公司的6116靜態(tài)RAM和6264。芯片引腳圖略, 6116引腳有D0D8,A0A10, /CE片選信號(hào),/WE寫選通信號(hào),/OE數(shù)據(jù)輸出允許信號(hào), Vcc,GND。 有 數(shù)據(jù)讀出、數(shù)據(jù)寫入、高阻 3種工作方式。單片數(shù)據(jù)存儲(chǔ)器擴(kuò)展多片數(shù)據(jù)存儲(chǔ)器擴(kuò)展5.4 可編程外圍并行接口8255A5.4.1 8255A的引腳功能和邏輯結(jié)構(gòu)8255A是可編程的并行I/O接口芯片,常用來實(shí)現(xiàn)C51系列單片機(jī)的并行I/O口擴(kuò)展
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生防疫王帥00課件
- T/BIKE 4-2019共享自行車鎖具
- 功能性飲料在2025年運(yùn)動(dòng)健身市場(chǎng)的品牌建設(shè)策略研究報(bào)告
- 長(zhǎng)期護(hù)理員崗位須知
- 2025年語言培訓(xùn)行業(yè)國(guó)際化課程體系構(gòu)建與實(shí)施報(bào)告
- 2025年工業(yè)互聯(lián)網(wǎng)平臺(tái)異構(gòu)數(shù)據(jù)庫融合在智能電網(wǎng)調(diào)度中的應(yīng)用報(bào)告
- 2025年老年教育課程設(shè)置與智能教學(xué)助手應(yīng)用報(bào)告
- 新生兒護(hù)理管理制度
- 胰腺炎健康教育科普
- 藥事管理與法規(guī):采購(gòu)與驗(yàn)收藥品
- 年產(chǎn)1000噸方便面工廠設(shè)計(jì)說明書
- 2024-2025學(xué)年數(shù)學(xué)滬科版七年級(jí)上冊(cè)期末綜合測(cè)試卷(四)(含答案)
- 2025年中考英語模擬試卷猜題卷(含答案)
- 基礎(chǔ)護(hù)理學(xué)選擇試題庫+答案
- 《人口與環(huán)境》課件
- 【MOOC】老子的人生智慧-東北大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 高血壓心臟病超聲
- 中南林業(yè)科技大學(xué)《Python程序設(shè)計(jì)實(shí)驗(yàn)》2021-2022學(xué)年期末試卷
- 麻醉科與患者安全溝通制度
- 2024年六年級(jí)道德與法治下冊(cè) 第三單元 多樣文明 多彩生活 7 多元文化 多樣魅力教案 新人教版
評(píng)論
0/150
提交評(píng)論