📄 正弦波通过按键选择频率.c
字号:
#include <C8051F410.h>
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
void delay(unsigned int k);
void oscill();
void check_sw();
bit yor_n();
uchar scan_key();
void key_value_process(uchar keyvalue);
void delayms(unsigned char ms);
void DDS_w_d();
void initial_AD9852();
unsigned char xdata biaozhi;
unsigned long i;
//&&&&&&&&&&&&&&&&&&&&&&&&&&
bdata unsigned char temp;
sbit temp0=temp^0;
sbit temp1=temp^1;
sbit temp2=temp^2;
sbit temp3=temp^3;
sbit temp4=temp^4;
sbit temp5=temp^5;
sbit temp6=temp^6;
sbit temp7=temp^7;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&
//注意
unsigned char ADDR; //// 所有函数均使用ADDR和DATA
unsigned char DATA[6]; //// 函数不带参数传输
#define N 4 //倍频数
#define CLK 50 //外部时钟
sbit IO_RES=P2^6; //A2 //高电平激活,在下一个指令周期开始应该将此置为低电平(17)
sbit SDIO=P2^1; //A0(第19脚)
sbit IO_UD=P2^2; //(第20脚)
sbit SCLK=P2^3; //(第21脚);//数据上升沿被装入
sbit _CS=P2^4; //(第22脚)//低电平激活
//sbit OSK=P1^5;
sbit RESET=P2^5; //(71)
//sbit FSK_BPSK=P1^7;
void main()
{
biaozhi=0;
oscill();
P2MDOUT = 0xff;
i=65553;
while(1)
{
check_sw();
switch(biaozhi)
{case 1:initial_AD9852() ;z
ADDR=2;
DATA[5]=0x09;
DATA[4]=0x00;
DATA[3]=0x99;
DATA[2]=0x99;
DATA[1]=0x99;
DATA[0]=0x00;
DDS_w_d();while(i--);i=65553;break;
case 2: ADDR=2;
DATA[5]=0xff;
DATA[4]=0x00;
DATA[3]=0x66;
DATA[2]=0x55;
DATA[1]=0x99;
DATA[0]=0x00;
DDS_w_d();while(i--);i=65553;break;
case 3:break;
case 4: break;
case 5: break;
case 6:break;
case 7: break;
case 8: break;
case 9:break;
}
}
}
//*******************************410初始化程序
void oscill(){ CLKSEL = 0x00;//选择内部振荡方式
//CLKSEL = 0x01;//选择外部振荡方式
OSCICN = 0x87;
PCA0MD &= ~0x40;//关开门狗
XBR1 = 0x40;
}
//****************************************************
//延时子程序
void delay(unsigned int k)
{
while(k--);
}
//*************************************************
void check_sw(){uchar key_value;
if( yor_n()){delay(10);
key_value=scan_key();
while(yor_n());
key_value_process(key_value); } }
//*********************其中1.4,1.3,1.2是列分别对应13,12,11脚
//********************/其中1.7,1.6,1.5是行分别对应16,15,14脚
//有无按键按下,判断行线是否有变化
bit yor_n()
{uchar scanvalue,keyvalue;
scanvalue=0x1C;//让所有的列都为0
P1=scanvalue;
keyvalue=P1;
if(keyvalue==0x1C) return 0;
else return 1;}
//****************************************************************
//列(高3位)扫描,并返回键值,判断是否有按键按下,有返回1,没返回0
uchar scan_key()
{uchar scanvalue,keyvalue;
scanvalue=0xdC;
while(scanvalue!=0xfC){
P1=scanvalue;
keyvalue=P1;
if((keyvalue&0x1C)!=0x1C) break;
scanvalue=(keyvalue<<1)|0x1C;}//列位又移一位,并将行位置高
return keyvalue;}
//**************************
//对应按键时处理
void key_value_process(uchar keyvalue){
uchar xdata scan;
scan=keyvalue;
switch(scan)
{
case 0x6C:biaozhi=1;break;
case 0xAC:biaozhi=2;break;
case 0xCC:biaozhi=3; break;
case 0x74:biaozhi=4; break;
case 0xB4:biaozhi=5;break;
case 0xD4:biaozhi=6;break;
case 0x58:biaozhi=7;break;
case 0x98:biaozhi=8;break;
case 0xD8:biaozhi=9;break;
} }
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//*********************888
void delayms(unsigned char ms)
{while(ms--);}
//****************************
void DDS_w_d() //根据已有的地址ADDR和DATA 写数据到AD9852
{ char num,i;
if((ADDR==0)||(ADDR==1)||(ADDR==8)||(ADDR==9)||(ADDR==0x0b))
num=2;
else if(ADDR==0x0a)
num=1;
else if(ADDR==6)
num=3;
else if(ADDR==5||ADDR==7)
num=4;
else num=6;
_CS=0;
IO_RES=0;
SCLK=1;
// IO_UD=0;
IO_RES=1;
delayms(10);
IO_RES=0;
delayms(50);
IO_RES=0;
//I/O输入,数据即可在上升沿输入近来
temp=ADDR;
for(i=7;i>=0;i--)
{
SCLK=0;
delayms(10);
SDIO=temp7;
SCLK=1;
delayms(10);
temp<<=1;
}
for(;num>0;num--)
{
temp=DATA[num-1];
for(i=7;i>=0;i--)
{
SCLK=0;delayms(10);
SDIO=temp7;
SCLK=1;
delayms(10);
temp<<=1;
}
}
// IO_UD=1;
delayms(10);
// IO_UD=0;
_CS=1;
}
//***********************8888
void initial_AD9852() //初始化AD9852
{
DATA[3]=0x04;
DATA[2]=0x44;
DATA[1]=0x01;
DATA[0]=0x00;
ADDR=7;///////////////////////////
RESET=1;
delayms(50);
RESET=0;
DDS_w_d();
delayms(50);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -