📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 10/14/2006 09:00:28 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Main.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************************************
2 程序名称:串行口接收测试
3 *******************************************************************************/
4
5
6 #include <reg51.h>
7 #include <absacc.h>
8 #include <intrins.h>
9
10
11 //定义I/O接口
12 sbit LE_DIG = P1^2;
13 sbit LE_SEG = P1^3;
14 sbit LE_LED = P1^4;
15 sbit RS485_RE = P1^5;
16
17
18 //宏函数:向数码管位选寄存器(74HC573)加载数据
19 #define DIGLD(dat)\
20 {\
21 P0 = (dat);\
22 LE_DIG = 1;\
23 _nop_();\
24 LE_DIG = 0;\
25 }
26
27
28 //宏函数:向数码管段选寄存器(74HC573)加载数据
29 #define SEGLD(dat)\
30 {\
31 P0 = (dat);\
32 LE_SEG = 1;\
33 _nop_();\
34 LE_SEG = 0;\
35 }
36
37
38 //定义显示缓冲区(由定时中断程序自动扫描)
39 unsigned char DispBuf[8];
40
41
42 /*******************************************************************************
43 函数:DispClear()
44 功能:清除显示
45 *******************************************************************************/
46 void DispClear()
47 {
48 1 unsigned char i;
49 1 for ( i=0; i<8; i++ )
50 1 {
51 2 DispBuf[i] = 0x00;
52 2 }
53 1 DIGLD(0x00);
54 1 SEGLD(0x00);
55 1 }
C51 COMPILER V7.06 MAIN 10/14/2006 09:00:28 PAGE 2
56
57
58 /*******************************************************************************
59 函数:T0_ISR()
60 功能:定时器T0中断服务程序,定时扫描显示数码管
61 *******************************************************************************/
62 void T0_ISR() interrupt 1
63 {
64 1 code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
65 1 static unsigned char n = 0;
66 1 TR0 = 0; //暂停T0(重新定时前应当暂停)
67 1 TH0 = 0xFC; //重新定时1ms
68 1 TL0 = 0x66;
69 1 TR0 = 1; //重启T0
70 1 SEGLD(0xFF); //暂停显示(重要操作)
71 1 DIGLD(com[n]); //更新位选信号
72 1 SEGLD(~DispBuf[n]); //更新段选数据
73 1 n++;
74 1 n &= 0x07;
75 1 }
76
77
78 /*
79 函数:DispChar()
80 功能:在数码管上显示字符
81 参数:
82 x:数码管的坐标位置(0~7)
83 c:要显示的字符(仅限十进制数字和减号)
84 */
85 void DispChar(unsigned char x, unsigned char c)
86 {
87 1 //0123456789的数码管字型数据
88 1 code unsigned char Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
89 1 x &= 0x07;
90 1 x = 7 - x;
91 1 if ( c == '-' )
92 1 {
93 2 DispBuf[x] = 0x40;
94 2 }
95 1 else if ( ( c >= '0' ) && ( c <= '9' ) )
96 1 {
97 2 DispBuf[x] = Tab[c-'0'];
98 2 }
99 1 }
100
101
102 /*
103 函数:DispStr()
104 功能:在数码管上显示字符串
105 参数:
106 x:数码管的坐标位置(0~7)
107 *s:要显示的字符串(字符仅限十进制数字和减号)
108 */
109 void DispStr(unsigned char x, unsigned char *s)
110 {
111 1 unsigned char c;
112 1 for (;;)
113 1 {
114 2 c = *s;
115 2 if ( c == '\0' ) break;
116 2 s++;
117 2 DispChar(x,c);
C51 COMPILER V7.06 MAIN 10/14/2006 09:00:28 PAGE 3
118 2 x++;
119 2 }
120 1 }
121
122
123 //定义波特率(取值1200、2400、4800、9600、19200等)
124 #define BaudRate 9600L
125
126
127 /*******************************************************************************
128 函数:UartInit()
129 功能:串行口初始化
130 *******************************************************************************/
131 void UartInit()
132 {
133 1 SCON = 0x50; //串口方式1(8位UART),允许接收
134 1 PCON |= 0x80; //波特率加倍
135 1 TMOD &= 0x0F; //设置T1为8位自动重装定时器,用于产生波特率
136 1 TMOD |= 0x20;
137 1 TH1 = TL1 = 256 - (11059200L / 12) / (16 * BaudRate); //设置T1初值
138 1 TR1 = 1; //启动T1
139 1 ES = 1;
140 1 }
141
142
143 //定义接收标志
144 bit ReceiveFlag = 0;
145
146 //定义接收缓冲区
147 unsigned char UartBuf[4];
148
149
150 /*******************************************************************************
151 函数:Uart_ISR()
152 功能:串行口中断服务函数
153 *******************************************************************************/
154 void Uart_ISR() interrupt 4
155 {
156 1 static unsigned char p = 0;
157 1 unsigned char c;
158 1 if ( RI ) //如果收到数据
159 1 {
160 2 RI = 0; //清除接收标志
161 2 c = SBUF; //读取收到的数据
162 2 if ( (c >= '0') && (c <= '9') ) //如果是数字
163 2 {
164 3 if ( p < 4 ) UartBuf[p++] = c; //保存到缓冲区
165 3 }
166 2 else if ( c == '\n' ) //如果接收完一行
167 2 {
168 3 UartBuf[p] = '\0';
169 3 p = 0;
170 3 ReceiveFlag = 1;
171 3 }
172 2 else
173 2 {
174 3 //对其它字符不予理睬
175 3 }
176 2 }
177 1 if ( TI )
178 1 {
179 2 TI = 0;
C51 COMPILER V7.06 MAIN 10/14/2006 09:00:28 PAGE 4
180 2 }
181 1 }
182
183
184 /*******************************************************************************
185 函数:SysInit()
186 功能:系统初始化
187 *******************************************************************************/
188 void SysInit()
189 {
190 1 LE_DIG = 0;
191 1 LE_SEG = 0;
192 1 LE_LED = 0;
193 1 DispClear(); //清除显示
194 1 UartInit();
195 1 TMOD &= 0xF0;
196 1 TMOD |= 0x01;
197 1 TH0 = 0xFC; //定时1ms
198 1 TL0 = 0x66;
199 1 ET0 = 1; //使能T0定时中断
200 1 TR0 = 1; //启动定时器T0
201 1 EA = 1; //使能总中断
202 1 }
203
204
205 //主函数
206 void main()
207 {
208 1 SysInit();
209 1 DispStr(0,"--------");
210 1 RS485_RE = 0;
211 1 for (;;)
212 1 {
213 2 PCON |= 0x01;
214 2 if ( ReceiveFlag )
215 2 {
216 3 ReceiveFlag = 0;
217 3 DispClear();
218 3 DispStr(0,UartBuf);
219 3 }
220 2 }
221 1 }
222
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 344 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 1
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -