【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器


  • 🎞 Proteus仿真
    在这里插入图片描述

步进调节说明

按下键KEY4,进入步进设置,通过按键KEY2和KEY3调节步进值,步进范围0.1-10;设置好后,再按一次KEY4回到波形显示界面。此时调节频率将是安装最新设置的步进进行频率调节.
  • 步骤:
  • 🌿按下KEY4,进入步进设置界面:
    在这里插入图片描述
  • 🌿通过KEY2和KEY3按键调整步进值:
    在这里插入图片描述
  • 🌿调节完步进值后,再按一次KEY4回到主界面。

在这里插入图片描述

  • 🌿此时再通过按KEY2和KEY3时,调整的频率,是按照最新的步进值进行增减频率操作。
    在这里插入图片描述

📝主程序代码

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
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
#include<reg52.h> //包含头文件
#include<intrins.h>
#define uchar unsigned char //宏定义
#define uint unsigned int

sbit s1=P3^5; //定义按键的接口
sbit s2=P3^6;
sbit s3=P3^7;
sbit s4=P3^4;

sbit led0=P3^0;
sbit led1=P3^1;
sbit led2=P3^2;
sbit led3=P3^3;

sbit lcdrs=P2^7; //液晶控制位
sbit lcden=P2^6;

char num,boxing,u; //定义全局变量
int pinlv=100,bujin=1,bujin1=1;
uchar code table[]="0123456789"; //定义显示的数组
uchar code table1[]="Fout= Wave form:";
unsigned long int m;
int a,b,h,num1;

//自定义字符
uchar code zifu[]={
0x0e,0x11,0x11,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x00, //正弦波 0 1

0x00,0x07,0x04,0x04,0x04,0x04,0x1c,0x00,
0x00,0x1c,0x04,0x04,0x04,0x04,0x07,0x00, //矩形波 2 3

0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00,
0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, //三角波 4 5

0x00,0x01,0x03,0x05,0x09,0x11,0x00,0x00, //锯齿波 6
};
uchar code sin[64]={
135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
}; //正弦波取码
uchar code juxing[64]={
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
}; //矩形波取码

uchar code sanjiao[64]={
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
}; //三角波取码
uchar code juchi[64]={
0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
}; //锯齿波取码

void delay(uint xms) //延时函数
{
int a,b;
for(a=xms;a>0;a--)
for(b=110;b>0;b--);
}
void write\_com(uchar com) //写命令函数
{
lcdrs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}

void write\_date(uchar date) //写数据函数
{
lcdrs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}

//自定义字符集
void Lcd\_ram()
{
uint i,j,k=0,temp=0x40;
for(i=0;i<7;i++)
{
for(j=0;j<8;j++)
{
write\_com(temp+j);
write\_date(zifu[k]);
k++;
}
temp=temp+8;
}
}

void init\_lcd() //初始化函数
{
uchar i;
lcden=0; //默认开始状态为关使能端,见时序图
Lcd\_ram();
write\_com(0x0f);
write\_com(0x38); //显示模式设置,默认为0x38,不用变。
write\_com(0x01); //显示清屏,将上次的内容清除,默认为0x01.
write\_com(0x0c); //显示功能设置0x0f为开显示,显示光标,光标闪烁;0x0c为开显示,不显光标,光标不闪
write\_com(0x06); //设置光标状态默认0x06,为读一个字符光标加1.
write\_com(0x80); //设置初始化数据指针,是在读指令的操作里进行的
for(i=10;i<20;i++) //显示初始化
{
write\_date(table1[i]);
}
write\_com(0x80+0x40);
for(i=0;i<9;i++)
{
write\_date(table1[i]);
}
write\_com(0x80+10);
write\_date(0);
write\_date(1);
write\_date(0);
write\_date(1);
write\_date(0);
write\_date(1);
write\_com(0x80+0x40+0x09);
write\_date(' ');
write\_date('1');
write\_date('0');
write\_date('.');
write\_date('0');
write\_date('H');
write\_date('z');
}
void initclock() //时钟初始化
{
TMOD=0x01;
TH0=a;
TL0=b;
EA=1;
ET0=1;
TR0=1;
}
void display() //显示函数
{
uchar qian,bai,shi,ge;
qian=pinlv/1000;
bai=pinlv%1000/100;
shi=pinlv%1000%100/10;
ge=pinlv%1000%100%10;
write\_com(0x80+0x40+0x09);

if(qian==0)
write\_date(' ');
else
write\_date(table[qian]);
if(qian==0&&bai==0)
write\_date(' ');
else
write\_date(table[bai]);
write\_date(table[shi]);
write\_date('.');
write\_date(table[ge]);
write\_date('H');
write\_date('z');
if(boxing==0)
{
write\_com(0x80+10);
write\_date(0);
write\_date(1);
write\_date(0);
write\_date(1);
write\_date(0);
write\_date(1);
led3=1;
led0=0;
}
if(boxing==1)
{
write\_com(0x80+10);
write\_date(2);
write\_date(3);
write\_date(2);
write\_date(3);
write\_date(2);
write\_date(3);
led0=1;
led1=0;
}


if(boxing==2)
{
write\_com(0x80+10);
write\_date(4);
write\_date(5);
write\_date(4);
write\_date(5);
write\_date(4);
write\_date(5);
led1=1;
led2=0;
}
if(boxing==3)
{
write\_com(0x80+10);
write\_date(6);
write\_date(6);
write\_date(6);
write\_date(6);
write\_date(6);
write\_date(6);
led2=1;
led3=0;
}

}
void keyscan() //键盘检测函数
{
if(s1==0)
{
EA=0;
delay(2);
if(s1==0)
{
while(!s1);
pinlv+=bujin;
if(pinlv>1000)
{
pinlv=100;
}
display();
m=65536-(150000/pinlv);
a=m/256;
b=m%256;
EA=1;
}
}
if(s2==0)
{

delay(5);
if(s2==0)
{
EA=0;
while(!s2);
pinlv-=bujin;
if(pinlv<100)
{
pinlv=1000;
}
display();
m=65536-(150000/pinlv);
a=m/256;
b=m%256;
EA=1;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
EA=0;
while(!s3);
boxing++;
if(boxing>=4)
{
boxing=0;
}
display();
EA=1;
}
}
}
void bujindisplay()
{
uint bai,shi,ge;
bai=bujin1/100;
shi=bujin1%100/10;
ge=bujin1%100%10;
write\_com(0x80+11);
if(bai==0)
write\_date(' ');
else
write\_date(table[bai]);
write\_date(table[shi]);
write\_date('.');
write\_date(table[ge]);
}
void bujinjiance()
{
if(s4==0)
{
delay(5);
if(s4==0)
{
while(!s4);
h++;
if(h==1)
{
write\_com(0x01);
write\_com(0x80);
write\_date('S');delay(1); //step value
write\_date('t');delay(1);
write\_date('e');delay(1);
write\_date('p');delay(1);
write\_date(' ');delay(1);
write\_date('v');delay(1);
write\_date('a');delay(1);
write\_date('l');delay(1);
write\_date('u');delay(1);
write\_date('e');delay(1);
write\_date(':');delay(1);
bujin1=bujin;

bujindisplay();
}
if(h==2)
{
h=0;
bujin=bujin1;

init\_lcd();
initclock();
display();
}
}
}
if(h==1)
{
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!s1);
bujin1++;
if(bujin1>=101)
{
bujin1=1;
}
bujindisplay();
}
}
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
bujin1--;
if(bujin1<=0)
{
bujin1=100;
}
bujindisplay();
}
}
}
}
void main() //主函数
{
init\_lcd();
m=65536-(150000/pinlv);
a=m/256;
b=m%256;
initclock();
led0=0;
while(1)
{
if(h==0)
{
keyscan();
// display();
}

bujinjiance();

switch(boxing)
{
case 0 : P1=sin[u]; break;
case 1 : P1=juxing[u]; break;
case 2 : P1=sanjiao[u]; break;
case 3 : P1=juchi[u]; break;
}
}
}
void T0\_time()interrupt 1 //定时器
{
TH0=a;
TL0=b;
u++;
if(u>=64)
u=0;
}

📚程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1ioyfxgpYH5rT6W36tfIL5Q 
提取码:4wk0