?? nmr.lst
字號:
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE NMR
OBJECT MODULE PLACED IN .\NMR.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\NMR.c ROM(COMPACT) DEBUG OBJECTEXTEND
stmt level source
1 /*本程序為核磁共振找水儀下位機程序*/
2
3 #include"my.h"
4 union u {unsigned int word;
5 struct{unsigned char high;unsigned char low;}bytes;//字節順序為高位在前的2byte結構
6 };
7
8 union w { ulong dwords;
9 struct {unsigned int high;unsigned int low;}words;
10 struct {unsigned char byte3;unsigned char byte2;unsigned char byte1;unsigned char byte0;}bytes;
11 };
12 //邏輯
13 #define FALSE 0
14 #define TRUE 1
15 #define H 1
16 #define L 0
17
18 /* 引腳定義*/
19
20 // AD:本設計采用TI公司的TLV2544ID,12bit,四通道,200ksps
21 sbit SDO = P1^0; // TLV2544片選
22 sbit CS = P1^1; // TLV2544控制模擬輸入采樣的開始和啟動轉換
23 sbit SDI = P1^2; // TLV2544A/D轉換結果的三態串行輸出端
24 sbit SCLK = P1^3; // TLV2544串行數據輸入
25 sbit INT = P1^4; // TLV2544串行時鐘輸入
26 sbit CSTART = P1^5; // TLV2544轉換結束或主處理器中斷
27 // DA:本設計采用TI公司的TLV5636,12bit,單通道
28 sbit DIN = P0^3; // TLV5636數據輸入
29 sbit DSCLK = P0^4; // TLV5636時鐘輸入
30 sbit FS = P0^5; // TLV5636片選
31 // LED
32 sbit LEDCLK = P0^0; // LED時鐘
33 sbit LEDDATA = P0^1; // LED數據
34 sbit LEDCLR = P0^2; // LED清零
35 //control
36 sbit powercon = p0^6;
37 sbit es485 = p1^6;
38 sbit STATE = P0^7;
39 sbit trstate = p1^7;
40 /*協議命令字定義*/
41 //
42 #define BEGIN 0x09 //起始碼
43 #define SOH 0x0a //起始碼
44 #define END 0x0d //結束碼
45 //標志號
46 #define NMRTYPE 'A' //標志號
47 //設備號
48 #define EQU 'P' //電源模塊標志
49 //功能碼
50 #define AD 'A' //AD采集
51 #define DA 'D' //DA輸出
52 #define EC 'E' //設備檢測
53 #define CLOSEDC 'C' //關閉電源逆變器
54 //返回命令
55 #define OK 'S' //操作成功
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 2
56 #define ERRBCC 'B'
57 #define ERRF 'W'
58 #define ERRC 'C'
59
60 // ADC:TLV2544操作命令
61 #define CHA0 '0'
62 #define CHA1 '1'
63 #define CHA2 '2'
64 #define CHA3 '3'
65
66 /*變量定義*/
67
68 unsigned char data ch; //ad通道號
69 unsigned char data mode; //mode 是模式 0為讀,1為寫 */
70 unsigned char data n; //數據長度,字節
71
72 //ad[chl:各通道采集完成數據;ch:各通道采集過程換算數據]
73
74 unsigned int idata chl0,ch0;
75 unsigned int idata chl1,ch1;
76 unsigned int idata chl2,ch2;
77 unsigned int idata chl3,ch3;
78
79 bit flag;//電壓采集完成標志
80 bit kk;//校驗正確與否標志
81 unsigned char idata command[20] _at_ 0x48; //串口的發送緩沖區
82
83 /*碼定義*/
84
85 const unsigned char code asci[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0
-x45,0x46};//ASCII
86 const uchar code ledcode[11]={0xEE,0x28,0xCD,0x6D,0x2B,0x67,0xE7,0x2C,0xEF,0x6F,0xFF};//LED字型
87
88 //函數聲明
89
90 void serial_init(void); //串口初始化
91 void bcc(void); //校驗
92 void sendcommand(void); //發送命令或返回命令數據
93 void proc_command(void); //接收命令后處理
94 unsigned int adx(unsigned char ch); //
95 void Delay_10_uS(void); //10us延時
96 unsigned int adrdwr(unsigned int par); //ad讀寫
97 void senderrbcc(void); //錯誤發送
98 void adinit(void); //ad初始化
99 void delay_ms(unsigned char i);
100 void writeda(unsigned int k); //寫da,中斷調用
101 void writedam(unsigned int k); //寫da,主程序調用
102 void dainit(void); //da初始化
103 void LEDinitial(void); //led初始化,檢測數碼管
104 void ledout(void); //led顯示
105 void sendequok(void);
106 void system_init(void);
107 void close(void);
108
109 void main(void)
110 {
111 1 unsigned int idata command1,command2;
112 1 unsigned char data i,j;
113 1 SP=0x60;
114 1 system_init();
115 1 serial_init();
116 1 adinit();
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 3
117 1 dainit();
118 1 LEDinitial();
119 1
120 1 flag=1; //未采集完成,禁止上位機讀取ad數據
121 1 while(1)
122 1 {
123 2 //
124 2 STATE=~STATE;
125 2 for (j=0;j<5;j++){//一個顯示過程
126 3
127 3 ch0=0x0000;
128 3 for(i=0;i<16;i++)//一個采集過程
129 3 {
130 4 command1=0x0000;
131 4 command2=adrdwr(command1);
132 4 while(INT==1);
133 4 CS=H;
134 4 delay_ms(1);
135 4 command2=adrdwr(command1);
136 4 while(INT==1);
137 4 CS=H;
138 4 command2=command2>>4;
139 4 ch0=ch0+command2;
140 4 }
141 3 //
142 3 ch1=0x00;
143 3 for(i=0;i<16;i++)
144 3 {
145 4 command1=0x2000;
146 4 command2=adrdwr(command1);
147 4 while(INT==1);
148 4 CS=H;
149 4 delay_ms(1);
150 4 command2=adrdwr(command1);
151 4 while(INT==1);
152 4 CS=H;
153 4 command2=command2>>4;
154 4 ch1=ch1+command2;
155 4 }
156 3 //
157 3 ch2=0x00;
158 3 for(i=0;i<16;i++)
159 3 {
160 4 command1=0x4000;
161 4 command2=adrdwr(command1);
162 4 while(INT==1);
163 4 CS=H;
164 4 delay_ms(1);
165 4 command2=adrdwr(command1);
166 4 while(INT==1);
167 4 CS=H;
168 4 command2=command2>>4;
169 4 ch2=ch2+command2;
170 4 }
171 3 ///
172 3 ch3=0x00;
173 3 for(i=0;i<16;i++)
174 3 {
175 4 command1=0x6000;
176 4 command2=adrdwr(command1);
177 4 while(INT==1);
178 4 CS=H;
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 4
179 4 delay_ms(1);
180 4 command2=adrdwr(command1);
181 4 while(INT==1);
182 4 CS=H;
183 4 command2=command2>>4;
184 4 ch3=ch3+command2;
185 4 }
186 3 flag=1;
187 3 chl0=ch0;
188 3 chl1=ch1;
189 3 chl2=ch2;
190 3 chl3=ch3;
191 3 flag=0;
192 3 }
193 2 ledout();//顯示通道1和2電壓
194 2 }
195 1 }
196
197
198 void system_init(void)
199 {
200 1 powercon = H;
201 1 es485=L;
202 1 STATE=L;
203 1 trstate=H;
204 1 }
205 //led初始化子函數,點亮全部數碼管及其各碼段
206 void LEDinitial(void)
207 {
208 1 unsigned char data k,i,wordC;
209 1 LEDCLR=0;
210 1 LEDCLR=1;
211 1 LEDCLK=1;
212 1 for(k=0;k<6;k++)
213 1 {
214 2 wordC=ledcode[10];
215 2 for(i=0;i<8;i++){
216 3 LEDCLK=0;
217 3 Delay_10_uS();
218 3 if ((wordC&0x80)==0x80) LEDDATA=1;
219 3 else LEDDATA=0;
220 3 wordC=wordC<<1;
221 3 LEDCLK=1;
222 3 Delay_10_uS();
223 3 }
224 2 }
225 1 delay_ms(500);
226 1 }
227
228 void close(void) using 1
229 {
230 1 powercon=H;
231 1 command[0]=SOH;
232 1 command[1]=NMRTYPE;
233 1 command[2]=EQU;
234 1 command[4]=OK;
235 1 command[7]=END;
236 1 mode=1;n=8;
237 1 bcc();
238 1 sendcommand();
239 1 }
240 //led顯示,左數碼管顯示通道1,右數碼管顯示通道2;
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 5
241 void ledout(void) using 1
242 {
243 1 unsigned long idata V1;
244 1 unsigned char data tmp,i,j,k,wordC,ledword[6];
245 1 LEDCLR=0;
246 1 LEDCLR=1;
247 1 LEDCLK=1;
248 1 V1=chl0;
249 1 V1=V1>>4;
250 1 tmp=V1/1000;
251 1 ledword[0]=tmp&0x0f;
252 1 V1=V1-tmp*1000;
253 1 tmp=V1/100;
254 1 ledword[1]=tmp&0x0f;
255 1 V1=V1-tmp*100;
256 1 tmp=V1/10;
257 1 ledword[2]=tmp&0x0f;
258 1 //
259 1 V1=chl1;
260 1 V1=V1>>4;
261 1 tmp=V1/1000;
262 1 ledword[3]=tmp&0x0f;
263 1 V1=V1-tmp*1000;
264 1 tmp=V1/100;
265 1 ledword[4]=tmp&0x0f;
266 1 V1=V1-tmp*100;
267 1 tmp=V1/10;
268 1 ledword[5]=tmp&0x0f;
269 1 for(i=0;i<6;i++)//依次顯示六個數碼管
270 1 {
271 2 k=ledword[5-i];
272 2 wordC=ledcode[k];
273 2 for(j=0;j<8;j++){//依次發送各數碼管碼段
274 3 LEDCLK=0;
275 3 if ((wordC&0x80)==0x80) LEDDATA=1;
276 3 else LEDDATA=0;
277 3 wordC=wordC<<1;
278 3 LEDCLK=1;
279 3 Delay_10_uS();
280 3 }
281 2 }
282 1 }
283
284 void Delay_10_uS(void) using 1
285 {
286 1 unsigned char data i=10;
287 1 while(i--);
288 1 }
289
290 void delay_ms(unsigned char ms_number)
291 {
292 1 unsigned int idata i;
293 1 unsigned char data j;
294 1 for(j=0;j<ms_number;j++)
295 1 for(i=0;i<229;i++);
296 1 }
297 /*********************************************/
298 //向上位機發送數據
299 void sendcommand(void) using 1
300 {
301 1 unsigned char data j=0;
302 1 unsigned char data tmp=0;
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 6
303 1 es485 =H;
304 1 trstate=L;
305 1 TH0=0xa0; TL0=0x00; TF0=0;
306 1 TR0=1;
307 1 while(TF0==0) { }
308 1
309 1 tmp=command[j];
310 1 TI=0;
311 1 while(tmp!=0x0d)
312 1 {
313 2 tmp=command[j];
314 2 SBUF=tmp;
315 2 j=j+1;
316 2 while(!TI);
317 2 TI=0;
318 2 }
319 1 //
320 1 es485 =L;
321 1 trstate=H;
322 1 TH0=0xa0; TL0=0x00; TF0=0;
323 1 TR0=1;
324 1
325 1 while(TF0==0) { }
326 1 //
327 1
328 1 }
329 /*********************************************/
330
331 //串口初始化:晶振采用22。1184M,波特率38400,方式一
332 void serial_init()
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -