找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1303|回复: 4
打印 上一主题 下一主题
收起左侧

请大家帮忙看看关于波形发生器的单片机代码,有一些小问题需要大家帮忙解答

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:941176 发表于 2022-5-6 21:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg51.H"
#include "ad9834.h"
#include "LCD1602.h"
#include "keyScan.h"        

#define  MAX_VOLT   47   //为啥47代表4.7V

//sbit LED = P0^0;
//sbit key1 = P1^2;
//sbit key2 = P1^3;
//sbit key3 = P1^4;        
//sbit key4 = P1^5;
//sbit key5 = P1^6;
//sbit FSK = P3^6;

/*
*********************************************************************************************************
*        函 数 名: DelayMs                        ‘i
*        功能说明: 时钟延时
*        形    参: ms 以毫秒为单位.
*        返 回 值: 无
*********************************************************************************************************
*/
void DelayMs( unsigned int ms)
{
        unsigned int i,j;
        for (i = 0; i < ms; i++)
                for(j=0;j<1000;j++);        //单片机晶振12MHZ,j是随便取吗
}


void main()
{
        unsigned long FreqData=20000;
  unsigned int volt=MAX_VOLT;
                unsigned int ratio;
        unsigned char AmpData=255;        //不懂这两行,255是啥
        unsigned char WaveModle=0;
        unsigned char  keyNum = 16;
        unsigned char SetFreq_flag=0;//设置频率的标志

        ratio=2550/MAX_VOLT;// 5.7= 255/47; ratio放大10倍了取整数, 44最高输出4.7V

   InitLCD();
   DelayMs( 100);
   DispStrAt("AD9834", 0, 0);
         DispStrAt("sinWave", 8, 0);
          DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);        //0,1,7的0是啥

    AD9834_WaveSeting(FreqData,0,SIN_WAVE,0 );//2KHz,        频率寄存器0,正弦波输出 ,初相位0
    AD9834_AmpSet(AmpData);        //设置幅值,幅值最大 255        

           DispStrAt("am   V", 10, 1);
                 DispDecShiftAt(volt, 12, 1, 1);

        while(1)
        {

          keyNum = keyScan();
    if(keyNum!=16)
                {

                        if(SetFreq_flag==0) //不是键盘输入设置频率状态, 步进设置状态
                        {
                                                if(keyNum==10 && SetFreq_flag==0)
                                                {
                                                        SetFreq_flag=1;
                                                        FreqData=0;
                                                        DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("  ", 7, 1);
                                                        //AD9833_WaveSeting(FreqData,0,SIN_WAVE,0 );                                       
                                                }                        
                                        if(keyNum==12)
                                        {
                                                FreqData=FreqData+1000;
                                                AD9834_WaveSeting(FreqData,0,WaveModle,0 );
                                                DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);
                                                //while(key1==0);
                                        }
                                 else if(keyNum==13)
                                        {
                                                if(FreqData>=1000)
                                                FreqData=FreqData-1000;
                                                AD9834_WaveSeting(FreqData,0,WaveModle,0 );
                                                DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);
                                                //while(key2==0);
                                        }        
                                 else if(keyNum==14)
                                        {  
                                                if(volt<MAX_VOLT)
                                                volt=volt+1;                        
                                                AmpData=volt*ratio/10;
                                                AD9834_AmpSet(AmpData);        
                                                //DispDecSpaceAt(AmpData, 13, 1, 3);
                                                DispDecShiftAt(volt, 12, 1, 1);                                

                                                //while(key3==0);
                                        }                        
                                 else if(keyNum==15)
                                        {  
                                                        if(volt>0)
                                                        volt=volt-1;                        
                                                        AmpData=volt*ratio/10;
                                                        AD9834_AmpSet(AmpData);        
                                                        //DispDecSpaceAt(AmpData, 13, 1, 3);
                                                        DispDecShiftAt(volt, 12, 1, 1);
                                                        //while(key4==0);
                                        }        

                                 else if(keyNum==11)
                                        {  
                                         WaveModle=WaveModle+1;
                                         if(WaveModle==3)WaveModle=0;
                                         if(WaveModle==0){AD9834_WaveSeting(FreqData,0,SIN_WAVE,0 );DispStrAt("sinWave", 8, 0);}
                                         else if(WaveModle==1){AD9834_WaveSeting(FreqData,0,TRI_WAVE,0 );DispStrAt("TriWave", 8, 0);}
                                         else if(WaveModle==2){AD9834_WaveSeting(FreqData,0,SQU_WAVE,0 );DispStrAt("SquWave", 8, 0);}               
                                         //else if(WaveModle==3){AD9834_SetFSK(1000,5000);DispStrAt("FSKWave", 8, 0);}                 
                                         //else if(WaveModle==4){AD9834_SetPSK(0,180,5000);DispStrAt("PSKWave", 8, 0);}                 
                                                //while(key5==0);
                                        }
                                }
                                 else if(SetFreq_flag==1) //是矩阵键盘输入设置频率状态
                                         {
                                                if(keyNum<10)//输入频率
                                                {                                                        
                                                        FreqData=FreqData*10+keyNum;
                                                        DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("  ", 7, 1);               
                                                }
                                                else if(keyNum==15)//输错倒退
                                                {
                                                        FreqData=FreqData/10;
                                                        DispDecSpaceAt(FreqData, 0, 1,7);                                                                                                
                                                }
                                                else if(keyNum==10)//HZ确定输出
                                                {
                                                        DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);   
                                                        AD9834_WaveSeting(FreqData,0,WaveModle,0 );
                                                        SetFreq_flag=0;
                                                }                                                
                                                else if(keyNum==11)////KHZ确定输出
                                                {
                                                        DispDecSpaceAt(FreqData, 0, 1, 6);DispStrAt("KHZ", 6, 1);   
                                                        FreqData=FreqData*1000;
                                                        AD9834_WaveSeting(FreqData,0,WaveModle,0 );
                                                        SetFreq_flag=0;

                                                }        
                                                else if(keyNum==12)////MHZ确定输出
                                                {
                                                        DispDecSpaceAt(FreqData, 0, 1, 6);DispStrAt("MHZ", 6, 1);   
                                                        FreqData=FreqData*1000000;
                                                        AD9834_WaveSeting(FreqData,0,WaveModle,0 );
                                                        SetFreq_flag=0;

                                                }                                                               

                                         }                                       


                        }
        }

}
以上是主程序,问题放在了程序中,还请大家帮忙看看
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:973695 发表于 2022-5-15 10:45 | 只看该作者
for(j=0;j<1000;j++);        //单片机晶振12MHZ,j是随便取吗
j 得根据晶振频率来计算

AD9834_AmpSet(AmpData);        //设置幅值,幅值最大 255   

DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);        //0,1,7的0是啥

具体看DispDecSpaceAt函数的定义
回复

使用道具 举报

板凳
ID:881498 发表于 2023-6-6 10:18 | 只看该作者
你好,请问你有这段代码里面LCD1602的显示程序吗
回复

使用道具 举报

地板
ID:205485 发表于 2023-6-6 20:34 | 只看该作者
我以前用过AD9833的程序,不是我写的,只是用过。你这个是AD9834,总体框架是差不多的
void main()
{
        unsigned long FreqData=20000;
  unsigned int volt=MAX_VOLT;
                unsigned int ratio;
        unsigned char AmpData=255;        //不懂这两行,255是啥
        unsigned char WaveModle=0;

第一行的20000是开机的初始频率;
255应该是设置振幅;值在1-255之间,255是最高值;
WaveModle, 0,1,2 分别代表正弦,方波,三角波(大概是这个顺序,记不清了,可自己验证)。
回复

使用道具 举报

5#
ID:1080331 发表于 2023-6-6 22:08 | 只看该作者
代码本身没有语法错误,但是由于缺少上下文和注释,无法确认代码的具体错误和目的。

在代码中有一些变量名、注释和字符串描述可能需要进一步修改,以便于更好地理解代码。同时,还需要注意以下问题:

延时函数DelayMs中的循环次数是否合适,是否能够实现所需延时。
MAX_VOLT值为47,在ratio计算中放大了10倍取整数,44最高输出4.7V,这里的数值计算可能存在精度问题。
在设置频率状态下,输入KHz或MHz确定频率输出时应将FreqData乘以对应的系数,否则会导致频率输出不正确。
根据代码中的注释,代码使用一个AD9834芯片生成正弦波、三角波和方波等信号输出,可以通过键盘输入调整输出频率和幅值。同时,还支持FSK和PSK调制方式的输出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表