📄 mcp3004.lst
字号:
C51 COMPILER V7.01 MCP3004 08/31/2007 09:13:57 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE MCP3004
OBJECT MODULE PLACED IN mcp3004.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE mcp3004.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 void long_delay(void); //长延时
8 void short_delay(void); //短延时
9 void delay500ms(void); //延时10ms
10 void write7279(uchar cmd,uchar dta); //写入7279
11 uchar read7279(uchar command); //读Hb7279
12 void send_byte(uchar out_byte); //发送一字节
13 uchar receive_byte(void); //接收一字节
14
15 sbit cs =P1^1;
16 sbit clk=P1^2;
17 sbit dat=P1^3;
18 sbit key=P3^4;
19 bit key_flag; //按键标志
20
21 sbit pAD_SCS = P1^7; //MCP3004
22 sbit pAD_SCK = P1^4;
23 sbit pAD_SDI = P1^6;
24 sbit pAD_SDo = P1^5;
25
26
27 #define CMD_RESET 0xa4 //复位
28 #define DECODE1 0xc8 //方式1译码指令
29 #define CMD_READ 0x15 //读键盘指令
30 #define UNDECODE 0x90 // 不译码指令
31 #define ACTCTL 0X98 //消隐控制命令
32
33 uchar key_number,i;
34 uint tmr;
35 uchar code www[8]={0xBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE,0X7F};
36
37
38
39 #define uchar unsigned char
40 #define uint unsigned int
41 //unsigned char AD7416_SystemError;
42 //unsigned int Temperature; //温度
43
44
45 sbit ADC_CLOCK =P1^4; // 启动一次转换,并在转换进行时对转换的每一位进行时钟输出
46 sbit ADC_IN =P1^6; // 将通道配置数据装入器件
47 sbit ADC_OUT =P1^5; // 将ADC转换的结果输出,在转换进行时,数据将总是在每个时钟的下降沿变化
48 sbit ADC_CS =P1^7; //为低启动器件,为高终止器件。在转换与转换之间引脚必须拉高。
49
50 uint data ADC_data[4]={600,700,800,900}; //假设4个通道的报警点
51 uint read3004(uchar port);
52 void Delay(uchar k);
53 uint Read3004(uchar ChNum);
54 /**
55 用采样点电阻分压值计算需要的报警点ADC值于读取采样值比较
C51 COMPILER V7.01 MCP3004 08/31/2007 09:13:57 PAGE 2
56 **/
57 void main(void)
58 {
59 1 uchar i;
60 1 uint j;
61 1 delay500ms();
62 1 while(1)
63 1 {
64 2 for(i=0;i<4;i++)
65 2 {
66 3 j=Read3004(i);
67 3 write7279(DECODE1+3,j/1000); //将编辑的数据发送出去
68 3 write7279(DECODE1+2,j%1000/100);
69 3 write7279(DECODE1+1,j%1000%100/10);
70 3 write7279(DECODE1+0,j%1000%100%10);
71 3 j=0;
72 3 delay500ms();
73 3 delay500ms();
74 3 delay500ms();
75 3 delay500ms();
76 3 }
77 2 }
78 1 }
79
80 void write7279(uchar cmd,uchar dta)
81 {
82 1 send_byte (cmd);
83 1 send_byte (dta);
84 1 }
85
86 unsigned char read7279(uchar command)
87 {
88 1 send_byte (command);
89 1 return(receive_byte());
90 1 }
91
92 void send_byte( uchar out_byte)
93 {
94 1 uchar j;
95 1 cs=0;
96 1 long_delay();
97 1 for (j=0;j<8;j++)
98 1 {
99 2 if (out_byte&0X80)
100 2 {
101 3 dat=1;
102 3 }
103 2 else
104 2 {
105 3 dat=0;
106 3 }
107 2 clk=1;
108 2 short_delay();
109 2 clk=0;
110 2 short_delay();
111 2 out_byte=out_byte*2;
112 2 }
113 1 dat=0;
114 1 }
115
116 uchar receive_byte(void)
117 {
C51 COMPILER V7.01 MCP3004 08/31/2007 09:13:57 PAGE 3
118 1 uchar j,in_byte;
119 1 dat=1;
120 1 long_delay();
121 1 for(j=0;j<8;j++)
122 1 {
123 2 clk=1;
124 2 short_delay();
125 2 in_byte=in_byte*2;
126 2 if(dat)
127 2 {
128 3 in_byte=in_byte|0x01;
129 3 }
130 2 clk=0;
131 2 short_delay();
132 2 }
133 1 dat=1;
134 1 return(in_byte);
135 1 }
136
137 void long_delay(void)
138 {
139 1 uchar j;
140 1 for(j=0;j<0x30;j++);
141 1 }
142
143 void short_delay(void)
144 {
145 1 uchar j;
146 1 for(j=0;j<8;j++);
147 1 }
148
149 void delay500ms(void)
150 {
151 1 uchar j,k,t;
152 1 for(j=15;j>0;j--)
153 1 for(k=202;k>0;k--)
154 1 for(t=81;t>0;t--);
155 1 }
156
157
158 //CS拉高再拉低启动器件
159 uint read3004(uchar port) //从3004读取采样值,形参port是采样的通道号
160 {
161 1 uint data ad=0;
162 1 uchar data i;
163 1 //uchar data al=0,ah=0;
164 1 if(port>3) //3004 为4通道10位ADC
165 1 {
166 2 port=3;
167 2 }
168 1 ADC_CS=0;
169 1 ADC_CLOCK=0; Delay(3);//Start
170 1 ADC_IN=1;
171 1 ADC_CLOCK=1; Delay(3);
172 1 ADC_CLOCK=0; Delay(3);
173 1 ADC_IN=1; //决定采用单端还是差分输入模式
174 1 ADC_CLOCK=1; Delay(3);
175 1
176 1 port<<=5;
177 1 for (i=0;i<3;i++) //把通道号打入3004,D1和D0译码通道号
178 1 {
179 2 ADC_CLOCK=0; Delay(3);
C51 COMPILER V7.01 MCP3004 08/31/2007 09:13:57 PAGE 4
180 2 ADC_IN=(bit)(port&0x80);
181 2 ADC_CLOCK=1; Delay(3);
182 2 port<<=1;
183 2 }
184 1
185 1
186 1 ADC_CLOCK=0; Delay(3);//采样与保持周期
187 1 ADC_CLOCK=1; Delay(3); //输出一个低空位
188 1 ADC_CLOCK=0; Delay(3);
189 1 ADC_CLOCK=1; Delay(3);
190 1 for (i=0;i<10;i++) //ADC转换取B9,B8,
191 1 {
192 2 ADC_CLOCK=0; Delay(3);
193 2 if (ADC_OUT)
194 2 {
195 3 ad|=0x0001;
196 3 }
197 2 ADC_CLOCK=1; Delay(3);
198 2 if(i<9)
199 2 ad<<=1;
200 2 }
201 1 ADC_CLOCK=0; Delay(3);
202 1 ADC_CLOCK=1; Delay(3);
203 1 ADC_CLOCK=0; Delay(3);
204 1 ADC_CS=1;
205 1 return (ad);
206 1 }
207 /*
208 for (i=0;i<8;i++) //取B7---B0位
209 {
210
211 ADC_CLOCK=0; Delay(3);
212 if (ADC_OUT)
213 {
214 al|=0x01;
215 }
216
217 ADC_CLOCK=1; Delay(3);
218 al<<=1;
219 }
220 ADC_CLOCK=0; Delay(3);
221 ADC_CS=1;
222 ad=(uint)ah;
223 ad<<=8;
224 ad|=al; //得到ADC值
225 return (ad);
226 }
227 */
228 void Delay(uchar k) //延时
229 {
230 1 uchar i;
231 1 for(i=0;i<k;i++);
232 1 }
233 /*
234 uint Read3004(uchar ChNum)
235 {
236 uchar i; uint ADResult=0;
237
238 pAD_SCS=0;
239 for(i=0; i<5; i++)
240 {
241 pAD_SCK=0;
C51 COMPILER V7.01 MCP3004 08/31/2007 09:13:57 PAGE 5
242 if((ChNum<<i)&0x80)
243 pAD_SDI=1;
244 else
245 pAD_SDI=0;
246 Delay(4); pAD_SCK=1;
247 Delay(4);
248 }
249
250 pAD_SCK=0; Delay(4);
251 pAD_SCK=1; Delay(4);
252 pAD_SCK=0; Delay(4);
253 pAD_SCK=1; Delay(4);
254
255 for(i=0; i<10; i++) //10位分辩率
256 {
257 pAD_SCK=0; Delay(4);
258 if(pAD_SDo)
259 ADResult=(ADResult<<1)|0x0001;
260 else
261 ADResult=(ADResult<<1)&0x03fe;
262 pAD_SCK=1; Delay(4);
263 }
264 pAD_SCK=0; Delay(4);
265 pAD_SCK=1; Delay(4);
266 pAD_SCK=0; pAD_SCS=1;
267 return(ADResult);
268 }
269 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 500 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 12
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -