📄 uart.lst
字号:
C51 COMPILER V7.20 UART 04/13/2006 13:41:59 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: C:\Keil_C51\C51\BIN\C51.EXE uart.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 * Copyright (C) 2006, 华中科技大学电气与电子科技创新中心
3 * All Rights Reserved.
4 *
5 * 文件名: uart.c
6 * 文件描述: 串口驱动主程序文件
7 *
8 * 当前版本: 1.0
9 * 作者: SangWei(swkyer@gmail.com)
10 * 完成日期: 2005年12月12日
11 *
12 */
13 #include <intrins.h>
14 #include <REGX52.h>
15 #include "uart.h"
16
17
18 static unsigned char idata uartbuf;
19 static unsigned char idata bufwptr, bufrptr;
20 unsigned char idata uartbuff[UARTBUFFLEN];
21
22 /* 波特率设置表(22.1184MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
23 //static unsigned char code BAUD[] = {0x70, 0xB8, 0xDC, 0xEE, 0xF4, 0xFA};
24 /* 波特率设置表(11.0592MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
25 static unsigned char code BAUD[] = {0xB8, 0xDC, 0xEE, 0xF7, 0xFA, 0xFD};
26
27 /*
28 * 初始化串口, 波特率57600
29 */
30 void UartInit(unsigned char baudrate)
31 {
32 1 ES = 0;
33 1 TR2 = 0;
34 1
35 1 bufwptr = 0; // 写指针
36 1 bufrptr = 0; // 读指针
37 1
38 1 PCON = 0x00; // 设置串口波特率, 时钟频率30MHZ
39 1 T2CON = 0x30; // 定时器2作为波特率发生器
40 1 SCON = 0x50; // 模式1
41 1 // n = 65536 - [fosc/baud*32]
42 1 // n = 65536 - 22118400/(57600*32) = 65536 - 12 = 65524 = 0xfff4
43 1 RCAP2H = 0xff;
44 1 RCAP2L = BAUD[baudrate]; // baud rate 57600
45 1 TH2 = 0xff;
46 1 TL2 = BAUD[baudrate];
47 1
48 1 IP = 0x10; // 串口中断优先级高
49 1 REN = 1;
50 1 TI = 0;
51 1 RI = 0;
52 1 TR2 = 1; // 启动定时器2
53 1 ES = 1; // 使能串口中断
54 1 }
55
C51 COMPILER V7.20 UART 04/13/2006 13:41:59 PAGE 2
56 /*
57 * 发送一个字节数据
58 */
59 void SendChar(unsigned char ch)
60 {
61 1 SBUF = ch;
62 1 while(TI == 0);
63 1 TI = 0;
64 1 }
65
66 /*
67 * 发送字符串
68 */
69 void SendString(char *str)
70 {
71 1 while(*str)
72 1 {
73 2 SendChar(*str);
74 2 str++;
75 2 }
76 1 }
77
78 /*
79 * 判断是否接收到数据,如果没有返回0,如果有,返回数据长度
80 */
81 unsigned char IsUartReceived(void)
82 {
83 1 unsigned char num;
84 1
85 1 EA = 0; // 关中断
86 1 if(bufwptr == bufrptr)
87 1 num = 0;
88 1 else if(bufwptr > bufrptr)
89 1 num = (bufwptr-bufrptr);
90 1 else // if(bufwptr < bufrptr)
91 1 num = (UARTBUFFLEN-bufwptr+bufrptr);
92 1 EA = 1;
93 1 return num;
94 1 }
95
96 /*
97 * 从缓冲区中读一个字节数据
98 * 返回剩下的字节数
99 */
100 unsigned char ReadChar(unsigned char idata *buf)
101 {
102 1 unsigned char ch, num;
103 1
104 1 EA = 0;
105 1 if(bufwptr == bufrptr)
106 1 {
107 2 *buf = 0;
108 2 num = 0;
109 2 }
110 1 else if(bufwptr > bufrptr)
111 1 {
112 2 ch = uartbuff[bufrptr];
113 2 *buf = ch;
114 2 bufrptr++;
115 2 num = (bufwptr-bufrptr);
116 2 }
117 1 else // if(bufwptr < bufrptr)
C51 COMPILER V7.20 UART 04/13/2006 13:41:59 PAGE 3
118 1 {
119 2 ch = uartbuff[bufrptr];
120 2 *buf = ch;
121 2 bufrptr++;
122 2 if(bufrptr == UARTBUFFLEN)
123 2 bufrptr = 0;
124 2 num = (UARTBUFFLEN-bufrptr+bufwptr);
125 2 }
126 1
127 1 EA = 1;
128 1 return num;
129 1 }
130
131
132 /*
133 * 串口中断接受
134 */
135 void UartInt(void) interrupt 4 using 1
136 {
137 1 if(RI)
138 1 {
139 2 ES = 0;
140 2 uartbuf = SBUF;
141 2 RI = 0; // 清中断标志
142 2
143 2 uartbuff[bufwptr] = uartbuf; // 数据写入缓冲区
144 2 if(bufwptr >= UARTBUFFLEN-1) // 循环缓冲指针
145 2 bufwptr = 0;
146 2 else
147 2 bufwptr++;
148 2 if(bufwptr == bufrptr) // 未读数据被覆盖,读指针更新到写指针的上一个单元
149 2 bufrptr = bufwptr + 1;
150 2
151 2 ES = 1;
152 2 }
153 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 246 ----
CONSTANT SIZE = 6 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 35 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -