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

📄 woxson.txt

📁 通过单片机编程控制ad9833输出任意波形
💻 TXT
字号:
#include "reg52.h" 
#define uchar unsigned char 
#define uint unsigned int 

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴极0~9对应16进制数 
//=============正弦波数据==================== 
uchar code sin_tab[256]= 
{ 
0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9c, 0x9f, 0xa2, 0xa5, 0xa8, 0xab, 0xae, 
0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xc1, 0xc4, 0xc7, 0xc9, 0xcc, 0xce, 0xd1, 0xd3, 0xd5, 0xd8, 
0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xed, 0xef, 0xf0, 0xf2, 0xf3, 0xf4, 
0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 
0xf6, 0xf5, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe3, 0xe1, 0xde, 0xdc, 
0xda, 0xd8, 0xd6, 0xd3, 0xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9, 0xb6, 0xb4, 
0xb1, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83, 
0x80, 0x7d, 0x79, 0x76, 0x73, 0x70, 0x6d, 0x6a, 0x67, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55, 0x52, 
0x4f, 0x4c, 0x49, 0x46, 0x43, 0x41, 0x3e, 0x3b, 0x39, 0x36, 0x33, 0x31, 0x2e, 0x2c, 0x2a, 0x27, 
0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x14, 0x12, 0x10, 0xf, 0xd, 0xc, 0xb , 
0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x3, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0 , 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x3, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 , 
0x9, 0xa, 0xc, 0xd, 0xe, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23, 
0x25, 0x27, 0x29, 0x2c, 0x2e, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x40, 0x43, 0x46, 0x48, 0x4b, 
0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, 0x6f, 0x73, 0x76, 0x79, 0x7c, 
}; 
//三角波信号数据表 
uchar code thr_tab[32]= 
{ 
0x00,0x0f,0x1f,0x2f,0x3f,0x4f,0x5f,0x6f,0x7f,0x8f,0x9f,0xaf,0xbf,0xcf,0xdf,0xef, 
0xff,0xef,0xdf,0xcf,0xbf,0xaf,0x9f,0x8f,0x7f,0x6f,0x5f,0x4f,0x3f,0x2f,0x1f,0x0f 
}; 
//------------------------------------------------------------------------------------------------------- 
//锯齿波信号数据表 
uchar code jc_tab[33]= 
{ 
0x00,0x08,0x0f,0x18,0x1f,0x28,0x2f,0x38,0x3f,0x48,0x4f,0x58,0x5f,0x68,0x6f,0x78, 
0x7f,0x88,0x8f,0x98,0x9f,0xa8,0xaf,0xb8,0xbf,0xc8,0xcf,0xd8,0xdf,0xe8,0xef,0xf8,0xff 
}; 
//数码管位选控制口定义 
sbit LED4=P2^7; 
sbit LED3=P2^6; 
sbit LED2=P2^5; 
sbit LED1=P2^4; 
//按键口申明 
sbit S1=P2^3; 
sbit S2=P2^2; 
sbit S3=P2^1; 
unsigned char tabArry[4]; //保存显示数据 
char flag=1; //按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下 
int keycount=0; //按键计数 
unsigned char waveth,wavetl; //用于对定时器付值 
unsigned int frecount=100; //频率计数 
unsigned int mbjs; //码表计数,共采32个点 
//毫秒延时程序 
void delayms(int ms) 
{ 
uchar i; 
while(ms--) 
{ 
for(i=250;i>0;i--); 
} 
} 

//键盘扫描 
void keyscan() 
{ 
if(flag==1) 
{ 
if(S3==0) //用S3切换波形 
{ 
delayms(2); //延时去抖 
if(S3==0) //按键计数,便于切换波形 
{ 
flag=0; 
keycount++; 
if(keycount>=4) keycount=0; //四种波形计数4次 
} 
} 

if(S2==0) //频率加1 处理 
{ 
delayms(2); 
if(S2==0) 
{ 
flag=0; 
switch(keycount) 
{ 
case 0: //正弦波频率加1 
frecount++; 
if(frecount>1000) frecount=0; 
break; 
case 1: //三角波频率加1 
frecount++; 
if(frecount>1000) frecount=0; 
break; 
case 2: //锯齿波频率加1 
frecount++; 
if(frecount>1000) frecount=0; 
break; 
case 3: //方波频率加1 
frecount++; 
if(frecount>1000) frecount=0; 
break; 
} 
waveth=(65536-57603/frecount)/256; //重新计算初值 
wavetl=(65536-57603/frecount)%256; 
} 
} 
if(S1==0) //频率减1 处理 
{ 
delayms(2); 
if(S1==0) 
{ 
flag=0; 
switch(keycount) 
{ 
case 0: //正弦波频率减1 
frecount--; 
if(frecount<0) frecount=999; 
break; 
case 1: //三角波频率减1 
frecount--; 
if(frecount<0) frecount=999; 
break; 
case 2: //锯齿波频率减1 
frecount--; 
if(frecount<0) frecount=999; 
break; 
case 3: //方波频率减1 
frecount--; 
if(frecount<0) frecount=999; 
break; 
} 
waveth=(65536-57603/frecount)/256; //重新计算初值 
wavetl=(65536-57603/frecount)%256; 
} 
} 

} 
if(S1!=0 && S2!=0 && S3!=0) flag=1; //判断按键是否弹起 

} 
//数据分位 
void change(char wavetype,unsigned int frequency) 
{ 
tabArry[0]=wavetype; //显示字母,表示波形类型 
tabArry[1]=frequency%1000/100; //百位 
tabArry[2]=frequency%100/10; //十位 
tabArry[3]=frequency%10; //个位 
} 
//显示函数 
void display() 
{ 

switch(keycount) 
{ 
case 0: //显示A和正弦波的频率 
change(0x0a,frecount); 
break; 
case 1: //显示b和三角波的频率 
change(0x0b,frecount); 
break; 
case 2: //显示C和锯齿波的频率 
change(0x0c,frecount); 
break; 
case 3: //显示d和方波的频率 
change(0x0d,frecount); 
break; 
} 

P0 = table[tabArry[0]]; //送最高位段码 
LED1=0; //打开对应的位选控制口 
delayms(2); //显示延时 
LED1=1; //关闭对应的位选控制后显示下一位 

P0 = table[tabArry[1]]; 
LED2=0; 
delayms(2); 
LED2=1; 

P0 = table[tabArry[2]]; 
LED3=0; 
delayms(2); 
LED3=1; 

P0 = table[tabArry[3]]; 
LED4=0; 
delayms(2); 
LED4=1; 
} 
void Timerinit() 
{ 
TMOD=0x01; //定时器0方式1 

//定时器初值计算公式:X=65536-(T/T0)=65536-(f0/f/32) 
TH0=waveth=(65536-57603/frecount)/256; //定时器初值 22.1184MHz 
TL0=wavetl=(65536-57603/frecount)%256; 
EA=1; //开总中断 
ET0=1; //开定时器0中断 
TR0=1; //定时器0开始计数 
} 
//主函数 
void main() 
{ 
Timerinit(); //定时器初始化 
while(1) 
{ 
keyscan(); //扫描按键 
display(); //显示程序 
} 
} 

void Timer0() interrupt 1 
{ 
TH0=waveth; //重新赋初值 
TL0=wavetl; 
if (keycount==0) //输出正弦波 
{ 
P1 = sin_tab[mbjs]; 
mbjs+=8; //256点,每隔8点输出一个数据 
if(mbjs>=256) 
{ 
mbjs=0; 
} 
} 
else if(keycount==1) //输出三角波 
{ 
P1 = thr_tab[mbjs]; 
mbjs++; 
if(mbjs>=32) 
{ 
mbjs=0; 
} 
} 
else if(keycount==2) //输出锯齿波 
{ 
P1 = jc_tab[mbjs]; 
mbjs++; 
if(mbjs>=32) 
{ 
mbjs=0; 
} 
} 
else if(keycount==3) //输出方波 
{ 
mbjs++; 
if(mbjs>=32) 
{ 
mbjs=0; 
} 
else if(mbjs<16) P1=0xff; 
else P1=0x00; 

} 
} 

⌨️ 快捷键说明

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