您好,欢迎访问一九零五行业门户网

单片机的MODEM通讯

摘要 探讨单片机之间或单片机与pc之间采用modem的实现方法,以及通讯参数的设定、数据的接收发送和部分at命令的介绍,并给出演示程序。
关键词 modem通讯 at命令 单片机 modem
我们经常能见到关于pc的modem通讯的文章,但关于单片机modem通讯的文章却不多见。现在将我个人单片机modem通讯的实践经历写出来供大家参考。
要写单片机的modem通讯必须要有两个背景知识,一个是at命令集,另一个是通用异步接收发送器(uart)。
1 at命令集
下面介绍我通讯程序例子中涉及到的at命令。
dn:拨号命令。该命令使modem立即进入摘机状态,并拨出跟在后面的号码。d命令是基本的拨号命令,它受到其它命令的修饰可构成modem何时拨号以及如何拨号等操作。
t:音频拨号。例如,atdt88888888,其中88888888为。
p:脉冲拨号。例如,atdp88888888,其中88888888为。
,:标准暂停。我们常常碰到外线时需要暂停一下,等听到二次拨号音(外线)之后才能再拨后续的号码。缺省时暂停时间为2s秒,它由s8寄存器。
sn:表示modem内部的寄存器。
s0:自动应答。如果要求modem具有自动应答特性,则应该预先将modem的s0寄存器设置为非0。
s8:逗号拨号修饰符的暂停时间。该寄存器决定了当modem在拨号中遇到逗号(,)时应该暂停的时间。
2 通用异步接收发送器uart
深入理解uart内部结构以及内部寄存器各位的含义,详细了解数据发送和接收的过程,有助于编写出、稳定的程序。现以gm16c550为例介绍编写基本通讯程序需要知道的寄存器。实际的address由具体接线决定。表1为gm16c550寄存器的介绍。
表1 gm16c550寄存器
500this.width=500 border=0>
(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 波特率除数锁存器
500this.width=500 border=0>
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
  500this.width=500 border=0>
图1 gm16c550与rs232接线图
(2) 接收缓冲寄存器和发送保持寄存器transmitreceive 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 中断状态寄存器
500this.width=500 border=0>
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所列。
表4 线路控制寄存器lcr.0~1
500this.width=500 border=0>
表5 线路控制寄存器lcr.2
500this.width=500 border=0>
lcr.3=1,进行奇偶校验。
lcr.4=0,进行奇校验;lcr.4=1,进行偶校验。
lcr.5=1,奇偶校验位恒为1或0。
表6为线路控制寄存器lcr.3~5。
表6 线路控制寄存器lcr.3~5
500this.width=500 border=0>
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)
可以存储用户信息。
有了上面知识的准备后就可以轻松地写出程序,现在可把零散的东西组织起来。
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通讯有一个比较深刻的认识。
其它类似信息

推荐信息