第三章_pic單片機(jī)指令系統(tǒng)_第1頁
已閱讀1頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)原理與應(yīng)用,童亮,聯(lián)系電話:13051775070,Email:Tongliang@tsinghua.org.cn,北京信息科技大學(xué)機(jī)電工程學(xué)院車輛工程教研室,PIC單片機(jī)指令系統(tǒng)及編程技術(shù),指令系統(tǒng)概述匯編語言程序設(shè)計PIC 匯編語言的偽指令PIC C語言編程,一、指令系統(tǒng)概述,1.機(jī)器指令的表示方法指令用于規(guī)定計算機(jī)的基本操作。一臺計算機(jī)所能執(zhí)行的指令集合就是它的指令系統(tǒng)。指令共有兩種表示方法,分別是機(jī)器語言表示方

2、法和匯編語言表示方法。不同種類的單片機(jī)有不同的一套命令(即所謂“指令系統(tǒng)”)。,2.匯編語言的表示方法 匯編語言是對機(jī)器語言的改進(jìn),它采用便于人們記憶的一些符號(例如簡化的英文單詞)來表示操作碼、操作數(shù)和地址碼等。通常把表示指令的符號稱之為助記符。 001 MOVF 20H,0;將20H寄存器內(nèi)容送到W寄存器(d=0)或F寄存器(d=1) 002 ANDLW 0FH;將立即數(shù)0FH與W中內(nèi)容相與,結(jié)果送W 003 MOV

3、WF 21H;將W中的內(nèi)容送F寄存器 004 ADDLW 35H;W中的值與立即數(shù)35H相加后送W寄存器,一、指令系統(tǒng)概述,一、指令系統(tǒng)概述,3、PIC16F87X單片機(jī)指令 PIC16F87X單片機(jī)采用精簡指令集(RISC)結(jié)構(gòu),指令效率高,功能強(qiáng)。它的指令為單字的寬字位(14)指令,由此生成的程序代碼短。指令條數(shù)少,僅有35條。(1)面向字節(jié)操作類(2)面向位操作類(3)常數(shù)操作和控制類操作。,PIC單片機(jī)指令的尋址

4、方式,1.寄存器間接尋址 所謂寄存器間接尋址指的是通過寄存器F0、F4來實(shí)現(xiàn)。實(shí)際的寄存器地址放在F4的低5位中,通過F0來進(jìn)行間接尋址。INDF不是物理上實(shí)際存在的寄存器,而任何尋址INDF的指令都是以FSR寄存器內(nèi)容為地址的RAM單元中存放著參加運(yùn)算或操作的數(shù)據(jù)。,2.立即數(shù)尋址,所謂立即尋址就是操作數(shù)在指令中直接給出。通常把出現(xiàn)在指令中的操作數(shù)稱之為立即數(shù),因此就把這種尋址方式稱之為立即尋址。,PIC單片機(jī)指令的尋址方式,3.

5、直接尋址,指令中操作數(shù)以其所在存儲單元地址的形式給出,就稱之為直接尋址。這種方式是對任何一寄存器直接尋址訪問。,PIC單片機(jī)指令的尋址方式,4.位尋址,這種尋址方式是對寄存器中的任一位(bit)進(jìn)行操作,PIC單片機(jī)指令的尋址方式,1、PIC匯編語言指令格式PIC系列微控制器匯編語言指令與MCS-51系列單片機(jī)匯編語言一樣,每條匯編語言指令由4個部分組成,其書寫格式如下:標(biāo)號 操作碼助記符 操作數(shù)1,操作數(shù)2;注釋001 MOV

6、F 20H,0;將20H寄存器內(nèi)容送到W寄存器(d=0)或F寄存器(d=1)002 ANDLW 0FH;將立即數(shù)0FH與W中內(nèi)容相與,結(jié)果送W003 MOVWF 21H;將W中的內(nèi)容送F寄存器004 ADDLW 35H;W中的值與立即數(shù)35H相加后送W寄存器,一、指令系統(tǒng)概述,,,,,,一、指令系統(tǒng)概述,2.指令符號的意義說明在PIC系列單片機(jī)指令中常把數(shù)據(jù)存儲器RAM當(dāng)作寄存器來使用(處理)并用字母f(或F)表示。d代表操作

7、數(shù)的目標(biāo)選擇,定義d=0,結(jié)果存入W;d=1結(jié)果存入(文件)寄存器f,當(dāng)使用匯編程序指令d缺省時,默認(rèn)d=1。b代表(文件)寄存器(8位)的位地址(0~7取值)。如寄存器的8位為b7、b6……b1、b0,若b=1代表寄存器的第b1位。字母符號k代表立即數(shù)、常數(shù)和數(shù)據(jù)標(biāo)號。,一、指令系統(tǒng)概述,二、匯編語言程序設(shè)計,1.匯編語言源程序的結(jié)構(gòu) 匯編語言提供了一種不涉及實(shí)際存儲器地址和機(jī)器指令編碼的編寫源程序的有效方法。 需要掌握

8、的是: 匯編語言的程序格式、語句格式、助記符、偽指令。 程序的4種基本結(jié)構(gòu):順序、分支、循環(huán)和子程序。,二、匯編語言程序設(shè)計,2.PIC 匯編語言的程序流程圖,三、PIC 匯編語言的偽指令,用來編寫匯編語言源程序的語句,主要是指令助記符,其次就是偽指令。所謂偽指令就是“假”指令的意思,不是單片機(jī)的指令系統(tǒng)中的真實(shí)指令。偽指令與指令系統(tǒng)中的助記符的不同之處是沒有機(jī)器碼與它對應(yīng)。,三、PIC 匯編語言的偽指令,1.INCLUDE

9、功能: 讀入外部源文件格式:INCLUDE 說明:用于把指定文件讀入源程序中作為源程序代碼的一部分。文件名必須用雙引號或尖括號給出,如果被指定文件非當(dāng)前工作目錄下,則需要指令完整的路徑。 #INCLUDE “P16f877A.INC” #INCLUDE ,三、PIC 匯編語言的偽指令,2.EQU 功能:對標(biāo)號賦值格式: EQU 說明:使EQU 兩端的8位值相等,即給標(biāo)號賦予一個特定值或者說是給

10、標(biāo)號定義一個數(shù)值。BCD EQU 20HBIN EQU 21H,三、PIC 匯編語言的偽指令,3.#DEFINE 功能:定義文本替換標(biāo)號格式:#DEFINE[]說明:用于定義文本替換標(biāo)號,在匯編時把源代碼中的替換成。#DEFINE TL Tongliang,三、PIC 匯編語言的偽指令,4.ORG 功能: 存放程序單元的起始地址格式:[標(biāo)號] ORG 說明:用于指定該偽指令后面的源程序存放的起始地址,也就是匯編后的機(jī)器

11、碼目標(biāo)程序在單片機(jī)的程序存儲器中開始存放的首地址。 ORG 0x00ORG 04H,三、PIC 匯編語言的偽指令,5.END 功能:程序結(jié)束偽指令格式:END 說明:這條偽指令通知匯編器MPASM結(jié)束對源程序(.ASM)的匯編,即使在后面還有語句,也將不予繼續(xù)匯編。,例子:點(diǎn)亮RC0口的一個LED,status equ 3h ;定義狀態(tài)寄存器地址 portc equ 7h ;定義端口C的數(shù)據(jù)寄存器地址

12、 trisc equ 87h ;定義端口C的方向控制寄存器地址 ;******************************** org 0x00h ;定義程序存放區(qū)域的起始地址 nop ;放置一條ICD必須的空操用指令 org 0x10;重新定位 goto main ;轉(zhuǎn)向執(zhí)行程序main bsf status,5 ;設(shè)置文件寄存器的體1

13、 movlw 00h ;對端口C的方向控制碼00H先送W movwf trisc ;再由W轉(zhuǎn)移到方向控制寄存器 bcf status,5 ;恢復(fù)到文件寄存器體0 movlw 01h ;將00000001B先送W movwf portc ;再由W轉(zhuǎn)移到數(shù)據(jù)寄存器 送RC0口高電平,點(diǎn)亮LED goto $ ;讓程序在本指令循環(huán) end,C語

14、言,#include main(){ TRISC=0X00;/*TRISC寄存器被賦值,PORTC每一位都為輸出*/ while(1); /*循環(huán)執(zhí)行點(diǎn)亮發(fā)光二極管的語句*/{PORTC=0X01;/*向PORTC送數(shù)據(jù),點(diǎn)亮LED*/ }},點(diǎn)亮一個LED并持續(xù)3秒后熄滅,status equ 3h ;定義狀態(tài)寄存器地址 portc equ 7h ;定義端口C的數(shù)據(jù)寄

15、存器地址 trisc equ 87h ;定義端口C的方向控制寄存器地址 ;******************************** org 000h ;定義程序存放區(qū)域的起始地址 nop ;放置一條ICD必須的空操用指令 org 0x10; goto main;main bsf status,5 ;設(shè)置文件寄存器的體1

16、 movlw 00h ;對端口C的方向控制碼00H先送W movwf trisc ;再由W轉(zhuǎn)移到方向控制寄存器 bcf status,5 ;恢復(fù)到文件寄存器體0 movlw 01h ;將00000001B先送W movwf portc ;再由W轉(zhuǎn)移到數(shù)據(jù)寄存器,讓RC0輸出高電平點(diǎn)亮LED call delay ;調(diào)用廷時子程序 bcf p

17、ortc,0 ;熄滅LED goto $ ;原地循環(huán),3秒鐘循環(huán)點(diǎn)亮和熄滅如何操作,?,;-------------------------廷時子程序----------------------delay ;子程序名,也是子程序入口地址 movlw 0fh ;將外層循環(huán)參數(shù)值FFH經(jīng)過W movwf 20h ;送入用作外循環(huán)變量的20H單元lp0 movlw 0ffh ;將第二層循環(huán)參數(shù)值

18、FFH經(jīng)過W movwf 21h ;送入用作內(nèi)循環(huán)變量的21H單元lp1 movlw 0ffh ;將內(nèi)層循環(huán)參數(shù)值FFH經(jīng)過W movwf 22h ;送入用作內(nèi)循環(huán)變量的22H單元 lp2 decfsz 22h,1 ;變量22H內(nèi)容遞減,若為0跳躍 goto lp2 ;跳轉(zhuǎn)到LP2處 decfsz 21h,1 ;變量21H內(nèi)容遞減,若為0跳躍 goto lp1 ;跳躍到LP1處

19、 decfsz 20h,1 ;變量20H內(nèi)容遞減,若為0跳躍 goto lp0 ;跳躍到LP0處 retlw 0 ;返回主程序 end ;源程序結(jié)束,C語言,四、PIC C語言編程,Hitech-PICC: www.htsoft.comIAR: www.iar.comCCS: www.ccsinfo.com/picc.shtmlByteCraft:www.bytecraft.com/,

20、PIC 單片機(jī)的C 語言原程序基本框架,在程序的最前面用#include 預(yù)處理指令引用包含頭文件,其中必須包含一個編譯器提供的“pic.h”文件,實(shí)現(xiàn)單片機(jī)內(nèi)特殊寄存器和其它特殊符號的聲明;用“__CONFIG”預(yù)處理指令定義芯片的配置位;聲明本模塊內(nèi)被調(diào)用的所有函數(shù)的類型,PICC 將對所調(diào)用的函數(shù)進(jìn)行嚴(yán)格的類型匹配檢查;定義全局變量或符號替換;實(shí)現(xiàn)函數(shù)(子程序),特別注意main 函數(shù)必須是一個沒有返回的死循環(huán)。,C 語言

21、編程實(shí)例,#include //包含單片機(jī)內(nèi)部資源預(yù)定義#include “pic1687xa.h” //包含自定義頭文件//定義芯片工作時的配置位__CONFIG (HS & PROTECT & PWRTEN & WDTDIS);//聲明本模塊中所調(diào)用的函數(shù)類型void SetSFR(void);void Clock(void);void KeyScan(void);void Measure(

22、void);void LCD_Test(void);void LCD_Disp(unsigned char);//定義變量unsigned char second, minute, hour;bit flag1,flag2;,C 語言編程實(shí)例,//函數(shù)和子程序void main(void){SetSFR();PORTC = 0x00;TMR1H += TMR1H_CONST;LED1 = LED_OFF;

23、LCD_Test();//程序工作主循環(huán)while(1) {asm(“clrwdt”); //清看門狗Clock(); //更新時鐘KeyScan(); //掃描鍵盤Measure(); //數(shù)據(jù)測量SetSFR(); //刷新特殊功能寄存器}},PICC 中的基本變量類型,PICC 中的高級變量,數(shù)組:unsigned int data[10];結(jié)構(gòu):struct commInData

24、 {unsigned char inBuff[8];unsigned char getPtr; unsigned putPtr;};聯(lián)合:union int_Byte {unsigned char c[2];unsigned int i;};,PICC位操作,匯編中的位操作是很容易的。在C 中更簡單。C 的頭文件中已經(jīng)對所有

25、可能需要位操作的寄存器的每一位都有定義名稱: 如:PORTA 的每一個I/O 口定義為:RA0、RA1、RA2。。。RA7。 OPTION 的每一位定義為:PS0、PS1、PS2 、PSA 、T0SE、T0CS、INTEDG 、RBPU。 可以對其直接進(jìn)行運(yùn)算和附值。,PICC位操作,char x; x=x|0B00001000; /*對X 的4 位置1。*/char x; x=x&0

26、B11011111; /*對X 的5 位清0。*/#define bitset(var,bitno)(var|=1<<bitno) #define bitclr(var,bitno)(var&=~(1<<bitno)) 則上面的操作就是: char x; bitset(x,4) char x; bitclr(x,5),數(shù)據(jù)寄存器bank

27、 的管理,為了使編譯器產(chǎn)生最高效的機(jī)器碼,PICC 把單片機(jī)中數(shù)據(jù)寄存器的bank 問題交由編程員自己管理,因此在定義用戶變量時你必須自己決定這些變量具體放在哪一個bank 中。如果沒有特別指明,所定義的變量將被定位在bank0。bank1 unsigned char buffer[32]; //變量定位在bank1中bank2 bit flag1,flag2; //變量定位在bank2中bank3 float val[8]; /

28、/變量定位在bank3 中 unsigned char buffer[32]; bit flag1,flag2; float val[8];,,無BANK聲明則在BANK0,點(diǎn)亮RC0口的一個LED,status equ 3h ;定義狀態(tài)寄存器地址 portc equ 7h ;定義端口C的數(shù)據(jù)寄存器地址trisc equ 87h ;定義端口C的方向控制寄存器地址 ;***********************

29、*******************************org 000h ;定義程序存放區(qū)域的起始地址 nop ;放置一條ICD必須的空操用指令org 0x10;重新定位goto main ;轉(zhuǎn)向執(zhí)行程序main bsf status,5 ;設(shè)置文件寄存器的體1 movlw 00h ; 端口C的方向控制碼00H先送W movwf trisc ;再由W轉(zhuǎn)移到方向控制寄存器 bcf status,5 ;恢復(fù)到文

30、件寄存器體0 movlw 01h ;將00000001B先送W movwf portc ;再由W轉(zhuǎn)移到數(shù)據(jù)寄存器 送 RC0口高電平,點(diǎn)亮LED goto $ ;讓程序在本指令循環(huán)end,#include ; #include "pic168xa.h" //定義所用單片機(jī)的頭文件void main(){TRISC=0X00;WHILE(1){

31、PORTC=0x01;}},點(diǎn)亮一個LED并持續(xù)3秒后熄滅,status equ 3h ;定義狀態(tài)寄存器地址 portc equ 7h ;定義端口C數(shù)據(jù)寄存器地址 trisc equ 87h ;定義端口C的方向控制寄存器地址 ;*************************************************org 000h ;定義程序存放區(qū)域的起始地址 nop ;放置一條ICD必須的空操用指令o

32、rg 0x10; goto main;main bsf status,5 ;設(shè)置文件寄存器體1 movlw 00h ; 端口C方向控制碼00H先送W movwf trisc ; 由W轉(zhuǎn)移到方向控制寄存器 bcf status,5 ;恢復(fù)到文件寄存器體0 movlw 01h ;將00000001B先送W movwf portc ;再由W轉(zhuǎn)移到數(shù)據(jù)寄存器,讓 RC0輸出高電平點(diǎn)亮

33、LED call delay ;調(diào)用廷時子程序 bcf portc,0 ;熄滅LED goto $ ;原地循環(huán),;-------------------------廷時子程序----------------delay ;子程序名,也是子程序入口地址 movlw 0fh ;將外層循環(huán)參數(shù)值FFH經(jīng)過W movwf 20h ;送入用作外循環(huán)變量20H單元lp0 movlw 0ffh ;將第二層循環(huán)參數(shù)值

34、 FFH經(jīng)過W movwf 21h ;送入用作內(nèi)循環(huán)變量21H單元lp1 movlw 0ffh ; 內(nèi)層循環(huán)參數(shù)值FFH過Wmovwf 22h ;送入用作內(nèi)循環(huán)變量22H單元 lp2 decfsz 22h,1 ;變量22H內(nèi)容遞減,若 為0跳躍 goto lp2 ;跳轉(zhuǎn)到LP2處 decfsz 21h,1 ;變量21H內(nèi)容遞減

35、為0跳躍 goto lp1 ;跳躍到LP1處 decfsz 20h,1 ;變量20H內(nèi)容遞減為0跳躍 goto lp0 ;跳躍到LP0處 retlw 0 ;返回主程序 end ;源程序結(jié)束,#include ; #include "pic168xa.h" //定義所用單片機(jī)的頭文件void main(){TRISC=0X00; WHILE(1){PORTC=0x01;#as

36、mmovlw 0fh ;將外層循環(huán)參數(shù)值FFH經(jīng)過W movwf 20h ;送入用作外循環(huán)變量的20H單元lp0 movlw 0ffh ;將第二層循環(huán)參數(shù)值FFH經(jīng)W movwf 21h ;送入用作內(nèi)循環(huán)變量的21H單元lp1 movlw 0ffh ;將內(nèi)層循環(huán)參數(shù)值FFH經(jīng)過W movwf 22h ;送入用作內(nèi)循環(huán)變量的22H單元 lp2 decfsz 22h,1 ;變量22H內(nèi)容遞減,若為0跳躍

37、goto lp2 ;跳轉(zhuǎn)到LP2處 decfsz 21h,1 ;變量21H內(nèi)容遞減,若為0跳躍 goto lp1 ;跳躍到LP1處 decfsz 20h,1 ;變量20H內(nèi)容遞減,若為0跳躍 goto lp0 #endasmPORTC=0x00;}},C語言,用于令與PORTC口相連的8個發(fā)光二極管前4個點(diǎn)亮,后4個熄滅。PORTC輸出#includemain(){TRISC=0X00;/

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論