📄 adc.lst
字号:
C51 COMPILER V8.05a ADC 05/26/2008 11:05:26 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE ADC
OBJECT MODULE PLACED IN adc.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE adc.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 数字滤波采用限幅+递推均值滤波法
3 */
4
5 #include<def.h>
6 #define f 10 //滤波器的频率,HZ
7 #define fadc 2457600 //ADC时钟
8 #define fcode fadc/f/128 //tm7707滤波器的值
9
10 ulong databuf[6]={0,0,0,0,0,0};
11 ulong dataave[6]={0};
12 //---------------------------------------------adc_8bit串行数据输入程序-----------------------------------
-------------------------------------
13 //上升沿传输数据
14 void adc_in8bit(uchar adc_data)
15 {
16 1 uchar m;
17 1 DIN=1;
18 1 SCLK=1;
19 1 for(m=0;m<8;m++)
20 1 {
21 2 SCLK=0;
22 2 if((adc_data&0x80)!=0)
23 2 {
24 3 DIN=1;
25 3 }
26 2 else
27 2 {
28 3 DIN=0;
29 3 }
30 2 SCLK=1;
31 2 adc_data=adc_data<<1;
32 2 }
33 1 }
34 //下降沿传输数据
35 void adc_in8bit_neg(uchar adc_data)
36 {
37 1 uchar m;
38 1 DIN=1;
39 1 for(m=0;m<8;m++)
40 1 {
41 2 SCLK=1;
42 2 if((adc_data&0x80)!=0)
43 2 {
44 3 DIN=1;
45 3 }
46 2 else
47 2 {
48 3 DIN=0;
49 3 }
50 2 SCLK=0;
51 2 adc_data=adc_data<<1;
52 2 }
53 1 }
54 //---------------------------------------------adc_8bit串行数据输出程序-----------------------------------
C51 COMPILER V8.05a ADC 05/26/2008 11:05:26 PAGE 2
-------------------------------------
55 //上升沿传输数据
56 uchar adc_out()
57 {
58 1 uchar m,k;
59 1 DOUT=1; //端口设置输入口
60 1 SCLK=1;
61 1 for(m=0;m<8;m++)
62 1 {
63 2 SCLK=0;
64 2 k=k<<1;
65 2 if(DOUT==0)
66 2 {
67 3 k=k&0xfe;
68 3 }
69 2 else
70 2 {
71 3 k=(k|0x01&0xff);
72 3 }
73 2 SCLK=1;
74 2 }
75 1 return(k);
76 1 }
77 //下降沿传输数据
78 uchar adc_out_neg()
79 {
80 1 uchar m,k;
81 1 DOUT=1; //端口设置输入口
82 1 for(m=0;m<8;m++)
83 1 {
84 2 SCLK=1;
85 2 k=k<<1;
86 2 if(DOUT==0)
87 2 {
88 3 k=k&0xfe;
89 3 }
90 2 else
91 2 {
92 3 k=(k|0x01&0xff);
93 3 }
94 2 SCLK=0;
95 2 }
96 1 return(k);
97 1 }
98 //---------------------------------------------ADC转换控制程序--------------------------------------------
--------------------------------------
99 uint adc7705_con()
100 {
101 1 uchar datal;
102 1 uint adcdata=0;
103 1 do
104 1 {
105 2 adc_in8bit(0x08); //写通讯寄存器,选择下一步读通讯寄存器
106 2 datal=adc_out(); //读通讯寄存器,等待最高位为0
107 2 }
108 1 while((datal&0x80)==0x80);
109 1 adc_in8bit(0x38); //写通讯寄存器,选择下一步读数据寄存器
110 1 //读数据寄存器
111 1 adcdata=adc_out();
112 1 adcdata<<=8;
113 1 adcdata|=adc_out();
114 1 return (adcdata);
C51 COMPILER V8.05a ADC 05/26/2008 11:05:26 PAGE 3
115 1 }
116 uint adc7715_con()
117 {
118 1 uchar datal;
119 1 uint adcdata=0;
120 1 do
121 1 {
122 2 adc_in8bit(0x0b); //写通讯寄存器,选择下一步读通讯寄存器
123 2 datal=adc_out(); //读通讯寄存器
124 2 }
125 1 while((datal&0x80)==0x80);
126 1 adc_in8bit(0x3b); //写通讯寄存器,选择下一步读数据寄存器
127 1 //读数据寄存器
128 1 adcdata=adc_out();
129 1 adcdata<<=8;
130 1 adcdata|=adc_out();
131 1 return (adcdata);
132 1 }
133 ulong adc7707_con()
134 {
135 1 uchar datal;
136 1 ulong adcdata=0;
137 1 do
138 1 {
139 2 adc_in8bit_neg(0x0c); //写通讯寄存器,选择下一步读通讯寄存器
140 2 datal=adc_out_neg(); //读通讯寄存器
141 2 }
142 1 while((datal&0x80)==0x80); //等待最高位为0
143 1 adc_in8bit_neg(0x5c); //写通讯寄存器,选择下一步读数据寄存器
144 1 //读数据寄存器
145 1 adcdata=adc_out_neg();
146 1 adcdata<<=8;
147 1 adcdata|=adc_out_neg();
148 1 adcdata<<=8;
149 1 adcdata|=adc_out_neg();
150 1 return (adcdata);
151 1 }
152 //-----------------------------------------------adc初始化程序--------------------------------------------
-----------------
153 void adcinit()
154 {
155 1 uchar p;
156 1 //发送连续40个时钟
157 1 DIN=1;
158 1 for(p=0;p<40;p++)
159 1 {
160 2 SCLK=0;
161 2 _nop_();
162 2 _nop_();
163 2 SCLK=1;
164 2 _nop_();
165 2 _nop_();
166 2 }
167 1 if(adcbit1==0)
168 1 {
169 2 if(adcbit0==0)
170 2 {
171 3 //tm7705初始化
172 3 adc_in8bit(0x20); //写通讯寄存器,选择下一步写时钟寄存器,CH1通道
173 3 adc_in8bit(0x84); //写时钟寄存器,使用2.4576M晶体,输出更新速率20HZ
174 3 adc_in8bit(0x10); //写通讯寄存器,选择下一步写设置寄存器
175 3 adc_in8bit(0x7c); //写设置寄存器,G=128,单极性,无缓冲
C51 COMPILER V8.05a ADC 05/26/2008 11:05:26 PAGE 4
176 3 }
177 2 else
178 2 {
179 3 //tm7715初始化
180 3 adc_in8bit(0x13); //写通讯寄存器,选择下一步写设置寄存器,G=128
181 3 adc_in8bit(0x60); //写设置寄存器
182 3 }
183 2 }
184 1 else
185 1 {
186 2 //tm7707初始化
187 2 adc_in8bit_neg(0x24); //写通讯寄存器,选择下一步写滤波器高8位
188 2 adc_in8bit_neg(0xe0|(fcode/256)); //写滤波器高8位
189 2 adc_in8bit_neg(0x34); //写通讯寄存器,选择下一步写滤波器低8位
190 2 adc_in8bit_neg(fcode%256); //写设置寄存器
191 2 adc_in8bit_neg(0x14); //写通讯寄存器,选择下一步写设置寄存器
192 2 adc_in8bit_neg(0x3c); //写设置寄存器,设置增益为16,自校准,并启动AD转换
193 2 }
194 1 }
195 //--------------------------------------------------ADC数据处理-------------------------------------------
--------------------
196 ulong adccon()
197 {
198 1 uchar i,j;
199 1 ulong idata temp,adcresult;
200 1 ulong idata adcdata_new,adcdata_now,adcdata_old;
201 1
202 1 //采集数据
203 1 if(adcbit1==0)
204 1 {
205 2 if(adcbit0==0)
206 2 {
207 3 adcdata_new=adc7705_con();
208 3 }
209 2 else
210 2 {
211 3 adcdata_new=adc7715_con();
212 3 }
213 2 }
214 1 else
215 1 {
216 2 adcdata_new=adc7707_con();
217 2 }
218 1
219 1 //数据处理
220 1 if(adcdata_new>=adcresult)
221 1 {
222 2 temp=adcdata_new-adcresult;
223 2 }
224 1 else
225 1 {
226 2 temp=adcresult-adcdata_new;
227 2 } //得到新的数据与滤波器值的差值
228 1 if(temp>data_th)
229 1 {
230 2 //比较上一次ADC的数据与本次滤波器的差值是否大于阀值
231 2 if(adcdata_old>=adcresult)
232 2 {
233 3 temp=adcdata_old-adcresult;
234 3 }
235 2 else
236 2 {
C51 COMPILER V8.05a ADC 05/26/2008 11:05:26 PAGE 5
237 3 temp=adcresult-adcdata_old;
238 3 } //得到上次ADC的数据与滤波器值的差值
239 2 if(temp>data_th)
240 2 {
241 3 //称重发生变化
242 3 dataave[0]=dataave[1]=dataave[2]=dataave[3]=dataave[4]=dataave[5]=adcdata_new; //用新的ADC的数据代替滤
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -