📄 9833.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 + -