?? 7738.lst
字號:
C51 COMPILER V6.23a 7738 11/21/2006 20:28:16 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE 7738
OBJECT MODULE PLACED IN D:\2-7738~1\7738.OBJ
COMPILER INVOKED BY: D:\Program Files\WAVE6000\COMP51\C51.EXE D:\2-7738~1\7738.C DB SB OE
stmt level source
1 //--------------------------------------------------------------------------------------------
2 //程序作用:用AD7738采集數據,由單片機將數據送往上位機
3 //2006.3 FDY 每個通道連續采樣6次,求平均數
4 //作為本次采集的有效數據
5 //---------------------------------------------------------------------------------------------
6
7 //--------------------------------------------------------------------------------------------
8 //頭文件以及全局變量定義
9 //---------------------------------------------------------------------------------------------
10 #include <reg51.h>
11 #include <intrins.h>
12 #include <math.h>
13
14 sbit SCK=P1^1; // 將p1.1口模擬時鐘輸出
15 sbit MOSI=P1^2; // 將p1.2口模擬主機輸出
16 sbit MISO=P1^3; // 將p1.3口模擬主機輸入
17 sbit RDY=P3^2; // 數據準備好標志
18 unsigned long tdata,a,b,c;
19 float v,d;
20 float pdata kk;
21 float v0,v1,v2,v3,v4,v5,v6,v7;
22 float m1,m2,m3,m4,m5,m6;
23 float e[6],x;
24 #define delayNOP(); {_nop_();_nop_();_nop_();};
25 //---------------------------------------------------------------------------------------------
26 // 函數名稱: delay
27 // 入口參數: N
28 // 函數功能: 延時16*N+24
29 //---------------------------------------------------------------------------------------------
30 void delay(int N)
31 {
32 1 int i;
33 1 for(i=0;i<N;i++);
34 1 }
35 //---------------------------------------------------------------------------------------------
36 // 函數名稱: Write7738
37 // 入口參數: ch
38 // 函數功能: 向AD7738發送一個字節
39 //---------------------------------------------------------------------------------------------
40 void Write7738(unsigned char ch)
41 {
42 1
43 1 unsigned char idata n=8; // 向SDA上發送一位數據字節,共八位
44 1 SCK = 1 ; //時鐘置高
45 1 while(n--)
46 1 {
47 2 delayNOP();
48 2 //delay(3);
49 2 SCK = 0 ; //時鐘置低
50 2 if((ch&0x80) == 0x80) // 若要發送的數據最高位為1則發送位1
51 2 {
52 3 MOSI = 1; // 傳送位1
53 3 }
54 2 else
55 2 {
C51 COMPILER V6.23a 7738 11/21/2006 20:28:16 PAGE 2
56 3 MOSI = 0; // 否則傳送位0
57 3 }
58 2 delayNOP();
59 2 //delay(3);
60 2 ch = ch<<1; // 數據左移一位
61 2 SCK = 1 ; //時鐘置高
62 2 }
63 1 }
64 //---------------------------------------------------------------------------------------------
65 // 函數名稱: Reset7738
66 // 入口參數: 無
67 // 函數功能: 復位AD7738,使其恢復到向通信寄存器寫狀態
68 //---------------------------------------------------------------------------------------------
69 void Reset7738(void)
70 {
71 1 Write7738(0x00);
72 1 Write7738(0xFF);
73 1 Write7738(0xFF);
74 1 Write7738(0xFF);
75 1 Write7738(0xFF);
76 1 }
77 //---------------------------------------------------------------------------------------------
78 // 函數名稱: Comp
79 // 入口參數:
80 // 函數功能: 按從小到大排列
81 //---------------------------------------------------------------------------------------------
82 void Comp(void)
83 {
84 1 int j,i;
85 1 e[0]=m1;e[1]=m2;e[2]=m3;e[3]=m4;e[4]=m5;e[5]=m6;
86 1 for(j=0;j<=4;j++)
87 1 {
88 2 for(i=0;i<=5-j;i++)
89 2 {
90 3 if(e[i]>e[i+1])
91 3 {x=e[i];e[i]=e[i+1];e[i+1]=x;}
92 3 }
93 2 }
94 1
95 1 }
96 //---------------------------------------------------------------------------------------------
97 // 函數名稱: Init7738
98 // 入口參數: 通道數n
99 // 函數功能: 初始化AD7738各寄存器,設置AD轉換相關參數
100 //---------------------------------------------------------------------------------------------
101 void Init7738(int n)
102 {
103 1 Reset7738( );
104 1 Write7738(0x30+n);
105 1 Write7738(0x8F); //設定通道n轉換時間,實驗中若將通轉換時間設為零,則輸出為滿量程
106 1 Write7738(0x01);
107 1 Write7738(0x30); //設置RDY引腳在任何一個通道轉換結束時變低
108 1 Write7738(0x28+n);
109 1 Write7738(0x05); //設置模擬輸入基準為AINCOM,輸入電壓范圍0--+2.5V,單轉換模式
110 1 }
111 //---------------------------------------------------------------------------------------------
112 // 函數名稱: Read7738
113 // 入口參數: 通道數z為整型,分別為0,1,2,3,4,5,6,7以表示讀取相應通道的A/D轉換結果
114 // 函數功能: 啟動A/D轉換,讀取第z通道轉換值并存入單片機
115 //---------------------------------------------------------------------------------------------
116 void Read7738(int z)
117 {
C51 COMPILER V6.23a 7738 11/21/2006 20:28:16 PAGE 3
118 1 int i,j;
119 1 for(j=0;j<5;j++)
120 1 {
121 2 Write7738(0x38+z);
122 2 Write7738(0x43); //設置模式為單轉換模式,數據為24位,啟動第z通道A/D轉換
123 2 while(RDY); //查詢本通道轉換是否結束,RDY=0時表明轉換結束,數據可用
124 2 Write7738(0x48+z);
125 2 SCK=1;
126 2 MOSI=0;
127 2 for(i=0;i<8;i++)
128 2 {
129 3 delayNOP();
130 3 SCK=0;
131 3 delayNOP();
132 3 tdata=tdata<<1;
133 3 if(MISO==1)
134 3 tdata=tdata|0x01;
135 3 else
136 3 tdata=tdata&0xFE;
137 3 SCK=1;
138 3
139 3 }
140 2 a=tdata; //接受高8位數據并賦給a
141 2 for(i=0;i<8;i++)
142 2 {
143 3 delayNOP();
144 3 SCK=0;
145 3 delayNOP();
146 3 tdata=tdata<<1;
147 3 if(MISO==1)
148 3 tdata=tdata|0x01;
149 3 else
150 3 tdata=tdata&0xFE;
151 3 SCK=1;
152 3 }
153 2 b=tdata; //接受中8位數據并賦給b
154 2 for(i=0;i<8;i++)
155 2 {
156 3 delayNOP();
157 3 SCK=0;
158 3 delayNOP();
159 3 tdata=tdata<<1;
160 3 if(MISO==1)
161 3 tdata=tdata|0x01;
162 3 else
163 3 tdata=tdata&0xFE;
164 3 SCK=1;
165 3 }
166 2 c=tdata; //接受低8位數據并賦給c
167 2 d = ((a<<16)&0x00ff0000)+((b<<8)&0x0000ff00)+(c&0x000000FF);
168 2 v=d*2.50000000/0xFFFFFF; //注意此處0xFFFFFF若寫成十進制數,則得到的最高電壓值2.4999998不等于滿量程
-2.5V
169 2 switch(j)
170 2 {
171 3 case 0:m1=v;break;
172 3 case 1:m2=v;break;
173 3 case 2:m3=v;break;
174 3 case 3:m4=v;break;
175 3 case 4:m5=v;break;
176 3 case 5:m6=v;break;
177 3 }
178 2
C51 COMPILER V6.23a 7738 11/21/2006 20:28:16 PAGE 4
179 2 }
180 1 Comp();
181 1 v=(e[2]+e[3]+e[4])/3;
182 1 switch(z)
183 1 {
184 2 case 0:v0=v*409.6;break;
185 2 case 1:v1=v*409.6;break;
186 2 case 2:v2=v*409.6;break;
187 2 case 3:v3=v*409.6;break;
188 2 case 4:v4=v*409.6;break;
189 2 case 5:v5=v*409.6;break;
190 2 case 6:v6=v*409.6;break;
191 2 case 7:v7=v*409.6;break;
192 2 }
193 1
194 1 }
195 //---------------------------------------------------------------------------------------------
196 // 函數名稱: SbufIN()
197 // 入口參數: 無
198 // 函數功能: 串口初始化子程序,假設單片機晶振為12M
199 //---------------------------------------------------------------------------------------------
200 void SbufIN(void)
201 {
202 1 TMOD=0x20; //設置波特率300,定時器1八位自動重裝方式
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -