No.8593 作者:szmodem 邮件:sales@szmodem.com ID:107760 登陆:4次 文章数:14篇 最后登陆IP:59.40.47.189 最后登陆:2008/7/10 9:57:36 注册:2008/4/17 13:09:52 财富:179 发帖时间:2008/5/19 9:50:53 发贴者IP:218.18.239.7 标题:szmodem:单片机的MODEM通讯 摘要:No.8593单片机的MODEM通讯 摘要 探讨单片机之间或单片机与PC之间采用MODEM的实现方法,以及通讯参数的设定、数据的接收发送和部分AT命令的介绍,并给出演示程序。 关键词 MODEM通讯 AT命令 单片机 MODEM 我们经常能见到关于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接线图 (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所列。 表4 线路控制寄存器LCR.0~1 表5 线路控制寄存器LCR.2 LCR.3=1,进行奇偶校验。 LCR.4=0,进行奇校验;LCR.4=1,进行偶校验。 LCR.5=1,奇偶校验位恒为1或0。 表6为线路控制寄存器LCR.3~5。 表6 线路控制寄存器LCR.3~5 LCR.6=1,表示允许间断,即允许发送器寄存器保持一个完整 ......
>>返回讨论的主题
|