欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机—串口通信

发布时间:2023/12/10 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 51单片机—串口通信 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

计算机串行通信:

并行通信:

串行通信:

异步通信:

同步通信:

串行通信的传输方向:

串行通信常见的错误校验:

传输速率比特率(波特率):
(fosc是晶振频率,要将Mhz转化为hz(乘10的6次方),若不设置SMOD则默认是0,有想设置的波特率就可以求出T初了,将它赋给TH和TL就行了)

串行通信接口标准:

传输距离与传输速率的关系:

采用RS-232C接口存在的问题:
串行接口的结构:

使用串口前的准备工作:

与串行通信相关的寄存器:

可位寻址的意思是可以写为像以下这样的形式:

SM0=0; SM1=1;//串口工作方式1,8位UART波特率可变REN=1;//串口允许接收

定时计数器控制寄存器TCON:

单片机同优先级中内部查询顺序:

串口通信示例(通过定时中断刷新数码管显示PC端发送的数据):

#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管位选 sbit key_s2 = P3^0;//独立按键S2 sbit key_s3 = P3^1;//独立按键S3 uchar num;//数码管显示的值//共阴数码管段选表 uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,}; //数码管位选码 uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};void display(uchar i) {static uchar wei; P0 = 0XFF;//清除断码WE = 1;//打开位选寄存器P0 = SMGwei[wei];WE = 0;//锁存位选寄存器switch(wei){case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break; case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break; }wei++;if(wei == 3)wei = 0; } //定时器0初始化 void timer0Init() {EA = 1; //打开总中断ET0 = 1;//打开定时器0中断TR0 = 1; //启动定时器0TMOD |= 0X01; //定时器工作模式,16位定时模式TH0 = 0xED;TL0 = 0xFF; //定时5ms } //串口初始化 void UARTInit() {EA=1;//打开总中断ES=1;//打开串口中断SM0=0; SM1=1;//串口工作方式1,8位UART波特率可变REN=1;//串口允许接收TR1=1;//启动定时器一(用来串口通信设置波特率)TMOD |=0x20;// 定时器1,工作模式2 8位自动重装TH1=0xfd;TL1=0xfd;//设置波特率9600 }void main()//main函数自身会循环 { timer0Init();//定时器0初始化UARTInit();//串口初始化while(1); } //定时器中断函数,达到时间后进入中断函数 void timer0() interrupt 1 {TH0 = 0xED;TL0 = 0xFF; //定时5msdisplay(num); //数码管显示函数 } //串口中断函数 void UART() interrupt 4 {uchar temp;if(RI)//判断接收数否完成{num=SBUF;//读SBUF,读串口接收到的数据RI=0;//软件清0接收标志位temp=num;SBUF=++temp;//写SBUF,把要发送的数据发送给缓存器}if(TI)//判断是否发送完成TI=0;//清0发送完成标志位 }

当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。当然,单片机发送完一帧数据,TI也会置1,同样会产生中断!

补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓冲器SBUF中,如果你之前有允许串行口中断,RI就会置1,向单片机CPU申请中断,并进入中断服务程序,即你问题中的serial()函数,做完这个函数后就会自动返回断点。如果你没有允许中断,便不会产生串行中断。

总结

以上是生活随笔为你收集整理的51单片机—串口通信的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。