当前位置:首页 > 单片机 > 单片机
[导读]我们经常能见到关于PC的MODEM通讯的文章,但关于单片机MODEM通讯的文章却不多见。现在将我个人单片机MODEM通讯的实践经历写出来供大家参考。要写单片机的MODEM通讯必须要有两个背景知识,一个是AT命令集,另一个是通用

我们经常能见到关于PC的MODEM通讯的文章,但关于单片机MODEM通讯的文章却不多见。现在将我个人单片机MODEM通讯的实践经历写出来供大家参考。

要写单片机的MODEM通讯必须要有两个背景知识,一个是AT命令集,另一个是通用异步接收发送器(UART)。

1.AT命令集

下面介绍我通讯程序例子中涉及到的AT命令。
??Dn:拨号命令。该命令使MODEM立即进入摘机状态,并拨出跟在后面的号码。D命令是基本的拨号命令,它受到其它命令的修饰可构成MODEM何时拨号以及如何拨号等操作。
??T:音频拨号。例如,ATDT2245879,其中2245879为电话号码。
??P:脉冲拨号。例如,ATDP2245879,其中2245879为电话号码。
??,:标准暂停。我们常常碰到拨打外线电话时需要暂停一下,等听到二次拨号音(外线)之后才能再拨后续的号码。缺省时暂停时间为2s(秒),它由S8寄存器指定。
??Sn:表示MODEM内部的寄存器。
??S0:自动应答。如果要求MODEM具有自动应答特性,则应该预先将MODEM的S0寄存器设置为非0。
??S8:逗号拨号修饰符的暂停时间。该寄存器决定了当MODEM在拨号中遇到逗号(,)时应该暂停的时间。
??2.通用异步接收发送器UART

深入理解UART内部结构以及内部寄存器各位的含义,详细了解数据发送和接收的过程,有助于编写出高效、稳定的程序。现以GM16C550为例介绍编写基本通讯程序需要知道的寄存器。实际的ADDRESS由具体接线决定。表1为GM16C550寄存器的介绍。
 
表1 GM16C550寄存器

(1) 波特率除数锁存器(LSB、MSB)

在通讯之前要进行一些参数初始化,波特率是首先应该考虑的一项。该寄存器是一个16位的寄存器,分为低8位(LSB)和高8位(MSB)寄存器。

当 LCR.7=1,且A2A1A0=000/001时,单片机访问的是波特率除数锁存器LSB/MSB。GM16C550推荐的工作频率是 1.8432MHz。这个频率除以16就是波特率的时钟频率,用于控制发送和接收数据的速度。下面给出波特率除数锁存器值的计算公式:

波特率除数锁存器值=工作频率/(16×期望波特率)=1843200/(16×期望波特率)

表2给出了常用波特率与波特率除数锁存器值。
 
表2 波特率除数锁存器

MOV DPTR,#LCR ;除数锁定允许
MOV A,#80H
MOVX @DPTR, A
MOV DPTR,#LSB ;波特率为9600baud
MOV A,#0CH
MOVX @DPTR, A
INC DPTR
CLR A
MOVX @DPTR, A

图 1为GM16C550与RS232接线图。


     图1 GM16C550与RS232接线图

(2) 接收缓冲寄存器和发送保持寄存器(transmit and receive holding register)

当LCR.7=0,且A2A1A0=000时,读操作单片机访问接收缓冲寄存器(RHR),写操作单片机访问发送保持寄存器(THR)。

(3) 中断允许寄存器(interrupt enable register)

当LCR.7=0,且A2A1A0=001时,单片机访问中断允许寄存器(IER)。
??IER.0=1,允许接收器数据就绪中断。
??IER.1=1,允许发送保持寄存器为空时中断。即当从发送保持寄存器把一个字节移到移位寄存器时,产生一个中断,使发送保持寄存器能够接收下一个字节。
??IER.2=1,表示允许接收有错信息或间断条件中断。
??IER.3=1,MODEM状态变化中断。
??IER.4~7,没有使用,设置为零。

MOV DPTR,#IER
MOV A,#01H
MOVX @DPTR,A

(4) FIFO控制寄存器(FIFO control register)

数据发送和接收模式的选择。GM16C550提供了两种模式:FIFO和DMA。其中DMA又有两种模式DMA的模式0、DMA的模式1可供选择。我的举例采用默认的DMA的模式0。感兴趣的朋友可试一试其它模式,这里不再说明。

(5) 中断状态寄存器(interrupt status register)

前面介绍了几种中断,它们在各自的条件下产生中断,UART都会输出一个高电平的中断请求信号,触发同一个中断请求。为了具体判断是哪一种中断,还应该检测ISR,如表3所列。

表3 中断状态寄存器


       ISR.0=1,表示没有中断产生。
??ISR.4~5没有使用。
??ISR.6~7,当采用FIFO的接收和发送模式时,这两位都设置为1;反之,都设置为0。

(6) 线路控制寄存器(line control register)
?? LCR.0~1,表示发送和接收时的字节长度,如表4所列。
??LCR.2,这一位与LCR.0~1共同定义了停止位的长度,如表5所列。

??LCR.6=1,表示允许间断,即允许发送器寄存器保持一个完整帧时间以上的空号状态。
??LCR.7,用于区分访问除数锁存寄存器还是访问接收缓冲/发送保持和中断允许寄存器。 MOVDPTR,#LCR;通讯传输长度为8位,停止位为1,;偶校验
MOVA,#1BH
MOVX @DPTR,A

(7) MODEM控制寄存器(MODEM control register)

这是一个MODEM和外设接口的寄存器。
??MCR.0=1时,强制芯片引脚DTR=0;
??MCR.0=0时,强制芯片引脚DTR=1。
??MCR.1=1时,强制芯片引脚RTS=0;
??MCR.1=0时,强制芯片引脚RTS=1。
??MCR.2=1时,强制芯片引脚OP1=0;
??MCR.2=0时,强制芯片引脚OP1=1。
??MCR.3=1时,强制芯片引脚OP2=0;
??MCR.2=0时,强制芯片引脚OP2=1。
??MCR.4=1时,循环返回模式,可用于芯片自测。
??其它位保留。
MOVDPTR,#MCR;异步串口芯片的DTR、RTS引脚送出逻辑低电平
MOVA,#03H
MOVX @DPTR,A

(8) 线路状态寄存器(line status register)
??LSR.0:当接收移位寄存器接收到的字节完全移到接收缓冲寄存器时,该位置1。如果读该寄存器,那么这一位被清零。
??LSR.1:出现超越错时,这一位被置1。读该寄存器,这一位被清零。
??LSR.2:出现奇偶校验错时,这一位被置1。读该寄存器,这一位被清零。
??LSR.3:出现停止位不完整、丢失、空号时,这一位被置1。读该寄存器,这一位被清零。
??LSR.4:当接收寄存器检测到空号状态已持续一个完整帧传输时间时,这一位被置1。读该寄存器,这一位被清零。
??LSR.5:当发送的字节从发送保持寄存器移到发送移位寄存器时,该位置1。
??LSR.6:当发送保持寄存器和发送移位寄存器都没用字节时,该位置1。
??LSR.7:当奇偶校验错、帧格式错、空号错有一个出现时,该位置1。


Setdata:
MOV DPTR,#LSR
MOVX A,@DPTR
JNB ACC.5,Setdata
MOV A,DataNumber;DataNumber记录发 ;送字符的个数
MOV DPTR,#AtCommand ;AtCommand定义AT命令参数的起始地址
MOVC A,@A+DPTR
MOV DPTR,#THR ;发送保持寄存器
MOVX @DPTR,A
INC DataNumber
MOV A,DataNumber
CJNE A,#0BH,Setdata ;发送11个字符
AtCommand:DB “A”,“T”,“S”,“0”,“=”,“2”,“S”,“8”, “=”,“5”,0DH

(9) MODEM状态寄存器(MODEM status register)
??MSR.0~3=1时,表示自上一次单片机读MSR寄存器之后,分别反映MODEM控制逻辑的四个输入信号的状态发生了变化。
??MSR.0=1时,清除发送信号(CTS)已经发生了变化。
??MSR.1=1时,数据设备就绪信号(DSR)已经发生了变化。
??MSR.2=1时,振铃信号(RI)已经发生了变化。
??MSR.3=1时,载波信号(DCD)已经发生了变化。
??MSR.4~7四位分别反映MODEM控制逻辑的四个输入信号的当前状态。
??MSR.4=1时,清除发送信号(CTS)有效。
??MSR.5=1时,数据设备就绪信号(DSR)有效。
??MSR.6=1时,振铃信号(RI)有效。
??MSR.7=1时,载波信号(DCD)有效。

(10) 临时数据寄存器(scratchpag register)

可以存储用户信息。

有了上面知识的准备后就可以轻松地写出单片机的MODEM通讯程序。现在可把零散的东西组织起来了。

GM16C550芯片初始化模块
Init_16C550:
??MOV DPTR,#LCR ;除数锁定允许
??MOV A,#80H
??MOVX @DPTR, A
??MOV DPTR,#LSB ;波特率为9600baud
??MOV A,#0CH
??MOVX @DPTR, A
??INC DPTR
??CLR A
??MOVX @DPTR, A
??MOV DPTR,#LCR;通讯传输长度为8位,停止 ;位为1,偶校验
??MOV A,#1BH
??MOVX @DPTR, A
??MOV DPTR,#MCR;异步串口芯片的DTR。RTS ;引脚送出逻辑低电平
??MOV A,#03H
??MOVX @DPTR,A
??MOV DPTR,#IER
??MOV A,#01H
??MOVX @DPTR,A

采用中断的方式接数据
Interrupt2:
??PUSH ACC
??PUSH DPH
??PUSH DPL
??PUSH PSW
??MOV DPTR,#RHR ;接受数据
??MOVX A,@DPTR
??……………………
??POP PSW
??POP DPL
??POP DPH
??POP ACC
??RETI

至此,完成了一个小型的单片机MODEM通讯系统。其中的检错寄存器、MODEM状态寄存器等应用限于篇幅没有完全涉及到。有兴趣的朋友可以试一试,那么你就会对MODEM通讯有一个比较深刻的认识。
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

这款全新的中端MCU系列为设计人员提供了更高水平的安全性和灵活性

关键字: 嵌入式 单片机

单片机是一种嵌入式系统,它是一块集成电路芯片,内部包含了处理器、存储器和输入输出接口等功能。

关键字: 单片机 编写程序 嵌入式

在现代电子技术的快速发展中,单片机以其高度的集成性、稳定性和可靠性,在工业自动化、智能家居、医疗设备、航空航天等诸多领域得到了广泛应用。S32单片机,作为其中的佼佼者,其引脚功能丰富多样,是实现与外部设备通信、控制、数据...

关键字: s32单片机引脚 单片机

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

在当前的科技浪潮中,单片机作为嵌入式系统的重要组成部分,正以其强大的功能和广泛的应用领域受到越来越多行业的青睐。在众多单片机中,W79E2051以其卓越的性能和稳定的工作特性,成为市场上的明星产品。本文将深入探讨W79E...

关键字: 单片机 w79e2051单片机

单片机,又称为微控制器或微处理器,是现代电子设备中的核心部件之一。它集成了中央处理器、存储器、输入输出接口等电路,通过外部信号引脚与外部设备进行通信,实现对设备的控制和管理。本文将详细介绍单片机的外部信号引脚名称及其功能...

关键字: 单片机 微控制器 中央处理器
关闭
关闭