赞
踩
目录
通过串口(UART)让单片机与计算机进行通信。51单片机发送数据,计算机通过串行口接收数据;或者由计算机发送数据,单片机接收数据。
发送数据的过程是:先把要传的数据写入发送缓冲区SBUF,以一定的波特率,通过发送数据源串口TXD,把数据发送出去。接收数据的过程是:数据通过RXD,以一定的波特率,写入接收缓冲区SBUF。
单片机不管是发送数据还是接收数据,首先都应该对串口进行初始化。初始化包括串口控制寄存器SCON、电源及波特率选择寄存器PCON、辅助寄存器AUXR的赋值,波特率的确定,中断是否开放。
51单片机默认的是12分频,所以不用配置AUXR寄存器,高级的单片机要调分频系数的时候,可能会用到AUXR寄存器。
TI:发送中断标志位。在方式 0 时,当串行发送第 8 位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使 TI 置 1,向 CPU 发中断申请。 在中断服务程序中,必须用软件将其清 0,取消此中断申请。
RI:接收中断标志位。在方式 0 时,当串行接收第 8 位数据结束时,或在其 它方式,串行接收停止位的中间时,由内部硬件使 RI 置 1,向 CPU 发中断申请。 也必须在中断服务程序中,用软件将其清 0,取消此中断申请。
PCON:令SMOD=0,其他位不变。PCON&=0x7f。
SMOD:波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有 关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。
- #include <REGX52.H>
- void UartInit() //9600bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x40; //8位数据,可变波特率
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xFD; //设定定时初值
- TH1 = 0xFD; //设定定时器重装值
- TR1 = 1; //启动定时器1
- ET1 = 0; //禁止定时器1中断
- }
- void Uartsend(unsigned char byte)//发送
- {
- SBUF=byte;//把数据写入发送缓冲区SBUF
- //数据发送完成的标志是TI=1;所以等待数据传送完
- while(TI==0);
- TI=0;//软件清零
- }
-
- int main()
- {
- UartInit();
- Uartsend('a');
- while(1)
- {
-
- }
- }
在程序中,单片机发送字符'a'(ascll值=61),其实发送的是字符'a'的ascll值0x61,计算机接收的也是ascll值。计算机以hex模式显示就是61;以文本模式(字符模式)显示就是字符'a'。
接收数据初始化和发送时的串口初始化有2个改动的地方。
为了方便知道接收的数据是什么,把接收的数据再发送给计算机。
- #include <REGX52.H>
- void UartInit() //9600bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位数据,可变波特率
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xFD; //设定定时初值
- TH1 = 0xFD; //设定定时器重装值
- TR1 = 1; //启动定时器1
- ET1 = 0; //禁止定时器1中断
- EA=1; //开放总中断
- ES=1; //开放串口中断
- }
- void Uartsend(unsigned char byte)//发送
- {
- SBUF=byte;//把数据写入发送缓冲区SBUF
- //数据发送完成的标志是TI=1;所以等待数据传送完
- while(TI==0);
- TI=0;//软件清零
- }
- void UART_ISR() interrupt 4//串口中断函数
- {
- if(RI==1)//接收中断
- {
- Uartsend(SBUF);//把接收的数据发送到计算机
- RI=0;//软件清零
- }
- }
- int main()
- {
- UartInit();
- while(1)
- {
-
- }
- }
可见不管是以字符的形式发送,还是直接发送字符的ASCLL码值,发送的数据都是一样的。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。