“共享”一个串口小程序
自已死背,记不住,不如泡论坛跟大伙谈谈,倒好记些。。。。功能:一个C51串口自传功能(就是通过串口自已发送然后又通过串口自已接收了)
P0口采集数据,P2口显示P0口所采集到的数据,
为了达到自传目地,把串口的RI与TI短接。
1:首先要用UART(串口)的M1(模式1)进行数据传输,所以SCON寄存器的第8与7位必须设定为0与1;
而进行接收数据时SCON的REN,必须设为1,才会启动接收送功能。
所以SCON的值应为:SCON=0X50 (它的二进制值为:01010000 与如下相对应)
。。。B7。。。B6。。。B5。。。B4。。。B3。。。B2。。。B1。。。B0。。。
。。SM0。。。SM1。。。SM2。。REN。。。TB8。。RB8。。。TI。。。RI。。。
。。。0。。。。1。。。0。。。1。。。。。0。。。0。。。。0。。。0。。。
因为要用到M1模式,我们就用TIMER1的中断作为传输波特率,为此,必须设定PCON(电源寄存器)的SMOD 位,(它的作用是改变比特率的倍增)如设定它为0,比特率就为TIMER1的中断值。
先设定一个位变量(PCON的SMOD位) : sbit SMOD=0X87^7 (PCON的SMOD位地址)
然后进行赋值 SMOD=0;
2:就是接收与发送数据了
发送数据很简单,就直接把P0口的状态反映到SBUF寄存器中便可:SBUF=P0;
赋完值后,系统就自动的帮你把数据发送出去。
然后便是接收数据,对于C51的数据接收也很简单。要注意的是要还没接收数据前应把RI设为0 ,这个一定要注意!!!!!因为系统并不会自动帮你设定这个数值,但在接收过程中,我们必须用IF(RI==0)做为数据是否已完整的接收!就是说,当一个8位数据接收完毕时,系统就会把RI设为1,我们只需用一个IF(RI==0);进行判断就可知接收的完整性。
整个过程的代码:
#include "reg51.h" 头文件声明
sbit smod=0x81^7; 定义SMOD 为PCON的第七位
main()
{
P2=oxff; 规范化P2为输入端口
TMOD=0X20; 设定比特率时钟为TIMER1
SMOD=0; 设定比特率为正常模式
TH1=0XFD; 设定计数器的高位值
TR1=1; 启动TIMER1
SCON=0X50; 设定SCON的值,具体作用如上所说
while(1)
{
SBUF=P0; 接收P0端口的状态值
while(RI==0); 判断是否完整接收
RI=0; 复位RI值
P2=SBUF; 把所接收到的数值反映到P2端口上
TI=0; 把接收寄存位复0;
}
}