📄 uart.lst
字号:
C51 COMPILER V7.06 UART 10/18/2008 15:01:24 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil C51\C51\BIN\C51.EXE uart.c BROWSE DEBUG OBJECTEXTEND
stmt 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
34 1
35 1 bufwptr = 0; // 写指针
36 1 bufrptr = 0; // 读指针
37 1
38 1 PCON = 0x00; // 设置串口波特率, 时钟频率30MHZ
39 1
40 1 SCON = 0x50; // 模式1
41 1
42 1 TMOD=0x20; // 定时器1作为波特率发生器
43 1 TCON=0x00;
44 1
45 1 TH1=BAUD[baudrate];
46 1 TL1=BAUD[baudrate]; // n = 65536 - [fosc/baud*32]
47 1 // n = 65536 - 22118400/(57600*32) = 65536 - 12 = 65524 = 0xfff4
48 1
49 1 IP = 0x10; // 串口中断优先级高
50 1 REN = 1;
51 1 TI = 0;
52 1 RI = 0;
53 1 ES = 1; // 使能串口中断
54 1 }
55
C51 COMPILER V7.06 UART 10/18/2008 15:01:24 PAGE 2
56 void UartInt(void) interrupt 4 using 1
57 {
58 1 if(RI)
59 1 {
60 2 ES = 0;
61 2 uartbuf = SBUF;
62 2 RI = 0; // 清中断标志
63 2
64 2 uartbuff[bufwptr] = uartbuf; // 数据写入缓冲区
65 2 if(bufwptr >= UARTBUFFLEN-1) // 循环缓冲指针
66 2 bufwptr = 0;
67 2 else
68 2 bufwptr++;
69 2 if(bufwptr == bufrptr) // 未读数据被覆盖,读指针更新到写指针的上一个单元
70 2 bufrptr = bufwptr + 1;
71 2
72 2 ES = 1;
73 2 }
74 1 }
75
76 void SendChar(unsigned char ch)
77 {
78 1 SBUF = ch;
79 1 while(TI == 0);
80 1 TI = 0;
81 1 }
82
83 /*
84 * 发送字符串
85 */
86 void SendString(char *str)
87 {
88 1 while(*str)
89 1 {
90 2 SendChar(*str);
91 2 str++;
92 2 }
93 1 }
94
95 /*
96 * 判断是否接收到数据,如果没有返回0,如果有,返回数据长度
97 */
98 unsigned char IsUartReceived(void)
99 {
100 1 unsigned char num;
101 1
102 1 EA = 0; // 关中断
103 1 if(bufwptr == bufrptr)
104 1 num = 0;
105 1 else if(bufwptr > bufrptr)
106 1 num = (bufwptr-bufrptr);
107 1 else // if(bufwptr < bufrptr)
108 1 num = (UARTBUFFLEN-bufwptr+bufrptr);
109 1 EA = 1;
110 1 return num;
111 1 }
112
113 /*
114 * 从缓冲区中读一个字节数据
115 * 返回剩下的字节数
116 */
117 unsigned char ReadChar(unsigned char idata *buf)
C51 COMPILER V7.06 UART 10/18/2008 15:01:24 PAGE 3
118 {
119 1 unsigned char ch, num;
120 1
121 1 EA = 0;
122 1 if(bufwptr == bufrptr)
123 1 {
124 2 *buf = 0;
125 2 num = 0;
126 2 }
127 1 else if(bufwptr > bufrptr)
128 1 {
129 2 ch = uartbuff[bufrptr];
130 2 *buf = ch;
131 2 bufrptr++;
132 2 num = (bufwptr-bufrptr);
133 2 }
134 1 else // if(bufwptr < bufrptr)
135 1 {
136 2 ch = uartbuff[bufrptr];
137 2 *buf = ch;
138 2 bufrptr++;
139 2 if(bufrptr == UARTBUFFLEN)
140 2 bufrptr = 0;
141 2 num = (UARTBUFFLEN-bufrptr+bufwptr);
142 2 }
143 1
144 1 EA = 1;
145 1 return num;
146 1 }
147
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 238 ----
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 + -