用定时器_T0或_T1_模拟串行口程序.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用定时器_T0或_T1_模拟串行口程序

/************************************************************************* 用定时器 T0 或 T1 模拟串行口程序。 最高波特率(12 clock): ??? 本程序收、发波特率相同。 ??? 11.059MHz -- 最高波特率 收: 9600,? 最低波特率:300?? ??? 30.000MHz -- 最高波特率 收: 28800? 最低波特率:300?? ??? 40.000MHz -- 最高波特率 收: 38400? 最低波特率:300?? ?????? ... 使用说明: ??? 1. 本程序使用一个定时器和任意 2 个 I/O 口模拟一个串行口。 ??? 2. 1位起始位,8位数据位,1位停止位。发数据位时先发低位。 ??? 3. 支持半双工通讯。收、发波特率相同。 ??? 4. 应把定时器中断优先级设置为最高级。 ??? 5. 本程序每接收一个字节后就把它放到一个队列缓冲区中(也可使用环行缓冲区), ?????? 待缓冲区满后,将缓冲区中的内容原样发回。这是为了测试多字节连续收发的 ?????? 能力和简化程序。实际应用中应防止缓冲区溢出。? ??? 6. 由接收转换到发送时要先调用? soft_send_enable (); ?????? 由发送转换到接收时要先调用? soft_receive_enable ()。 ??? 7. 发送最后一个字节后如果要立刻转为接收,必须等待最后一个字节后发送完毕 ?????????? while ( rs_f_TI == 0)? ;? // 等待最后一个字节发送完毕 ************************************************************************** 编程说明: 发送: ??? 由接收转换到发送时要先调用 soft_send_enable (), 它为发送做初始化的工作。 以后就可以调用 rs_send_byte () 启动发送一个字节的过程。 ??? 发送口平时为高电平,rs_send_byte ()函数使发送口变为低电平开始发送起始位; 同时设置和启动定时器,为发送数据位在预定的时刻产生定时器中断。发送数据位和 停止位都在定时器的中断服务程序中进行。 ??? 中断服务程序中处理 4 种情况:发送数据位、发送停止位、发送完毕、处理错误。 接收: ??? 由发送转换到接收时要先调用 soft_receive_enable (), 它为接收做初始化的工 作。定时器以 3 到 4 倍波特率的频率产生中断(参见 rs_TEST0 的定义)检测 PC 机发送的起始位。一旦检测到起始位,立刻把定时器产生中断的频率调整到与波特率 相同,准备在下一个定时器中断中接收第 1 个数据位。 ??? 中断服务程序中处理以下情况: ??? 1. 收到的是 PC 机发送的起始位: 调整定时器产生中断的频率与波特率相同。 ??? 2. 收到第 8 位数据位: 存储接收到的字节。 ??? 3. 收到第 1--7 位数据位: 存储到收、发移位暂存器。 ??? 4. 收到停止位: 调用 soft_receive_enable(),检测 PC 机发出的下一个起始位。 ??? 5. 处理出错的情况。 **************************************************************************/ #i nclude reg52.h sfr16?DPTR = 0x82; typedef?unsigned char?INT8U; typedef?unsigned int?INT16U; #define?YES?? 1 #define?NO??? 0 //定义使用哪个定时器, 只可定义一个?? //#define TIMER_0 #define TIMER_1 //定义串口收、发送管脚。? sbit rs_TXD = P2^1; sbit rs_RXD = P2^0; //根据定时器确定参数? #ifdef TIMER_0 ??? #define TMOD_AND_WORD?? 0xF0; ??? #define TMOD_TIME_MODE? 0x01; ??? #define TMOD_COUNT_MODE 0x05;????? //设置计数模式位? ??? sbit? TCON_ENABLE_TIMER = TCON^4; ??? sbit? TCON_TFx = TCON^5;?????????? //中断标志位? ??? sbit? IE_ETx = IE^1;

文档评论(0)

vdi938 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档