⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9833.c

📁 8051系列单片机
💻 C
字号:
/****************************************************************************
* 工程功能: STC控制AD9833
* 编译器版本: KEIL C 8.01
* 创建日期: 2007.1.26
* 所属单位: 台州迈尔电子,    lmhtz@hotmail.com
* 芯片类型: STC89C5410AD
* 时钟频率: 12MH*/

#include "STC12C2052AD.H"
#define u08 unsigned char
#define u32 unsigned long
#define u16 unsigned int

#define TimeMaxNum ModHex[3] 
#define sMod       ModHex[4]    
#define DF_sfre    ModHex[7]
#define DF_num     ModHex[8]

#define PERHZ 24
#define SerMaxNum 4
#define OK 1
#define CANCLE 0
#define RND 99 

sbit FreStart = P3^0;
sbit SC = P1^3;         //SPI
u08 Tablei;             //选表格用
u08 TimeNum = 0;        //定时周期数
bit TempMod = OK;       //数据变动状态
bit CovFlag;
u16 idata dat[100];     //发送表格

u08 code ModHex[12]=    //code区修改用,上位机决定
{
    0x03,0x0d,0x40,     //频率          [0-2]
              0x10,     //采集周期      [3-3]    低频控制速度用
              0x01,     //扫频模式MOD   [4-4]    1是高速 0是低速
         0xff,0x10,     //扫频幅度      [5-6]
              0x23,     //扫频频率      [7-7]
              0x32,     //表格个数      [8-8]    高频控制速度用 低频时固定50
         0x38,0x38,     //时钟初始值    [9-10]   低频是控制速度用(备用)
              0x00      //扫频是否开启位[11-11]   1开 0关
};

typedef struct                         
{
    u32 fre;            //频率
    u16 fre_max;        //扫频幅度
    u08 start;          //是否开启扫频
}settype;
settype set;

/*  set值初始化--------------------------------------------------------------------------------------- */
void SetInit(void)
{
    set.fre     = ModHex[0] * 65536 + ModHex[1] * 256 + ModHex[2];
    set.fre_max = ModHex[5] * 256 + ModHex[6];     
    set.start   = ModHex[11];
}

/* T1初始化------------------------------------------------------------------------------------------------ */
void T1Init(void)
{
    TMOD = 0x20;        //T1 mod 2
    TH1 = ModHex[9];
    TL1 = ModHex[10];
    AUXR &= 0XBF;       //normal clock 
    ET1 = 1;            //open T1 interrupt  enable
}

/* 发送数据到9833无片选----------------------------------------------------------------------------------------------------------- */
void send(u08 a)
{
    SPDAT = a;
    while(!(SPSTAT & 0x80)); //等待标志位变化
    SPSTAT |= 0x80;          //清标志位
}

/* 发送2个字节到9833------------------------------------------------- */
void send9833(u16 a)
{
    SC = 0;
    send((u08)(a>>8));  //发送低8位     
    send((u16)(a));     //发送高8位
    SC = 1;             //触发信号
}

/* STC-MCU SPI初始化------------------------------------------------- */
void SPIInit (void)
{
    SPCTL = 0xdf;       //11011100
    SPSTAT = 0xc0;      //11000000
    AUXR |= 0x08;       //normal  clock 
    EADC_SPI = 1;       //spi enable
}

/*  缓冲处理--------------------------------------------------------- */                                                            
void TempReal(void)
{   
    u32 b_fre;      
    u32 p_fre;     
    u32 Toatal;    
    u08 i;          
    u16 per_fre;   
    
    //缓冲中数据没有更改 退出   
    if(TempMod == CANCLE)                      
    {
        return;
    }
    //缓冲中数据有更改+++++++++++++++++++++
    TempMod = CANCLE;                           //清除标志位
    b_fre = set.fre * PERHZ;                    //计算需发送的频率数值
    //有扫频+++++++++++++++++++++++++++++++
    if (set.start == OK)                        
    {
        p_fre = set.fre_max * PERHZ;            //要处理的便宜频率数值
        b_fre -= p_fre;                         //最小频率
        per_fre = (p_fre<<1) / (DF_num>>1);    
    
        //建立上升沿表格+++++++++++++++++++
        for(i=0; i<DF_num+2; )                       
        {
            Toatal =  b_fre + per_fre * i;                  
            dat[i++] = ((u16)(Toatal) | 0x4000) & 0x7fff;  
            dat[i++] = ((u16)(Toatal>>14)) | 0x4000 ;       
        }
        //建立下降沿表格+++++++++++++++++++
        for(i=2; i<(DF_num); i+=2)                         
        {
            dat[(DF_num<<1)-i+1] = dat[i+1];                
            dat[(DF_num<<1)-i] = dat[i];
        }
        return;
    }
    //无扫频 只处理0,1字节+++++++++++++++++
    if(set.start == CANCLE)                     
    {
        dat[0] = ((u16)(b_fre) | 0x4000) & 0x7fff;          //只处理一组数据
        dat[1] = ((u16)(b_fre>>14)) | 0x4000 ;  
    }
}

/* 低速扫频模式--------------------------------------------------------------------------------- */
void SlowSpeedMod(void)
{
    if(TimeNum > TimeMaxNum)               //速度
    {
        TimeNum = 0;
        if(Tablei==100)
        {
            Tablei=0;
        }
        send9833(0x2000);
        send9833(dat[Tablei++]);
        send9833(dat[Tablei++]);
    }
}

/* 高速扫频模式--------------------------------------------------------------------------------- */
void FastSpeedMod(void)
{
    for(Tablei=0; Tablei< (DF_num<<1); )
    { 
        send9833(0x2000);
        send9833(dat[Tablei++]);
        send9833(dat[Tablei++]);
    }
}

/* 固定频率 ------------------------------------------------------------------------------------------*/
void NoScanMod(void)
{
    set.start = RND;      
    send9833(0x2000);
    send9833(dat[0]);
    send9833(dat[1]);
//  send9833(0x4f00);
//  send9833(0x4200);  //200KHz    4170
}

/* 处理前一MCU发送过来的信号..并防止多少发送9833停止信号 --------------------------------------------*/
void Check(void (*fun)(void))
{
    if(FreStart == 1)
    {
        fun();
        CovFlag = CANCLE;
    }
    else if(CovFlag == CANCLE)
    {
        send9833(0x0040);
        CovFlag = OK;
    }
}

/* 模式选择 -----------------------------------------------------------------------------------------*/
void ModSelect(void)
{
    if((set.start == OK) && (sMod == 1))    
    {
        Check(FastSpeedMod);
    }
    else if(set.start == CANCLE)            
    {
        Check(NoScanMod);
    }
}
/* ----------------------------------------------------------------------------------------------- */
void main (void)
{
    T1Init();
    SPIInit();
    SetInit();
    //如果低速扫频开始T1
    if (sMod == 0)
    {
        TR1 = 1;
    }
    TempReal();
    EA = 1; 
    while(1)
    {  
        ModSelect(); 
        TempReal();
    }
}

/* T1中断------------------------------------------------------------------------------------------- */
void T1ISR(void) interrupt 3
{
    TimeNum++;
    Check(SlowSpeedMod);
}     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -