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

📄 app.c

📁 使用单片机控制AD9851输出正弦波
💻 C
字号:
//********************************************************//
#include "includes.h"

#define I2C_BUF_LEN  10
#define BUF_LEN 16
#define Config_ADD   0  //配置寄存器
//工作模式
#define Start_Mode   0  //启动模式,等待选择
#define Serial_Mode  1  //通过串口控制输出频率
#define Select_Mode  2  //从已编程存储器中选择频率
#define Prog_Mode    3  //对频率寄存器进行编程

#define FRQ_N		 10  //用户已编程频点数
#define FRQ_ADD      16  //用户编程频率存储器开始地址,连续4个字节

uint8 COM_IN;				//指令输入有效,1
uint8 Work_mode;			//当前工作模式
uint8 I2C_BUF[I2C_BUF_LEN];  //I2C读写缓冲区
uint32 FRQ_Now;              //系统当前的输出频率
extern uint8 UART_BUF[BUF_LEN+1];

union  DDS
{
uint32 FW_W;
uint8  FW_B[4];
};
union DDS FRQ;	//第一频率控制字
//*******************************************************//
void Read(uint8 Length,uint16 Addr)
{
EA = 0;
SDA = 1;
RW24xx(I2C_BUF,Length,Addr,0xa1);
EA = 1;
}
//******************************************************//
void Wri(uint8 Length,uint16 Addr)
{
EA = 0;
WP = 0;
SDA = 1;
RW24xx(I2C_BUF,Length,Addr,0xa0);
WP = 1;
EA = 1;
}
//*******************************************************//
uint32 ASC2INT(uint8 *buf) //ASCII
{
uint32 F_In;
uint8 i;

F_In=0;
for(i=1;i<(buf[0]+1);i++)
	{
	F_In=F_In * 10 + buf[i]-'0';
	}
UART_BUF[1]='0';
UART_BUF[0]=0;
return (F_In);
}
//*******************************************************//
FRQ_Set(uint32  f,uint8 con)  //AD9851频率控制,单位Hz
							  //con==0:f为实际的频率值
							  //con==其他:f为频率控制字
{

if(con==0)
	{
	FRQ.FW_W = (uint32)f*(uint32)23+(uint32)f*(uint32)86/(uint32)100
			   +(uint32)f/1000;
	}
else
	{
	FRQ.FW_W = f;
	}
	AD9851_SET(0x01,FRQ.FW_B);
}
//*******************************************************//
void Main_Menu() //正常工作时候的界面
{
print_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
print_str("Pocketable Sine Wave Generator\n");
print_str("\n");
print_str("\n");
print_str("Output Frequency: ");
print_uint32(FRQ_Now);
print_str("Hz\n");
print_str("\n");
print_str("Please selce the mode:\n");
print_str("1:    Control with serial\n");
print_str("2:    Select frequency from table\n");
print_str("3:    Programme frequency table\n");
}
//*******************************************************//
void Serial_Process(void)
{
print_str("\nPlease input the frequency(Hz):");
while(COM_IN==0);		  //等待输入待编程的频率序号
COM_IN=0;
FRQ_Now=ASC2INT(UART_BUF);
FRQ_Set(FRQ_Now,0);
Main_Menu();
}
//******************************************************//
void Select_Process(void)
{
uint8 i;
uint32 temp,*p;
print_str("Num   Frequecncy(Hz)\n");
for(i=0;i<10;i++)   //读取并显示全部的可编程频率
	{
	Read(4,(FRQ_ADD + (i<<2)));
	print_uint32(i);
	print_str("---->");
	p=(uint32)I2C_BUF;
	print_uint32(*p);
	print_str("Hz\n");
	}
print_str("Please select the frequency:");
while(COM_IN==0);		  //等待输入待编程的频率序号
COM_IN=0;
temp=ASC2INT(UART_BUF);//获取选择的索引信息
if((uint8)temp>=FRQ_N)
	{
	print_str("\nThe frequency you selected is not existed!\n");
	for(i=0;i<2;i++)   //延时显示
		{
		temp=60000;
		while(temp--)
			{
			EA = 0;
			}
		EA = 1;
		}
	}
else
	{
	Read(4,(FRQ_ADD + ((uint8)temp<<2)));//读取频率值
	p=(uint32)I2C_BUF;
	FRQ_Now = *p;
	FRQ_Set(FRQ_Now,0);
	}
Main_Menu();
}
//*******************************************************//
void EEROM_Prog(void)
{
uint8 i,num,*buf;
uint32 temp,*p;
print_str("The  frequency stored is:\n");
print_str("Num   Frequecncy\n");
for(i=0;i<10;i++)   //读取并显示全部的可编程频率
	{
	Read(4,(FRQ_ADD + (i<<2)));
	print_uint32(i);
	print_str("---->");
	p=(uint32)I2C_BUF;
	print_uint32(*p);
	print_str("Hz\n");
	}
while(1)				
	{
	print_str("Select the num you want to programme:\n");
	print_str("To finish,input any number more than 10\n");
	UART_BUF[0]=0;            //清除接收计数器
	while(COM_IN==0);		  //等待输入待编程的频率序号
	COM_IN=0;
	num=ASC2INT(UART_BUF);//获取输入的值
	if(num>10)
		{
		print_str("\nProgramme finished\n");
		print_str("The frequency table is:\n");
		print_str("Num   Frequecncy(Hz)\n");
		for(i=0;i<10;i++)   //读取并显示全部的可编程频率
			{
			Read(4,(FRQ_ADD + (i<<2)));
			print_uint32(i);
			print_str("---->");
			p=(uint32)I2C_BUF;
			print_uint32(*p);
			print_str("Hz\n");
			}
		for(i=0;i<2;i++)   //延时显示频率表
			{
			temp=60000;
			while(temp--)
				{
				EA = 0;
				}
			EA = 1;
			}
		Main_Menu();   //显示主菜单
		break;
		}
	else
		{
		print_str("\nYou select ");
		print_uint32((uint32)num);
		print_str("\nPlease input the frequency:\n");
		UART_BUF[0]=0;            //清除接收计数器
		while(COM_IN==0);		  //等待输入待编程的频率序号
		COM_IN=0;
	    temp=ASC2INT(UART_BUF);
		print_str("\nprogramming num ");
		print_uint32((uint32)num);
		print_str(" frequency is ");
		print_uint32(temp);
		print_str("Hz\n");
		print_str("Please wait...\n");
		buf=&temp;
		for(i=0;i<4;i++)
			{
			I2C_BUF[i]=*(buf+i);
			}
		Wri(4,(FRQ_ADD + (num<<2)));
		
		print_str("OK\n");	
		}
	}
}

//*******************************************************//
void Init_Sys(void)
{
UART0_Init();
AD9851_RST();
FRQ_Now= 38000;
Main_Menu();
FRQ_Set(FRQ_Now,0);
WP = 1;
EA = 1;
}

//*******************************************************//
void main(void)
{
uint8 temp;
Init_Sys();
while(1)
	{
	if(COM_IN)
		{
		COM_IN=0;
		temp=ASC2INT(UART_BUF);
		switch(temp)
			{
			case 1:
				{
				print_str("\n");
				Serial_Process();		
				}
			break;
			case 2:
				{
				print_str("\n");
				Select_Process();		
				}
			break;
			case 3:
				{
				print_str("\n");
				EEROM_Prog();	
				}
			break;
			default:
				{
				Main_Menu();
				}				
			}
		}
	}
}
//*******************************************************//

⌨️ 快捷键说明

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