历史上的今天
返回首页

历史上的今天

今天是:2025年04月11日(星期五)

正在发生

2018年04月11日 | 单片机的调制解调器通讯

2018-04-11 来源:eefocus

  我们经常能见到关于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寄存器 
47.jpg?imageView2/2/w/550

  (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接线图。

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所列。
54


  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通讯有一个比较深刻的认识。


推荐阅读

史海拾趣

ERNI公司的发展小趣事

进入20世纪60年代,ERNI开始关注连接器技术的发展。他们意识到,随着电子设备的日益复杂和多样化,对连接器技术的需求也将不断增长。因此,ERNI投入大量资源进行研发,终于在1967年成功开发出第一个背板连接器,这一创新技术迅速成为公司的核心产品,也为ERNI在连接器市场赢得了声誉。

虹冠电子(Champion)公司的发展小趣事

虹冠电子注重全球市场的拓展,通过建立完善的营销网络和合作伙伴关系,将产品销往世界各地。公司在新竹、汐止以及美国硅谷等地设有研发中心和生产基地,能够为客户提供及时、高效的技术支持和服务。同时,虹冠电子还与国内优秀的晶圆封测大厂等合作伙伴建立了紧密的合作关系,共同推动电源管理技术的发展和应用。

Banner Engineering公司的发展小趣事

为了进一步扩大市场份额,Banner Engineering公司积极实施全球化战略。公司在全球范围内建立了多个生产基地和销售网络,以便更好地服务客户。同时,公司还积极参加国际电子展会和技术交流会议,与国际同行进行合作与交流,不断吸收新技术和新理念。这些举措使公司的知名度和影响力得到了进一步提升,也为公司的国际化发展奠定了坚实基础。

Compex Corporation公司的发展小趣事

在电子行业的发展过程中,Compex Corporation也积极寻求与其他企业的合作与收购机会。XXXX年,公司成功收购了一家在电子元件领域具有丰富经验的企业,通过这次收购,公司获得了更多的技术资源和市场份额。此外,公司还与其他企业建立了战略合作关系,共同开发新产品和技术,实现了资源的有效整合。

福斯特(FIRST)公司的发展小趣事
确保信号在传输过程中不受噪声和干扰的影响。例如,轮速传感器的接口电路设计可能包括两级滤波和整形电路。
东晶(ECEC)公司的发展小趣事

东晶电子自创立以来,始终将技术创新作为公司发展的核心动力。在21世纪初,随着通信技术的迅猛发展,对高性能、高稳定性的石英晶体元器件需求急剧增加。东晶电子凭借其强大的研发团队,成功研发出一系列高精度、高稳定的石英晶体谐振器和振荡器,打破了国外厂商的技术垄断,为中国通信产业提供了关键元器件支持。这一技术突破为公司赢得了市场口碑,也奠定了其在电子行业中的领先地位。

问答坊 | AI 解惑

通过测试确认无铅连接器的焊点可靠性

本月伊始,欧盟RoHS指令开始生效。电子行业的OEM厂商和合同制造商都已经开足马力,加快用无铅镀锡和无铅焊料代替电子元件上的引脚铅锡抛光和焊接所用的有铅焊料。 在所有可能的方案中,电镀纯锡被选作为连接器无铅抛光的处理方案。电镀纯锡的优点 ...…

查看全部问答>

51单片机中断

请问这个程序 中断是怎样进行的?? 什么时候有中断申请,是从TR0=1开始就申请中断了吗??? 什么时候响应中断 帮帮忙,一个人很难学... #include #include #define uint unsigned int #define uchar unsigned char uchar temp,aa,num; s ...…

查看全部问答>

silentwins兄,帮我把你安装好的"Microsoft Windows CE 5.0 Device Emulator"传下好吗?

你把你安装好的那个目录压个包传到你空间让我下下吧,估计那我就可以直接用拉,呵呵. http://topic.eeworld.net/u/20090605/11/ffa56802-b472-4eac-8f17-0873fdd18edc.html PS:你的空间......\"miehuohuobudingmmshiggedazhutou\".....哈哈 …

查看全部问答>

哪为仁兄使用过ifs kit开发文件过滤驱动?

哪位仁兄使用ifs kit开发过滤驱动,我是刚学习,安装了ifs kit for server 2003,但不知道怎么编写代码。我也安装了vc6。0。请高手给一些初学者开发的资料(清发到: fengyi621@163.com)谢谢了 。对了,我还遇到了一个问题,使用windows server 2003 ...…

查看全部问答>

单片机中断不产生是怎么回事!(急)

我用中断读取icl7135的转换结果,昨天中断还产生,怎么今天就不行了? 望达人指点指点!程序如下!我qq174717183 #include #include #define ad_run   XBYTE[0x7fff] #define ad_read  XBYTE[0xbfff] #define uchar unsig ...…

查看全部问答>

做个CANbootloader

                                 想用can来更新STM32的内容,大家有什么好想法没有?…

查看全部问答>

关于未使用的XT2(IN、OUT)的处理

我用MSP430F135做项目,XT2不使用,如何正确的处理XT2IN、XT2OUT引脚? 是不是可以将XT2IN接地,XT2OUT悬空?…

查看全部问答>

【求助】430程序中不能使用结构体数组吗???

今天搞了一天,程序编译没错,在simulator下运行没问题,但是下到板子上调试就出错,download刚刚完成,debug工具栏就变灰了,强行中断下来发现一只在运行memcpy,一只不能运行到我的main函数处,强行终止后发现debug log的提示信息如下,栈满了, ...…

查看全部问答>

LM3S 的分散加载堆和栈的划分

最近程序中涉及到了malloc函数,所以要先弄一块堆区域,不知道为什么一直报错,恳请经验者解答下,截图如附件。…

查看全部问答>

dsp新手

各位高手好:                   小弟現在系統架構 是外部訊號經由\"訊號截取卡\"傳送至pc給matlab進行運\算處理 然後輸出,     而matlab ...…

查看全部问答>