随着单片机系统的广泛应用和计算机网络技术的普及,单片机的通信功能愈来愈显得重要。单片机通信分为并行和串行通信方式。并行通信通常是将数据字节的各位用多条数据线同时进行传送,每一位数据都需要一条传输线,由于需要传输线较多,长距离传送时成本高且收、发方的各位同时接收存在困难,故应用较少。串口通信则使用广泛,技术成熟,这里介绍的是常用的异步串行通信方式。
并行通信方式
串行通信方式
异步串行通信是指通信的发送与接收设备使用的各自的时钟控制数据的发送和接收过程。一帧字符信息由四部分组成:起始位、数据位、奇偶校验位和停止位。串口通信的设置主要有两个重要寄存器:串行口控制寄存器SCON、定时器模式寄存器TMOD。其中SCON:SM0,SM1,SM2,REN,TB8,RB8,TI,RI。重要位有SM0SM1=xx,常用xx=01含义为10位异步收发,波特率可变;REN串行接收使能位;TI发送中断标志位;RI接收中断标致位。TMOD常用低两位M1M0=xx,设置定时器/计数器工作方式,下面程序用M1M0=10,含义为8位初值自动重装。
下面代码即单片机串口通信的设置,可实现单片机串口与计算机、手机(通过蓝牙)通信。
1. // 名称:51单片机串口通信
2. // 作者:ChunyuY19
3. // 备注:晶振11.0592MHz,波特率设置为9600,无奇偶校验,有接收中断无发送中断,发送在任意时间可进行
4. // <span style="white-space:pre"> </span> 程序开始发送数据若观测不到,RESET后可看到效果。
5.
6. #include"reg52.h"
7. //******************** 函数声明 *******************
8. void InitUART (void);
9. void SendByte(unsigned char dat);
10. void SendStr(unsigned charchar *s);
11. //******************** 主函数 *******************
12. void main (void)
13. {
14. InitUART();
15. "okH"); //上电后即由串口发出
16. while(1); //等待接收中断进行通信
17. }
18. //******************* 串口初始化*******************
19. void InitUART (void)
20. {
21. 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
22. 0x20; // TMOD:timer 1, mode 2, 8-bit 重装
23. 1 =TL1= 0xFD; // TH1: 重装值9600 波特率 晶振 11.0592MHz
24. 1 =1; // TR1: timer 1 打开
25. 1; //打开总中断
26. 1; //打开串口中断
27. }
28. //******************* 发送一个字节 *******************
29. void SendByte(unsigned char dat)
30. {
31. SBUF = dat;
32. while(!TI);
33. 0;
34. }
35. //**************** 发送一个字符串 *******************
36. void SendStr(unsigned charchar *s)
37. {
38. while(*s!='\0') // \0表示字符串结束标志,通过检测是否字符串末尾
39. {
40. SendByte(*s);
41. s++;
42. }
43. }
44. //****************** 串口中断程序 *******************
45. void UART_SER (void) interrupt 4
46. {
47. char Temp;
48. if(RI) //判断是接收中断产生
49. {
50. 0; //标志位清零
51. //读入缓冲区的值
52. //把接收到的值再发回电脑端
53. }
54. }
以上程序均已跑过,单片机为STC89C52或51系列,若与计算机通信,不用插蓝牙,用USB线连接至电脑,计算机端可用串口调试助手或以下matlab函数,也可连接蓝牙后与手机通信,手机端需下载“蓝牙串口调试助手”进行通信。