通信
单片机还可以通过IO口实现多种通信。
串行通信:一条数据线,一次发1bit,发很久。
并行通信:多条数据线,同时发送,发的速度快多了但是费用高、接收困难、抗干扰性差。
异步通信:发送和接收方时钟可以不用完全一致。
同步通信 :发送和接收方时钟要完全一致。
单工、半双工、全双工通信:数据的传输方式,略。
比特率:位/s。
波特率:码元/s。
(有那么一点点感谢通原了~)
串口
串口通信,指外设和计算机之间通过数据线等传输数据的一种通信方式。比如RS-系列,大多数计算机应该都有对应的梯形接口。51单片机内自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现与计算机之间的串口通信!
串口通信最重要的管脚:TXD(发送数据,串行输出)RXD(接收数据,串行输入)SGND(信号接地)。
TXD和RXD用正负电压表示逻辑1和0,51单片机采用TTL 晶体管-晶体管逻辑集成电路,用高低电平表示逻辑状态(+5V:1;0V:0),所以需要转换型时候才能与计算机串口通信。
STC89C52系列有一个通用异步收发器(P30 P31端口),有四种工作模式。
- 模式0:同步移位寄存器;
- 模式1:8位UART,波特率可变(常用);
- 模式2:9位UART,波特率固定;
- 模式3:9位UART,波特率可变.
串口助手和单片机要规定好发送数据的形式。
波特率:发送接收速度。
检验位:有无校验位,有的话是奇校验?偶校验?
停止位:挺值得标识。
寄存器:SBUF。物理上是接收和发送两个寄存器,实际上共用相同的地址,只是使用时有不同的意义。
实施串口通信
STC-ISP自带一个串口调试助手。
串口选择左侧和串口号一致的选项。
STC89C52串口初始化函数:
void uart_init(void)
{
TMOD|=0X20; //设置计数器工作方式 2
SCON=0X50; //设置为工作方式 1
PCON=0X80; //波特率加倍
TH1=0XFA; //计数器初始值设置,根据波特率为9600
TL1=0XFA;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器1
}
单片机向电脑发送数据:给SBUF赋值即可。
在程序中发送可以直接SBUF=0X11;
单片机就会收到11的信息,点击复位按钮后可以在串口助手的接收缓冲区中看到。赋值后需要一段时间才能发送完成,发送完成后TI不再是0.因此可以通过while(TI==0);TI=0;
来等待发送完成后清除发送完成标志位。
void main(){
uart_init();
SBUF=0x11;
while(TI==0);TI=0;
while(1){}
}
这样就在程序中发送了11信息。
电脑给单片机发送数据:通过串口助手发信息可以通过串口中断interrupt 4
实现。
void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;
P2=0x00;//这一句使得函数成功触发时LED灯全亮,便于调试
if(RI==1){P2=~SBUF;RI=0;}//因为发送和接收中断共用4中断,这句用于区分具体是发送还是接收中断
//如果是接收中断,RI=1,那么只简单执行这两句即可。
SBUF=rec_data; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
以上程序可以将发送缓冲区中输入的数据发给单片机,单片机再在接收缓冲区中原封不动地呈现出来。