(一)、nRF9E5芯片應(yīng)用簡(jiǎn)述
nRF9E5是一款工作頻率為433/868/915MHz的智能射頻芯片,該芯片采用1.9V~3.6V單電源供電,32腳QFN封裝(5×5mm),發(fā)射功率為10dBm,接收靈敏度-100dBm,在低功耗時(shí)電流僅2.5μA,在發(fā)射功率為-10dBm時(shí)的發(fā)射電流11mA,接收模式下的電流12.5mA,適用于工業(yè)無(wú)線傳感器、遙控器和無(wú)線報(bào)警器等。經(jīng)測(cè)試在沒(méi)有建筑物阻擋的情況下,發(fā)送端放在辦公室的桌子上,隔一層玻璃,接收端在1000米遠(yuǎn)的馬路上能穩(wěn)定傳輸沒(méi)問(wèn)題,或者在本樓層1至4樓之間傳輸也很好。 下圖所示為nRF9E5的內(nèi)部結(jié)構(gòu)框圖。nRF9E5是一片嵌入了nRF905無(wú)線收發(fā)芯片、集成增強(qiáng)型8051微處理器和4個(gè)通道的10位ADC,采樣速率為80ksps,內(nèi)含1.22V電壓基準(zhǔn)、電源管理、PWM輸出、UART異步串口、SPI通訊接口、邏輯接口電路、看門(mén)夠電路、多通道可編程喚醒,以及CRC檢驗(yàn)和多點(diǎn)通信控制,高頻電感和濾波器等已經(jīng)全部?jī)?nèi)置,外圍元件很少,芯片的一致性能好、穩(wěn)定且不易受干擾。 nRF9E5沒(méi)有復(fù)雜的通訊協(xié)議,完全對(duì)用戶透明,同種產(chǎn)品之間可以自由通訊,內(nèi)置的CRC糾錯(cuò)硬件電路和協(xié)議免去了軟件開(kāi)發(fā)人員的軟件糾錯(cuò)編程和微控器的糾錯(cuò)運(yùn)算,降低了無(wú)線應(yīng)用的開(kāi)發(fā)難度。 (二)、nRF9E5芯片I/O口設(shè)置 nRF9E5有一8 位的通用雙向口(P0口)。另外,4個(gè)SPI 也可以用作通用IO口(P1 口)。大部分通用 I/O 口都可以通過(guò)編程設(shè)置為第二功能,第二功能包括:RXD、TXD,SPI、3個(gè)定時(shí)器/計(jì)數(shù)、PWM輸出等。 nRF9E5的P0 口通過(guò) P0_ALT 和 P0_DIR 進(jìn)行設(shè)置。若 P0_ALT.n = 1,則引腳P0.n 具有UART、外部中斷、定時(shí)器輸入或脈寬調(diào)制輸出功能; RXD方向取決于 P0_DIR.1 的值。若要使用 INT0_N 或INT1_N作為中斷,則必須使用 P0_ALT.3 / P0_ALT.4 的第二功能。若未置 P0_ALT.n=1,則相應(yīng)的 P0.n 作為通用 IO 口使用, 其方向由P0_DIR.n 確定。如下表所示:
表9 P0 口功能設(shè)置表 P1 口有4 個(gè)引腳,當(dāng)SPI_CTRL=01時(shí)是作SPI 口用。。引腳EECSN作為EEPROM 的片選信號(hào),MOSI作為SPI輸出,MISO作為SPI輸入,SCK作為SPI時(shí)鐘。將SPI_CTRL設(shè)為不等于01時(shí),若P1_ALT.n 設(shè)為0則P1.0--P1.3為通用 IO 口,此時(shí) P1_DIR.n 決定是輸入還是輸出口,見(jiàn)下表。 無(wú)線收發(fā)器是由 P2 口來(lái)控制的,P2口的地址與 8051相同。但是因無(wú)線收發(fā)器集成在片內(nèi),P2口不再是雙向口。為了匹配無(wú)線電收發(fā)器子系統(tǒng)的需要,P2 口鎖存電壓值與標(biāo)準(zhǔn)8051也有所不同。無(wú)線收發(fā)器是通過(guò) P2 口特殊功能寄存器的SPI_CTRL 來(lái)控制的,如下表所示: SFR 地址 | | | | | | | | | | | NRF905 無(wú)線電收發(fā)器和AD 轉(zhuǎn)換器子系統(tǒng)的 IO 接口 | | | | | | 00->不用SPI 01->SPI 與端口P1 相連接 1x->SPI 與nRF905/AD相連接 |
P2 寄存器位:功能 | 相應(yīng)的 nRF905 收發(fā)器引腳名稱 | | | | 6: nRF905 收發(fā)器載波檢測(cè) | | 5: nRF905 收發(fā)器數(shù)據(jù)就緒 | | | | |
| 2: nRF905收發(fā)器和ADC SPI 數(shù)據(jù)輸出(SBMISO) | | |
| |
| | |
| |
| | | 4: nRF905收發(fā)器發(fā)射/接收選擇 | | 3: nRF905收發(fā)器和ADC SPI 芯片選擇(SBCSN) | | |
| 1: nRF905收發(fā)器和ADC SPI 數(shù)據(jù) (SBMOSI) | | 0: nRF905收發(fā)器和ADC SPI 時(shí)鐘(SBSCK) | | (三)、nRF9E5芯片A/D口轉(zhuǎn)換
nRF9E5的AD轉(zhuǎn)換器是一個(gè)10位的線性轉(zhuǎn)換器,在低頻信號(hào)及濾波器的作用下可以增大到12位。AD轉(zhuǎn)換器的基準(zhǔn)電壓是:AREF或內(nèi)部帶隙參考電壓(1.22V)。 默認(rèn)狀態(tài)下AD 轉(zhuǎn)換器是 10位的,如有特殊要求,也可以設(shè)置成6,8,12位轉(zhuǎn)換模式。AD轉(zhuǎn)換器也可以應(yīng)用在其它模式下,比如 AIN0 輸入一負(fù)電壓,AIN1~AIN3作為放大輸入端。 AD 轉(zhuǎn)換器有兩個(gè)寄存器ADC_CONFIG_REG 和 ADC_DATA_REG。輸入頻道的選擇直接由 START_ADC_CONV 控制,CHSEL 的值從0 到 3 分別對(duì)應(yīng)選擇 AIN0 到AIN3, 若CHSEL 設(shè)置為 1xxx 則nRF9E5 提供給 AD轉(zhuǎn)換器內(nèi)部電壓:VDD/3~1.22V。 AD 轉(zhuǎn)換的結(jié)果將保存在ADC_DATA_REG 寄存器中。數(shù)據(jù)存儲(chǔ)形式如下表所示由ADC_RL_JUST來(lái)決定。
溢出狀態(tài)保存在STATUS_REGISTER寄存器中的 ADC_RFLAG 中。當(dāng) ADC_PWR_UP=0時(shí),AD轉(zhuǎn)換器功能被禁止。 使用內(nèi)部參考電壓時(shí)的測(cè)量值:當(dāng)VFSSEL=0,CHSEL選擇一個(gè)輸入AINi(AIN0到 AIN3),AD轉(zhuǎn)換的結(jié)果 ADCDATA 與 VAINi/1.22成正比:
ADC-配置寄存器說(shuō)明 參數(shù) | | | | | 當(dāng) ADCRUN 無(wú)效時(shí),此信號(hào)的上升沿將啟動(dòng)AD 轉(zhuǎn)換, | | | 有效時(shí),AD 轉(zhuǎn)換器連續(xù)轉(zhuǎn)換。此時(shí)可忽視CSTARTN 的狀態(tài) | | | | | | AD 轉(zhuǎn)換器參考電壓選擇 0:內(nèi)部帶隙參考電壓(1.22V) 1:外部引腳AREF 參考電壓(如果CHSEL=[1xxx],不考慮VFSSEL狀態(tài)) | | | 輸入通道選擇: 0000:AIN0 0001: AIN1 0010:AIN2 0011:AIN3 1xxx:內(nèi)部 VDD/3 | | | A/D 轉(zhuǎn)換器分辨率: 00:6 位 01:8 位 10:10 位 11:12 位 | | | 使能差分測(cè)量,AIN0 輸入一負(fù)電壓,AIN1~AIN3 作為放大輸入端, | | | 選擇向左或者向右數(shù)據(jù)存放格式 0:數(shù)據(jù)向左存放 1:數(shù)據(jù)向右存放 |
狀態(tài)寄存器說(shuō)明 參數(shù) | | | | | 地址匹配,接收到與本機(jī)地址匹配的地址數(shù)據(jù)。(見(jiàn) 9.8章) | | | 載波檢測(cè),接收到相同頻率的載波.詳細(xì)說(shuō)明見(jiàn)9.7 章. | | | 數(shù)據(jù)就緒,接收到一包有效數(shù)據(jù)(地址和 CRC 校驗(yàn)正確)(見(jiàn) 9.9章) | | | 轉(zhuǎn)換結(jié)束,表明 AD 轉(zhuǎn)換已經(jīng)完成,數(shù)據(jù)存儲(chǔ)在ADC_DATA_REG 里. | | | ADC 溢出標(biāo)志: RFLAG[2]:未溢出(ADCDATA=0)RFLAG[1]:溢出(ADCDATA=2n-1) RFLAG[0]:溢出部分=RFLAG[1]或者RFLAG[2] |
EXIF 特殊功能寄存器控制字
位 | | | IE5-中斷5 標(biāo)志位。IE5=1 則探測(cè)AM 信號(hào)上升沿(見(jiàn)P2)。IE5必須由軟件清0。使能后軟件 設(shè)置產(chǎn)生中斷 | | IE4-中斷4 標(biāo)志位。IE4=1則探測(cè) DR 信號(hào)上升沿.(見(jiàn)P2)。.IE4必須由軟件清 0。使能后軟件 設(shè)置產(chǎn)生中斷 | | IE3-中斷3 標(biāo)志位。IE3=1表明內(nèi)部SPI 模塊已發(fā)射或接收了 8 位數(shù)據(jù),等待新指令。.IE3必 須由軟件清 0。使能后軟件設(shè)置產(chǎn)生中斷 | | IE2-中斷2 標(biāo)志位。IE2=1則探測(cè) ADC’s 的EOC 信號(hào)上升沿(見(jiàn)第10章)。IE2必須由軟件清 0。使能后軟件設(shè)置產(chǎn)生中斷 | | | | |
(四)、nRF9E5芯片用戶程序 nRF9E5的主程序存放在外部的串行EEPROM中,當(dāng)芯片開(kāi)始上電時(shí),其內(nèi)部固化的廠家引導(dǎo)程序通過(guò)SPI接口,將外部EEPROM中的主程序?qū)?/font>nRF9E5的RAM中(4K字節(jié)空間,沒(méi)有被主程序占用的可作為片內(nèi)RAM使用),接著執(zhí)行跳轉(zhuǎn)指令,開(kāi)始主程序的運(yùn)行。主程序需要按照下表所示的規(guī)則寫(xiě)入EEPROM中,其中SPEED(bit3)為EEPROM的最大讀寫(xiě)速度,0為1MHz,1為0.5MHz。XO_FREQ(bit2,1,0)為nRF9E5的外接晶振的頻率,000=4MHz,001=8MHz,010=12MHz,011=16MHz,100=20MHz。

在用編程器寫(xiě)程序時(shí),前3個(gè)單元是0B0302,后面是主程序。其中0BH=00001011代表speed=1,XO_FREQ =011表示外接晶振是16MHz,03代表應(yīng)用程序起始偏移量,02代表主程序的256字節(jié)區(qū),見(jiàn)下圖。
nRF9E5發(fā)送數(shù)據(jù)程序 ;開(kāi)機(jī)進(jìn)行鍵掃描,有按鍵按下,就把該鍵值(10h,20h,40h)送出20個(gè),然后等待接收20個(gè)字符;接收到20個(gè)字符后,把這些數(shù)據(jù)送串口發(fā)送到微機(jī)里,用串口調(diào)試助手可以檢查接收情況。
PWMCON EQU 0A9h
PWMDUTY EQU 0AAh
REGX_MSB EQU 0ABh
REGX_LSB EQU 0ACh
REGX_CTRL EQU 0ADh
RSTREAS EQU 0B1h
SPI_DATA EQU 0B2h
SPI_CTRL EQU 0B3h
SPICLK EQU 0B4h
TICK_DV EQU 0B5h
CK_CTRL EQU 0B6h
CKLFCON EQU 0BFh
EXIF EQU 91h
EIE EQU0E8h
CKCON EQU 8EH
SPI_SCK EQU P2.0
SPI_MOSI EQU P2.1
RACSN EQU P2.3
TXEN EQU P2.4
TRX_CE EQU P2.5
SPI_MISO EQU P2.2
EOC EQU P2.4
DR EQU P2.5
CD EQU P2.6
AM EQU P2.7
P0_DRV EQU93H
P0_DIR EQU 94H
P0_ALT EQU 95H
P1_DIR EQU 96H
P1_ALT EQU 97H
KeyValue EQU 20H
L0 EQU KeyValue.4 ;L0=1,(20H)=10H
L1 EQU KeyValue.5 ;L1=1,(20H)=20H
L2 EQU KeyValue.6 ;L2=1,(20H)=40H
S0 EQU P0.5
S1 EQU P0.6
S2 EQU P0.7
LED0 EQU P0.0
LED1 EQU P0.3
LED2 EQU P0.4
BZW EQU 12H ;設(shè)一個(gè)標(biāo)志位
ORG 0000H
LJMP MAIN
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG004BH
RETI
ORG 0050H
;串口發(fā)送數(shù)據(jù)到pc
PutChar: CLR ES
MOV SBUF ,R7
JNB TI, $ ;串口發(fā)送無(wú)線收到的R7鍵值(10H,20H,40H)
CLR TI
SETB ES
RET
;初始化子程序
Init: MOV SP,#60H ;設(shè)堆棧指針
MOV TH1,#0F3h ;波特率19200,N,8,1
MOV TL1,#0F3h ;波特率19200,N,8,1 ;;;;;;
ORL CKCON,#10H ;T1M=1,1/4時(shí)鐘
MOV PCON,#80H ;SMOD=1,波特率加倍
MOV SCON,# 50h ; Timer1 8bit auto reload ,方式1,REN=1,TI=1
MOV TMOD,#21h ;
SETB TR1 ;啟動(dòng)定時(shí)器1
ORL P0_ALT,#06h ; P0.0 out,P0.1 input(RXD),P0.2(TXD) P0.3P0.4輸出,,P0.5 P0.6 P0.7輸入
MOV P0_DIR,#0E2h
MOV SPICLK,#01h ; Connect internal SPI controller toRadio
MOV SPI_CTRL,#02h
SETB LED0 ;燈滅
SETB LED1
SETB LED2
MOV BZW,#00H
CLR RACSN ;SPI片選有效
MOV R7,#19h ;讀RF配置寄存器10-19為讀命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV A,R7
ORL A,#0CH ;讀結(jié)果送R6也就是送到06H單元
MOV R6,A
SETB RACSN
CLR RACSN
MOV R7,#09h ;00-09寫(xiě)RF配置寄存器命令
LCALL SpiReadWrite
MOV R7,06h
LCALL SpiReadWrite ;把讀出的結(jié)果寫(xiě)回
SETB RACSN
CLR RACSN ; Write to RF config address 3 (RX payload)
MOV R7,#03H ;配置RX_PWR,初值20H,32個(gè)字節(jié)03h是3個(gè)字節(jié)
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
SETB RACSN
CLR RACSN
MOV R7,#11h ;Read RF config address 1
LCALL SpiReadWrite ;讀配置寄存器。0001aaaa,aaaa指出讀操作的開(kāi)始字節(jié),
CLR A ;字節(jié)數(shù)量取決于aaaa指出的開(kāi)始地址。
MOV R7,A
LCALL SpiReadWrite ;寫(xiě)配置寄存器。0000aaaa,aaaa指出寫(xiě)操作的開(kāi)始字節(jié),
MOV A,R7 ; 字節(jié)數(shù)量取決于aaaa指出的開(kāi)始地址.
ANL A,#0F0H
MOV R6,A
SETB RACSN
CLR RACSN ; Write RF config address 0
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV R7,#05Fh
LCALL SpiReadWrite
MOV A,R6
ORL A,#0Dh
MOV R7,A
LCALL SpiReadWrite
MOV R7,#44h ;44接收、發(fā)送地址長(zhǎng)度
LCALL SpiReadWrite
MOV R7,#01H ;01h為1字節(jié)有效20h是32字節(jié)有效
LCALL SpiReadWrite
MOV R7,#01h
LCALL C0185
SETB RACSN
SETB EA
SETB ES ;
RET
;掃描鍵盤(pán)子程序
ScanKey: CLR A ;掃描鍵盤(pán)即掃描3個(gè)按鈕,獲取鍵值
MOV KeyValue,A ;沒(méi)有鍵盤(pán)按下轉(zhuǎn)c00b1
JB S0,C00B1
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤(pán)按下LED0燈亮延時(shí)后熄滅
MOV R7,#1AH
LCALL Delayms
SETB LED0
C00B1:JB S1,C00BF ;L1按下Keyvalue=20h,L0=Keyvalue.5
SETB L1
CLR LED1
MOV R7,#1AH
LCALL Delayms
SETB LED1
C00BF:JB S2 ,C00CD
SETB L2 ;L2按下Keyvalue=40h,L0=Keyvalue.6
CLR LED2
MOV R7,#1AH
LCALL Delayms
SETB LED2
C00CD: MOV A,KeyValue
JZ C00D9
FS: MOV R2,#20H ;發(fā)送20個(gè)字節(jié)
FS1: MOV A,KeyValue
MOV R7,A ;獲取的鍵值送R7
SETB TXEN ;發(fā)送使能
LCALL TransmitPacket ;調(diào)用發(fā)射程序包
CLR TXEN
MOV R7,#2AH
LCALL Delay100us
DJNZ R2,FS1
C00D9: RET
;無(wú)線接收子程序
ReceivePacket: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,C010E
CLR RACSN
MOV R7,#24H ;讀接收數(shù)據(jù)命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV KeyValue,R7
INC BZW
JNB L0,C00F9 ;對(duì)接收數(shù)據(jù)進(jìn)行計(jì)數(shù)
CLR LED0 C00F9: JNB L1,C00FE
CLR LED1
C00FE: JNB L2,C0103
CLR LED2
C0103: MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C010E: RET
;無(wú)線發(fā)送子程序
TransmitPacket: MOV R5,07H ; Spi enable for write a spi command
CLR RACSN ;Writeaddress command
MOV R7,#22H ;寫(xiě)發(fā)送地址命令22H
LCALL C0185 ;E7,E7,E7,E7 TX_ADDRESS
SETB RACSN
MOV R7,#01H ;延時(shí)100微秒
LCALL Delay100us
CLR RACSN
MOV R7,#20H ;寫(xiě)發(fā)送數(shù)據(jù)命令20H
LCALL SpiReadWrite
MOV R7,05H ;保存在R5中的鍵值送R7發(fā)送
LCALL SpiReadWrite
SETB RACSN
SETB TRX_CE
MOV R7,#0AH ;發(fā)送后延時(shí)
LCALL Delay100us
CLR TRX_CE
C0136: JNB TRX_CE,C0136 ;等待發(fā)送完畢
RET
;主程序
main: LCALL Init ;主程序,現(xiàn)調(diào)用初始化程序
CLR LED0 ;3個(gè)燈陸續(xù)點(diǎn)亮后熄滅
MOV R7,#0AH
LCALL Delayms
CLR LED1
MOV R7,#0AH
LCALL Delayms
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
Q: MOVA,#20H
MOVR2,#60D ;清數(shù)據(jù)區(qū)
MOV R0,#13H
QING: MOV@R0,A ;清數(shù)據(jù)區(qū)
INC R0
DJNZ R2,QING
C0158: LCALL ScanKey ;掃描鍵盤(pán)等待接受數(shù)據(jù)
MOV A,KeyValue
JZ C0158
MOV R0,#30H
AJMPFH ;等待接收數(shù)據(jù)
CLR A ;掃描鍵盤(pán)即掃描3個(gè)按鈕,獲取鍵值
MOV KeyValue,A ;沒(méi)有鍵盤(pán)按下轉(zhuǎn)c00b1
JB S0,C0158
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤(pán)按下LED0燈亮延時(shí)后熄滅
MOV R7,#0AH
LCALL Delayms
SETB LED0
MOV A,KeyValue
JZ C0158
FH: SETB TRX_CE ; nRF905 收發(fā)器使能,接收器功能
JNB TRX_CE,FH
CLR RACSN
MOV R7,#24H ;讀接收數(shù)據(jù)命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN ;SPI片選有效
CLR TRX_CE
MOV A,R7
MOV @R0,A
MOV R7,#05H ;延時(shí)100微秒
LCALL Delay100us
INC BZW
INC R0
MOV A,BZW
XRL A,#20D
JZ FH0
AJMP FH
FH0: MOVR2,#20D ; OK
MOV R0,#30H
CLR LED0
FH1: MOV A,@R0
MOV R7,A
LCALL PutChar
INC R0
DJNZ R2,FH1
LCALL Delay
MOV BZW,#0
SETB LED0
LCALL Delay
LJMP C0158
C0185: LCALL SpiReadWrite ;寫(xiě)發(fā)送數(shù)據(jù)地址
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
SpiReadWrite: ANL EXIF,#0DFH ;Move byte to send to SPI data register
MOV SPI_DATA,R7 ;讀寫(xiě)SPI數(shù)據(jù)
C019E: MOV A,EXIF
JNB 0E0H.5,C019E
MOV R7,SPI_DATA
RET
Delayms: MOV 10H,R7 ;延時(shí)子程序
C01A8: MOV R7, 10H
DEC 10H
MOV A,R7
JZ C01BF
CLR A
MOV R5,A
C01B1: MOV A,R5
CLR C
SUBB A,#0AH
JNC C01A8
MOV R7,#0AH
LCALL Delay100us
INC R5
SJMP C01B1
C01BF: RET
Delay100us: MOV 11H,R7
Delay100us1: MOV R7, 11H
DEC 11H
MOV A,R7
JZ C021D
CLR A
MOV R6,A
Delay100us2: MOV A,R6
CLR C
SUBB A,#23H
JNC Delay100us1
INC R6
SJMP Delay100us2
C021D: RET
DELAY: MOV 70H,#0FFH
DELAY1: LCALL DELAY2
DJNZ 70H,DELAY1
RET
DELAY2: MOV 71H,#0FFH
DELAY3: NOP
DJNZ 71H,DELAY3
RET
END
nRF9E5接收數(shù)據(jù)程序示例 ;開(kāi)機(jī)等待接收20個(gè)字符,送到30h起始的單元中,然后再把這些數(shù)據(jù)發(fā)送出去
PWMCON EQU 0A9h
PWMDUTY EQU 0AAh
REGX_MSB EQU 0ABh
REGX_LSB EQU 0ACh
REGX_CTRL EQU 0ADh
RSTREAS EQU 0B1h
SPI_DATA EQU 0B2h
SPI_CTRL EQU 0B3h
SPICLK EQU 0B4h
TICK_DV EQU 0B5h
CK_CTRL EQU 0B6h
CKLFCON EQU 0BFh
EXIF EQU 91h
EIE EQU 0E8h
CKCON EQU 8EH
SPI_SCK EQU P2.0
SPI_MOSI EQU P2.1
RACSN EQU P2.3
TXEN EQU P2.4
TRX_CE EQU P2.5
SPI_MISO EQU P2.2
EOC EQU P2.4
DR EQU P2.5
CD EQU P2.6
AM EQU P2.7
P0_DRV EQU93H
P0_DIR EQU 94H
P0_ALT EQU 95H
P1_DIR EQU 96H
P1_ALT EQU 97H
KeyValue EQU 20H
L0 EQU KeyValue.4 ;L0=1,(20H)=10H
L1 EQU KeyValue.5 ;L1=1,(20H)=20H
L2 EQU KeyValue.6 ;L2=1,(20H)=40H
S0 EQU P0.5
S1 EQU P0.6
S2 EQU P0.7
LED0 EQU P0.0
LED1 EQU P0.3
LED2 EQU P0.4
BZW EQU 12H ;設(shè)一個(gè)標(biāo)志位
ORG0000H
LJMP MAIN
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 004BH
RETI
ORG 0050H
PutChar: CLR ES
MOV SBUF ,R7
JNB TI, $ ;串口發(fā)送無(wú)線收到的R7鍵值(10H,20H,40H)
CLR TI
SETB ES
RET
Init: MOV SP,#60H ;設(shè)堆棧指針
MOV TH1,#0F3h ;波特率19200,N,8,1
MOV TL1,#0F3h ;波特率19200,N,8,1 ;;;;;;
ORL CKCON,#10H ;T1M=1,1/4時(shí)鐘
MOV PCON,#80H ;SMOD=1,波特率加倍
MOV SCON,# 50h ; Timer1 8bit auto reload ,方式1,10位UART波特率可變,波特率受MSOD影響,REN=1,TI=1
MOV TMOD,#21h ; Timer1 8bit auto reload 20---21;;;;;;
SETB TR1 ;啟動(dòng)定時(shí)器1
ORL P0_ALT,#06h ; P0.0 out,P0.1 input(RXD),P0.2(TXD) P0.3 P0.4輸出,,P0.5 P0.6P0.7輸入
MOV P0_DIR,#0E2h
MOV SPICLK,#01h ; Connect internal SPI controller to Radio
MOV SPI_CTRL,#02h
SETB LED0 ;燈滅
SETB LED1
SETB LED2
MOV BZW,#00H
CLR RACSN ;SPI片選有效
MOV R7,#19h ;讀RF配置寄存器10-19為讀命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV A,R7
ORL A,#0CH ;讀結(jié)果送R6也就是送到06H單元
MOV R6,A
SETB RACSN
CLR RACSN
MOV R7,#09h ;00-09寫(xiě)RF配置寄存器命令
LCALL SpiReadWrite
MOV R7,06h
LCALL SpiReadWrite ;把讀出的結(jié)果寫(xiě)回
SETB RACSN
CLR RACSN ; Write to RF config address 3 (RX payload)
MOV R7,#03H ;配置RX_PWR,初值20H,32個(gè)字節(jié)01h是1個(gè)字節(jié)
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
SETB RACSN
CLR RACSN
MOV R7,#11h ;Read RF config address 1
LCALL SpiReadWrite ;讀配置寄存器。0001aaaa,aaaa指出讀操作的開(kāi)始字節(jié),
CLR A ;字節(jié)數(shù)量取決于aaaa指出的開(kāi)始地址。
MOV R7,A
LCALL SpiReadWrite ;寫(xiě)配置寄存器。0000aaaa,aaaa指出寫(xiě)操作的開(kāi)始字節(jié),
MOV A,R7 ;字節(jié)數(shù)量取決于aaaa指出的開(kāi)始地址.
ANL A,#0F0H
MOV R6,A
SETB RACSN
CLR RACSN ; Write RF config address 0
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV R7,#05Fh
LCALL SpiReadWrite
MOV A,R6
ORL A,#0Dh
MOV R7,A
LCALL SpiReadWrite
MOV R7,#44h ;44接收、發(fā)送地址長(zhǎng)度
LCALL SpiReadWrite
MOV R7,#01H ;01h為1字節(jié)有效20h是32字節(jié)有效
LCALL SpiReadWrite
MOV R7,#01h
LCALL C0185
SETB RACSN
SETB EA
SETB ES ;
RET
ScanKey: CLR A ;掃描鍵盤(pán)即掃描3個(gè)按鈕,獲取鍵值
MOV KeyValue,A ;沒(méi)有鍵盤(pán)按下轉(zhuǎn)c00b1
JB S0,C00B1
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤(pán)按下LED0燈亮延時(shí)后熄滅
MOV R7,#0AH
LCALL Delayms
SETB LED0
C00B1: JB S1,C00BF ;L1按下Keyvalue=20h,L0=Keyvalue.5
SETB L1
CLR LED1
MOV R7,#0AH
LCALL Delayms
SETB LED1
C00BF: JB S2 ,C00CD
SETB L2 ;L2按下Keyvalue=40h,L0=Keyvalue.6
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED2
C00CD: MOV A,KeyValue
JZ C00D9
FS: SETB TXEN ;發(fā)送使能
MOV R7,A ;獲取的鍵值送R7
MOV R2,#20H ;發(fā)送20個(gè)字節(jié)
FS1: LCALL TransmitPacket ;調(diào)用發(fā)射程序包
DJNZ R2,FS1
CLR TXEN
C00D9: RET
ReceivePacket: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,C010E
CLR RACSN
MOV R7,#24H ;讀接收數(shù)據(jù)命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV KeyValue,R7
INC BZW
JNB L0,C00F9 ;對(duì)接收數(shù)據(jù)進(jìn)行計(jì)數(shù)
CLR LED0 C00F9: JNB L1,C00FE
CLR LED1
C00FE: JNB L2,C0103
CLR LED2
C0103: MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C010E: RET
TransmitPacket:MOV R5,07H ; Spi enable for write a spi command
CLR RACSN ;Writeaddress command
MOV R7,#22H ;寫(xiě)發(fā)送地址命令22H
LCALL C0185 ;E7,E7,E7,E7 TX_ADDRESS
SETB RACSN
MOV R7,#01H ;延時(shí)100微秒
LCALL Delay100us
CLR RACSN
MOV R7,#20H ;寫(xiě)發(fā)送數(shù)據(jù)命令20H
LCALL SpiReadWrite
MOV R7,05H ;保存在R5中的鍵值送R7發(fā)送
LCALL SpiReadWrite
SETB RACSN
SETB TRX_CE
MOV R7,#0AH ;發(fā)送后延時(shí)
LCALL Delay100us
CLR TRX_CE
C0136: JNB TRX_CE,C0136 ;等待發(fā)送完畢
RET
main: LCALL Init ;主程序,現(xiàn)調(diào)用初始化程序
CLR LED0 ;3個(gè)燈陸續(xù)點(diǎn)亮后熄滅
MOV R7,#0AH
LCALL Delayms
CLR LED1
MOV R7,#0AH
LCALL Delayms
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C0158: LCALL ScanKey ;掃描鍵盤(pán)等待接受數(shù)據(jù)
Q: MOVA,#20H
MOVR2,#60D ;清數(shù)據(jù)區(qū)
MOV R0,#13H
QING: MOV@R0,A ;清數(shù)據(jù)區(qū)
INC R0
DJNZ R2,QING
MOV R0,#30H
MOV R2,#20D
AJMPFH ;等待接收數(shù)據(jù)
FCBQ1: MOV R0,#30H
MOV R2,#20D
FCBQ2: MOV A,@R0
SETB TXEN ;發(fā)送使能
MOV R7,A ;獲取的鍵值送R7
LCALL TransmitPacket ;調(diào)用發(fā)射程序包
CLR TXEN
MOV R7,#0AH ;必須加延時(shí),否則收不到
LCALL Delay100us
INC R0
DJNZ R2,FCBQ2
CLR LED0
LCALL Delay
SETB LED0
MOV BZW,#0
LJMP C0158
FH: MOV R0,#30H
JS0: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,JS0
CLR RACSN
MOV R7,#24H ;讀接收數(shù)據(jù)命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV A,R7
MOV @R0,A
XRL A,#10H
JNZ JS1
CLR LED0 ;;;;;;
AJMP JS3
JS1: MOV A,R7
XRLA,#20H
JNZ JS2
CLR LED1 ;;;;;;
JS2: MOV A,R7
XRL A,#40H
JNZ JS3
CLR LED2 ;;;;;;
JS3: MOV R7,#0AH ;延時(shí)100微秒
LCALL Delay100us
INC BZW
INC R0
MOV A,BZW
XRL A,#20D
JZ FH2
AJMP JS0
FH0: MOV R2,#20D
MOV R0,#30H
FH1: MOV A,@R0
MOV R7,A
LCALL PutChar
INC R0
DJNZ R2,FH1
LCALL Delay
MOV BZW,#0
SETB LED0
FH2: LCALL Delay
LCALL Delay
LCALL Delay
LCALL Delay
SETB LED0
SETB LED1
SETB LED2
LJMP FCBQ1
C0185: LCALL SpiReadWrite ;寫(xiě)發(fā)送數(shù)據(jù)地址
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
SpiReadWrite: ANL EXIF,#0DFH ;Move byte to send to SPI data register
MOV SPI_DATA,R7 ;讀寫(xiě)SPI數(shù)據(jù)
C019E: MOV A,EXIF
JNB 0E0H.5,C019E
MOV R7,SPI_DATA
RET
Delayms: MOV 10H,R7 ;延時(shí)子程序
C01A8: MOV R7, 10H
DEC 10H
MOV A,R7
JZ C01BF
CLR A
MOV R5,A
C01B1: MOV A,R5
CLR C
SUBB A,#0AH
JNC C01A8
MOV R7,#0AH
LCALL Delay100us
INC R5
SJMP C01B1
C01BF: RET
Delay100us: MOV 11H,R7
Delay100us1: MOV R7, 11H
DEC 11H
MOV A,R7
JZ C021D
CLR A
MOV R6,A
Delay100us2: MOV A,R6
CLR C
SUBB A,#23H
JNC Delay100us1
INC R6
SJMP Delay100us2
C021D: RET
DELAY: MOV70H,#0FFH
DELAY1: LCALL DELAY2
DJNZ70H,DELAY1
RET
DELAY2: MOV 71H,#0FFH
DELAY3: NOP
DJNZ71H,DELAY3
RET
END
nRF9E5A/D轉(zhuǎn)換程序(無(wú)線溫度計(jì)程序)
;開(kāi)機(jī)定時(shí)器工作35h為0時(shí),a/d轉(zhuǎn)換采集20個(gè)數(shù)據(jù)后,無(wú)線發(fā)送40h單元開(kāi)始的20個(gè)數(shù)據(jù)。
PWMCON EQU 0A9h
PWMDUTY EQU 0AAh
REGX_MSB EQU 0ABh
REGX_LSB EQU 0ACh
REGX_CTRL EQU 0ADh
RSTREAS EQU 0B1h
SPI_DATA EQU 0B2h
SPI_CTRL EQU 0B3h
SPICLK EQU 0B4h
TICK_DV EQU 0B5h
CK_CTRL EQU 0B6h
CKLFCON EQU 0BFh
EXIF EQU 91h
EIE EQU 0E8h
CKCON EQU 8EH
SPI_SCK EQU P2.0
SPI_MOSI EQU P2.1
RACSN EQU P2.3
TXEN EQU P2.4
TRX_CE EQU P2.5
SPI_MISO EQU P2.2
EOC EQU P2.4
DR EQU P2.5
CD EQU P2.6
AM EQU P2.7
P0_DRV EQU93H
P0_DIR EQU 94H
P0_ALT EQU 95H
P1_DIR EQU 96H
P1_ALT EQU 97H
KeyValue EQU 20H
L0 EQU KeyValue.4 ;L0=1,(20H)=10H
L1 EQU KeyValue.5 ;L1=1,(20H)=20H
L2 EQU KeyValue.6 ;L2=1,(20H)=40H
S0 EQU P0.5
S1 EQU P0.6
S2 EQU P0.7
LED0 EQU P0.0
LED1 EQU P0.3
LED2 EQU P0.4
BZW EQU 12H ;設(shè)一個(gè)標(biāo)志位
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP C1
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 004BH
RETI
ORG 0050H
C1: CPLLED0
MOV TH0,#0BH
MOV TL0, #06H
INC 2FH
MOV A,2FH
CJNE A, #32H, C2
MOV 2FH, #00H
INC 35H ;秒個(gè)位加1
MOV A,35H
CJNE A, #0AH, C2
MOV 35H, #00H
INC 34H ;秒十位加1
MOV A,34H;
C2: RETI
PutChar: PUSH ACC
CLR ES
MOV SBUF ,R7
JNB TI, $ ;串口發(fā)送無(wú)線收到的R7鍵值(10H,20H,40H)
CLR TI
SETB ES
POP ACC
RET
JSSJ: CLR EIE.1 ;INT3中斷使能位,禁止中斷
CLR LED1
INCBZW
MOVA,EXIF ;EXIF.5INT3中斷標(biāo)志位
JNB ACC.5 ,$ ;串口發(fā)送無(wú)線收到的R7鍵值(10H,20H,40H)
SETB ACC.5
MOV EXIF,A
SETBEIE.1 ;INT3中斷使能,即允許中斷
RETI
Init: MOV SP,#60H ;設(shè)堆棧指針
MOV TH1,#0F3h ;波特率19200,N,8,1
; MOV TL1,#0F3h ;波特率19200,N,8,1 ;;;;;;
MOV TH0, #3CH
MOV TL0, #0c0h;
ORL CKCON,#10H ;T1M=1,1/4時(shí)鐘
MOV PCON,#80H ;SMOD=1,波特率加倍
MOV SCON,# 50h ; Timer1 8bit auto reload ,方式1,10位UART波特率可變,波特率受MSOD影響,REN=1,TI=1
MOV TMOD,#21h ; Timer1 8bit auto reload 20---21;;;;;;
SETB TR1 ;啟動(dòng)定時(shí)器1
ORL P0_ALT,#06h ; P0.0 out,P0.1 input(RXD),P0.2(TXD) P0.3 P0.4輸出,,P0.5 P0.6P0.7輸入
MOV P0_DIR,#0E2h
MOV SPICLK,#01h ; Connect internal SPI controller to Radio
MOV SPI_CTRL,#02H;02h
SETB LED0 ;燈滅
SETB LED1
SETB LED2
MOV BZW,#00H
CLR RACSN ;SPI片選有效
MOV R7,#19h ;讀RF配置寄存器10-19為讀命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV A,R7
ORL A,#0CH ;讀結(jié)果送R6也就是送到06H單元
MOV R6,A
SETB RACSN
CLR RACSN
MOV R7,#09h ;00-09寫(xiě)RF配置寄存器命令
LCALL SpiReadWrite
MOV R7,06h
LCALL SpiReadWrite ;把讀出的結(jié)果寫(xiě)回
SETB RACSN
CLR RACSN ; Write to RF config address 3 (RX payload)
MOV R7,#03H ;配置RX_PWR,初值20H,32個(gè)字節(jié)01h是1個(gè)字節(jié)
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
SETB RACSN
CLR RACSN
MOV R7,#11h ;Read RF config address 1
LCALL SpiReadWrite ;讀配置寄存器。0001aaaa,aaaa指出讀操作的開(kāi)始字節(jié),
CLR A ;字節(jié)數(shù)量取決于aaaa指出的開(kāi)始地址。
MOV R7,A
LCALL SpiReadWrite ;寫(xiě)配置寄存器。0000aaaa,aaaa指出寫(xiě)操作的開(kāi)始字節(jié),
MOV A,R7 ; 字節(jié)數(shù)量取決于aaaa指出的開(kāi)始地址.
ANL A,#0F0H
MOV R6,A
SETB RACSN
CLR RACSN ; Write RF config address 0
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV R7,#05Fh
LCALL SpiReadWrite
MOV A,R6
ORL A,#0Dh
MOV R7,A
LCALL SpiReadWrite
MOV R7,#44h ;44接收、發(fā)送地址長(zhǎng)度
LCALL SpiReadWrite
MOV R7,#01H ;01h為1字節(jié)有效20h是32字節(jié)有效
LCALL SpiReadWrite
MOV R7,#01h
LCALL C0185
SETB RACSN
InitADC: CLR RACSN ;Configure and turn on ADC
MOV R7,#44h
LCALL SpiReadWrite
MOV R7,#35H ;Select AIN3, PWR_UP = 1, VFSEL=0;
LCALL SpiReadWrite
MOV R7,#09H;0BH ;Set RES_CTRL = 3, 11位,Rightjustified
LCALL SpiReadWrite
SETB RACSN
SETB EA
SETB ES ;EA, ES, EX1, ET0, EX0;;;;;;
SETB ET0
SETB 0BCH ;通信中斷優(yōu)先,IP中PS置1
RET
ScanKey: CLR A ;掃描鍵盤(pán)即掃描3個(gè)按鈕,獲取鍵值
MOV KeyValue,A ;沒(méi)有鍵盤(pán)按下轉(zhuǎn)c00b1
JB S0,C00B1
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤(pán)按下LED0燈亮延時(shí)后熄滅
MOV R7,#1AH
LCALL Delayms
SETB LED0
C00B1: JB S1,C00BF ;L1按下Keyvalue=20h,L0=Keyvalue.5
SETB L1
CLR LED1
MOV R7,#1AH
LCALL Delayms
SETB LED1
C00BF: JB S2 ,C00CD
SETB L2 ;L2按下Keyvalue=40h,L0=Keyvalue.6
CLR LED2
MOV R7,#1AH
LCALL Delayms
SETB LED2
C00CD: MOV A,KeyValue
JZ C00D9
FS: MOV R2,#20H ;發(fā)送20個(gè)字節(jié)
FS1: MOV A,KeyValue
MOV R7,A ;獲取的鍵值送R7
SETB TXEN ;發(fā)送使能
LCALL TransmitPacket ;調(diào)用發(fā)射程序包
CLR TXEN
MOV R7,#2AH
LCALL Delay100us
DJNZ R2,FS1
C00D9: RET
ReceivePacket: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,C010E
CLR RACSN
MOV R7,#24H ;讀接收數(shù)據(jù)命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV KeyValue,R7
INC BZW
JNB L0,C00F9 ;對(duì)接收數(shù)據(jù)進(jìn)行計(jì)數(shù)
CLR LED0
C00F9: JNB L1,C00FE
CLR LED1
C00FE: JNB L2,C0103
CLR LED2
C0103: MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C010E: RET
TransmitPacket:MOV R5,07H ; Spi enable for write a spi command
CLR RACSN ;Writeaddress command
MOV R7,#22H ;寫(xiě)發(fā)送地址命令22H
LCALL C0185 ;E7,E7,E7,E7 TX_ADDRESS
SETB RACSN
MOV R7,#01H ;延時(shí)100微秒
LCALL Delay100us
CLR RACSN
MOV R7,#20H ;寫(xiě)發(fā)送數(shù)據(jù)命令20H
LCALL SpiReadWrite
MOV R7,05H ;保存在R5中的鍵值送R7發(fā)送
LCALL SpiReadWrite
SETB RACSN
SETB TRX_CE
MOV R7,#0AH ;發(fā)送后延時(shí)
LCALL Delay100us
CLR TRX_CE
C0136: JNB TRX_CE,C0136 ;等待發(fā)送完畢
RET
main: LCALL Init ;主程序,現(xiàn)調(diào)用初始化程序
CLR LED0 ;3個(gè)燈陸續(xù)點(diǎn)亮后熄滅
MOV R7,#0AH
LCALL Delayms
CLR LED1
MOV R7,#0AH
LCALL Delayms
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
Q: MOV A,#0H
MOVR2,#60D ;清數(shù)據(jù)區(qū)
MOV R0,#12H
QING: MOV@R0,A ;清數(shù)據(jù)區(qū)
INC R0
DJNZ R2,QING
SETB TR0
C0158: SETB TR0;
MOV A,35H
CJNE A, #0AH, C0158
CLR TR0
LCALL StartADC
MOV A,40H
MOV R7,A
CPL LED1
CLR TR0
FCBQ1: MOV R0,#40H
MOV R2,#20D
FCBQ2: MOV A,@R0
SETB TXEN ;發(fā)送使能
MOV R7,A ;獲取的鍵值送R7
LCALL TransmitPacket ;調(diào)用發(fā)射程序包
CLR TXEN
MOV R7,#0AH ;必須加延時(shí),否則收不到
LCALL Delay100us
INC R0
DJNZ R2, FCBQ2
LCALL Delay
MOV BZW,#0
SETB TR0
LJMP C0158
FH: SETB TRX_CE ;等待接收完畢 OK
JNB TRX_CE,FH
CLR RACSN
MOV R7,#24H ;讀接收數(shù)據(jù)命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV A,R7
MOV @R0,A
MOV R7,#05H ;延時(shí)100微秒
LCALL Delay100us
INC BZW
INC R0
MOV A,BZW
XRL A,#20D
JZ FH0
AJMP FH
FH0: MOVR2,#20D ; OK
MOV R0,#30H
CLR LED0
FH1: MOV A,@R0
MOV R7,A
LCALL PutChar
INC R0
DJNZ R2,FH1
LCALL Delay
MOV BZW,#0
SETB LED0
FH2: ; LCALLDelay
LCALL Delay
LJMP C0158
StartADC: MOV R2,#20
MOV R0,#40H;PUSH ACC
ADC20: CLR RACSN
MOV R7,#0C3h ;START_ADC_CONV(SAV)1100-SSSS=CHSEL=3通道
LCALL SpiReadWrite
SETB RACSN
JNB EOC, $
CLR RACSN
MOV R7,#40h
LCALL SpiReadWrite
MOV R7,#0FFH
LCALL SpiReadWrite
MOV A,R7;07H ;
MOV @R0,A ;
INC R0
DJNZ R2,ADC20
cpl led2
RET
C0185: LCALL SpiReadWrite ;寫(xiě)發(fā)送數(shù)據(jù)地址
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
SpiReadWrite: ANL EXIF,#0DFH ;Move byte to send to SPI data register
MOV SPI_DATA,R7 ;讀寫(xiě)SPI數(shù)據(jù)
C019E: MOV A,EXIF
JNB 0E0H.5,C019E
MOV R7,SPI_DATA
RET
Delayms: MOV 10H,R7 ;延時(shí)子程序
C01A8: MOV R7, 10H
DEC 10H
MOV A,R7
JZ C01BF
CLR A
MOV R5,A
C01B1: MOV A,R5
CLR C
SUBB A,#0AH
JNC C01A8
MOV R7,#0AH
LCALL Delay100us
INC R5
SJMP C01B1
C01BF: RET
Delay100us: MOV 11H,R7
Delay100us1: MOV R7, 11H
DEC 11H
MOV A,R7
JZ C021D
CLR A
MOV R6,A
Delay100us2: MOV A,R6
CLR C
SUBB A,#23H
JNC Delay100us1
INC R6
SJMP Delay100us2
C021D: RET
DELAY: MOV 70H,#0FFH
DELAY1: LCALL DELAY2
DJNZ 70H,DELAY1
RET
DELAY2: MOV 71H,#0FFH
DELAY3: NOP
DJNZ 71H,DELAY3
RET
END
|