欢迎来到天天文库
浏览记录
ID:9366523
大小:52.50 KB
页数:9页
时间:2018-04-29
《用定时器 t0 或 t1 模拟串行口程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、/*************************************************************************用定时器T0或T1模拟串行口程序。最高波特率(12clock): 本程序收、发波特率相同。 11.059MHz--最高波特率收:9600, 最低波特率:300 30.000MHz--最高波特率收:28800 最低波特率:300 40.000MHz--最高波特率收:38400 最低波特率:300 ...使用说明: 1
2、.本程序使用一个定时器和任意2个I/O口模拟一个串行口。 2.1位起始位,8位数据位,1位停止位。发数据位时先发低位。 3.支持半双工通讯。收、发波特率相同。 4.应把定时器中断优先级设置为最高级。 5.本程序每接收一个字节后就把它放到一个队列缓冲区中(也可使用环行缓冲区), 待缓冲区满后,将缓冲区中的内容原样发回。这是为了测试多字节连续收发的 能力和简化程序。实际应用中应防止缓冲区溢出。 6.由接收转换到发送时要先调用 soft_send_enable();
3、 由发送转换到接收时要先调用 soft_receive_enable()。 7.发送最后一个字节后如果要立刻转为接收,必须等待最后一个字节后发送完毕 while(rs_f_TI==0) ; //等待最后一个字节发送完毕**************************************************************************编程说明:----------------发送: 由接收转换到发送时要先调用soft_send_enab
4、le(),它为发送做初始化的工作。以后就可以调用rs_send_byte()启动发送一个字节的过程。 发送口平时为高电平,rs_send_byte()函数使发送口变为低电平开始发送起始位;同时设置和启动定时器,为发送数据位在预定的时刻产生定时器中断。发送数据位和停止位都在定时器的中断服务程序中进行。 中断服务程序中处理4种情况:发送数据位、发送停止位、发送完毕、处理错误。----------------接收: 由发送转换到接收时要先调用soft_receive_enable(),它为接收做
5、初始化的工作。定时器以3到4倍波特率的频率产生中断(参见rs_TEST0的定义)检测PC机发送的起始位。一旦检测到起始位,立刻把定时器产生中断的频率调整到与波特率相同,准备在下一个定时器中断中接收第1个数据位。 中断服务程序中处理以下情况: 1.收到的是PC机发送的起始位:调整定时器产生中断的频率与波特率相同。 2.收到第8位数据位:存储接收到的字节。 3.收到第1--7位数据位:存储到收、发移位暂存器。 4.收到停止位:调用soft_receive_enable(),检测PC机发
6、出的下一个起始位。 5.处理出错的情况。**************************************************************************/#includesfr16 DPTR=0x82;typedef unsignedchar INT8U;typedef unsignedint INT16U;#define YES 1#define NO 0//定义使用哪个定时器,只可定义一个 //#defineTIMER_0#defi
7、neTIMER_1//定义串口收、发送管脚。 sbitrs_TXD=P2^1;sbitrs_RXD=P2^0;//根据定时器确定参数 #ifdefTIMER_0 #defineTMOD_AND_WORD 0xF0; #defineTMOD_TIME_MODE 0x01; #defineTMOD_COUNT_MODE0x05; //设置计数模式位 sbit TCON_ENABLE_TIMER=TCON^4; sbit TCON_TFx=TCON^5; /
8、/中断标志位 sbit IE_ETx=IE^1; //中断允许位为ET0 sbit IP_PTx=IP^1; //中断优先级 sfrrs_timerL=0x8A; //TL0 sfrrs_timerH=0x8C; //TH0#endif#ifdefTIMER_1 #defineTMOD_AND_WORD 0x0F; #def
此文档下载收益归作者所有