51单片机控制AD9833,如何输出固定周期的波形,比如十个周期

hustyangju 2014-09-29 09:58:15
给点意见,如何修改,可以输出固定周期的波形
#include <reg52.h>
#include <intrins.h>


sbit f_sync = P1^0;
sbit s_clk = P1^1;
sbit s_data = P1^2;


#define DDS_SCLK_UP s_clk=1
#define DDS_SCLK_DOWN s_clk=0

#define DDS_SDATA_UP s_data=1
#define DDS_SDATA_DOWN s_data=0

#define DDS_FSYNC_UP f_sync=1
#define DDS_FSYNC_DOWN f_sync=0

//#define BITB 0x0800


//AD9833输入时钟值
unsigned long int MCLK=6000000;

//寄存器配置数组
unsigned int Config_Data[8];

//频率
unsigned long int code freq[5]={75000,100000,200000,300000,400000};

//函数声明
static void delay2us(unsigned char i);
static void changeFreq(unsigned char key);
static unsigned char getKeyValue();
void writeDDS2Byte(unsigned int config);
void waveGenerate(unsigned long int frequency,unsigned char signal_type);


void main(void)
{
unsigned char key_temp,key;
//用单片机P1口的高5bit来选择频率。
key=getKeyValue();
changeFreq(key);

while(1)
{
key_temp=getKeyValue();
if(key!=key_temp)
{
key = key_temp;
changeFreq(key);
}
}
}


static unsigned char getKeyValue()
{
unsigned char cnt;
unsigned char key_first,key_second;

key_first = P1&0xF8;
for(cnt=0; cnt<100; --cnt );
key_second = P1&0xF8;

if( key_first == key_second )
return key_second;
else
return 255;
}


static void changeFreq(unsigned char key)
{
switch(key)
{
case 0xF0://s5
waveGenerate(freq[4],0);
P2 = 0x00;
break;

case 0xE8://s4
waveGenerate(freq[3],0);
P2 = 0x01;
break;

case 0xD8://s3
waveGenerate(freq[2],0);
P2 = 0x02;
break;

case 0xB8://s2 X3
waveGenerate(freq[1],0);
P2 = 0x03;
break;

case 0x78://s1 X4
waveGenerate(freq[0],0);
P2 = 0x04;
break;

default:
waveGenerate(freq[0],0);
P2 = 0x04;
break;
}
}

/*******************************************************************
* 功能: 波形发生函数
*
* 入口参数: frequency: 期望得到的信号频率 (frequency<MCLK)
*
* signal_type:0(正弦波),1(三角波),2(方波)
*
* 默认配置: 0相移,方波不分频
*******************************************************************/
void waveGenerate(unsigned long int frequency,unsigned char signal_type)
{
unsigned char k;
unsigned long int freq_temp;

if(frequency>MCLK)
frequency=MCLK;
switch(signal_type)
{
case 0://正弦波
Config_Data[0]=0x2108;//控制寄存器配置值,复位片内其它寄存器
Config_Data[7]=0x2008;//控制寄存器配置值,不复位片内其它寄存器
break;
case 1://三角波
Config_Data[0]=0x210A;
Config_Data[7]=0x200A;
break;
case 2://方波,不分频
Config_Data[0]=0x2128;
Config_Data[7]=0x2028;
break;
default://正弦波
Config_Data[0]=0x2108;
Config_Data[7]=0x2008;
break;
}
//freq_temp=frequency*(2^28/MCLK),MCLK=6Mhz时,2^28/MCLK约等于44.739242666666669
freq_temp=frequency*44.739242666666669;

Config_Data[1]=freq_temp&0x3fff;
Config_Data[3]=Config_Data[1];
Config_Data[2]=(freq_temp&0x0fffc000)>>14;
Config_Data[4]=Config_Data[2];

Config_Data[1]=Config_Data[1]|0x4000;//FREQ0 14 LSBs
Config_Data[2]=Config_Data[2]|0x4000;//FREQ0 14 MSBs
Config_Data[3]=Config_Data[3]|0x8000;//FREQ1 14 LSBs
Config_Data[4]=Config_Data[4]|0x8000;//FREQ1 14 MSBs
Config_Data[5]=0xC000;//PHASE0
Config_Data[6]=0xE000;//PHASE1

for(k=0;k<8;k++)
{
writeDDS2Byte(Config_Data[k]);
}
}


void writeDDS2Byte(unsigned int config)
{
unsigned char i;
DDS_SCLK_DOWN;
_nop_();
DDS_FSYNC_UP;
_nop_();
DDS_SCLK_UP;
delay2us(1);
DDS_FSYNC_DOWN;
_nop_();
for (i=0; i<16; i++)
{
if (config & 0x8000)
DDS_SDATA_UP;
else
DDS_SDATA_DOWN;

delay2us(1);
DDS_SCLK_DOWN;
delay2us(1);
DDS_SCLK_UP;
config <<= 1;
}
DDS_FSYNC_UP;
_nop_();
DDS_SCLK_DOWN;
delay2us(100);
}


static void delay2us(unsigned char i)
{
while (--i);
}
...全文
694 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
DISINHUI 2014-09-29
  • 打赏
  • 举报
回复
开启波形输出, 开启定时器。 时间到, 定时中断函数中关闭波形输出即可。
STC89C52单片机开发板 一、方案设计 1.1 方案论证 在科技广泛发展的今天,计算机的发展已经越来越快,他的应用已经越来越广泛。二 单片机的发展和应用是其中的重要一方面。单片机在工业生产(机电、化工、轻纺、自 控等)和民用家电方面有广泛的应用。其中,单片机在工业生产中的应用尤其广泛。 单片机具有集成度高,处理能力强,可靠性高,系统结构简单,价格低廉的优点,因 此被广泛应用。目前,单片机在工业控制系统诸多领域得到了极为广泛的应用。特别是 C51系列的单片机稳定性好,运算精度高,推动了工业生产,影响着人们的工作和学习。 而本次设计就是要通过对C52系列单片机最小系统进行开发板的设计。有助于当代大学生 及涉及单片机领域的工作者们更深入的了解和学习单片机的开发机应用。 1.2 设计思路 (1)本设计采用STC89C52单片机为主控制核心。 (2)选择PCF8951实现A/D、D/A转换装置,与单片机接口为P2.1口和P2.0口。 (3)此外,还选择了NRF905无线通信模块及4*4矩阵键盘等模块进行开发与学习设计。 硬件设计 本设计由8部分组成:STC89C52单片机最小系统、PCF8951A/D转换电路、报警器模块 、NRF905无线模块、矩阵键盘模块、温度传感器电路、红外接收模块、LED流水灯模块。 电路原理图见附录。 2.1 STC89C52单片机最小系统模块 STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的 解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容 被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高 运作频率35Mhz,6T/12T可选。 复位电路 当振荡器运行时,只要有有两个机器周期即24个振荡周期以上的高电平在这个引脚出 现时,那么就将会使单片机复位,如果将这个引脚保持高电平,那么51单片机芯片就会 循环不断地进行复位。复位后的P0口至P3口均置于高电平,这时程序计数器和特殊功能 寄存器将全部清零。 单片机晶振 单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结 合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么 单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频 率。 在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有 些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。晶振用一种 能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡 。 单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各 部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方 法保持同步。晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。如果不同 子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。 晶振实物图: 单片机实物图如下: 2.2 PCF8951 AD/DA转换模块 PCF8591是一款单电源、低功耗8位COMS型A/D、D/A转换芯片,它具有4路模拟量输入 通道、一路模拟量输出通道和1个I2C总线接口。该器件I2C从地址的低三位由芯片的A0、 A1和A2三个地址引脚决定,所以在不增加任何硬件的情况下同一条I2C总线最多可以连接 8个同类型的器件。 该器件具有多路模拟量输入、片上跟踪保持、8位A/D转换和8位D/A转换等功能。A/D 与D/A的最大转换速率由I2C总线的最大传输速率决定。 PCF8591具有以下特点:单电源供电;正常工作电源电压范围为2.5V~6V;通过I2C总 线完成数据的输入/输出;器件地址由3个地址引脚决定;采样频率由I2C总线传输速率决 定; 4路模拟量输入可编程为单端输入或差分输入;可配置转换通道号自动增加功能; 模拟电压范围为VSS~VDD;片上跟踪保持功能;8位逐次逼近A/D转换;带有一路模拟量输 出的乘法D/A转换。 PCF8951A/D、D/A转换模块: PCF8951模块实物图: 2.3 Nrf905 无线通信装置 NRF9

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧