📄 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 + -