Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 1 / 5
11 串口应用
简介
第九章我们学习了单片机串口的基本
使用方法
消防栓的使用方法指针万用表的使用方法84消毒液使用方法消防灭火器使用方法铁材计算器使用方法
,并且用查询方式实现了和PC
机通信。这一章,我们讲解如何使用串口中断,并写一个稳定的收发程序。
11.1 串口中断
在实际的通信设计中,中断的使用频率非常高,可以提高程序的运行效率。
串口收、发完成都能触发中断,收到一个完整字节,RI 标志位置位,触发接
收中断,发送完一个字节,TI 标志位置位,触发接收中断,但这两个中断地址
是一个(0023H),所以必须软件再判断中断类型。
11.2 软件设计
基于中断写一个串口收发程序,把从串口收到的数据再输出。代码如下:
程序
清单
安全隐患排查清单下载最新工程量清单计量规则下载程序清单下载家私清单下载送货清单下载
L11.1 基于中断的串口程序
1 #include
2 #include "hw_config.h"
3 #include "my_type.h"
4
5 u8 RxBuf[32]; //串口接收缓冲区
6 volatile u8 RxBufWrite; //接收缓冲区写指针
7 volatile u8 RxBufRead; //接收缓冲区读指针
8
9 u8 TxBuf[32]; //串口发送缓冲区
10 volatile u8 TxBufWrite; //发送缓冲区写指针
11 volatile u8 TxBufRead; //发送缓冲区读指针
12 volatile u8 TxLen; //发送缓冲区数据长度
13
14 //串口初始化
15 void uart_init(void);
16 void uart_start_send(void);
17 void delay(u8 count);
18
19 void main(void)
20 {
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 2 / 5
21 u8 *str = "This is a test program\n";
22
23 uart_init();
24 while(1)
25 {
26 delay(250);
27 if(TxLen == 0)
28 {
29 TxLen = strlen(str);
30 strcpy(TxBuf,str);
31 uart_start_send();
32 }
33 }
34 }
35
36
37 /*************************************************************
38 名称:uart_init
39 功能: 串口初始化
40 *************************************************************/
41 void uart_init(void)
42 {
43 //缓冲区处理
44 RxBufRead = 0;
45 RxBufWrite = 0;
46
47 TxBufRead = 0;
48 TxBufWrite = 0;
49 TxLen = 0;
50
51 PCON |= 0X80; //波特率加倍
52 SCON = 0x50; //8 位数据位,无校验位
53
54 TMOD |= 0x20; //定时器 1 自动重装
55 TH1 = 0xFD; //1190200 波特率
56 TL1 = 0xFD;
57 TR1 = 1; //开定时器 1
58
59 ES = 1; //开启串口中断
60 EA = 1;
61 }
62
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 3 / 5
63 /************************************************************
64 名称:uart_interrupt
65 功能:串口中断处理
66 ************************************************************/
67 void uart_interrupt(void) interrupt 4 using 1
68 {
69 //接收到数据
70 if(RI == 1)
71 {
72 RxBuf[RxBufWrite++] = SBUF;
73 RxBufWrite %= 32;
74
75 //空间不够直接覆盖掉
76 if(RxBufWrite == RxBufRead)
77 {
78 RxBufRead++;
79 RxBufRead %= 32;
80 }
81
82 RI = 0;
83 }
84
85 //发送完成
86 if(TI == 1)
87 {
88 TI = 0;
89
90 //数据未发送完毕
91 if(TxLen != 0)
92 {
93 SBUF = TxBuf[TxBufRead++];
94 TxLen--;
95 }
96 }
97 }
98
99
100 /*************************************************************
101 名称:uart_start_send
102 功能: 启动发送
103 *************************************************************/
104 void uart_start_send(void)
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 4 / 5
105 {
106 if(TxLen > 0)
107 {
108 TxBufRead = 0;
109 SBUF = TxBuf[TxBufRead++];
110 TxLen--;
111 }
112 }
113
114 /**************************************************************
115 名称:delay
116 **************************************************************/
117 void delay(u8 count)
118 {
119 u8 i;
120
121 while(count--)
122 {
123 for(i=0; i<255; i++)
124 {}
125 }
126 }
L11.1(5-12).声明串口通信所需的缓冲区。
L11.1(26-32).不断用串口发送一个字符串。
L11.1(70-83).中断方式接收,接收数据后放到接收缓冲区。
L11.1(86-96).中断方式发送,若检测到还有数据未发送,继续。
L11.1(104).启动串口发送,第一个字节要手动发送,触发中断后由中断发送。
下载验证
把程序编译后下载到单片机中,打开“串口调试助手”,设置好相应的参数
(9600-8-n-1 这个之前的文章我们介绍过)后,打开串口,可以看到有数据从串发过
来
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 5 / 5
思考
如何实现用中断接收,写出例程并测试
作者简介
Spark 嵌入式工作室,成立于 2010 年,致力于嵌入式方面的软、硬件开发和
研究,团队成员都是有
经验
班主任工作经验交流宣传工作经验交流材料优秀班主任经验交流小学课改经验典型材料房地产总经理管理经验
的开发工程师,擅长使用 51 单片机、STM32。
联系方式 QQ:pzq@sparkcn.cn
csh@sparkcn.cn
QQ 技术交流群:186232047 验证码:spark
因群加入成员很快,如遇群满,请到 www.sparkcn.co.cc 获取最新交流群号,加
入交流
代码包下载地址:www.sparkcn.co.cc 或直接到群里共享下载
串口应用
简介
11.1串口中断
11.2 软件设计
下载验证
思考
作者简介