- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装载的8位定时方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。 T1溢出率=fsoc/{12*[256-(TH1)]} 在单片机的应用中,常用的晶振频率为:12MHZ和11.0592MHZ。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表表示。 常用波特率 fosc/MHZ SMOD TH1初值 19200 11.0592 1 0FDH 9600 11.0592 0 0FDH 4800 11.0592 0 0FAH 2400 11.0592 0 0F4H 1200 11.0592 0 0E8H 表 定时T1工作于模式2常用波特率及初值 所以,用定时器/计数器的模式2作波特率发生器最恰当。 选用11.0592MHZ时钟频率,可获得标准的波特率。 串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器、串行口控制和中断控制。具体步骤如下: 确定定时器的工作方式(TMOD设置) 计算定时器的初值,装载TH、TL 启动定时器(置位TR) 确定串行口控制(设置SCON) 串行口在中断方式工作时,要进行中断设置(设置IE、IP) 串口编程初始化,例如: SCON=0x50; //串口方式1,允许接收,TI和RI清零 PCON=0x80; //波特率加倍(×2) TMOD=0x20; //T1设为定时方式2 TH1=0xfd; //T1计数初值,9.6k波特率 TL1=0xfd; //T1计数初值,9.6k波特率 IE; //中断使能(开总中断,开串口中断) TR1=1; //启动T1 GATE TMOD C/T M1 M0 M0 M1 GATE C/T (89H) 序号 波特率 SMOD a 1 62500 1 0xff 2 19200 1 0xfd 3 9600 0 0xfd 4 4800 0 0xfa 5 2400 0 0xf4 6 1200 0 0xe8 7.3 串行通信工作方式 方式0——八位同步移位寄存器方式 数据传输波特率固定为fosc/12 由RXD引脚输入或输出数据 TXD引脚输出fosc/12时钟信号 以8位数据为一帧,不设起始位和停止位,先发送或接收最低位 方式0主要用于扩展I/O口(串并转换)。 扩展输出口 扩展输入口 扩展输出芯片:CD4094、 74LS164… …扩展输入芯片:CD4014、 74LS165… … 方式1—— 10位数据异步通讯方式 一帧信息 = 1个起始位(0)+8位数据位+1个停止位(1) ,(起始位和停止位是自动插入的)。 指定T1为波特率时钟发生器, 一般选择定时方式2 序号 波特率 SMOD a 1 62500 1 0xff 2 19200 1 0xfd 3 9600 0 0xfd 4 4800 0 0xfa 5 2400 0 0xf4 6 1200 0 0xe8 (fosc=11.0592MHz) 方式1主要用于点对点通信 接线关系: 主机TXD、RXD分别与外设RXD、TXD相接;两机共地 接线关系: 利用RS-232C进行电平转换——(1:-5~-15V, 0:+5~ +15V) 实例2: 采用双机串行通信,其中甲机发送数据,乙机接收数据,两机fosc约为12MHz,波特率为2.4k,串口方式1。 甲机循环发送数字0~F,乙机接收后返回接收值。若发送值与返回值相等,继续发送下一数字,否则重复发送当前数字。 发送值和接收值分别显示在双方LED数码管上; 采用查询法检查收发是否完成。 ——通信协议 实例2电路原理图 带译码电路的数码管(7SEG-BCD——可直接输入数据0~F,无需显示字模) 实例2程序流程图 实例2参考程序(甲机) #includereg51.h unsigned char i,temp; void delay(unsigned int z) { unsigned int x,y; for(x=z;x0;x--) for(y=125;y0;y--); } { SBUF=i; while(!TI); TI=0; while(!RI); RI=0; temp=SBUF; if(temp==i) { P2=i; delay(500); i++; if(i==16) i=0; } } } void main() { SCON=0x50; PCON=0; TMOD=0x20; TH1=TL1=0xf4; TR1=1; while(1) 实例2参考程序(乙机)
原创力文档


文档评论(0)