📄 serial.lst
字号:
C51 COMPILER V7.50 SERIAL 06/13/2007 22:16:10 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN Serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Serial.c LARGE BROWSE FLOATFUZZY(7) INCDIR(C:\KEIL\C51\测厚仪\X-RAY\AD\) DE
-BUG OBJECTEXTEND
line level source
1
2
3 //*************************************************************************
4 //串口中断服务程序
5 //*************************************************************************
6 //#include "TestSerial.h"
7 #include <c8051f060.h> // SFR declarations
8 #include <stdio.h>
9
10 #define DB_SENDMAXSIZE 30 //上传最大可能长度 30 字节。
11 #define DB_RECMAXSIZE 9 //下传最大可能长度 9 字节。
12 //#define UpSize 13
13 #define ModuAddr 170 //= 170 ;0XAA
14 #define SYSCLK 24500000 //22118400 // SYSCLK frequency in Hz 24500000 //
15 #define BAUDRATE 9600 // 115200用户定义的timer1 波特率
16
17
18 unsigned char UpSize = 13 ;
19 bit CommRecDataOverflowFlag,FlagRecComm,SendItComm;
20 unsigned char Count1ms,DownSize = 3 , AddSum ;
21 unsigned char CommSendBufferHead, CommSendBufferTail;
22 unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE] ;
23 unsigned char CommRecBufferHead, CommRecBufferTail;
24 unsigned char xdata CommRecBuffer[DB_RECMAXSIZE];
25
26 sbit R485 = P2^1; //P0^2 ; //P5^3; //485 接收/发送, 选择位。
27
28 void ClearCommRecBuffer(void)
29 {
30 1 char data old_SFRPAGE ;
31 1 old_SFRPAGE = SFRPAGE ;
32 1 SFRPAGE = 0X00 ;
33 1 CommRecBufferTail=0;
34 1 FlagRecComm=0;
35 1 CommRecBuffer[0] = 0x00;
36 1 CommRecBuffer[1] = 0x00;
37 1 CommRecBuffer[40] = 0x00;
38 1 DownSize = 3;
39 1
40 1 SFRPAGE = old_SFRPAGE ;
41 1 }
42
43 void OpenComm(void)
44 {
45 1 char data old_SFRPAGE ;
46 1 old_SFRPAGE = SFRPAGE ;
47 1 SFRPAGE = 0X00 ;
48 1 R485 = 0; // 0:接收数据。
49 1
50 1
51 1 // FOLLOW IS FOR TIMER0,1 INIT.
52 1 PCON |= 0x80; // 电源控制寄存器
53 1 TMOD = 0x21; // Configure Timer 0,1 for use.
54 1 CKCON |= 0x12; // Timer 1 derived from SYSCLK.
C51 COMPILER V7.50 SERIAL 06/13/2007 22:16:10 PAGE 2
55 1 TH1 = -(SYSCLK/BAUDRATE/16); //SYSCLK = 22.1168 ,BAUDRATE/16
56 1 TR1 = 1 ; // Start Timer 1
57 1 TR0 = 1 ;
58 1 CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
59 1 CommRecBufferHead=CommRecBufferTail=0;
60 1 FlagRecComm=0;
61 1
62 1 // FOLLOW IS FOR UART0 INIT.
63 1 SFRPAGE = UART0_PAGE;
64 1 SCON0 = 0x50; // SCON: mode 1, 8-bit UART, enable RX
65 1 SSTA0 = 0x10; // BY Timer 1 generates UART0 baud rate and
66 1 // 禁止UART0 的波特率/2 功能.
67 1 RI0=0; // Clear UART0 receive.
68 1 TI0=0; // Clear UART0 transmit.
69 1
70 1 ES0=1; // allow the serial interrupt
71 1
72 1 SendItComm=1; // enable send the data to SBUF0.
73 1
74 1 SFRPAGE = old_SFRPAGE ;
75 1 }
76 //---------------------------------------------------------------------
77 //通信预置数据
78 //-----------------------------------------------------------------------
79
80 void SendCommBuffer(unsigned char *base, unsigned char Len) // UpSize = 8 个上传数据
81 {
82 1 unsigned char i=0, AddSum ;
83 1
84 1 if (SendItComm)
85 1 {
86 2 R485 = 1; // 1;发送数据。
87 2 i = 0 ;
88 2 AddSum = 0;
89 2 while (i<Len-1) //i = 0 --- 6 为要传送的数据,放入缓冲区。
90 2 {
91 3 AddSum += base[i] ;
92 3 CommSendBuffer[i]=base[i];
93 3 i++;
94 3 }
95 2 CommSendBuffer[Len-1] = AddSum; // [7] 为ADDSUM at end, place the addsum.
96 2 }
97 1 CommSendBufferHead=0;
98 1 SBUF0=CommSendBuffer[CommSendBufferHead]; // send the first byte,开始通讯.
99 1 }
100
101 //--------------------------------------------------------------------------
102 //通信中断程序
103 //---------------------------------------------------------------------------
104
105 void CommISR(void) interrupt 4 using 3
106 {
107 1
108 1 unsigned char i=0;
109 1 if (TI0) //清除发送中断标志
110 1 {
111 2 TI0=0;
112 2 CommSendBufferHead++;
113 2
114 2 if (CommSendBufferHead != (UpSize) ) //UpSize = 8 则上传0--7 共8个数据 ,
115 2 {
116 3 SBUF0=CommSendBuffer[CommSendBufferHead]; // < 13 ,0--12 共13个数据被发送.send the next byte
C51 COMPILER V7.50 SERIAL 06/13/2007 22:16:10 PAGE 3
117 3 SendItComm=0;
118 3 }
119 2 else // = 13 相等,本次通讯完成。
120 2 {
121 3 SendItComm=1; //允许进行下一次通讯。
122 3 R485 = 0; // 0:接收数据。
123 3 DownSize = 3;
124 3 }
125 2 }
126 1
127 1 if (RI0)
128 1 {
129 2 RI0=0; //清除接收中断标志
130 2 CommRecBuffer[CommRecBufferTail]=SBUF0; //receive data。
131 2 CommRecBufferTail++;
132 2 if (CommRecBufferTail >= DB_RECMAXSIZE)
133 2 {
134 3 CommRecBufferTail = 0 ; //如果接受的数据比缓冲区还长,指针清零.
135 3 }
136 2 if ( CommRecBuffer[0]== ModuAddr ) //是本设备接收的地址吗?
137 2 {
138 3 if (CommRecBufferTail==2) //先加指针,因此=2。
139 3 {
140 4 DownSize = CommRecBuffer[1]; //指针在0Xa5后第一个单元。
141 4 }
142 3 if (CommRecBufferTail>=DownSize) //本次通讯,数据已传输完了吗?
143 3 {
144 4 for (i=0; i<DownSize-1 ;i++)
145 4 {
146 5 AddSum = AddSum + CommRecBuffer[ i ] ;
147 5 }
148 4 if ( CommRecBuffer[ DownSize-1 ]== AddSum) // 累加和相等吗?
149 4 {
150 5 FlagRecComm=1; //本次通讯数据正确,通知主程序取数。
151 5 DownSize = 3; //否则只修改指针,不通知主程序取数。
152 5 REN0 = 0; //禁止UART0 接收数据,主程序取数后再打开
153 5 }
154 4 CommRecBufferTail = 0x00; //只要指针大于DownSize,将指针恢复到起始地址。
155 4 AddSum = 0; //清除累加和。
156 4 CommRecBuffer[ 0 ] = 0;
157 4 DownSize = 3;
158 4 }
159 3
160 3 }
161 2 if ( CommRecBuffer[0]!= ModuAddr )
162 2 {
163 3 CommRecBufferTail = 0x00; //第一个字符不相等,将指针恢复到起始地址。
164 3 AddSum = 0; //清除累加和。
165 3 }
166 2 }
167 1 }
168
169
170
171
172
173
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 434 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V7.50 SERIAL 06/13/2007 22:16:10 PAGE 4
XDATA SIZE = 47 3
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -