📄 dds.txt
字号:
#include <reg52.h>
#include <math.h>
#include <intrins.h>
unsigned char code seg[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19};
unsigned char code seg_zero[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x18};
unsigned long idata kongzhizit ;
unsigned long idata f_kongzhizi ;
unsigned char fre0,fre1,fre2,fre3,fre4,fre5; //定义频率字
unsigned char fudu0,fudu1,fudu2,fudu3;
unsigned long freqw;
sbit P3_2=P3^2;
sbit CLK=P3^4;
sbit DAT=P3^3;
sbit w_clk =P2^7;
sbit fq_ud =P2^6;
sbit cs= P3^6;
sbit sck = P2^5;
sbit si = P2^4;
unsigned char w[5];
unsigned char dispbuff[8];//显示缓冲区
void delay(unsigned int temp1)
{
while(temp1--);
}
void Moni_Send(unsigned char dsdata)
{
unsigned char i,temp=0;
CLK=0;
for(i=0;i<=7;i++)
{
temp=dsdata&0x01;
dsdata=dsdata>>1;
if(temp==0)
DAT=0;
else
DAT=1; //置数据在端口上
CLK=1; //发出移位脉冲
CLK=0;
}
}
//清空显示---------------------------------------------------------------
void disp_cls(void)
{ char i;
for(i=0;i<8;i++)
{
Moni_Send(0xff);
}
}
void disp_int()
{ char i,j;
for(i=0;i<10;i++)
{
dispbuff[0]=seg[i];
dispbuff[1]=seg[i];
dispbuff[2]=seg[i];
dispbuff[3]=seg[i];
dispbuff[4]=seg[i];
dispbuff[5]=seg[i];
dispbuff[6]=seg[i];
dispbuff[7]=seg[i];
for(j=0;j<8;j++)
{Moni_Send(dispbuff[j]);
}
delay(60000);
disp_cls();
}
}
//*显示频率数值程序--------------------------------------------
void disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0)
{dispbuff[7]=0xff;
dispbuff[6]=0xff;
dispbuff[5]=seg[fre5]; //ge wei
dispbuff[4]=seg[fre4]; //shi wei
dispbuff[3]=seg[fre3]; //bai wei
dispbuff[2]=seg[fre2]; //qian wei
dispbuff[1]=seg[fre1]; //wang wei
dispbuff[0]=seg[fre0]; //shiwang wei
Moni_Send(dispbuff[7]);
Moni_Send(dispbuff[6]);
Moni_Send(dispbuff[5]);
Moni_Send(dispbuff[4]);
Moni_Send(dispbuff[3]);
Moni_Send(dispbuff[2]);
Moni_Send(dispbuff[1]);
Moni_Send(dispbuff[0]);
}
//*显示幅度数值程序--------------------------------------------
void disp_fudunum(fudu3,fudu2,fudu1,fudu0)
{dispbuff[7]=0xff;
dispbuff[6]=0xff;
dispbuff[5]=0xff;
dispbuff[4]=0xff;
dispbuff[3]=seg[fudu3];
dispbuff[2]=seg[fudu2];
dispbuff[1]=seg[fudu1];
dispbuff[0]=seg[fudu0];
Moni_Send(dispbuff[7]);
Moni_Send(dispbuff[6]);
Moni_Send(dispbuff[5]);
Moni_Send(dispbuff[4]);
Moni_Send(dispbuff[3]);
Moni_Send(dispbuff[2]);
Moni_Send(dispbuff[1]);
Moni_Send(dispbuff[0]);
}
//*键盘处理程序--------------------------------------------
unsigned char key_chk()
{
unsigned char temp,key_c;
// 11xx xxxx
P1 =0xF0; // 1111 0000
ACC =P1 & 0xF0; // 1111 0000
B =ACC;
P1 =0x0F; // 0000 1111
ACC =P1 & 0x0F; // 0000 1111
temp=ACC | B;
if( temp !=0xff ) // 1111 1111
{
switch( temp)
{
case 0x77: key_c= 0; break;//0
case 0xbd: key_c= 1; break;//1
case 0xbb: key_c= 2; break;//2
case 0xb7: key_c= 3; break;//3
case 0xed: key_c= 4; break;//4
case 0xeb: key_c= 5; break;//5
case 0xe7: key_c= 6; break;//6
case 0xdd: key_c= 7; break;//7
case 0xdb: key_c= 8; break;//8
case 0xd7: key_c= 9; break;//9
case 0x7b: key_c= 10; break;//chuanhuan
case 0xee: key_c= 11; break; //+
case 0xbe: key_c= 12 ; break; //*
case 0x7d: key_c= 13; break; //<-
case 0xde: key_c= 14; break; //clear
case 0x7e: key_c= 15; break;//enter
default: key_c=0xff;
}
return(key_c);
}
else return(0xff);
}
unsigned char get_key()
{
unsigned char temp,temp1;
// temp=key_chk();
// delay(15320);
// temp1=key_chk();
// if(temp==temp1)
// return temp;
// else
// return 0xff;
do
{
temp=key_chk();
delay(12000);
temp1=key_chk();
}
while(temp==0xff||temp!=temp1);
return(temp);
}
//*频率数值调整程序--------------------------------------------
void pinlvtiaozheng(unsigned char key)
{ unsigned char dat;
dat=key;
fre5=fre4;
fre4=fre3;
fre3=fre2;
fre2=fre1;
fre1=fre0;
fre0=dat;
}
//*频率数值减1处理程序---------------------------------------------
void pinlvjian1()
{ if (fre0!=0)
{fre0--;
}
else
{fre0=9;
if (fre1!=0)
{fre1--;
}
else
{fre1=9;
if(fre2!=0)
{fre2--;
}
else
{fre2=9;
if(fre3!=0)
{fre3--;
}
else
{fre3=9;
if(fre4!=0)
{fre4--;
}
else
{fre4=9;
if(fre5!=0)
{fre5--;
}
else
{fre5=5;
}
}
}
}
}
}
}
//*频率数值加1处理程序---------------------------------------------
void pinlvjia1()
{ if (fre0!=9)
{fre0++;
}
else
{fre0=0;
if (fre1!=9)
{fre1++;
}
else
{fre1=0;
if(fre2!=9)
{fre2++;
}
else
{fre2=0;
if(fre3!=9)
{fre3++;
}
else
{fre3=0;
if(fre4!=9)
{fre4++;
}
else
{fre4=0;
if(fre5!=5)
{fre5++;
}
else
{fre5=0; //注意可能会在这里出错
}
}
}
}
}
}
}
//*幅度数值调整程序--------------------------------------------
void fudutiaozheng(unsigned char key)
{ unsigned char f_dat;
f_dat=key;
if ((fudu2==1)&&(fudu1==0)&&(fudu0==0)&&(f_dat==0)) //保证不超过100mA
fudu3=1;
else
fudu3=0;
fudu2=fudu1;
fudu1=fudu0;
fudu0=f_dat;
}
//*幅度控制字输送程序--------------------------------------------
void fudu_shusong(f_kongzhizi)
{ unsigned char i,j;
j=f_kongzhizi%256;
cs=0;
_nop_();
for(i=0;i<8;i++)
{si=j&0x80;
_nop_();
sck=1;
_nop_();
sck=0;
j<<=1;
}
cs=1;
}
//*幅度数值减0.5处理程序---------------------------------------------
void fudujian1()
{if (fudu0!=0)
{fudu0=fudu0-5;
}
else
{fudu0=5;
if(fudu1!=0)
{fudu1--;
}
else
{fudu1=9;
if(fudu2!=0)
{fudu2--;
}
else
{if (fudu3==1)
{fudu3=0;
fudu2=9;
}
}
}
}
}
//*幅度数值加0.5处理程序---------------------------------------------
void fudujia1()
{if (fudu0!=5)
{fudu0=fudu0+5;
}
else
{fudu0=0;
if(fudu1!=9)
{fudu1++;
}
else
{fudu1=0;
if(fudu2!=9)
{fudu2++;
}
else
{if (fudu3==0)
{fudu3=1;
fudu2=0;
}
}
}
}
}
void onsetflame()
{ w[0]=0x00;
w[1]=0x01; //100 0x53e3
w[2]=0x47; //0x147ae14 100k 0x20c49b 10k
w[3]=0xae; //50 0x29f1
w[4]=0x14;
fq_ud=0;
w_clk=0;
P0=w[0];
w_clk=1;
w_clk=0;
P0=w[1];
w_clk=1;
w_clk=0;
P0=w[2];
w_clk=1;
w_clk=0;
P0=w[3];
w_clk=1;
w_clk=0;
P0=w[4];
w_clk=1;
w_clk=0;
fq_ud=1;
fq_ud=0;
}
void loadword()
{
fq_ud=0;
w_clk=0;
P0=w[0];
w_clk=1;
w_clk=0;
P0=w[1];
w_clk=1;
w_clk=0;
P0=w[2];
w_clk=1;
w_clk=0;
P0=w[3];
w_clk=1;
w_clk=0;
P0=w[4];
w_clk=1;
w_clk=0;
fq_ud=1;
fq_ud=0;
}
void loadgengxin(unsigned long frew_song)
{ delay(30000);
w[4]=frew_song;
frew_song=frew_song>>8;
w[3]=frew_song;
frew_song=frew_song>>8;
w[2]=frew_song;
frew_song=frew_song>>8;
w[1]=frew_song;
frew_song=frew_song>>8;
w[0]=0x00;
loadword();
}
main()
{unsigned char key;
unsigned long freq_song;
disp_int(); //调用晶体管初始化程序
disp_cls(); //晶体管清零程序
onsetflame();
P3_2=0; //设置指示灯为亮,开始为设置频率态
while(1)
{ key=get_key(); // 从键盘程序返回键盘值
if (key!=0xff) //若无输入,则重新开始循环体
{ //if(P3_2==0) //在P3_2为零时,不考虑key=13和16时的动作
//{
if(0<=key&&key<=9)
{freqw=freqw*10+key;
pinlvtiaozheng(key); //调用频率数值左移程序
disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0);//调用频率显示程序
}
else if(key==10) //.
{
}
else if(key==11)
{ freqw=freqw+1;
freq_song=freqw*215;
loadgengxin(freq_song);
pinlvjia1(); //频率加1,频率幅度调整程序
disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0); //频率显示程序
}
else if(key==12)
{ freqw=freqw-1;
freq_song=freqw*215;
loadgengxin(freq_song);
pinlvjian1(); //频率减一,频率数值调整程序
disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0);//频率显示程序
}
else if(key==14) //清零键
{ fre5=0;fre4=0;fre3=0;fre2=0;fre1=0;fre0=0;
freqw=0;
disp_cls(); //晶体管清零程序
}
else if(key==15) //确定键
{
freq_song=freqw*215;
loadgengxin(freq_song);
}
}
/*
else
{ if(0<=key&&key<=9)
{ fudutiaozheng(key); //调用频率数值左移程序
disp_fudunum(fudu3,fudu2,fudu1,fudu0); //调用幅度显示程序
}
else if(key==10) //确定键
{ //P3_2=0;
f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5;//求幅度控制字模块
fudu_shusong(f_kongzhizi); //幅度控制字传输程序 还没编!
//是否能在这里添加显示以前的频率的程序呢?
}
else if(key==11)
{ fudujia1();//幅度加1,幅度调整程序
disp_fudunum(fudu3,fudu2,fudu1,fudu0); //幅度显示程序
f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5;//求幅度控制字模块
//幅度控制字传输程序 还没编!
}
else if(key==12)
{ fudujian1();//幅度减一,幅度数值调整程序
disp_fudunum(fudu3,fudu2,fudu1,fudu0); //幅度显示程序
f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5;//求幅度控制字模块
fudu_shusong(f_kongzhizi);//幅度控制字传输程序 还没编!
}
else if(key==14) //清零键
{ fudu0=0;fudu1=0;fudu2=0;fudu3=0;//清除幅度数值
disp_cls(); //晶体管清零程序
}
else if(key==15)
{ f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5; // 求幅度控制字模块
fudu_shusong(f_kongzhizi); //幅度控制字传输程序 还没编!?
}
// }
}
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -