×
单片机 > 单片机程序设计 > 详情

AD9850函数信号发生器制作

发布时间:2020-08-27 发布时间:
|

信号发生器的制作基于AD9850
   

 

单片机源程序如下:

/*******************************************************

项目名:基于ARM Cortex-M3 函数信号发生器

涉及便件连接情况: PA0~7--------DDS模块 D0~D7

                  PB4 PB5 PB6----DDS模块fqud  reset  w_clk

                  PB0 PB2 PB3----液晶12864 CS(RS) DIO(RW) CLK(EP)

                  PE0 PE1 PE2 ----KEY3  KEY4  KEY5

                  PD1 PG5------KEY1 KEY2

                  PD0 PG2------LED1 LED2

                  PF0  PF1-----接24C04  SDA  SCL

程序主要功能:

作者:suqingxiao  huangrenji  liangping

*********************************************************/


#include

#include  "AD9850.h"

#include  "24C04.h"

#define  SysCtlPeriEnable       SysCtlPeripheralEnable

#define  SysCtlPeriDisable      SysCtlPeripheralDisable

#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput

#define  TASK_STK_SIZE                  64

/**************************************

  CONSTANTS 常量

**************************************/


/************************************

  VARIABLES 变量

*************************************/

uint16 now_color=0;             //当前色

uint16 state=0,flag=0;                 //状态

uint16 frist_in=0;              //初次进入标志

unsigned  long  num,aa=1,temp=0;

unsigned long ulData  =  0;

unsigned  char  buff[5];

unsigned  char  display[10];   

unsigned  char  fshi1=0,fge1=0,temp1=0;

unsigned  char  fshi2=0,fge2=0,temp2=0;

unsigned  char  fshi3=0,fge3=0,temp3=0;

unsigned long dat=0,dat2,dat3;

unsigned  char wan=0, qian=0,ge=0,shi=0,bai=0;

unsigned  char wan2, qian2,ge2,shi2,bai2;

unsigned  char wan3, qian3,ge3,shi3,bai3;

unsigned  char ge4,shi4;


static OS_STK  GstkStart[TASK_START_STK_SIZE];//启动任务的堆栈   

static OS_STK  GstkLED[TASK_LED_STK_SIZE]; 

OS_STK        Task1Stk[TASK_STK_SIZE];

OS_STK        Task2Stk[TASK_STK_SIZE];



/*************************************

   FUNCTION PROTOTYPES 函数声明

**************************************/

static void taskStart (void  *parg);          //启动任务 

static void taskLED(void *parg);              //任务0

void  Task1(void *data);

void  Task2(void *data);



/***********************************************

    功能:主程序

************************************************/

int main (void)

{

    OSInit();                                 //  OS-II 初始化uC/OS-II的内核


    OSTaskCreate( taskStart,                                          

                  (void *)0, 

                  &GstkStart[TASK_START_STK_SIZE-1], 

                  TASK_START_PRIO );                    

   /*  初始化启动任务   */        

    OSStart();                                // 启动uC/OS-II*/


    return(0);

}



/****************************************

** Function name:           Task_Start           

** input parameters:        *p_arg

*****************************************/

static void taskStart (void  *parg)

{

    (void)parg;


    targetInit();                      // 初始化目标单片机     


    #if OS_TASK_STAT_EN > 0

    OSStatInit();                         // 使能统计功能

    #endif

    

    /* 在这里创建其他任务 */

    OSTaskCreate( taskLED,                                          

                  (void *)0, 

                  &GstkLED[TASK_LED_STK_SIZE-1], 

                  TASK_LED_PRIO );            //  建处理任务 

    OSTaskCreate(Task1, (void *)2, &Task1Stk[TASK_STK_SIZE - 1],2);        

    OSTaskCreate(Task2, (void *)3, &Task2Stk[TASK_STK_SIZE - 1], 3); 

    

    

    KEY_Init(KEY1 | KEY2 | KEY3 |KEY4 |KEY5 ); //按键初始化

    

    LCDInit();   //LCD12864初始化                                               //  LCD初始化

    clear_all(); // 清屏

    

    while (1) 

    {                             

        /* 启动任务可在这里挂起  */

       OSTaskSuspend(OS_PRIO_SELF);

    }

}



/***********************************************

名称:任务0

功能:

**********************************************/

static void taskLED(void  *parg)

{

    (void)parg;

    Display(ulData);//开机显示

    SystemInit();//  系统初始化

    init();//24C04初始化

    num=read_add(1);//选波型,读波型

    

    /******正弦波****/

    shi=read_add(2);//读24C04中正弦波十位

    bai=read_add(3);//读24C04中正弦波百位

    //qian=read_add(6);

    //wan=read_add(5);

    dat=read_add(6);////读24C04中正弦波频率

    dat=wan*10000+qian*1000+bai*100+shi*10;//读24C04中正弦波频率

    

    fge1=read_add(7);//读24C04中正弦波幅度小数位

    fshi1=read_add(8);

    temp1=read_add(9);//读24C04中正弦波幅度值

    temp1=fshi1*10+fge1;//读24C04中正弦波幅度值

    /*************/

    

    /*****方波****/

    shi2=read_add(10);//读24C04中方波十位

    bai2=read_add(11);//读24C04中方波百位

    //qian=read_add(6);

    //wan=read_add(5);

    dat2=read_add(12);//读24C04中方波频率

    dat2=wan2*10000+qian2*1000+bai2*100+shi2*10;

    

    fge2=read_add(13);//读24C04中方波幅度小数位

    fshi2=read_add(14);

    

    temp2=read_add(15);//读24C04中方波幅度

    temp2=fshi2*10+fge2;//读24C04中方波幅度

    /*************/

    

    /*****三角波*****/

    shi3=read_add(16);//读24C04中三角波十位

    bai3=read_add(17);//读24C04中三角波百位

    //qian=read_add(6);

    //wan=read_add(5);

    dat3=read_add(18);//读24C04中三角波*频率

    dat3=wan3*10000+qian3*1000+bai3*100+shi3*10;

    

    fge3=read_add(19);//读24C04中三角波幅度小数位

    fshi3=read_add(20);

    temp3=read_add(21);//读24C04中三角波幅度值

    temp3=fshi3*10+fge3;//读24C04中三角波幅度值

    /*************/

    //num=temp;

    for(;;)

    {   

      

        if(flag==1)//标志位为1时可以操作24C04

        { 

          flag=0;//标志位清0

          write_add(1,num);//选波型 写到24C04

          

          /******正弦波*******/

           write_add(2,shi);//写正弦波频率的十位到24C04

           write_add(3,bai);//写正弦波频率的百位到24C04

          // write_add(6,qian);

          //write_add(5,wan);

           dat=wan*10000+qian*1000+bai*100+shi*10;

           write_add(6,dat);//写正弦波频率值到24C04

           

           write_add(7,fge1);//写正弦波幅值的小数位到24C04

          write_add(8,fshi1);

           temp1=fshi1*10+fge1;//写正弦波幅值到24C04

           write_add(9,temp1);

           /************/

           

           /***方波*****/


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式