打印

请教AT89c51单片机用DAC0832输出正弦波出问题

[复制链接]
9294|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 hangang0214 于 2012-12-26 17:57 编辑

新手刚接触单片机,遇到问题请教一下大家!我用的郭天祥的单片机开发板,使用定时器0,由dac0832输出正弦波,或者是三角波发现输出的波形有问题,下面是程序,请大家忙帮看看问题出在哪里?


程序如下:
#include <reg52.h>

sbit csda=P3^2;//da 输出接单片机p0口
sbit wr=P3^6;
sbit dula=P2^6;
sbit wela=P2^7;
int z,a,flage;
int code table[63]=
{
0,26,51,76,100,123,145,165,184,
201,216,229,239,247,253,256,256,254,
250,243,233,221,207,191,173,154,132,
110,86,62,37,11,-14,-40,-65,-89,-113,
-135,-156,-176,-193,-209,-223,-234,-243,
-250,-254,-255,-255,-251,-245,-237,-226,-213
-197,-180,-161,-140,-118,-95,-71,-46,-21,
};
void output(int z)
{
        csda=0;   //数据输出采取直通方式
        wr=0;
        P0=z;
        csda=1;
        wr=1;
}

init_MCU()
{
        TMOD=0x01;
        TH0=(65536-50)/256;
        TL0=(65536-50)%256;
        TR0=1;
        EA=1;
        ET0=1;
}

void main()
{
        a=0;
        wela=1;
        P0=0xff;
        wela=0;
        flage=1;
        
        init_MCU();        

        while(1)
        {
               
        }
}

timer0()  interrupt 1
{
        TH0=(65536-5)/256;
        TL0=(65536-5)%256;
            if(flage==1)               //这一部分是正弦波程序
                {
                        a++;
                        if(a>=63)
                        {
                                flage=0;
                        }
                        output(table[a]);
                };

                if(flage==0)
                {
                        a--;
                        if(a<=0)
                        {
                                flage=1;
                        }
                        output(table[a]);
                };
               
                /*        a=a+5;     //这一部分是三角波程序
                        if(a>=256)
                        {
                                //flage=0;
                                a=0;
                        }
                        output(a);
                        //delay(1);
                */
}


相关帖子

沙发
icecut| | 2012-12-26 18:23 | 只看该作者
我从图能看出来,你的程序中有使ad输出0的地方.自己找找.

使用特权

评论回复
板凳
hangang0214|  楼主 | 2012-12-26 19:05 | 只看该作者
icecut 发表于 2012-12-26 18:23
我从图能看出来,你的程序中有使ad输出0的地方.自己找找.

不好意思,我是菜鸟,我看了半天也没找到问题,能否请您看一下我的程序,帮忙指点一下。

使用特权

评论回复
地板
NE5532| | 2012-12-26 19:35 | 只看该作者
你先输出稳定的直流电平再说。

使用特权

评论回复
5
icecut| | 2012-12-26 22:11 | 只看该作者
呵呵.就这几行.一点点改也知道

使用特权

评论回复
6
hangang0214|  楼主 | 2012-12-29 14:02 | 只看该作者
上面的图是用Protues仿真的图,实际的示波器波形如下所示
我的程序中并没有加延时程序,不知道为什么每个波形结束之后总会有一段时间为0;
而且DAC0832是一个8为的DA,按道理来说输出时从0~256的,我不管是仿真还是实测都发现数据从0~128是逐渐变大的,但是大于128之后数据就改变不明显了。

使用特权

评论回复
7
qiliangzhong| | 2013-1-3 20:14 | 只看该作者
//file:dac0832
//锯齿,三角,正弦,方波的输出



#include"reg51.h"
#define uchar unsigned char
sbit cs=P1^0;
sbit wr=P3^6;
unsigned int i;
uchar k;
uchar discount=0;//外部中断计数
uchar code tab[]={128, 130, 132, 135, 137, 139, 141, 144, 146, 148,150, 152, 155,  //正弦函数点数组
                                       157, 159, 161, 163, 165, 168, 170,172, 174,
                                       176, 178, 180, 182, 184, 186, 188, 190,
                                 192, 194, 196, 198, 200, 201, 203, 205, 207, 209,
                           210, 212, 214, 215, 217, 219, 220, 222, 223, 225, 226,
         227, 229, 230, 232, 233, 234, 235, 237, 238,
    239, 240, 241, 242, 243, 244, 245, 246, 247, 247 ,
    248, 249, 250, 250, 251, 252, 252, 253, 253, 254,
    254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
    255, 255, 255, 255, 255, 255, 255, 255, 255, 254,
    254, 254, 253, 253, 252, 252, 251, 250, 250, 249,
    248, 247, 247, 246, 245, 244, 243, 242, 241, 240,
    239, 238, 237, 235, 234, 233, 232, 230, 229, 227,
    226, 225, 223, 222, 220, 219, 217, 215, 214, 212 ,
    210, 209, 207, 205, 203, 201, 200, 198, 196, 194,
   192, 190, 188, 186, 184, 182, 180, 178, 176, 174,
    172, 170, 168, 165, 163, 161, 159, 157, 155, 152  ,
    150, 148, 146, 144, 141, 139, 137, 135, 132, 130 ,
    128, 126, 124, 121, 119, 117, 115, 112, 110, 108,
    106, 104, 101, 99, 97, 95, 93, 91, 88, 86,
    84, 82, 80, 78, 76, 74, 72, 70, 68, 66  ,
    64, 62, 60, 58, 56, 55, 53, 51, 49, 47 ,
    46, 44, 42, 41, 39, 37, 36, 34, 33, 31,
    30, 29, 27, 26, 24, 23, 22, 21, 19, 18,
    17, 16, 15, 14, 13, 12, 11, 10, 9, 9,
    8, 7, 6, 6, 5, 4, 4, 3, 3, 2,
    2, 2, 1, 1, 1, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 1, 1, 1, 2,
    2, 2, 3, 3, 4, 4, 5, 6, 6, 7,
   8, 9, 9, 10, 11, 12, 13, 14, 15, 16,
     17, 18, 19, 21, 22, 23, 24, 26, 27, 29,
    30, 31, 33, 34, 36, 37, 39, 41, 42, 44,
     46, 47, 49, 51, 53, 55, 56, 58, 60, 62,
    64, 66, 68, 70, 72, 74, 76, 78, 80, 82,
     84, 86, 88, 91, 93, 95, 97, 99, 101, 104,
     106, 108, 110, 112, 115, 117, 119, 121, 124, 126,
     128};



//延时函数,可调整频率
void delay()
{
uchar b,c;
for(c=1;c>0;c--)


for(b=1;b>0;b--);
}
//锯齿波
void juchi()
{

for(i=0;i<256;i++)
{
P0=i;
delay();
}

}
//三角波
void sanjiaobo()
{
for(i=0;i<255;i++)
{P0=i;
delay();}
for(i=254;i>0;i--)
{P0=i;
delay();}
}
//方波
void plus()
{
for(i=0;i<500;i++)
{P0=255;
delay();
}
for(i=0;i<500;i++)
{P0=0;
delay();}
}
//正弦波
void sin()
{
for(i=0;i<360;i++)
{P0=tab[i];
delay();}

}

void ExtInt0() interrupt 0//使用外部中断0
{

discount++;
if(discount==4)
{discount=0;
}
}
void waveout() //波形选择输出
{
switch (discount)
{
case 0:juchi();break;
case 1:sanjiaobo();break;
case 2:sin();break;
case 3:plus();break;
}
}


//主函数
main()
{TCON=0X01; //下降沿有效
IE=0X81;

cs=0;wr=0;

while(1)
{
waveout();

}
}

你参考一下,很久没看过程序了····不好意思

使用特权

评论回复
8
hangang0214|  楼主 | 2013-1-6 17:49 | 只看该作者
qiliangzhong 发表于 2013-1-3 20:14
//file:dac0832
//锯齿,三角,正弦,方波的输出

谢谢你!我看过程序了。我们的程序差不多。只是始终搞不懂我的哪里出了问题。
我修改下你的程序再运行一下。

使用特权

评论回复
9
lirunze| | 2013-1-6 19:54 | 只看该作者
路过了啊

使用特权

评论回复
10
vgalcd| | 2013-1-6 23:10 | 只看该作者
不错,挺详细了

使用特权

评论回复
11
adofe| | 2013-1-7 10:02 | 只看该作者

使用特权

评论回复
12
wuyiyun88| | 2013-1-7 10:15 | 只看该作者
                        a++;
                        if(a>=63)
                        {
                                flage=0;
                        }
                        output(table[a]);
table[63]已经越界了吧

使用特权

评论回复
13
wuyiyun88| | 2013-1-7 10:33 | 只看该作者
        csda=0;   //数据输出采取直通方式
        wr=0;
        P0=z;
        csda=1;
        wr=1;
时序也不对,P0=z;应该在wr=0;之前

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

0

粉丝