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

📄 main.c

📁 DDS 单片机控制AD7008 产生正弦波
💻 C
字号:
#include "LCM12864.h"
#include "AD7008.h"

#define ZLG7290_Key 0x01 //键值寄存器地址

volatile bit  Key_INT = 0;
volatile bit  SIN_F = 0;
volatile bit  AM_F  = 0;
volatile bit  FM_F  = 0;
volatile bit  PSK_F = 0;
volatile bit  ASK_F = 0;
unsigned char KeyValue;
unsigned char Key_disp[8];
unsigned char n;
unsigned char m1=0,m2=0;
unsigned long FW;
unsigned char i;

bit fb = 0;

code char STR2[]="载波频率(Hz):";
code char clr[]= "          " ;
code char STR3[]="通信工程系 ";
code unsigned char sinam[]={
127, 152, 176, 198, 217, 233, 244, 252, 255, 252, 244, 233, 217, 198, 176, 
152, 127, 102, 78, 56, 37, 21, 10, 2, 0, 2, 10, 21, 37, 56, 
78, 102};
code unsigned char sintab[]={
0x0, 0x0, 0x6C, 0x80,  0x0, 0x0, 0x81, 0x56,  0x0, 0x0, 0x95, 0x7E,  0x0, 0x0, 0xA9, 0xCF,  0x0, 0x0, 0xBA, 0x9B,  
0x0, 0x0, 0xC7, 0x0B,  0x0, 0x0, 0xD0, 0x48,  0x0, 0x0, 0xD6, 0x29,  0x0, 0x0, 0xD7, 0x00,  0x0, 0x0, 0xD4, 0xA4,  
0x0, 0x0, 0xCC, 0x15,  0x0, 0x0, 0xC0, 0x53,  0x0, 0x0, 0xB1, 0x35,  0x0, 0x0, 0xA0, 0x92,  0x0, 0x0, 0x8B, 0x6A,  
0x0, 0x0, 0x76, 0x6B,  0x0, 0x0, 0x61, 0x95,  0x0, 0x0, 0x4C, 0x96,  0x0, 0x0, 0x37, 0x6E,  0x0, 0x0, 0x26, 0xCB,  
0x0, 0x0, 0x17, 0xAD,  0x0, 0x0, 0x0B, 0xEB,  0x0, 0x0, 0x03, 0x5C,  0x0, 0x0, 0x00, 0x00,  0x0, 0x0, 0x00, 0xD7,  
0x0, 0x0, 0x07, 0xB8,  0x0, 0x0, 0x10, 0xF5,  0x0, 0x0, 0x1D, 0x65,  0x0, 0x0, 0x2E, 0x31,  0x0, 0x0, 0x42, 0x82,  
0x0, 0x0, 0x56, 0xAA,  0x0, 0x0, 0x6C, 0x80};
void Delayns()
{
	unsigned char ii = 30;
	do
	{
		ii--;
	}while (ii!=0);
}
void INT_E0() interrupt 0 using 1
{
     Key_INT = 1;
}
unsigned long BCDtoHEX(unsigned char *bcd)
{
	unsigned long k;
	unsigned char i;
	i = 0;
	k = 0;
	while(i<n)
	{
	     k = k * 10;
	     k += bcd[i];
	     i++;
	}
	return k;
}
void HEXtoBCD(unsigned long hex, unsigned char *bcd)
{
	char i;
	for (i=7; i>=0; i--)
	{
		bcd[i] = hex % 10;
		hex = hex / 10;
	}
}
void main()
{
	unsigned char jj;
	unsigned char h=0;
	unsigned long k1;
	unsigned char f1,f2,f3,f4;
	I2C_Init();
	Init_LCM();
	CLEAR();
	Init_AD7008();
	FW = 1000;
	Display(STR2,0x80); // 上面一行显示一个预定字符串
	Display(STR3,0x98);
	Delayus(200);
	Write_command(0x90,0);
	Write_command(0x0f,0); //光标处反白闪烁
	IT0 = 1;	//负边沿触发中断
	EX0 = 1;	//允许外部中断
	EA  = 1;
	while(1)
	{
		if(Key_INT == 1)
		{
			Key_INT = 0;
			ZLG7290_ReadReg(ZLG7290_Key, &KeyValue);
			switch (KeyValue)
			{
			case 1: //数字键
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:
			case 10:
			{
				if(n == 0)	//清除显示
				{
					Display(clr, 0x90);
					Write_command(0x90,0);
					Write_command(0x0f,0); //光标处反白闪烁
				}
				if(n>7) break;
				if(KeyValue == 10) KeyValue = 0;
				Key_disp[n] = KeyValue;
				Write_data(Key_disp[n] + 0x30);
				n++;
				break;
			}
			case 11:  //确认
			{
				FSELECT = 0;
				if(n > 0)
				{
					FW = BCDtoHEX(Key_disp);
					Write_command(0x0c,0);
					n = 0;
					SendFW(FW,0); //发送频率控制字到:FREQ0
				}
				break;
			}
			case 12:  //步进100Hz
			{
				FW = FW + 100;
				SendFW(FW,0); //发送频率控制字到:FREQ0
				HEXtoBCD(FW,Key_disp);
				Display(clr, 0x90);
				Write_command(0x90,0);
				h = 0;
				for(jj=0;jj<8;jj++) //LCD显示,去除高位的0
				{
					if(Key_disp[jj] != 0 || h == 1)
					{
						h = 1;
						Write_data(Key_disp[jj] + 0x30);
					}
				}
				break;
			}
			case 13:  //减小100Hz
			{
				FW = FW - 100;
				SendFW(FW,0); //发送频率控制字到:FREQ0
				HEXtoBCD(FW,Key_disp);
				Display(clr, 0x90);
				Write_command(0x90,0);
				h = 0;
				for(jj=0;jj<8;jj++)
				{
					if(Key_disp[jj] != 0 || h == 1)
					{
						h = 1;
						Write_data(Key_disp[jj] + 0x30);
					}
				}
				break;
			}
			case 14:   //ASK 幅移键控
			{
				SendIQMOD(0x00);
				while(!Key_INT)
				{
				 	if(fb == 0) {SendCM(0x04);fb = 1;Delayns();}
					else {SendCM(0x00);fb = 0;Delayns();}
				}
				SendCM(0x00);
				break;
			}
			case 19:  //PSK 相移键控
			{
				while(!Key_INT)
				{
					if(fb == 0) {SendPW(2048);fb = 1;Delayns();}
					else {SendPW(0);fb = 0;Delayns();}
				}
				SendPW(0);
				break;
			}
			case 16:  //FM 调频
			{
				i=0;
				FSELECT = 0;
    			k1=FW * FW_1Hz;
    			f4=k1/0x1000000;
    			f3=k1%0x1000000/0x10000;
    			f2=k1%0x10000/0x100;
    			f1=k1%0x100;
				while(!Key_INT)
				{
    				write(f4+sintab[i++]);
    				write(f3+sintab[i++]);
    				write(f2+sintab[i++]);
    				write(f1+sintab[i++]);
    				load(FREQ0);
					i &= 0x7f;
				}
				SendFW(FW,0);
				break;
			}
			case 15:  //AM 调幅
			{
				i = 0;
				SendCM(0x04);
				if(m1 == 0xf0) 
				{
					m1 = 0;
					if(m2 > 0x03) m2 = 0;
					else m2++;
				}
				else m1 = m1 + 0x3c;
				while(!Key_INT)
				{
    				write(m2);
    				write(m1);
    				write(sinam[i]);
    				load(IQMOD);
					i++;
					i &= 0x1f;
				}
				SendCM(0x00);
				break;
			}
			case 18:  //FSK
			{
				SendFW(10000,1);
				while(!Key_INT)
				{
					if(fb == 0) {FSELECT = 0;fb = 1;Delayus(5);}
					else {FSELECT = 1;fb = 0;Delayus(5);}
				}
				FSELECT = 0;
				break;
			}
			default: break;
			}
		}
	}
}

⌨️ 快捷键说明

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