历史上的今天
返回首页

历史上的今天

今天是:2025年01月16日(星期四)

正在发生

2020年01月16日 | 基于PIC12C508 DTMF拔号程序编写分享

2020-01-16 来源:elecfans

pIC12C508 DTMF拔号程序

;|Name:MAIN.ASM|

;|Description:DTMF-》RS232converter(forusewithPCNummerViser)|

;|DetectsDTMFandringing,andtransmitstoastd.|

;|RS232port,at2400baud.|

;|||

;+--------------------------------------------------------------------+

基于PIC12C508 DTMF拔号程序编写分享

;|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.


推荐阅读

史海拾趣

中微股份(Cmsemicon)公司的发展小趣事

2019年,中微股份(Cmsemicon)迎来了又一个重要时刻——成为科创板首批上市公司之一。这一荣誉不仅是对公司过去成绩的肯定,也为公司的未来发展提供了更多的资金支持。上市以来,公司充分利用资本市场的优势,加大研发投入,推动技术创新和产品升级。同时,公司还积极拓展国际市场,提升品牌影响力。

Advanced Semiconductor, Inc.公司的发展小趣事

随着全球对环保和可持续发展的重视,ASI也积极响应这一趋势,致力于研发更加环保、节能的半导体产品。公司不断投入资源研发低功耗、高性能的芯片技术,为推动绿色电子产业的发展贡献力量。同时,ASI也对未来充满信心,将继续加大在新技术、新应用领域的投入,为半导体行业的未来发展贡献更多的智慧和力量。

这五个故事展示了Advanced Semiconductor, Inc.在电子行业中的发展历程和取得的成就。从创立初期的艰难探索到如今的行业领先地位,ASI凭借其独特的技术、创新的精神和敏锐的市场洞察力,不断突破自我、超越自我,成为了半导体行业的一颗璀璨明星。

BAHCO公司的发展小趣事

随着市场的不断变化和消费者需求的多样化,BAHCO也在不断调整和优化产品线。除了传统的五金工具外,BAHCO还积极开发新的产品领域,如电动工具、测量仪器等。这些新产品的推出不仅丰富了公司的产品线,也满足了不同消费者的需求。同时,BAHCO还注重产品的环保性能和可持续性发展,致力于为消费者提供更加环保、高效的产品解决方案。

DL Instruments LLC公司的发展小趣事

经过多年的发展,DL Instruments已经成为电子行业中一家具有重要影响力的企业。然而,公司并没有因此而满足。相反,它继续加大研发投入、拓展产品线、优化生产流程、提高产品质量和服务水平。展望未来,DL Instruments将继续秉承“创新、卓越、服务”的理念,为电子行业的发展做出更大的贡献。

请注意,这些故事是基于现有信息进行的概述和虚构,并非真实的历史事件。如有需要,您可以进一步查阅相关资料或联系DL Instruments公司获取更详细的信息。

Engineered Components Co公司的发展小趣事

Engineered Components Co(ECC)公司成立于XXXX年,由几位在电子制造领域有丰富经验的工程师共同创立。他们看到了电子行业中对于高质量、高精度电子元件的迫切需求,因此决定专注于此领域。ECC在创立初期就确立了以客户需求为导向,以技术创新为驱动的发展战略。他们通过自主研发,生产出了第一批高精度电子连接器,并在市场上获得了良好的反响。

Eska公司的发展小趣事

为了满足全球客户的需求,Eska公司实施了市场拓展和国际化战略。公司在欧洲各大主要城市及美国设立了服务中心,以便为当地客户提供快速可靠的服务。此外,Eska还利用先进的分切设备,为当地客户集中快速地提供载切大小格式灰板的服务。同时,Eska的产品也通过全球代理商、经销商及存货商网络,覆盖到更广泛的市场。

问答坊 | AI 解惑

检测绝缘栅极双极型晶体管(IGBT)好坏的简易方法

1、判断极性首先将万用表拨在R×1KΩ挡,用万用表测量时,若某一极与其它两极阻值为无穷大,调换表笔后该极与其它两极的阻值仍为无穷大,则判断此极为栅极(G)。其余两极再用万用表测量,若测得阻值为无穷大,调换表笔后测量阻值较小。在测量阻值 ...…

查看全部问答>

很奇怪的问题 wince 串口测试应用程序 writefile(...)函数没有执行完就失败了,然后程序死掉了。

串口测试的writefile(...)函数没有执行完就失败了,没有任何返回结果。writefile的下一个语句做断点,没有执行到。 if(hComm!=INVALID_HANDLE_VALUE&&dwCharToWrite!=0)         {           &nbs ...…

查看全部问答>

终于研发成功

终于研发成功,cpu是s3c2410,64M   SDRAM,网口为cs8900 flash(k9f1208 64m)   实现了只用nand flash 就可以启动引导vxworks. 公司送bsp及全套开发文档 ,另可配公司的开发板 有意着QQ联系641328010 请注明 arm…

查看全部问答>

STC12LE5206AD 程序将引脚置为0 却检测到为高

有谁能够帮忙解决下啊? 本人qq:853887107…

查看全部问答>

RT_THREAD中的异常与中断

  异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果系统不及时处理,系统轻则出错,重着导致系统毁灭性的瘫痪。所以正确地处理异常避免错误的发生是提高软件的鲁棒性重要的一方面,对于嵌入式系统更加如此。 异常可以分成两类 ...…

查看全部问答>

DIY导航避障车规整贴

DIY导航避障车小组今日下午展开第一次例会,在本次例会中大家集中讨论了无线的选择,避障的选择等等部分,并对小车进行了前景规划,以谷歌的自动驾驶车为终极目标,大家积极发言例会持续了一个半小时,并表示未来会采用各种新技术。下次再来把细节 ...…

查看全部问答>

11.06【每周讨论】软文——春风化雨、润物无声

您知道“软文”的含义吗?什么,不知道。赶紧百度一下吧,别被OUT了 [ 本帖最后由 longxtianya 于 2011-11-6 20:19 编辑 ]…

查看全部问答>

分享一些收集的msp430方面的书籍

最近接触了一下msp430的单片机从网上搜集了一些书籍希望对大家有帮助。…

查看全部问答>

泰克2012年度春季创新论坛北京站见闻

    4月24日阴雨天气,阿牛哥上午9点去北京朝阳区五洲皇冠大酒店参加泰克2012年度春季创新论坛。热情的工程师们朋友已经在会场里聆听泰克的测试测量行业趋势观点,泰克领先测试测量方案,还有一些工程师朋友在展厅参观泰克最新 ...…

查看全部问答>

全球智能机Q2出货1.5亿部 中兴进前五

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 …

查看全部问答>