?? uart.lst
字號(hào):
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN Uart.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Uart.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 ///////////////////////////////////////////////////////////////////////////////
2 // 門禁終端與上位服務(wù)器通信
3 // 門禁終端與上位服務(wù)器通信采用RS485總線方式連接,每臺(tái)門禁終端分配固定設(shè)備
4 // 地址。
5 // 需要注意的是在處理串行通信的時(shí)候,可以關(guān)閉其它中斷
6 // idata=19
7 ///////////////////////////////////////////////////////////////////////////////
8
9 #include "Global.h"
10
11
12 ///////////////////////////////////////////////////////////////////////////////
13 // 內(nèi)部存儲(chǔ)區(qū)變量 0~128字節(jié)
14 extern data uchar cur_time[15]; // 系統(tǒng)當(dāng)前時(shí)間顯示存儲(chǔ)區(qū) XXXX年XX月XX日XX時(shí)XX分XX秒星期X
15
16 extern data uchar pulse; // 蜂鳴
17 extern data uint time_out; // 通用超時(shí)定時(shí)器
18
19 extern data uint recv_ctr; // 接收數(shù)據(jù)起始指針
20 extern data uint trans_time; // 發(fā)送數(shù)據(jù)超時(shí)保護(hù)
21 extern data uint trans_ctr; // 發(fā)送數(shù)據(jù)指針
22 extern data uint trans_size; // 發(fā)送數(shù)據(jù)大小
23
24 extern idata uint SOH_crt; // 數(shù)據(jù)包開始指針
25
26 extern idata char wieformat; // 韋根通信格式
27
28 extern bdata bit maxtrans; // 大/小數(shù)據(jù)量傳輸狀態(tài)
29 extern idata uchar baudrate; // 波特率
30 extern bdata bit comm_ok; // 通信狀態(tài)
31 extern idata uchar laddr; // 地址低字節(jié)ASC碼
32 extern idata uchar haddr; // 地址高字節(jié)ASC碼
33 extern idata uchar currecno; // 當(dāng)前已讀取的實(shí)時(shí)記錄索引
34 extern idata uchar sumrecno; // 所有實(shí)時(shí)記錄索引
35
36 extern data uchar checksum; // 校驗(yàn)和
37 extern data uchar testchecksum; // 接收到的校驗(yàn)和
38
39 ///////////////////////////////////////////////////////////////////////////////
40 // 外部存儲(chǔ)區(qū)變量 256~1280字節(jié)
41 extern xdata uchar SPIbuf[BUFSIZE]; // SPI和串行通信緩沖區(qū)
42 extern xdata uchar recv_buf[RCVBUFSIZE]; // 接收數(shù)據(jù)緩沖區(qū)
43 extern xdata uchar trans_buf[TRANSBUFSIZE]; // 發(fā)送數(shù)據(jù)緩沖區(qū)
44 extern xdata uchar RTrecord[MAX_REALREC_SIZE]; // 實(shí)時(shí)記錄緩沖區(qū)
45
46 void sendmessage(uchar message); // 發(fā)送信息
47 void ClearRcvBuf(); // 清接收緩沖區(qū)
48
49 ///////////////////////////////////////////////////////////////////////////////
50 // 中斷4服務(wù)列程
51 // 串行中斷服務(wù)
52 ///////////////////////////////////////////////////////////////////////////////
53 void ser() interrupt 4
54 {
55 1 idata uchar c;
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 2
56 1
57 1 if(_testbit_(TI)) // 檢測(cè)發(fā)送完成位
58 1 {
59 2 if(maxtrans) // 大數(shù)據(jù)量傳輸
60 2 {
61 3 trans_ctr++; // 發(fā)送指針下移
62 3 if(trans_ctr<trans_size)
63 3 SBUF=SPIbuf[trans_ctr]; // 發(fā)送數(shù)據(jù)
64 3 else
65 3 {
66 4 trans_ctr=0;
67 4 trans_size=0;
68 4 Dir=0; // 停止發(fā)送
69 4 }
70 3 }
71 2 else // 小數(shù)據(jù)量傳輸
72 2 {
73 3 trans_ctr++; // 發(fā)送指針下移
74 3 if(trans_ctr<trans_size)
75 3 SBUF=trans_buf[trans_ctr]; // 發(fā)送數(shù)據(jù)
76 3 else
77 3 {
78 4 trans_ctr=0;
79 4 trans_size=0;
80 4 Dir=0; // 停止發(fā)送
81 4 }
82 3 }
83 2 }
84 1
85 1 if(_testbit_(RI)) // 檢測(cè)接收完成位
86 1 {
87 2 c=SBUF;
88 2 if(c!=0x00)
89 2 {
90 3 if(maxtrans) // 大數(shù)據(jù)量傳輸
91 3 {
92 4 SPIbuf[recv_ctr]=c;
93 4 recv_ctr++;
94 4 if(recv_ctr>BUFSIZE)
95 4 recv_ctr=0;
96 4 }
97 3 else // 小數(shù)據(jù)量傳輸
98 3 {
99 4 recv_buf[recv_ctr]=c;
100 4 recv_ctr++;
101 4 if(recv_ctr>RCVBUFSIZE)
102 4 recv_ctr=0;
103 4 }
104 3 }
105 2 }
106 1 }
107
108 ///////////////////////////////////////////////////////////////////////////////
109 // 檢查接收緩沖區(qū)是否有完整的數(shù)據(jù)包
110 // 如果有返回成功,如果數(shù)據(jù)包不完整可能數(shù)據(jù)有部分丟失或者沒有完整的數(shù)據(jù)返回失敗
111 // 檢查SOH和EOT來判斷
112 ///////////////////////////////////////////////////////////////////////////////
113 bit checkmessage()
114 {
115 1 bdata bit SOHfound;
116 1 bdata bit EOTfound;
117 1 idata uchar temp;
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 3
118 1 idata uint i;
119 1
120 1 SOHfound=FALSE;
121 1 EOTfound=FALSE;
122 1
123 1 if(recv_ctr==0)
124 1 return FALSE; // 緩沖區(qū)中無(wú)數(shù)據(jù)
125 1
126 1 if(maxtrans)
127 1 {
128 2 if(recv_ctr>BUFSIZE) // 接收緩沖區(qū)溢出
129 2 {
130 3 ClearRcvBuf();
131 3 return FALSE;
132 3 }
133 2 }
134 1 else
135 1 {
136 2 if(recv_ctr>RCVBUFSIZE) // 接收緩沖區(qū)溢出
137 2 {
138 3 ClearRcvBuf();
139 3 return FALSE;
140 3 }
141 2 }
142 1
143 1 for(i=0; i<recv_ctr; i++)
144 1 {
145 2 if(maxtrans)
146 2 temp=SPIbuf[i];
147 2 else
148 2 temp=recv_buf[i];
149 2
150 2 if(temp==SOH)
151 2 {
152 3 SOHfound=TRUE; // 發(fā)現(xiàn)SOH
153 3 SOH_crt=i;
154 3 }
155 2 if(temp==EOT)
156 2 EOTfound=TRUE; // 發(fā)現(xiàn) EOT
157 2 }
158 1
159 1 if(SOHfound&&EOTfound)
160 1 {
161 2 COMDISABLE; // 不允許再接收數(shù)據(jù)
162 2 return TRUE; // 接收到完整的數(shù)據(jù)包
163 2 }
164 1
165 1 return FALSE;
166 1 }
167
168 ///////////////////////////////////////////////////////////////////////////////
169 // 發(fā)送信息
170 ///////////////////////////////////////////////////////////////////////////////
171 void sendmessage(uchar message)
172 {
173 1 idata uchar i;
174 1 idata uchar temp;
175 1
176 1 if(maxtrans) // 大模式數(shù)據(jù)傳輸
177 1 {
178 2 SPIbuf[0]=SOH;
179 2 SPIbuf[1]=haddr; // 源地址
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 4
180 2 SPIbuf[2]=laddr;
181 2 SPIbuf[3]='0'; // 目標(biāo)地址
182 2 SPIbuf[4]='0';
183 2 SPIbuf[5]='0'; // 信息號(hào)
184 2 SPIbuf[6]=message; // ACK/NAK
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -