试用DAC0832芯片设计一个能够输出频率为50Hz的方波电路和程序

如题所述

第1个回答  2012-03-22
#include<reg52.h>
sbit key2=P3^4;
sbit key1=P3^5;
sbit key0=P3^7;

sbit wela=P2^7;
sbit dula=P2^6;
sbit dawr=P3^6;
sbit csda=P3^2;

char flag; //波型输出标置变量
bit time;
unsigned char i;
int num ;
void frequency() ;

void delay(int z) //延时 z毫秒
{
int x,y;
for(x=z;x>0;x--)
for(y=124;y>0;y--);
}

unsigned char sin(unsigned char x)//正弦波
{

unsigned char code sin_tab[]=
{
0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9c, 0x9f, 0xa2, 0xa5, 0xa8, 0xab, 0xae, //上半周
0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xc1, 0xc4, 0xc7, 0xc9, 0xcc, 0xce, 0xd1, 0xd3, 0xd5, 0xd8,
0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xed, 0xef, 0xf0, 0xf2, 0xf3, 0xf4,
0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7,
0xf6, 0xf4, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdc,
0xda, 0xd8, 0xd5, 0xd3, 0xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9, 0xb6, 0xb3,
0xb0, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83, 0x80,

0x80, 0x7d, 0x7a, 0x76, 0x73, 0x70, 0x6d, 0x6a, 0x67, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55, 0x52, //下半周期
0x4f, 0x4c, 0x49, 0x46, 0x43, 0x41, 0x3e, 0x3b, 0x39, 0x36, 0x33, 0x31, 0x2e, 0x2c, 0x2a, 0x27,
0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x14, 0x12, 0x10, 0x0f, 0x0d, 0x0c, 0x0b,
0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00,
0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 ,0x09, 0x0b, 0x0c, 0x0d,
0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23, 0x25, 0x27, 0x2a, 0x2c,
0x2e, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x3e, 0x40, 0x43, 0x46, 0x48, 0x4b, 0x4e, 0x51, 0x54,
0x57, 0x5a, 0x5d, 0x5f, 0x60, 0x63, 0x66, 0x69, 0x6b, 0x6d, 0x6f, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7e, 0x80};
return sin_tab[x];
}

void DAC0832(unsigned char x)
{

csda=0;
dawr=0;
P0=x;
csda=1;
dawr=1;
}
void main()
{
char d;
wela=0;
dula=0;
d=1;
TMOD=0X02;
num=10;
TH0=256-num; //num用来控制采样一个点所用的时间
TL0=256-num;
ET0=1; //按键接于外部中断0,与中断1
EA=1;
TR0=1;
flag=2; //开始时有输出
i=0;
while(1)
{
if(key2==0) //按一下key3,d自加1
{
delay(5);
if(key2==0)
{
while(!key2);
d++;
if(d==21)//当d=21,d变为1
d=1;
}
}
frequency() ;
if(time==1)
{
time=0;
if(i>255)
i=0;
else
i=i+d; //设置采样间隔
switch(flag) //当按键1的为输出三角波,按键2时输出正弦波
{
case 0:DAC0832(i);break;// 当flag=0时,锯齿波
case 1:
if(i>127)// 当flag=1时,三角波
DAC0832(255-i);
else
DAC0832(i);
break;
case 2: DAC0832(sin(i)); //当flag=2时,正弦波
break;
default: break;
}
}
}
}

void time0() interrupt 1
{
TH0=256-num;
TL0=256-num;
time=1;
}
void frequency()
{
if(key0==0) // //key0控制flag,频率选择
{
delay(5) ;
if(key0==0) //再次检测
{
while(!key0); //等待按键释放
flag++; //按一下加1
if(flag==3) //大于2返回0
flag=0;
}
}
if(key1==0) //检测P21是否按下
{
delay(5) ;
if(key1==0) //再次检测
{
while(!key1);
num=num+10; //按一下减10
if(num==250) //小于5,返回5
num=10;
}
}
}本回答被提问者采纳
相似回答