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

2020-01-16来源: elecfans关键字:PIC12C508  DTMF  拔号程序

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.


关键字:PIC12C508  DTMF  拔号程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485870.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PIC16F87X单片机的定时器/计数器的应用
下一篇:基于PIC单片机控制温度传感器测温的设计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

以PIC16C72单片机控制为核心的水温水位控制器设计
。1 系统结构和工作原理该控制器主要是用于测量、显示落水式太阳能热水器水箱中的水位和水温,上下水管道温度,控制电磁阀上水、控制辅助电加热及管道防冻电伴热带等。它主要由单片机PIC16C72、水箱温度和管道温度传感器、水位传感器及测量电路、输入按健、用水水流开关、电磁阀控制、电加热控制和电伴热带控制等部分组成。控制器结构框图如图1所示。单片机PIC16C72作为控制的核心,通过执行程序实现对系统各部分的控制。水位测量模块实现水箱水位的测量,温度测量模块实现储水箱水温、上下水管道温度的温度测量。三路控制输出通过继电器分别控制上水电磁阀、电加热器和防冻电伴热带工作。LED部分显示水箱水位,水箱水温及显示相关参数,按健部分用于选择工作模式
发表于 2019-12-26
以PIC16C72单片机控制为核心的水温水位控制器设计
基于PIC12C508单片机对灯光系统的控制
以下程序使用PIC12C508 单片机 ,内部4MHz时钟,4脚输入50HZ脉冲信号,7,6,3脚(GP0,GP1,GP4端口)为输出口。其中渐变部分是让灯慢慢的变亮(或灭)。;程序如下:GPI0EQU6COUNT1EQU11COUNT2EQU12COUNT3EQU13COUNT4EQU14COUNT5EQU15POINTEREQU16POINTER1EQU17ORG00HMOV LW07H;设定时钟参数1:256分频OPTIONMOV LW2CH;输出端口设定0,1,4输出,3输入50HZTRIS6;-------------------------------START:;对3端口扫描扫描0低电位MOV
发表于 2019-12-23
基于PIC12C508单片机对灯光系统的控制
基于PIC16C71单片机的数字水温配制阀设计
设计了一种基于PIC16C71单片机的数字水温配制阀。该配制阀采用NTC热敏电阻作温度传感器,与固定电阻组成简单分压电路作为水温测量电路,利用PIC16C71单片机内置的8位A/D转换器把热敏电阻上的模拟电压转换为数字量,PIC16C71单片机控制直流电机驱动混水阀调节冷热水的混合比例实现水温调节。给出了控制电路图,对水温测量电路的参数选择和测温精度作了详细讨论。实验和分析表明,选用阻值较大的NTC热敏电阻和分压电阻可较好地解决热敏电阻因功耗较大造成的热击穿问题。随着社会的发展,各种热水器及管道热水进入千家万户,人们在不同场合对水温的要求是多种多样的,经常需要把热水和冷水混合到需要的温度。可以控制各种热水器及管道热水的出水
发表于 2019-12-19
基于PIC16C71单片机的数字水温配制阀设计
PIC 8位单片机16C6×系列简介
PIC 8位单片机16C6×系列简介由于PIC系列单片机是靠发展多个系列产品型号来满足不同层次用户的需要,所以其产品型号特别多,但是仔细分析各类产品的特点,仍可找到它们的一些共同点。PIC16C6×属于PIC系列中级产品之一类,其产品有:PIC16C61/62A/62/63/R63/64A/R64/65A/65/R65/67等型号。它们的引脚功能如图1、图2、图3所示。未给出的产品型号其引脚功能与给出的产品型号引脚之间极为近似,仅表现在少数几个引脚的复位功能上。主要功能 高性能RISC结构CPU;OTP/EPROM工艺;精简指令集35条单字节指令;除GOTO、CALL为双周期指令外其余均为单周期指令;执行速度DC~200ns;多种
发表于 2019-12-14
PIC 8位单片机16C6×系列简介
基于PIC12C508的定时器
说明1、PIC12C508单片机的设置 P2脚---设置输入 P3脚---软件PWM产生输出 P4脚---开始/停止开关输入 P5脚---50HZ时钟基准输入 P6脚---驱动继电器输出 P7脚---比较器输入。2、电源 由变压器T1,二级管D1,D2,D3,电容C1,C2,C3和U3组成。为继电器和I.C.S提供5V电压.如果有绝缘需求,可心使用无变压电源.3、时间基准 为产生时钟基准,第二运算放大器U2B常常用来产生50HZ的方波,由电阻或稳压二级管产生近似方波.甚至也使用内部时钟.4、设置 通常是由跳线来选择时间基准的范围.如果J3跳线,时间基准为0-100S,若不跳线,时钟基准范围为0-100分钟.5、开始/停止 由开关
发表于 2019-10-23
基于PIC12C508的定时器
采用MSP430单片机与DTMF技术设计医院呼叫对讲系统设计
    随着科学技术的迅速发展,尤其是电子信息技术的不断更新,医疗卫生事业也逐步深化改革,实现现代化医疗成为医院未来发展的趋势,医院呼叫对讲系统是提高医院的护理水平的重要设备之一,其基本功能就是通过一种简便的途径使护理对象与医护人员达成沟通。16位的MSP430单片机的集成度很高,片内资源丰富,主要的突出特点是低功耗,可以实现长时间的稳定工作,应用到该系统后,性能得到很好的优化,可以提高医护人员的工作效率和降低他们的劳动强度,病人也能得到及时的护理和医疗,可以显着提高医院的服务水平和医疗质量。    1 DTMF呼叫对讲系统介绍    1.1 DTMF技术的介绍 
发表于 2018-04-05
采用MSP430单片机与DTMF技术设计医院呼叫对讲系统设计
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved