悟空彩票

時間:2019-08-14

  pic單片機,想必大家都比較熟悉。其中,pic單片機簡介、pic單片機優勢以及pic單片機不足等內容,皆是入門級知識。本文將向大家介紹pic單片機的高級應用——將pic單片機的數據存儲器RAM用作寄存器,本文存在一定難度,望大家用心研讀。
  PIC16C5X把数据存储器RAM都当作寄存器来使用以使寻址简单明洁,它们功能上可分为操作寄存器、I/O寄存器、通用寄存器和特殊功用寄存器。它们的组织结构如下图所示:这些寄存器用代号F0~F79来表示。F0~F4是操作寄存器,F5-F7是I /O寄存器,其余为通用寄存器。特殊功用寄存器地址对用户不透明。


  一、操作寄存器
  1、F0間址寄存器
  尋址F0實際上意味著間址尋址。實際地址爲寄存器選擇寄存器F4的內容。
  例: MOVLW 10
  MOVWF  f4    ;10→f4
  MOVLW  55
  MOVWF  f0    ;55→f10
  2、F1實時時鍾/計數寄存器(RTCC)
  此寄存器是一個8位計數器。和其他寄存器一樣可由程序進行讀寫操作。它用于對外加在RTCC引腳上的脈沖計數,或對內部時鍾計數(起定時器作用)。


  上圖中可看出RTCC工作狀態由OPTION寄存器控制,其中OPTION寄存器的RTS位用來選擇RTCC的計數信號源,當RTS爲“1”時,信號源爲內部時鍾,RTS爲“0”時,信號源爲來自RTCC引腳的外部信號。OPTION寄存器的PSA位控制預分頻器(Prescaler)分配對象,當PSA位爲“1”,8位可編程預分配給RTCC,即外部或內部信號經過預分頻器分頻後再輸出給RTCC。預分頻器的分頻比率由OPTION內的PS0~PS2決定。這時涉及寫f1(RTCC)寄存器的指令均同時將預分頻器清零。但要注意OPTION寄存器內容仍保持不變,即分配對象、分頻比率等均不變。OPTION的RTE位用于選擇外部計數脈沖觸發沿。當RTE爲“1”時爲下降沿觸發,爲“0”時爲上升沿觸發。
  RTCC計數器采用遞增方式計數,當計數至FFH時,在下一個計數發生後,將自動複零,重新開始計數,以此一直循環下去。RTCC對其輸入脈沖信號的響應延遲時間爲2個機器周期,不論輸入脈沖是內部時鍾、外部信號或是預分頻器的輸出。
  RTCC對外部信號的采樣周期爲2個振蕩周期。因此當不用預分頻器時,外加在RTCC引腳上的脈沖寬度不得小于2個振蕩周期,即1/2指令周期。同理,當使用預分頻器時,預分頻器的輸出脈
  沖周期不得小于指令周期,因此預分頻器最大輸入頻率可達N.fosc/4,N爲預分頻器的分頻比,但不得大于50MHz。
  当RTCC使用内部时钟信号时,如果没有预分频器,则RTCC值随指令节拍增1。 当一个值写入RTCC时,接下来的二个指令节拍RTCC的值不会改变,从第三个指令节拍才开始递增,见下图。


  應注意的是盡管PIC對外部加于RTCC信號端上的信號寬度沒有很嚴格的要求,但是如果高電平或低電平的維持時間太短,也有可能使RTCC檢測不到這個信號。一般要求信號寬度要大于是10nS。
  3、F2程序計數器(PC)
  程序計數器PC可尋址最多2K的程序存儲器。下表列出了PIC16C5X各種型號的PC長度和堆棧的長度。


  單片機一複位(RESET),F2的值全置爲“1”。除非執行地址跳轉指令,否則當執行一條指令後,F2(PC)值會動加1指向下一條指令。
  下面這些指令可能改變PC的值:
  a、“GOTO”指令。它可以直接寫(改變)PC的低9位。對于PIC16C56/57/58,狀態寄存器F3的PA1、PAO兩位將置入PC的最高二位。所示“GOTO”指令可以跳轉到程序存儲器的任何地方。
  b、“CALL”指令。它可以直接写PC 低8位,同时将PC的第9位清零。对于PIC16C56/57/58,状态寄存器F3的PA1、PAO两位将置入PC的最高二位(第10、11位)。
  c、“RETLW”指令。它把棧項(堆棧1)的值寫入PC。
  d、“MOVWF F2”指令。它把W寄存器的内容置入PC。
  e、“ADDWF F2”指令。它把PC值加1后再和W寄存器的值相加,结果写入PC。
  在以上b、d和e中,PC的第9位總是被清爲零。所以用這三條指令來産生程序跳轉時,要把子程序或分支程序放在每頁的上部地址(分別爲000-0FF、200-2FF、400-4FF、600-6FF)。
  4、F3狀態寄存器(STATUS)
  F3包含了ALU的算术状态、RESET状态、程序存储器页面地址等。F3中除PD和TO两位外,其他的位都可由指令来设置或清零。注意,当你执行一条欲改变F3 寄存器的指令后,F3中的情况可能出乎你的意料。
  例:CLRF F3 ;清F3为零
  你得到的結果是F3=000UU100(U爲未變)而不是想像中的全零。UU兩位是PD和TO,它們維持不變,而2位由于清零操作被置成“1”。所以如果你要想改變F3的內容,建議你使用BCF、BSF和MOVWF這三條指令,因爲它們的執行不影響其他狀態位。
  例:MOVLW 0;0→W
  MOVWF F3 ;把F3除PD和TO以外的位全部清零,则你可得到F3=000UU000。
  有關各條指令對狀態位的影響請看第二章介紹。
  在加法運算(ADDWF)時,C是進位位。在減法運算(SUBWF)時,C是借位的反(Borrow)。
  例:CLRF F10 ;F10=0
  MOVLW 1 ;1→W
  SUBWF F10 ;F10-W=0-1=FFH→F10
  C=0:運算結果爲負
  例:MOVLW 1 ;1→W
  MOVWF F10 ;F10=1
  CLRW ;W=0
  SUBWF F10 ;F10-W=1-0=1→F10
  C=1:運算結果爲正
  PD和TO兩位可用來判斷RESET的原因。例如判斷RESET是由芯片上電引起的,或是由看門狗WDT計時溢出引起的,或是複位端加低電平引起的,或是由WDT喚醒SLEEP引起的。
  表1.4列出了影響TO、PD位的事件。表1.5列出了在各種RESET後的TO、PD位狀態。
  判斷RESET從何處引起有時是很必要的。例如在對系統初始化時,經常需判斷這次複位是否是上電引起的。如果不是上電複位,則不再進行初始化。
  頁面選擇位PA1、PA0的作用前面已描述過,RESET時清PA0-PA2位爲零,所以複位後程序區頁面自動選擇在0頁。
  5、F4 寄存器选择寄存器(FSR)
  a、 PIC16C52/54/55/56
  F4的0-4位在間接尋址中用來選擇32個數據寄存器。5-7位爲只讀位,並恒爲1。請參考F0寄存器描述。
  b、PIC16C57/58
  FSR《6:5》位用來選擇當前數據寄存器體(Bank)。PIC16C57有80個數據寄存器,如圖1.4所示。80個寄存器分爲4個體(Bank0~Bank3),每個體的低16個寄存器的物理位置是相同的(參考§1.5.3通用寄存器的描述)。當FSR的第4位爲“1”時,則要根據FSR《6:5》位來選擇某個寄存器體中的某一個高16的寄存器。
  注意:當芯片上電複位時,FSR《6:5》是不定的,所以它可能指向任何一個Bank。而其他複位則保持原來的值不變。
  二、I/O 寄存器
  PIC16C52/54/56/58有二個I/O口RA、RB(F5、F6),PIC16C55/57有三個I/O口RA、RB、RC(F5、F6、F7)。與其它寄存器一樣,它們皆可由指令來讀寫。它們是可編程雙向I/O口,可由程序來編程確定每一根I/O端的輸入/輸出狀態。
  RESET後所有的I/O口都置成輸入態(等于高阻態),即I/O控制寄存器(TRISA、TRISB、TRISC)都被置成“1”。
  1、F5(A口)
  4位I/O口寄存器。只能使用其低4位。高4位永遠定義爲“0”。
  2、F6(B口)
  8位I/O口寄存器。
  3、F7(C口)對于PIC16C55/PIC16
  C57,它是一個8位I/O口寄存器。
  對于PIC16C54/56/58,它是一個通用寄存器。
  §1.5.3 通用寄存器
  PIC16C54/56:
  07H~1FH
  PIC16C55:
  08H~1FH
  PIC16C57/58:
  08H-0FH:共有通用寄存器(無須體選擇即可尋址)。
  10H-1FH:Bank0的通用寄存器
  20H-2FH:物理上等同于00H-0FH。
  30H-3FH:Bank1的通用寄存器
  40H-4FH:物理上等同于00H-0FH。
  50H-5FH:Bank2的通用寄存器
  60H-6FH:物理上等同于00H-0FH。
  70H-7FH:Bank3的通用寄存器。
  三、特殊功能寄存器
  1、工作寄存器(W)
  W用來存放兩操作數指令中的第二個操作數,或用以進行內部數據傳送。算術邏輯單元ALU把W和寄存器連接起來,ALU的運算結果通過總據總線可以送到W保存。
  2、I/O控制寄存器(TRISA、TRISB、TRISC)
  TRISA、TRISB、TRISC分别对应I/O口A、B、C。其中TRISA只有4位,和A口对应。执行“TRIS f”指令可把W的值置入I/O控制寄存器,以此来定义各I/O端的输入/输出态。当写入“1”时,将相应的I/O端置成输入态(高阻态),当写入“0”,则将相应的I/O端置成输出态。I/O控制寄存器都是只写寄存器,在RESET后自动置为全“1”,即所有I/O口都为输入态。
  3、預設倍數/RTCC選擇寄存器(OPTION)
  OPTION可用于:
  a、定義預分頻器的預分頻參數。
  b、分配預分頻器(Prescaler)給RTCC或WDT。注意預分頻器只能分配給RTCC或WDT其中之一使用,不能同時分配。
  c、定義RTCC的信號源。
  d、定義RTCC信號源的觸發沿(上升沿觸發或下降沿觸發)。
  当预分频器分配给RTCC后,所有写RTCC寄存器的指令如CLRF 1、MOVWF 1等都会清除预分频器。同理,分配给WDT时,诸如CLRWDT和SLEEP指令将清除预分频器里已有的值使其归零。
  通過執行“OPTION”指令可將W值置入OPTIOW寄存器,RESET後OPTION被置成全“1”。

上一篇:輸入側與輸出側電解電容如何計算?
下一篇:帶你計算一個電流互感器!

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技術資料