标题:
51单片机+DAC0832产生正弦波电路Proteus仿真+代码
[打印本页]
作者:
aimer123
时间:
2019-1-19 11:40
标题:
51单片机+DAC0832产生正弦波电路Proteus仿真+代码
利用51单片机搭建正弦波产生电路仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(19.1 KB, 下载次数: 62)
下载附件
2019-1-19 16:44 上传
单片机源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define uchar unsigned char
sbit wr2=P3^7;
sbit rs = P2^6;
sbit rw= P2^5;
sbit ep = P2^7;
sbit gn=P2^4;
sbit up=P2^3;
sbit down=P2^2;
sbit S1=P2^0;
sbit S2=P2^1;
sbit wr1=P3^0;
sbit dir1=P3^1;
sbit dir2=P3^4;
uchar j,k=39,flag,amp=0xfa;
uint freq;
code uchar v[]="amplitude:";
uchar vv[5];
code uchar f[]="freqency:";
code uint fj[40]={999,744,591,490,419,366,325,292,265,243,224,208,194,181,171,
161,153,145,138,132,126,121,116,111,107,104,100,97,94,91,85,81,74,71,67,64,60,57,53,50};
code uchar sj[]={0,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,31,33,36,38,40,42,45,48,51,55};
uchar fv[6];
code uchar sin[]={0x7F,0x84,0x88,0x8D,0x91,0x96,0x9B,0x9F,0xA4,0xA8,0xAC,0xB1,0xB5,0xB9,0xBD,0xC1,0xC5,0xC9,
0xCD,0xD0,0xD4,0xD7,0xDA,0xDE,0xE1,0xE4,0xE6,0xE9,0xEB,0xEE,0xF0,0xF2 ,0xF4,0xF6,0xF7,0xF9,0xFA,0xFB,
0xFC,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD ,0xFD,0xFC,0xFB,0xF9,0xF8,0xF7,0xF5,0xF3,0xF1,0xEF,0xED,
0xEA,0xE8,0xE5,0xE2,0xDF ,0xDC,0xD9,0xD5,0xD2,0xCE,0xCB,0xC7,0xC3,0xBF,0xBB,0xB7,0xB3,0xAE,0xAA,0xA6,0xA1,
0x9D,0x98,0x94,0x8F,0x8B,0x86,0x81,0x7D,0x78,0x73,0x6F,0x6A,0x66,0x61,0x5D,0x58 ,0x54,0x50,0x4B,0x47,0x43,
0x3F,0x3B,0x37,0x33,0x30,0x2C,0x29,0x25,0x22,0x1F,0x1C ,0x19,0x16,0x14,0x11,0x0F,0x0D,0x0B,0x09,0x07,0x06,
0x05,0x03,0x02,0x01,0x01,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x07,0x08,0x0A,0x0C,
0x0E,0x10,0x13,0x15,0x18,0x1A,0x1D,0x20,0x24,0x27,0x2A,0x2E,0x31,0x35,0x39,0x3D,0x41,0x45,0x49,0x4D,0x52,0x56,
0x5A,0x5F,0x63,0x68,0x6D,0x71,0x76,0x7A,0x7F};
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
P0=com;
delay(5); //?nop????????
ep=1;
delay(5);
ep=0;
}
void write_data(uchar date)
{
rs=1;
P0=date;
delay(5);
ep=1;
delay(5);
ep=0;
}
void init_1602()
{
rw=0;
write_com(0x38);
delay(1);
write_com(0x0c);
delay(1);
write_com(0x06);
delay(1);
write_com(0x01);
delay(1);
}
void display_1602(uchar *v)
{
uchar i=0;
while(v[i]!='\0')
{
write_data(v[i]);
i++;
delay(1);
}
}
void dealv(uchar amp)
{
int i;
i=amp*10;
i=i/50;
vv[0]=i/10+48;
vv[1]='.';
vv[2]=i%10+48;
vv[3]='V';
vv[4]='\0';
}
void dealf()
{
freq=fj[k];
fv[0]=freq/100+48;
fv[1]=freq%100/10+48;
fv[2]=freq%10+48;
fv[3]='H';
fv[4]='z';
fv[5]='\0';
freq=0; //????
}
void fudu(uchar amp)
{
P1=amp;
wr1=0;
delay(1);
wr1=1;
}
void keyscan1()
{
if(gn==0)
{
delay(20);
if(gn==0);
{
while(!gn);
flag^=0x01;
}
}
if(flag)
{
dir1=0;
if(up==0)
{
delay(10);
if(up==0);
{
while(!up);
dir2^=1;
amp+=5;
if(amp>250) amp=0; //??????
fudu(amp);
dealv(amp);
write_com(0x80+10);
display_1602(vv);
}
}
if(down==0)
{
delay(100);
if(down==0);
{
while(!down);
dir2^=1;
amp-=5;
if(amp==0) amp=250;
fudu(amp);
dealv(amp);
write_com(0x80+10);
display_1602(vv);
}
}
}
else
{
dir1=1;
if(up==0)
{
delay(100);
if(up==0);
{
while(!up);
dir2^=1;
k++;
delay(10);
if(k>39) k=0; //???????
dealf();
write_com(0xc0+10);
display_1602(fv);
}
}
if(down==0)
{
delay(80);
if(down==0);
{
while(!down);
dir2^=1;
k--;
delay(10); //
if(k>=250) k=39;
dealf();
write_com(0xc0+10);
display_1602(fv);
}
}
}
}
void main()
{
uchar i;
fudu(amp);
init_1602();
write_com(0x80);
display_1602(v);
write_com(0xc0);
display_1602(f);
dealv(amp);
write_com(0x80+10);
display_1602(vv);
dealf();
write_com(0x80+0x40+10);
display_1602(fv);
while(1)
{
keyscan1();
for(j=0;j<173;j++)
{
P1=sin[j];
wr2=0;
for(i=sj[k];i>0;i--); //??????????
wr2=1;
for(i=sj[k];i>0;i--);
wr2=1;
}
}
}
复制代码
0.png
(10.86 KB, 下载次数: 60)
下载附件
2019-1-19 16:45 上传
所有资料51hei提供下载:
51 正弦波.zip
(68.17 KB, 下载次数: 80)
2019-1-19 11:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
刘梓凌
时间:
2019-6-3 19:43
请问一下,如果想把它的分辨率提高成256的话,如何修改数据呢?
作者:
Sanlv_
时间:
2019-6-29 20:06
请问S1 S2 dir1 dir2有什么用呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1