009第九章 类比数位转换器(Analog to Digital Converter) - 图文

更新时间:2024-06-30 17:00:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第九章 類比數位轉換器(Analog to Digital

Converter)

9-1、 簡介

任何一個物理量的值,都可以將它轉換為電壓的大小,此時便可以針對此物理量的值加以運算或儲存,而處理此值的電路可以分為數位(Digital)及類比(Analog)兩種系統,因此我們經常會處理類比信號與數位信號。在處理的過程中,有時會在兩種系統作轉換:數位到類比轉換器(Digital –To- Analog Converter;DAC、D∕A)是將數位信號轉為類比信號;而類比到數位轉換器(Analog –To- Digital Converter;ADC、A∕D)則是將類比信號轉為數位信號。

在實際的應用中,經常會將類比信號(如聲音、溫度)轉換為數位信號後再作處理。之所以要將類比信號轉換為數位信號是因為數位信號有如下的優點:

? 數位信號比較不易受到雜訊干擾

類比系統將類比信號直接作處理,若在處理的過程中有雜訊的干擾,例如我們將類比信號做放大,在放大的同時雜訊也會被放大,其放大的結果就可想而知了。數位信號是不具連續性的訊號。在數位系統中,所處理的信號通常以二進位編碼,0代表為低電壓(Low),1代表為高電壓(High),0與1之間會有一段距離可以容忍一些雜訊的干擾,使得數位系統可以在處理數位信號的時候,比較不易受到雜訊干擾,所以運算的結果也是比較穩定而精確的。

? 數位信號比較容易儲存

在儲存數位信號時,儲存的是一連串由1和0組合的數字,因此可以儲存數位信號的裝置很多,例如記憶體、磁碟機、光碟片、磁帶機,都可以儲存數位信號。而類比信號的儲存是將信號連續的振幅電壓儲存下來,因此目前可以看到的儲存媒體就只有錄音或錄影帶了。

? 數位信號比較容易處理

我們經常會對數位信號作處理,例如對信號做複製、修改、混合與分離等,這些處理對於數位系統而言只是對是對一連串的數字做運算,通常只要有一部電腦即可處理。而對於類比信號而言,就可能需要一些專用的設備,因此數位信號比類比信號容易處理。

~ 1 ~

在類比到數位的轉換(ADC)中有兩個重要的數值需要考慮:解析度(Resolution)及取樣率(Sampling Rate)。

解析度即為在經過數位轉換後所造成的量化誤差,因為在電腦中紀錄資料的位元組是有限的,例如以8Bit來記錄5V的電壓範圍,即:5/28=19.53mV,表示每個位元之間相差19.53 mV,因此解析度(Resolution)愈高表示轉換後所造成的誤差愈小。

取樣率簡單的說就是每秒鐘取樣數目,取樣的頻率愈高,未來類比波形重建的品質就會愈好,失真會愈小。一般而言,取樣率必須至少為兩倍欲觀察信號頻率大小,而濾波的截止頻率為二分之一取樣頻率─即Nyquist Frequency。但若是類比信號輸入的頻率增高,取樣頻率就要變得更高,如此數位系統所處理的速度就要增高,儲存取樣資料的記憶容量相對的也要變得更大,這些都是必須留意的地方。

~ 2 ~

9-2、 ET44M210的ADC

圖9-1:ET44M210的ADC功能

圖9-1為ET44M210中Analog –To- Digital Converter (ADC)的功能方塊圖。ET44M210中的ADC功能,它可以將輸入的類比信號轉換為10Bit的數位信號,並且可同時輸入16個類比信號,在同一個時間內會有一個輸入類比信號轉換為數位信號輸出。圖中左上角ADC0 ~ ADCF為16個輸入類比信號,經過一個 16→1 的類比開關,選擇其中一組類比輸入作為轉換器的輸入,轉換為數位信號。

ADC0 ~ ADCF為ET44M210的I/O埠接腳之一,當左下角的ADE除能(=0)時,ADC0 ~ ADCF 為一般的I/O埠。當左下角的ADE致能(=1)時,ADC0 ~ ADCF 為16類比信號輸入埠。當ADE致能(=1)時,左邊的IMS[0:2]暫存器可以控制哪些埠為類比信號輸入埠,哪些埠為一般的I/O埠。在不需要有這麼多的類比信號輸入時,可設定此暫存器以保留一些I/O埠給其他目的使用。

例如:當 IMS[0:2] 設為000時,

表示PORT E的Bit6及Bit7為類比信號輸入埠, 其他接腳則為為一般的I/O埠。

當類比信號輸入時,會連接到一個 16→1 的類比開關,此開關由AIPS[0:3] 暫存器控制,可選擇要將哪一個的類比信號轉換為數位信號。

~ 3 ~

圖中右邊為ADC的運算單元,當ADE致能(=1)時,ADC的運算功能就準備開始動作。ADC的運算單元左下方的CKR[0:2] 暫存器是控制ADC轉換的速率。當所有動作都準備就緒之後,ADC的運算單元右下方的ADRUN是控制是否開始動作,當ADRUN致能(=1)時,ADC的運算單元便開始將輸入的類比信號運算轉換為數位信號。

當運算結束之後,ADC的運算單元便將結果存於ADDATAH及ADDATAL之中,在寫入ADDATAH最後一個bit之後,這時會設定AD的中斷旗標ADIF通知MCU已經完成一個AD轉換,MCU可以將資料取走以便進行下一次的AD轉換。

JP11357911P1121X2X3X123456781Y2Y3Y5V1315171921232527293133353739VDD+C14.7UVI5V+C24.7U41434547246810121416182022242628303234363840424446485V 圖9-2:ET44M210實驗電路板ADC接腳

圖9-2所示為ET44M210實驗電路板ADC的接腳,它是以搖桿的方式連接到PORT E的Bit6與Bit7,也就是ADC的Channel 14與Channel 15。由於搖桿是連接到5V的電壓,因此在使用實驗電路板以搖桿模擬ADC的功能時,必須將另外一個USB線接上電腦,使用USB所提供的5V電源。如圖9-3所示。

~ 4 ~

圖9-3:ICE與電腦連接圖

~ 5 ~

9-3、 與ADC相關的暫存器

? 中斷旗標暫存器(Interrupt Flag Register) – INTF (0x11)

7 6 5 4 3 2 1 0 ADIF

RBFIF PWM1IF PWM0IF EINT1F EINT0F TCCOF FRCOF ? Bit 7 (ADIF): ADC中斷旗標:

當ADC轉換完成一筆資料時,中斷條件成立,此位元設為1。以軟體指令清除。

? The Converting Value of ADC – ADDATAH (0x1F) & ADDATAL (0x20)

ADDATAH: MSB Converting Value of ADC. 7 6 5 4 3 2 1 0 ADD9 ADD8 ADD7 ADD6 ADD5 ADD4 ADD3 ADD2 ADDATAL: LSB Converting Value of ADC. 7 6 5 4 ADD1 ADD0 - - 3 - 2 - 1 - 0 - 此暫存器儲存ADC轉換完成的資料。其中ADDATAH是ADC轉換完成資料高位元組,ADDATAL是ADC轉換完成資料低位元組。

? 週邊功能致能控制暫存器(Peripherals Enable Control) – PRIE (0x80)

7 6 5 4 3 2 1 0 SPIE USBE WME ADE PWM1E PWM0E TCCE FRCE 此暫存器控制是否啟用週邊功能。當設為0時,表示不啟用該週邊功能,當設為1時,表示啟用該週邊功能。 ? Bit 4 (ADE):

類比對數位轉換(ADC) 功能致能位元。

~ 6 ~

? ADC類比輸入選擇控制暫存器(ADC analog Input Pin Select) – ADCAIS (0x96)

7 6 5 4 3 2 1 0 - - IMS2 IMS1 IMS0 CKR2 CKR1 CKR0

? Bit 0 ~ Bit 2 (CKR0 ~ CKR2):AD conversion Rate control bits 此位元是設定ADC轉換的速率。 A/D Conversion Rate Unit: KHz CKR2: CKR1: Divided Rate 6MHz 12MHz 24MHz 48MHz CKR0 Clock Source Clock Source Clock Source Clock Source 000 ÷ 2 250 500 1000 2000 001 ÷ 4 125 250 500 1000 010 ÷ 8 62.5 125 250 500 011 ÷ 16 31.3 62.5 125 250 100 ÷ 32 15.6 31.3 62.5 125 101 ÷ 64 7.8 15.6 31.3 62.5 110 ÷ 128 3.9 7.8 15.6 31.3 111 ÷ 256 2.0 3.9 7.8 15.6

? Bit 3 ~ Bit 5 (IMS0~IMS2):ADC configuration definition bit 此位元是設定ADC類比輸入通道的組態。 IMS PTEPTEPTEPTEPTEPTEPTEPTEPTDPTDPTDPTDPTDPTDPTDPTD7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 000 A A D D D D D D D D D D D D D D 001 A A A A D D D D D D D D D D D D 010 A A A A A A D D D D D D D D D D 011 A A A A A A A A D D D D D D D D 100 A A A A A A A A A A D D D D D D 101 A A A A A A A A A A A A D D D D 110 A A A A A A A A A A A A A A D D 111 A A A A A A A A A A A A A A A A Note:A→類比輸入信號。 D→數位輸入(出)信號。

? Bit 5 ~ Bit 7:保留

~ 7 ~

? ADC組態控制暫存器(ADC Configuration Register) – ADCCR (0x97)

7 6 5 4 3 2 1 0 ADRUN ADIE - - AIPS3 AIPS2 AIPS1 AIPS0

? Bit 0 ~ Bit3 (AIPS0~AIPS3):Analog Input Select 此位元是設定ADC類比輸入通道的選擇。 0000 = AN0; 0001 = AN1; 0010 = AN2; 0011 = AN3; 0100 = AN4; 0101 = AN5; 0110 = AN6; 0111 = AN7; 1000 = AN8; 1001 = AN9; 1010 = ANA; 1011 = ANB; 1100 = ANC; 1101 = AND; 1110 = ANE; 1111 = ANF;

? Bit 6 (ADIE):ADC interrupt enable

此位元是設定ADC中斷功能致能位元。當設為0時,表示不啟用ADC中斷功能,當設為1時,表示啟用ADC中斷功能。

? Bit 7 (ADRUN):ADC starts to RUN 此位元是設定ADC開始動作。

? Bit 4 and Bit 5 :保留

~ 8 ~

9-4、 程式範例

1. 實習1 - 類比數位轉換原理實習

? 動作說明

程式使用ADC的功能,由VR類比輸入訊號經由MCU轉換成數位訊號,秀在LED上。 ? 硬體連接

此範例使用ET44M210的實驗電路板。 ? 程式說明

此範例使用ADC的功能,並且採用Polling的方式而不使用中斷的方式。程式一開始先起始ET44M210的動作:除能所有的中斷功能,設定PORT A為輸出端,清除ADDATAH、ADDATAL 的值,設定ADC類比輸入及ADC轉換速率,設定ADC轉換的Channel。當起始ET44M210的動作完成後,ADC便開始轉換,並等待ADC轉換完成,當ADC轉換完成後,將ADC轉換完成後的資料傳給PORT A,程式跳至AD_START繼續執行。

? 流程圖

START起始ET44M210ADC轉換開始NO等待AD轉換完成YES將ADC轉換的值傳給PORT A

~ 9 ~

? 程式碼 ADC01.dt中副程式及程式區段說明 ADC01.dt 程式共包含了9個副程式及程式區段,依照程式的撰寫順序有: INITIAL: 、 AD_START: 、 WAIT_AD_TRANS: 、 AD_TRANS_OK: 、 DELAY: 、 DELAYDD: 、 DELAYCC: 、 DELAYAA: 、 DELAYA: 為了方便讀者閱讀瞭解,針對程式中所定義的LABEL,以字母排序,整理如下表: 程式中所定義的副程式或LABEL說明 編號 LABEL名稱 0 AD_START: 1 AD_TRANS_OK: 2 DELAY: 3 DELAYA: 4 DELAYAA: 5 DELAYCC: 6 DELAYDD: 7 INITIAL: 行號 39 ADC轉換開始 50 AD轉換完成 57 DELAY副程式 75 延遲副程式下的LABEL 71 延遲副程式下的LABEL 66 延遲副程式下的LABEL 61 延遲副程式下的LABEL 19 主程式起始化 說明 8 WAIT_AD_TRANS: 42 等待AD轉換完成 本表格是針對程式中所定義的LABEL所整理出來的,針對表格每一欄的屬性說明如下: 編號:為該表格中所要說明的LABEL順序編號。 LABEL名稱:為程式中實際的LABEL名稱。 行號:為該LABEL實際於程式中第幾行。 說明:該說明用以描述解釋該LABEL下面的副程式或程式區段所要執行的動作。 ADC01.dt完整的原始程式碼 000 /*********************************************** 001 程式說明 002 由VR類比輸入訊號經由MCU轉換成數位訊號,秀在LED上 003 004 ************************************************/ 005 INCLUDE \ 006 INCLUDE \ 007 CKR == 7 ;設定ADC轉換的速率

~ 10 ~

008 ;0:CLK_SOURCE/2 ; 1:CLK_SOURCE/4 009 ;2:CLK_SOURCE/8 ; 3:CLK_SOURCE/16 010 ;4:CLK_SOURCE/32 ; 5:CLK_SOURCE/64 011 ;6:CLK_SOURCE/128; 7:CLK_SOURCE/256 012 ANALOG_CHANNEL == 0X0E ;設定ADC轉換的CHANNEL 013 014 ORG 0X0000 ;程式起始位址 015 JMP INITIAL 016 017 ORG 0X0100 018 ;主程式起始化 019 INITIAL: 020 CALL DELAY 021 MOV A,#0X00 022 MOV IOCA,A ;將 PORT A 設為 OUTPUT 023 MOV PORTA,A ;設定PORT A 的初值為00 024 CLR R41 ;設定R41的初值為00 025 CLR R42 ;設定R42的初值為00 026 CLR PRIE ;清除此暫存器以除能其週邊功能 027 BS PRIE,ADE ;設定週邊功能中的ADC致能 028 CLR ADDATAH ;設定ADDATAH 的初值為00 029 CLR ADDATAL ;設定ADDATAL 的初值為00 030 CLR ADCAIS ;設定ADCAIS 的初值為00 031 MOV A,#CKR ;設定ADC轉換的速率 032 OR A,#0B00111000 ;設定ADC類比輸入 033 MOV ADCAIS,A ;設定ADC類比輸入及ADC轉換速率 034 MOV A,#ANALOG_CHANNEL ;設定ADC轉換的CHANNEL 035 ADD A,#0B11000000 036 MOV ADCCR,A 037 ENI 038 ;ADC轉換開始 039 AD_START: 040 BS ADCCR,ADRUN ;ADC轉換開始 041 ;等待AD轉換完成 042 WAIT_AD_TRANS: 043 ;當AD_STATE中 TRANS_OK BIT 為1 044 ;表示AD轉換完成 045 ;程式跳至AD_TRANS_OK執行 046 JBS INTF,ADIF,AD_TRANS_OK 047 NOP ~ 11 ~

048 JMP WAIT_AD_TRANS ;若無則程式跳回繼續等待 049 ;AD轉換完成 050 AD_TRANS_OK: 051 ;AD轉換完成 052 BC INTF,ADIF ;清除AD_STATE的TRANS_OK BIT 053 MOV A,ADDATAH ;將資料傳給PORT A 054 MOV PORTA,A 055 JMP AD_START ;程式跳至AD_START繼續執行 056 ;DELAY副程式 057 DELAY: 058 MOV A,#0X10 059 MOV TEMP5,A 060 ;延遲副程式下的LABEL 061 DELAYDD: 062 DJZ TEMP5,DELAYA 063 MOV A,#0X11 064 MOV TEMP3,A 065 ;延遲副程式下的LABEL 066 DELAYCC: 067 DJZ TEMP3,DELAYDD 068 MOV A,#0X22 069 MOV TEMP4,A 070 ;延遲副程式下的LABEL 071 DELAYAA: 072 DJZ TEMP4,DELAYCC 073 JMP DELAYAA 074 ;延遲副程式下的LABEL 075 DELAYA: 076 RET 077 078 079 ORG 0X3FFF 080 DW 0X4000

~ 12 ~

2. 實習2 - 類比數位轉換應用實習

? 動作說明

程式使用ADC的功能,由VR類比輸入訊號經由MCU轉換成數位訊號,並把十六進制轉成十進制秀在LCD上。 ? 硬體連接

此範例使用ET44M210的實驗電路板。 ? 程式說明

此範例使用ADC的功能,程式一開始先起始ET44M210的動作:除能所有的中斷功能,設定PORT A為輸出端,清除ADDATAH、ADDATAL 的值,設定ADC類比輸入及ADC轉換速率,設定ADC轉換的Channel。當起始ET44M210的動作完成後,呼叫Initial_LCD副程式,起始LCD 。之後ADC便開始轉換,並等待ADC轉換完成,當ADC轉換完成後,將ADC轉換完成後的資料傳給PORT A,再將ADC轉換完成後的資料轉換成十進位秀在LCD上,程式跳至AD_START繼續執行。 ? 流程圖

STARTADC中斷向量起始ET44M210將ADC轉換的值傳給PORT A起始LCD顯示器將ADC轉換的值轉換成十進制寫入LCDADC轉換開始ADC轉換開始等待AD轉換完成RETI

~ 13 ~

? 程式碼 ADC02.dt中副程式及程式區段說明 ADC02.dt 程式共包含了18個副程式及程式區段,依照程式的撰寫順序有: ADCONVERT: 、 START: 、 AD_START: 、 INITIAL: 、 INITIAL_LCD: 、 CLEAR_LCD: 、 WRITE_COMMAND: 、 WRITE_LCD: 、 HUND: 、 ADD_H: 、 TEN: 、 ADDTEN: 、 DELAY: 、 D2: 、 DELAY1: 、 D1: 、 DELAY3: 、 D3: 為了方便讀者閱讀瞭解,針對程式中所定義的LABEL,以字母排序,整理如下表: 程式中所定義的副程式或LABEL說明 編號 LABEL名稱 0 ADCONVERT: 1 ADDTEN: 2 ADD_H: 3 AD_START: 4 CLEAR_LCD: 5 D1: 6 D2: 7 D3: 8 DELAY1: 9 DELAY3: 10 DELAY: 11 HUND: 12 INITIAL: 13 INITIAL_LCD: 14 START: 15 TEN: 17 WRITE_LCD: 行號 40 ADC中斷副程式 225 二進制轉十進制副程式下的LABEL 214 二進制轉十進制副程式下的LABEL 88 ADC轉換開始 166 清除顯示器副程式 255 延遲副程式1下的LABEL 239 延遲副程式下的LABEL 272 延遲副程式3下的LABEL 249 延遲副程式1 265 延遲副程式2 233 延遲副程式 207 二進制轉十進制 103 起始副程式;起始ET44M210的動作 138 INITIAL_LCD副程式 84 程式開始 218 二進制轉十進制副程式下的LABEL 191 寫入資料副程式 說明 16 WRITE_COMMAND: 174 寫入命令副程式 本表格是針對程式中所定義的LABEL所整理出來的,針對表格每一欄的屬性說明如下: 編號:為該表格中所要說明的LABEL順序編號。 LABEL名稱:為程式中實際的LABEL名稱。 行號:為該LABEL實際於程式中第幾行。 說明:該說明用以描述解釋該LABEL下面的副程式或程式區段所要執行的動作。

~ 14 ~

ADC02.dt完整的原始程式碼 000 /*********************************************** 001 程式說明 002 由VR類比輸入訊號經由MCU轉換成數位訊號, 003 並把十六進制轉成十進制秀在LCD上 004 ************************************************/ 005 INCLUDE \ 006 PORTC == 0X16 007 LCMRS == 0X04 ;LCD RS(暫存器選擇) 008 PORTF == 0X19 009 SRCS == 0X00 ;FLASH RAM CHIP SELECT 010 LCMEN == 0X03 ;LCD ENABLE(致能) 011 R41 == 0X41 012 R42 == 0X42 013 R43 == 0X43 014 AD_STATE == 0X47 015 TRANS_OK == 0X00 016 COMBUFFER == 0X50 ;自設的暫存器(命令緩衝區) 017 DATABUFFER == 0X51 ;自設的暫存器(資料緩衝區) 018 TIMER1 == 0X52 ;自設的暫存器(延時計數用) 019 TIMER2 == 0X53 ;自設的暫存器(延時計數用) 020 TIMER3 == 0X54 ;自設的暫存器(延時計數用) 021 H_COUNTER == 0X55 022 T_COUNTER == 0X56 023 PIECE == 0X57 024 Y_BUFFER == 0X58 025 CKR == 7 ;設定ADC轉換的速率 026 ;0:CLK_SOURCE/2 ; 1:CLK_SOURCE/4 027 ;2:CLK_SOURCE/8 ; 3:CLK_SOURCE/16 028 ;4:CLK_SOURCE/32 ; 5:CLK_SOURCE/64 029 ;6:CLK_SOURCE/128; 7:CLK_SOURCE/256 030 ANALOG_CHANNEL == 0X0E ;設定ADC轉換的CHANNEL 031 032 ORG 0X0000 033 JMP START 034 035 ORG 0X0038 ;ADC中斷位址 ~ 15 ~

036 JMP ADCONVERT 037 038 ORG 0X0100 039 ;ADC中斷副程式 040 ADCONVERT: 041 BC INTF,ADIF ;清除INTF中的ADIF旗標 042 MOV A,ADDATAH ;將ADDATAH的資料移至A 043 MOV PORTA,A 044 MOV Y_BUFFER,A 045 CALL HUND 046 CALL DELAY1 ;寫入資料 047 MOV A,#0X30 048 ADD H_COUNTER,A 049 MOV A,H_COUNTER 050 MOV DATABUFFER,A 051 CALL WRITE_LCD 052 CALL DELAY3 053 CALL DELAY1 ;寫入資料 054 MOV A,#0X30 055 ADD T_COUNTER,A 056 MOV A,T_COUNTER 057 MOV DATABUFFER,A 058 CALL WRITE_LCD 059 CALL DELAY3 060 CALL DELAY1 ;寫入資料 061 MOV A,#0X30 062 ADD PIECE,A 063 MOV A,PIECE 064 MOV DATABUFFER,A 065 CALL WRITE_LCD 066 CALL DELAY3 067 CLR H_COUNTER 068 CLR T_COUNTER 069 CLR PIECE 070 BS ADCCR,ADRUN ;ADC轉換開始 071 CALL DELAY ;寫入命令 清除顯示器 072 CALL CLEAR_LCD 073 CALL DELAY1 074 NOP 075 CALL DELAY ;WRITE COMMAND SET DD RAM ~ 16 ~

076 MOV A,#0X80 ;ADDRESS AT THE HEAD OF FIRST LINE 077 MOV COMBUFFER,A 078 CALL WRITE_COMMAND 079 CALL DELAY1 080 NOP 081 RETI 082 083 ;程式開始 084 START: 085 CALL INITIAL ;呼叫INITIAL副程式 086 CALL INITIAL_LCD ;呼叫INITIAL_LCD副程式 087 ;ADC轉換開始 088 AD_START: 089 CALL DELAY ;寫入命令 清除顯示器 090 CALL CLEAR_LCD 091 CALL DELAY1 092 NOP 093 CALL DELAY ;WRITE COMMAND SET DD RAM 094 MOV A,#0X80 ;ADDRESS AT THE HEAD OF FIRST LINE 095 MOV COMBUFFER,A 096 CALL WRITE_COMMAND 097 CALL DELAY1 098 NOP 099 ENI 100 BS ADCCR,ADRUN ;ADC轉換開始 101 JMP $ 102 ;起始副程式;起始ET44M210的動作 103 INITIAL: 104 MOV A,#0X00 105 MOV IOCA,A ;將 PORT A 設為 OUTPUT 106 MOV IOCC,A ;PORTC 設為輸出端 107 MOV IOCD,A ;PORTD 設為輸出端 108 MOV IOCF,A ;PORTF 設為輸出端 109 CLR PORTA 110 CLR PORTC 111 CLR PORTD ;清除PORT D的值 112 CLR PORTF ;清除PORT F的值 113 CLR COMBUFFER ;清除COMBUFFER的值 114 CLR DATABUFFER ;清除DATABUFFER的值 115 CLR TIMER1 ;清除TIMER1的值 ~ 17 ~

116 CLR TIMER2 ;清除TIMER2的值 117 CLR TIMER3 ;清除TIMER3的值 118 CLR H_COUNTER 119 CLR T_COUNTER 120 CLR PIECE 121 BS PORTF,SRCS ;將FLASH RAM除能 122 CLR R41 ;設定R41的初值為00 123 CLR R42 ;設定R42的初值為00 124 CLR PRIE ;清除此暫存器以除能其週邊功能 125 BS PRIE,ADE ;設定週邊功能中的ADC致能 126 CLR ADDATAH ;設定ADDATAH 的初值為00 127 CLR ADDATAL ;設定ADDATAL 的初值為00 128 CLR ADCAIS ;設定ADCAIS 的初值為00 129 MOV A,#CKR ;設定ADC轉換的速率 130 OR A,#0X00 ;設定ADC類比輸入 131 MOV ADCAIS,A ;設定ADC類比輸入及ADC轉換速率 132 MOV A,#ANALOG_CHANNEL ;設定ADC轉換的CHANNEL 133 ADD A,#0B11000000 134 MOV ADCCR,A 135 RET 136 137 ;INITIAL_LCD副程式 138 INITIAL_LCD: 139 MOV A,#0X38 ;寫入命令 功能設定 140 MOV COMBUFFER,A ;0 0 1 DL N F X X 141 CALL WRITE_COMMAND ;DL ->1=8 BITS,0=4BITS 142 CALL DELAY ;N ->1=2 LINES,0=1 LINE 143 ;F ->1=5X10 DOTS,0=5X7 DOTS 144 MOV A,#0X08 ;寫入命令 關閉顯示器 145 MOV COMBUFFER,A ;0 0 0 0 1 D C B 146 CALL WRITE_COMMAND ;D ->1=DISPLAY ON,0=DISPLAY OFF 147 CALL DELAY ;C ->1=CURSOR ON,0=CURSOR OFF 148 ;B ->1=CURSOR BLINK ON,0=CURSOR BLINK OFF 149 MOV A,#0X01 ;寫入命令 清除顯示器 150 MOV COMBUFFER,A 151 CALL WRITE_COMMAND 152 CALL DELAY 153 MOV A,#0X06 ;寫入命令 進入模式設定 154 MOV COMBUFFER,A ;0 0 0 0 0 1 I/D S 155 CALL WRITE_COMMAND ;I/D ->1=INCREMENT,0=DECREMENT ~ 18 ~

156 CALL DELAY ;B ->1=DISPLAY SHIFT WHEN DATA IS WRITEN 157 ; NORMAL OPERATION SET TO ZERO 158 MOV A,#0X0E ;寫入命令 開啟顯示器 159 MOV COMBUFFER,A ;0 0 0 0 1 D C B 160 CALL WRITE_COMMAND ;D ->1=DISPLAY ON,0=DISPLAY OFF 161 CALL DELAY1 ;C ->1=CURSOR ON,0=CURSOR OFF 162 NOP 163 RET 164 165 ;清除顯示器副程式 166 CLEAR_LCD: 167 MOV A,#0X01 ;寫入命令 清除顯示器 168 MOV COMBUFFER,A 169 CALL WRITE_COMMAND 170 CALL DELAY 171 RET 172 173 ;寫入命令副程式 174 WRITE_COMMAND: 175 MOV A,#0X00 176 MOV IOCD,A ;PORTD 設為輸出端 177 MOV A,COMBUFFER ;指令送到資料匯流排 178 MOV PORTD,A 179 BC PORTC,LCMRS== 0 180 NOP ;寫入指令到指令暫存器 181 NOP 182 BS PORTF,LCMEN ;ENABLE LCD MODULE 183 NOP 184 NOP 185 NOP 186 BC PORTF,LCMEN ;DISABLE LCD MODULE 187 CALL DELAY 188 RET 189 190 ;寫入資料副程式 191 WRITE_LCD: 192 MOV A,#0X00 193 MOV IOCD,A ;PORTD 設為輸出端 194 MOV A,DATABUFFER ;資料送到資料匯流 195 MOV PORTD,A ~ 19 ~

196 BS PORTC,LCMRS== 1 197 NOP ;寫入資料到資料暫存器 198 NOP 199 BS PORTF,LCMEN ;ENABLE LCD MODULE 200 NOP 201 NOP 202 NOP 203 BC PORTF,LCMEN ;DISABLE LCD MODULE 204 RET 205 206 ;二進制轉十進制 207 HUND: 208 MOV A,#0X64 209 SUB Y_BUFFER,A 210 JBC STATUS,C,ADD_H 211 INC H_COUNTER 212 JMP HUND 213 ;二進制轉十進制副程式下的LABEL 214 ADD_H: 215 MOV A,#0X64 216 ADD Y_BUFFER,A 217 ;二進制轉十進制副程式下的LABEL 218 TEN: 219 MOV A,#0X0A 220 SUB Y_BUFFER,A 221 JBC STATUS,C,ADDTEN 222 INC T_COUNTER 223 JMP TEN 224 ;二進制轉十進制副程式下的LABEL 225 ADDTEN: 226 MOV A,#0X0A 227 ADD Y_BUFFER,A 228 MOV A,Y_BUFFER 229 MOV PIECE,A 230 RET 231 232 ;延遲副程式 233 DELAY: 234 MOV A,#0X00 235 MOV TIMER1,A ~ 20 ~

本文来源:https://www.bwwdw.com/article/bwu3.html

Top