51单片机ADC0832模数转换+ LCD12864显示+Proteus仿真

51单片机ADC0832模数转换+ LCD12864显示+Proteus仿真


  • Proteus仿真
    在这里插入图片描述
  • 在Proteus SP2仿真过程中发现无法读取ADC0832的数据。解决办法:在proteus安装目录下:D:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\DATA\MODELS替换ADC083X.DLL
    在这里插入图片描述
  • ADC0832.dll动态链接库文件下载:
1
2
3
链接:https://pan.baidu.com/s/1Dh2GoRHKpEFIPSylaTpBEw 
提取码:nfjz

  • 汉字取模软件:PCtoLCD2002,

取模参数:阴码,顺向取模,逐行式扫描;

在这里插入图片描述

程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
#include<reg51.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含\_nop\_()函数定义的头文件

//全局变量声明
#define uchar unsigned char
#define uint unsigned int

//ADC0832端口引脚定义
sbit CS=P1^0; //将CS位定义为P3.4引脚
sbit CLK=P1^1; //将CLK位定义为P1.0引脚
sbit DIO=P1^2; //将DIO位定义为P1.1引脚

sbit wr=P2^0; //数据写
sbit rd=P2^1; //数据读
sbit ce=P2^2; //片选
sbit cd=P2^3; //指令数据通道,1指令,0数据
sbit rst=P2^4; //复位信号

void delay(uint t);
void init\_12864();
void write\_data(uchar dat);
void write\_cmd1(uchar cmd);
void write\_cmd2(uchar dat,uchar cmd);
void write\_cmd3(uchar data1,uchar data2,uchar cmd);
uchar read\_status();
void check\_status();
void clear\_screen();
void display\_char(uchar x,uchar y,uchar ch);
void init();
uchar A\_D();
uchar code digit[10]= {16,17,18,19,20,21,22,23,24,25}; //定义字符数组显示数字
//注意汉字数组要加code放到外部存储器中,如果不加code则空间不够
uchar code HZ0[5][32]= {
{
0x10,0x10,0x08,0x20,0x04,0x40,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
0x21,0x08,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,/\*"单",0\*/
},

{ 0x00,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x1F,0xFC,0x10,0x00,0x10,0x00,
0x10,0x00,0x1F,0xE0,0x10,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x40,0x20,/\*"片",1\*/

},

{ 0x10,0x00,0x11,0xF0,0x11,0x10,0x11,0x10,0xFD,0x10,0x11,0x10,0x31,0x10,0x39,0x10,
0x55,0x10,0x55,0x10,0x91,0x10,0x11,0x12,0x11,0x12,0x12,0x12,0x12,0x0E,0x14,0x00,/\*"机",2\*/
},

{ 0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/\*"学",0\*/
},
//学

{ 0x00,0x00,0x7F,0xF8,0x00,0x08,0x00,0x08,0x08,0x08,0x04,0x08,0x02,0x08,0x02,0x08,
0x00,0x68,0x01,0x88,0x0E,0x08,0x70,0x08,0x20,0x08,0x00,0x08,0x00,0x50,0x00,0x20,/\*"习",1\*/
}
};

uchar code HZ1[5][32]= {

{ 0x01,0x00,0x21,0x08,0x21,0x08,0x3F,0xF8,0x00,0x20,0x22,0x20,0x22,0x3E,0xFF,0x42,
0x22,0x94,0x22,0x10,0x3E,0x10,0x22,0x10,0x22,0x28,0x3E,0x28,0x22,0x44,0x00,0x82,/\*"嵌",0\*/
},

{ 0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x02,0x80,
0x04,0x40,0x04,0x40,0x08,0x20,0x08,0x20,0x10,0x10,0x20,0x10,0x40,0x08,0x80,0x06,/\*"入",1\*/
},

{ 0x00,0x48,0x00,0x44,0x00,0x44,0x00,0x40,0xFF,0xFE,0x00,0x40,0x00,0x40,0x3E,0x40,
0x08,0x40,0x08,0x40,0x08,0x20,0x08,0x22,0x0F,0x12,0x78,0x0A,0x20,0x06,0x00,0x02,/\*"式",2\*/
},

{ 0x00,0x00,0x7F,0xFC,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0xFF,0xFE,
0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0x20,/\*"开",3\*/
},

{ 0x01,0x00,0x11,0x10,0x11,0x08,0x22,0x00,0x3F,0xFC,0x02,0x00,0x04,0x00,0x07,0xF8,
0x0A,0x08,0x09,0x08,0x11,0x10,0x10,0xA0,0x20,0x40,0x40,0xA0,0x03,0x18,0x1C,0x06,/\*"发",4\*/
},

};


uchar code HZ3[4][32]= {
//电
{ 0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE
},
//压
{ 0x00,0x00,0x3F,0xFE,0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x2F,0xFC,
0x20,0x80,0x20,0x80,0x20,0x90,0x20,0x88,0x20,0x88,0x40,0x80,0x5F,0xFE,0x80,0x00
},
//:
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
},
//伏
{ 0x08,0x40,0x08,0x50,0x08,0x48,0x10,0x48,0x10,0x40,0x37,0xFE,0x30,0x40,0x50,0x40,
0x90,0xA0,0x10,0xA0,0x10,0xA0,0x11,0x10,0x11,0x10,0x12,0x08,0x14,0x04,0x18,0x02
}
};
uchar code HZ4[11][32] = {
//零
{ 0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x02,0x9D,0x74,0x01,0x00,0x1D,0x70,0x02,0x80,
0x0C,0x60,0x32,0x18,0xC1,0x06,0x1F,0xE0,0x00,0x20,0x06,0x40,0x01,0x80,0x00,0x40
},
//一
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
},
//二
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00
},
//三
{ 0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00
},
//四
{ 0x00,0x00,0x00,0x00,0x7F,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
0x48,0x44,0x48,0x3C,0x50,0x04,0x60,0x04,0x40,0x04,0x7F,0xFC,0x40,0x04,0x00,0x00
},
//五
{ 0x00,0x00,0x7F,0xFC,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xF0,0x04,0x10,
0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0xFF,0xFE,0x00,0x00
},
//六
{ 0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,
0x04,0x40,0x04,0x20,0x08,0x10,0x08,0x08,0x10,0x08,0x20,0x04,0x40,0x04,0x00,0x00
},
//七
{ 0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x3C,0x07,0xC0,0xFA,0x00,
0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x04,0x02,0x04,0x02,0x04,0x01,0xFC,0x00,0x00
},
//八
{ 0x00,0x00,0x00,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x20,
0x08,0x20,0x08,0x20,0x08,0x10,0x10,0x10,0x10,0x08,0x20,0x08,0x20,0x04,0x40,0x02
},
//九
{ 0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xE0,0x04,0x20,0x04,0x20,0x04,0x20,
0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x22,0x10,0x22,0x20,0x22,0x40,0x1E,0x80,0x00
},
//点
{ 0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xFC,0x02,0x00,0x02,0x00,0x3F,0xF0,0x20,0x10,
0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x24,0x88,0x22,0x44,0x42,0x44,0x80,0x04
}
};
//汉字显示函数,处在x y处显示汉字hz
void display\_HZ(uchar x,uchar y,uchar \*hz)//x 0-3 y 0-7
{
uchar i,j=0;
for(i=0; i<16; i++)
{
write\_cmd3(((j/2)<<4)|(y\*2),x,0x24);//地址指针设置..低地址,高地址,命令
write\_cmd2(hz[j++],0xc0);
write\_cmd2(hz[j++],0xc0);
}
}
//由于pg12864f不带中文字库,所以采取取模方式以图片显示汉字。

void main()
{
uchar i,j=0;
uint AD_val; //储存A/D转换后的值
uchar Int,Dec,t,h; //分别储存转换后的整数部分与小数部分小数
init();
for(i=0; i<5; i++)
display\_HZ(0,1+i,HZ0[i]);
for(i=0; i<5; i++)
display\_HZ(1,1+i,HZ1[i]);
delay(500);
while(1) {
AD_val= A\_D(); //进行A/D转换
delay(500);
Int=(AD_val)/51; //计算整数部分
Dec=(AD_val%51)\*100/51; //计算小数部分
t=Dec/10; //取十位(小数点后第一位)
h=Dec%10; //取个位(小数点后第二位)
display\_HZ(3,0,HZ3[0]);//电
display\_HZ(3,1,HZ3[1]);//压
display\_HZ(3,2,HZ3[2]);//:
display\_HZ(3,3,HZ4[Int]);
display\_HZ(3,4,HZ4[10]);//.
display\_HZ(3,5,HZ4[t]);
display\_HZ(3,6,HZ4[h]);
display\_HZ(3,7,HZ3[3]);//伏
}

}

void delay(uint t)
{
uint i,j;
for(i=0; i<t; i++)
for(j=0; j<50; j++);
}

void init()
{
P2=0Xff;
P1=0Xff;

rst=1;
delay(10);
rst=0;

wr=1;
rd=1;
ce=1;
cd=1;
rst=1;

check\_status();
write\_cmd3(0x01,0x00,0x21);//光标指针设置
check\_status();
write\_cmd3(0x00,0x00,0x42);//图形区首地址
check\_status();
write\_cmd3(16,0x00,0x43);//图形区宽度
check\_status();
write\_cmd1(0x80);//显示方式设置,正常显示
check\_status();
write\_cmd1(0x98);//图形方式显示,不显示字母,只打点
check\_status();
write\_cmd1(0xa0);//光标形状设置1 0 1 0 0 N2 N1 N0
}


void write\_data(uchar dat)
{
rd=1;
cd=0;
ce=0;
wr=0;
P0=dat;
delay(10);
wr=1;
ce=1;
cd=1;
}

void write\_cmd1(uchar cmd)
{
rd=1;
cd=1;
ce=0;
wr=0;
P0=cmd;
delay(10);
wr=1;
ce=1;
cd=0;
}
//先送参数,再送指令
void write\_cmd2(uchar dat,uchar cmd)
{
check\_status();
write\_data(dat);
check\_status();
write\_cmd1(cmd);
}
void write\_cmd3(uchar data1,uchar data2,uchar cmd)
{
check\_status();
write\_data(data1);
check\_status();
write\_data(data2);
check\_status();
write\_cmd1(cmd);
}

uchar read\_status()
{
uchar status;
P0=0;//端口b置为输入
rd=0;
wr=1;
ce=0;
cd=1;
status=P1;
return status;
}
void check\_status()
{
uchar s;
P0=0Xff;//端口b置为输出
while((s&0x80)!=0x80)
s=read\_status();//等待位1,2置为。命令读写准备好。数据读写准备好
}


uchar A\_D()
{
uchar i,dat;
CS=1; //一个转换周期开始
\_nop\_();
CLK=0; //为第一个脉冲作准备
\_nop\_();
\_nop\_();
CS=0; //CS置0,片选有效
\_nop\_();
DIO=1; //DIO置1,规定的起始信号
\_nop\_();
CLK=1; //第一个脉冲
CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
\_nop\_();

DIO=1; //DIO置1, 通道选择信号
\_nop\_();

CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0

CLK=0; //第二个脉冲下降沿

DIO=0; //DI置0,选择通道0

CLK=1; //第三个脉冲

CLK=0; //第三个脉冲下降沿

DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1

CLK=1; //第四个脉冲
for(i=0; i<8; i++) //高位在前
{
CLK=1; //第四个脉冲
\_nop\_();
\_nop\_();
CLK=0;
\_nop\_();
\_nop\_();
dat<<=1; //将下面储存的低位数据向右移
dat|=(uchar)DIO; //将输出数据DIO通过或运算储存在dat最低位
}
CS=1; //片选无效
return dat; //将读书的数据返回
}


程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1uhaOnMJUShfZYV-wfNVmpA 
提取码:3mq6