日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] pIC12C508 DTMF拔號(hào)程序;|Name:MAIN.ASM|;|Description:DTMF->RS232converter(forusewithPCNummerViser)|;|DetectsDTMFandringing,andtransmitstoastd.|;|RS232port,at2400baud.|;|||;+---------------

pIC12C508 DTMF拔號(hào)程序
;|Name:MAIN.ASM|

;|Description:DTMF->RS232converter(forusewithPCNummerViser)|
;|DetectsDTMFandringing,andtransmitstoastd.|
;|RS232port,at2400baud.|
;|||
;+--------------------------------------------------------------------+
;|Platform:PIC12C508(A)(usinginternal4MHzRC-oscillator)|
;|Uses:90-342W/512Wprogram-mem(all’switches’setto0/1)|
;|6B/25Bdata-mem|
;|Assembler:MPASM2.20(MPLAB4.00.00)|
;|Comments:-|
;+====================================================================+

TITLE’DTMFtoRS232converter’

PROCESSOR12C508

__CONFIG_CP_OFF&_MCLRE_OFF&_IntRC_OSC&_WDT_ON
INCLUDE

RADIXDEC
__IDLOCSh’0104’


OTPSET1;Usefactory-storedcal.-value(onOneTimeProgrammable)

TMR0CLKSET1;UseTMR0externalclockat3,579545MHz(insteadofIntRC).
PARITYSET1;Useevenparity-bitwhentransmittingtotheserialport.
CLIONLYSET1;TransmitsCLI(A-numbers)only.
RINGSET1;Transmitsringing.
IDENTTXSET1;Transmits’ident’whenpressing’***’(DTMF).
PWRUPIDSET1;Transmitsshort’ident’atpowerup.
ASCIISET1;TransmitsASCII-charsinsteadofbinary:
;DigitASCIIBinaryDigitASCIIBinary
;00(48d)0000000099(57d)00001001
;11(49d)00000001AA(65d)00001010
;22(50d)00000010BB(66d)00001011
;33(51d)00000011CC(67d)00001100
;44(52d)00000100DD(68d)00001101
;55(53d)00000101**(42d)00001110
;66(54d)00000110##(35d)00001111
;77(55d)00000111RingR(82d)00010000
;88(56d)00001000


;---+++***Constants***+++---

IFTMR0CLK==0;Internaloscillator
OPTION_REGequb’10000001’;’Default’timer/prescalersetup
ENDIF

IFTMR0CLK==1;ExternalTMR0source(3,579545MHz)
OPTION_REGequb’10100011’;’Default’timer/prescalersetup
ENDIF

#defineDTMF0GPIO,0;Bit0(LSB)fromMT8870
#defineDTMF1GPIO,1;Bit1fromMT8870
#defineDTMF2GPIO,3;Bit2fromMT8870/_Ring-detector
#defineDTMF3GPIO,4;Bit3fromMT8870/TxD-output(high=sPACe)
#defineDTMFOKGPIO,5;DTMFdetected,andreadyatDTMF0-3


;---+++***Variabledeclaration***+++---
cblock0Ch
DTMFval
identval
misc
temp1,temp2,teMP3;Temp-variables
endc

#defineCLIPmisc,0;SetwhenCLIPdetected
#defineCLIPendmisc,1;SetbyCLIPdetwhen#received
#defineIdentOKmisc,2;Setwhen’ident’detected(***)


;---+++***Resetvector***+++---
ORG0h
rst_vector:
MOVwfOSCCAL;Setoscillatorcalibration.

callinit

IFPWRUPID==1
gotopwrupident
pwrupidentreturn:
ENDIF

gotomain



;---+++***Identity(located’low’becauseofnoCP<64b)***+++---
identtable:
IFIDENTTX==1
addwfPCL,F
dt"+++PCNummerViser+++",13
dt"Firmwarev1.04",13,13
dt"JaCOBBlichfELDt’98",13,13,13,0
ENDIF

pwrupidenttable:
IFPWRUPID==1
addwfPCL,F
dt"DTMFTORS232",60,"0104",62,0
ENDIF


;---+++***Initialization***+++---
init:
;SetupI/O-direction(GP0-3,5=input,GP4=output)
MOVlwb’11101111’
trisGPIO

;TxD=Space(GP4=low)
MOVlwb’00000000’
MOVwfGPIO

;EnableportBpull-up,dISAblewake-uponPINchange
;SetupT0=inc.oneitherOSC.orTMR0,prescaler=4/16(dependsonTMR0CLK)
clrwdt
MOVlwOPTION_REG
option

clrfmisc
clrfidentval

retlw0


;---+++***Power-upidentitytransmission***+++---
IFPWRUPID==1
pwrupident:

MOVlw4;waitapprox.1second
MOVwftemp3
pwrup11:clrftemp2
pwrup12clrftemp1
pwrup13:clrwdt
decfsztemp1,F
gotopwrup13
decfsztemp2,F
gotopwrup12
decfsztemp3,F
gotopwrup11

MOVlwh’0FF’
MOVwftemp3
pwrup2:clrwdt
incftemp3,F
MOVftemp3,W

callpwrupidenttable;Fetchtext

clrftemp2
subwftemp2,F
btfscSTATUS,Z;Endoftable?
gotopwrupend
calltxser
gotopwrup2

pwrupend:
gotopwrupidentreturn
ENDIF


;---+++***Main***+++---
main:gotoDTMFdet
DTMFdetreturn:
gotoringdet
ringdetreturn:
gotomain;Repeatmain


;ReadDTMF-bitsfrom8870,convertstonibble,andreturnsinW.
readDTMF:
MOVfGPIO,W
andlwb’00000011’;Getbit0-1
MOVwfDTMFval

bsfDTMFval,2;Getbit2
btfssDTMF2
bcfDTMFval,2

MOVlwb’11111111’;Getbit3(DTMF3=input)
bcfDTMFval,3
trisGPIO
MOVlwb’11101111’
btfscDTMF3
bsfDTMFval,3
trisGPIO;DTMF3=Output
bcfDTMF3

MOVfDTMFval,W;Convertfrom8870->’normal’
andlwb’00001111’
callDTMFtable
MOVwfDTMFval
retlw0

DTMFtable:
addwfPCL,F
retlwb’00001101’;DTMF’D’
retlwb’00000001’;DTMF’1’
retlwb’00000010’;DTMF’2’
retlwb’00000011’;DTMF’3’
retlwb’00000100’;DTMF’4’
retlwb’00000101’;DTMF’5’
retlwb’00000110’;DTMF’6’
retlwb’00000111’;DTMF’7’
retlwb’00001000’;DTMF’8’
retlwb’00001001’;DTMF’9’
retlwb’00000000’;DTMF’0’
retlwb’00001110’;DTMF’*’
retlwb’00001111’;DTMF’#’
retlwb’00001010’;DTMF’A’
retlwb’00001011’;DTMF’B’
retlwb’00001100’;DTMF’C’


;ConvertsreceivedDTMFtoASCII(returnsinW)
conASCII:
IFASCII==1
addwfPCL,F
retlwA’0’
retlwA’1’
retlwA’2’
retlwA’3’
retlwA’4’
retlwA’5’
retlwA’6’
retlwA’7’
retlwA’8’
retlwA’9’
retlwA’A’
retlwA’B’
retlwA’C’
retlwA’D’
retlwA’*’
retlwA’#’
ENDIF


;Testsfor3subsequent’*’.
ident:
IFIDENTTX==1
bcfIdentOK
MOVlwb’00001110’;DTMF’*’
subwfDTMFval,W
btfssSTATUS,Z
gotoident1
incfidentval,F

MOVlwd’3’
subwfidentval,W
btfssSTATUS,Z
gotoidentend
bsfIdentOK
ident1:clrfidentval

identend:
retlw0
ENDIF


;TransmitsWat2400bps/std.RS232.Calculatesparity-bit.Returnswhendone.
txser:
MOVwftemp1

bcfSTATUS,C;Transmitstart-bit
calltxcarry

MOVlwd’8’;Transmit8databits
MOVwftemp2
txbits:clrwdt
rrftemp1,F
calltxcarry
decfsztemp2,F
gototxbits

IFPARITY==1
rrftemp1,F;calculateparity(even)
swapftemp1,W
xorwftemp1,W
MOVwftemp1
rrftemp1,F
rrftemp1,F
xorwftemp1,F
rrftemp1,W
xorwftemp1,F
bcfSTATUS,C
btfsctemp1,0
bsfSTATUS,C
calltxcarry
ENDIF

bsfSTATUS,C;Transmit2*stop-bit
calltxcarry
bsfSTATUS,C
calltxcarry

retlw0

;transmitcarry-flag
IFTMR0CLK==0
txcarry:MOVlw(256-104);2400=416,666us=1666,666c/16=104,17
ENDIF

IFTMR0CLK==1
txcarry:MOVlw(256-93);2400=416,666us=1491,477c/16=93,22
ENDIF


txndone:btfscTMR0,7;Lastbittransmitted(TMR0ovfl.)?
gototxndone

bsfDTMF3;Space
btfscSTATUS,C;Settomark(-12V)ifCarry=1
;(RS232invertsoutput)
bcfDTMF3;Mark

MOVwfTMR0

retlw0


;RecognizesCLIP(DTMFreceivedinA),andsets/clearsCLIP.

IFCLIONLY==1
CLIPdet:
MOVwftemp1
MOVlwb’00001010’;DTMF’A’
subwftemp1,W
btfssSTATUS,Z
gotoCLIPdet2
bsfCLIP
gotoCLIPdetend

CLIPdet2:MOVlwb’00001101’;DTMF’D’
subwftemp1,W
btfssSTATUS,Z
gotoCLIPdet3
bsfCLIP
gotoCLIPdetend

CLIPdet3:btfssCLIP
gotoCLIPdetend
MOVlwb’00001111’;DTMF’#’
subwftemp1,W
btfssSTATUS,Z
gotoCLIPdetend
bcfCLIP
bsfCLIPend

CLIPdetend:
retlw0
ENDIF


;DTMF-detection-CallsreadDTMF,CLIPdet,conASCIIandtxserifDTMFispresent.
;ReturnswhenDTMFisreMOVed.
DTMFdet:clrwdt
btfssDTMFOK
gotoDTMFdetreturn
goto$+1;Doublenop
btfssDTMFOK
gotoDTMFdetreturn

callreadDTMF;DTMFpresent,read!

IFIDENTTX==1;Transmitidentif’***’received
callident
btfssIdentOK
gotoDTMFdet2

MOVlwh’0FF’
MOVwftemp3

DTMFdet1:clrwdt
incftemp3,F
MOVftemp3,W

callidenttable;Fetchtext

clrftemp2
subwftemp2,F
btfscSTATUS,Z;Endoftable?
gotoDTMFdet2
calltxser
gotoDTMFdet1
ENDIF

DTMFdet2:
MOVfDTMFval,W
IFCLIONLY==1;TransmitonlyCLI
callCLIPdet
btfssCLIPend;LastdigitinCLI(#)?
gotoDTMFdet21
bcfCLIPend
gotoDTMFdet22
DTMFdet21:
btfssCLIP
gotoDTMFoff
DTMFdet22:
MOVfDTMFval,W
ENDIF

IFASCII==1;ConverttoASCII
MOVfDTMFval,W
callconASCII
ENDIF

calltxser;Transmittoserialport

DTMFoff:clrwdt;WaitforDTMFtostop
btfscDTMFOK
gotoDTMFoff

DTMFend:gotoDTMFdetreturn



;Ring-detection-Ifringingispresent,callstxserwithW=(ascii)’R’.
;ReturnswhenringingendsorDTMFispresent.
ringdet:clrwdt
IFRING==1
btfscDTMF2
gotoringend

ringdet2:;Waitforringing-pulseto
clrwdt;stop(orDTMFpresent).
btfscDTMFOK
gotoringend
btfssDTMF2
gotoringdet2

MOVlwb’10000111’;Setuptimer:50msbeforeoverflow.
option
MOVlwd’50’
MOVwfTMR0

ringdet3:clrwdt;Waitfornewringing-pulse
MOVlw0
subwfTMR0,W
btfscSTATUS,Z
gotoringend
btfscDTMF2
gotoringdet3
;Newpulsepresent.
MOVlwOPTION_REG;Restoreoldprescaler
option
MOVlwA’R’;Transmit’R’
calltxser
bcfCLIP;TerminateCLIP-sequence(ringdet.)
MOVlwb’10000111’;Setuptimer:50msbeforeoverflow.
option

ringdet4:MOVlwd’50’
MOVwfTMR0

ringdet5:clrwdt;Waitforringingtoend
btfssDTMF2
gotoringdet4

MOVlw0
subwfTMR0,W
btfscSTATUS,Z
gotoringend
btfssDTMFOK
gotoringdet5

ringend:MOVlwOPTION_REG;Restoreoldprescaler
option
ENDIF
gotoringdetreturn



IFOTP==0
ORGh’1FF’;(old12C508calibration-val.)
MOVlwh’0A0’
ENDIF

END


+---------------------------------------------------------------------+
|History|
+---------------------------------------------------------------------+

Rev.ChangeReasonDate
--------------------------------------------------------------------------------
0.0aSource-filecreated.-24.03.98

0.5aHierarchischdiagramfinished.-25.03.98

1.0aEverythingimplemented,readyfortest.-26.03.98

1.0bTestedin’reallife’...Everythingok,-27.03.98
(minorbugsreMOVed).

1.0Firstversion,’inuse’.-27.03.98

1.01Fixed’#’nottransmittedwhenCLIP=1.-29.03.98
Fixed’D’-sequencesnotrecognizedas
CLIP(nottransmittedwhenCLIP=1).
ImplementedPwrUpIdent.Givespossibilityof
auto-detection,and
FW-versiondetection.

1.02Implementedpossibilityofusingext.Moreprecisethan09.04.98
TMR0source,astimebaseforRS232-internalRC-oscillator.
communication.
BugfixedCLIPdet.ASCII-tablelocatedin
upperpagewhenall
switches=1.

1.03r+++First’public’release.+++IncasetheCLI-02.05.98
BreakCLIP-sequenceifringdetected.sequenceisnottermi-
natedprobably(because
oflinenoiseetc.)


1.04rMinorchanges/bugfixes:18.03.99
ChangedTX-timing.Transmittedat~2325bps.
Changedformatfrom8E1to8E2Enablesreceivertore-
(2stopbits).syncronizebetweeneach
byte,therebysupressing
framing-errors.
Minimized’read-DTMF’timing.ReMOVesunwanted10us
glitchonTXjustbefore
transmittingadigit.


Ideas/futurechanges:
-------------------------------------------------------------------------------
AddEEPROMandchangepower-supply,toenablereception/storingofDTMF,when
thePCisturnedoff.

Addoffhookdetector,toenable’lengthofconversation’,and’answered/not
answeredcall’logging.

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

在軟件開(kāi)發(fā)中,邊界條件檢查是確保程序穩(wěn)定性的關(guān)鍵環(huán)節(jié)。當(dāng)面對(duì)參數(shù)驗(yàn)證、資源分配或數(shù)據(jù)完整性校驗(yàn)時(shí),開(kāi)發(fā)者常在if語(yǔ)句和assert斷言間徘徊。兩者雖都能捕捉錯(cuò)誤,但設(shè)計(jì)哲學(xué)與適用場(chǎng)景迥異。

關(guān)鍵字: assert 程序

在這篇文章中,小編將對(duì)PLC的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對(duì)它的了解程度,和小編一起來(lái)閱讀以下內(nèi)容吧。

關(guān)鍵字: PLC 模塊化 程序

對(duì)程序進(jìn)行優(yōu)化,通常是指優(yōu)化程序代碼或程序執(zhí)行速度。優(yōu)化代碼和優(yōu)化速度實(shí)際上是一個(gè)予盾的統(tǒng)一。一般是優(yōu)化了代碼的尺寸,就會(huì)帶來(lái)執(zhí)行時(shí)間的增加;如果優(yōu)化了程序的執(zhí)行速度,通常會(huì)帶來(lái)代碼增加的副作用。很難魚(yú)與熊掌兼得,只能在...

關(guān)鍵字: 單片機(jī) 程序

一個(gè)程序首先要保證正確性,在保證正確性的基礎(chǔ)上,性能也是一個(gè)重要的考量。要編寫(xiě)高性能的程序,必須選擇合適的算法和數(shù)據(jù)結(jié)構(gòu)。

關(guān)鍵字: CPU 程序 緩存

仿真的概念其實(shí)使用非常廣,最終的含義就是使用可控的手段來(lái)模仿真實(shí)的情況。在嵌入式系統(tǒng)的設(shè)計(jì)中,仿真應(yīng)用的范圍主要集中在對(duì)程序的仿真上。

關(guān)鍵字: 單片機(jī) 仿真器 程序

步進(jìn)電動(dòng)機(jī)是將電脈沖激勵(lì)信號(hào)轉(zhuǎn)換成相應(yīng)的角位移或線位移的離散值控制電動(dòng)機(jī),這種電動(dòng)機(jī)每當(dāng)輸入一個(gè)電脈沖就動(dòng)一步,所以又稱脈沖電動(dòng)機(jī)。

關(guān)鍵字: 步進(jìn)電機(jī) 正反轉(zhuǎn) 程序

KeilμVision4是Keil軟件公司為8051系列微控制器及其兼容產(chǎn)品設(shè)計(jì)的集成式軟件開(kāi)發(fā)環(huán)境。μVision4集成了C51編譯器和A51匯編器,其界面類似于Microsoft VS,支持C語(yǔ)言和匯編語(yǔ)言程序的編寫(xiě)...

關(guān)鍵字: 程序 編譯 鏈接

雙方各執(zhí)一詞,誰(shuí)也不退讓,吳雄昂的身份成為薛定諤的貓:在Arm公司眼中,他已經(jīng)被罷免一切職位;在安謀中國(guó)聲明里,吳仍然一切照常。這種疊加態(tài)或許還會(huì)持續(xù)一段時(shí)間,但疊加態(tài)應(yīng)該很快就會(huì)塌縮成一個(gè)確定結(jié)果。同樣,安謀中國(guó)董事會(huì)...

關(guān)鍵字: ARM 中國(guó)董事會(huì) 程序

除了指令空間,自定義指令對(duì)應(yīng)的程序出入口也有嚴(yán)格限制。自定義指令在使用過(guò)程中出現(xiàn)任何錯(cuò)誤時(shí),Arm的工具鏈都能及時(shí)對(duì)其進(jìn)行識(shí)別、提取,并且進(jìn)行相應(yīng)的控制。目前也已經(jīng)有第三方編譯器,可以識(shí)別自定義指令集可能會(huì)出現(xiàn)的錯(cuò)誤。專...

關(guān)鍵字: 指令空間 程序 ARM

如果說(shuō)一眾美國(guó)科技公司遵循特朗普命令斷供華為,還算某種程度上維護(hù)所謂程序正義不得已而為之;那么各路本應(yīng)對(duì)政治保持中立的國(guó)際技術(shù)標(biāo)準(zhǔn)組織,先后宣布剔除華為成員資格,絕對(duì)算助紂為虐;而聯(lián)邦快遞將華為委托寄送目的地為中國(guó)的快遞...

關(guān)鍵字: 快遞 華為 程序
關(guān)閉