📄 adc0832.lst
字号:
C51 COMPILER V8.09 ADC0832 03/15/2008 09:11:19 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE ADC0832
OBJECT MODULE PLACED IN ADC0832.OBJ
COMPILER INVOKED BY: C:\EDA\Keil\C51\BIN\C51.EXE ADC0832.C BROWSE DEBUG OBJECTEXTEND
line level source
1 # include <AT89x52.h>
2
3 /*****************************************
4
5 P0------DB0~DB7
6 P1.0------RS
7 P1.1------RW
8 P1.2------E
9
10 *****************************************/
11
12 # define LCD_DB P0
13
14 sbit LCD_RS=P1^0;
15
16 sbit LCD_RW=P1^1;
17
18 sbit LCD_E=P1^2;
19
20 sbit ADC0832_CS =P2^0;
21
22 sbit ADC0832_CLK=P3^6;
23
24 sbit ADC0832_DO =P3^7;
25
26 sbit ADC0832_DI =P3^7;
27
28 /******定义函数****************/
29
30 # define uchar unsigned char
31
32 # define uint unsigned int
33
34
35 void LCD_init(void);//初始化函数
36
37 void LCD_write_command(uchar command);//写指令函数
38
39 void LCD_write_data(uchar dat);//写数据函数
40
41 void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
42
43 void delay_n40us(uint n);//延时函数
44
45
46
47 void Delay(unsigned char x)
48
49 {
50 1
51 1 unsigned char i;
52 1
53 1 for(i=0;i<x;i++); //延时,脉冲一位持续的时间
54 1
55 1 }
C51 COMPILER V8.09 ADC0832 03/15/2008 09:11:19 PAGE 2
56
57 unsigned char ReadADC(void) //把模拟电压值转换成8位二进制数并返回
58
59 {
60 1
61 1 unsigned char i,ch;
62 1
63 1 ch = 0 ;
64 1
65 1
66 1 ADC0832_CS=0;
67 1
68 1 //ADC0832_DO=0;//片选,DO为高阻态
69 1
70 1 for(i=0;i<100;i++)
71 1
72 1 { ; }
73 1
74 1 ADC0832_CLK=0;
75 1
76 1 Delay(20);
77 1
78 1 ADC0832_DI = 1 ;
79 1
80 1 ADC0832_CLK=1;
81 1
82 1 Delay(2); //第一个脉冲,起始位
83 1
84 1 ADC0832_CLK=0;
85 1
86 1 Delay(2);
87 1
88 1 ADC0832_DI=1;
89 1
90 1 ADC0832_CLK=1;
91 1
92 1 Delay(20); //第二个脉冲,DI=1表示双通道单极性输入
93 1
94 1 ADC0832_CLK=0;
95 1
96 1 Delay(20);
97 1
98 1 ADC0832_DI=0;
99 1
100 1 ADC0832_CLK=1;
101 1
102 1 Delay(20); //第三个脉冲,DI=0表示选择通道0(CH2)
103 1
104 1 //ADC0832_DI=1;
105 1
106 1 ADC0832_DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备
107 1
108 1 ADC0832_CLK=1;
109 1
110 1 Delay(20);
111 1
112 1 ADC0832_CLK=0;
113 1
114 1 Delay(20);//经实验,这里加一个脉冲AD便能正确读出数据,
115 1
116 1 //不加的话读出的数据少一位(最低位d0读不出)
117 1
C51 COMPILER V8.09 ADC0832 03/15/2008 09:11:19 PAGE 3
118 1 for (i=0; i<8; i++)
119 1
120 1 {
121 2
122 2 ADC0832_CLK=1;
123 2
124 2 Delay(20);
125 2
126 2 ADC0832_CLK=0;
127 2
128 2 Delay(20);
129 2
130 2 ch=(ch<<1)|ADC0832_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
131 2
132 2 }
133 1
134 1 ADC0832_CS=1;//取消片选,一个转换周期结束
135 1
136 1 return(ch);//把转换结果返回
137 1
138 1 }
139
140
141 //*******初始化函数***************
142
143 void LCD_init(void)
144
145 {
146 1
147 1 delay_n40us(10000);
148 1
149 1 LCD_write_command(0x38);//设置8位格式,2行,5x7
150 1
151 1 LCD_write_command(0x38);//设置8位格式,2行,5x7
152 1
153 1 LCD_write_command(0x38);//设置8位格式,2行,5x7
154 1
155 1
156 1 LCD_write_command(0x02);//整体显示,关光标,不闪烁
157 1
158 1 LCD_write_command(0x0C);//清除屏幕显示
159 1
160 1 LCD_write_command(0x06);//设定输入方式,增量不移位
161 1
162 1 }
163
164 //********************************
165
166 //********写指令函数************
167
168 void LCD_write_command(uchar dat)
169
170 {
171 1
172 1 LCD_E = 0;
173 1
174 1 LCD_RS=0;//指令
175 1
176 1 LCD_RW=0;//写入
177 1
178 1 LCD_DB=dat;
179 1
C51 COMPILER V8.09 ADC0832 03/15/2008 09:11:19 PAGE 4
180 1 LCD_E=1;//允许
181 1
182 1 delay_n40us(10);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
183 1
184 1 LCD_E = 0;
185 1 }
186
187 //*******************************
188
189 //********写数据函数*************
190
191 void LCD_write_data(uchar dat)
192
193 {
194 1
195 1 LCD_E = 0;
196 1
197 1 LCD_RS=1;//数据
198 1
199 1 LCD_RW=0;//写入
200 1
201 1 LCD_DB=dat;
202 1
203 1 LCD_E=1;//允许
204 1
205 1 delay_n40us(10);
206 1
207 1 LCD_E = 0;
208 1 }
209
210 //********************************
211
212 //*******显示一个字符函数*********
213
214 void LCD_disp_char(uchar x,uchar y,uchar dat)
215
216 {
217 1 uchar address;
218 1
219 1 if(y==1)
220 1
221 1 address=0x80+x;
222 1
223 1 else
224 1
225 1 address=0xc0+x;
226 1
227 1 LCD_write_command(address);
228 1
229 1 LCD_write_data(dat);
230 1 }
231
232
233
234 void delay_n40us(uint n)
235
236 {
237 1 uint i;
238 1
239 1 uchar j;
240 1
241 1 for(i=n;i>0;i--)
C51 COMPILER V8.09 ADC0832 03/15/2008 09:11:19 PAGE 5
242 1
243 1 for(j=0;j<15;j++)
244 1 ; //
245 1
246 1 } //
247
248 //*******************************
249
250 //*********主函数*****************
251
252 void main(void)
253
254 {
255 1
256 1 unsigned char result;
257 1
258 1 LCD_init();
259 1 while(1)
260 1 {
261 2 result = ReadADC();
262 2 LCD_disp_char(1,1,result/100+0x30);
263 2 result = result %100;
264 2 LCD_disp_char(2,1,result/10+0x30);
265 2 result = result %10;
266 2 LCD_disp_char(3,1,result+0x30);
267 2
268 2 delay_n40us(5000);
269 2 }
270 1
271 1
272 1
273 1 }
274
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 277 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -