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

📄 chengkonglvbo.c

📁 C51程控滤波程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//按键是低电平表示按下去,确认键作为就是做完作品中四个按键中的模式选择键//
#include<reg51.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define unit unsigned int

unsigned char code dis[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--f,不显示
unsigned char code shibie[8]={0x98,0x8c,0xb6,0x86,0xc6,0xc7,0x88,0x89};//符号q,p,三,E,【,L,A,H//
uchar key;



uchar key_moshi=2;    //模式键 (本程序中以后好像没有用到过)
uchar key_plus=2;     //下调键
uchar key_subb=2;     //上调键
uchar queren=2;      //确认键
uchar qiehuan=2;      //高低通切换键
uchar time;
uchar once;
uchar once2;

int key_first_flag=-1; //0放大 1低通   2高通
int flag=-1;
int  quren_flag=0;//确认标志
int  qiehuan_flag0=0;   //切换标志
int fangda[2];   //放大
int lvbo[3];   //低通滤波 显示数组
int hvbo[3];  //高通滤波   显示数组


sbit cs= P3^7;      //接数字电位器
sbit sclk= P2^6;   //接数字电位器
sbit si= P2^7;     //接数字电位器

sbit F_ge=P2^2;     //放大显示的个位
sbit F_shi=P2^1;   //放大显示的十位
sbit F_bai=P2^0;  //放大显示的百位

sbit L_ge=P2^5;   //低通显示的各位
sbit L_shi=P2^4;   //低通显示的十位
sbit L_bai=P2^3;   //低通显示的百位

sbit A0=P3^0;   //接262
sbit A1=P3^1;   //接262
sbit A2=P3^2;    //接262
sbit A3=P3^3;   //接262
sbit D0=P3^5;   //接262
sbit D1=P3^4;    //接262
sbit WR_262=P3^6;  //接262
/************************************
延时子程序
*************************************/
void delay(unsigned char time)
{
 unsigned int i,j;
 for(i=0;i<time;i++)
    for(j=0;j<50;j++);
 }
/************************************
延时子程序
*************************************/
void delay2(unsigned char time)
{
 unsigned int i,j;
 for(i=0;i<time;i++)
    for(j=0;j<5;j++);
 }

/************************************
延时子程序
*************************************/
void delay1(unsigned char time)
{
 unsigned int i,j;
 for(i=0;i<time;i++)
    for(j=0;j<800;j++);
 }
/******************************************************************/
 /*************************************
  模式选择    放大模式 滤波模式
************************************/
 void MOSHI_set_program(void)
{
if(key_moshi==0)
{
key_moshi=1;
delay(2);   //消抖延时
key_first_flag++;
if(key_first_flag>3)
                    {
key_first_flag=0;
                     }
}
}
/*******************************************
  放大设置 增加   减少
******************************************/
void key_plus_fangda( )     //放大的上升键
{
if(key_first_flag==0&&key_plus==0&&quren_flag==0)     //放大
{
   key_plus=1;
   delay(2);   //消抖延时
   fangda[1]++;
   if (fangda[1]>6)  fangda[1]=0;

}
}

void key_subb_fangda( )            //放大下调键
{
if(key_first_flag==0&&key_subb==0&&quren_flag==0)     //放大
{
   key_subb=1;
   delay(2);   //消抖延时
   fangda[1]--;
   if (fangda[1]<0)  fangda[1]=6;

}
}
/*******************************************
  滤波低通 增加   减少
******************************************/
void key_plus_lvbo( )
{
if(key_first_flag==1&&key_plus==0)     //低通滤波上调键
{
    key_plus=1;
   delay(1);   //消抖延时
   lvbo[0]++;
   if(lvbo[0]>9)
   {
     lvbo[0]=0;
     lvbo[1]++ ;


   }
   lvbo[2]=lvbo[0]+lvbo[1]*10 ;
   if(lvbo[2]>20) {lvbo[0]=0;lvbo[1]=0;}

}
}

void key_subb_lvbo( )
{
if(key_first_flag==1&&key_subb==0)     //低通滤波下调键
{
     key_subb=1;
     delay(1);   //消抖延时
    lvbo[0]--;
   if(lvbo[0]<0)
   {
     lvbo[0]=9;
     lvbo[1]-- ;
     if(lvbo[1]<0) lvbo[1]=2;

   }
   lvbo[2]=lvbo[0]+lvbo[1]*10 ;
   if(lvbo[2]==29) {lvbo[0]=0;lvbo[1]=2;}


}
}
/*******************************************
  滤波高通 增加   减少
******************************************/
void key_plus_hvbo( )
{
if(key_first_flag==2&&key_plus==0)     //高通上调键
{
   key_plus=1;
   delay(2);   //消抖延时
   hvbo[0]++;
   if(hvbo[0]>9)
   {
     hvbo[0]=0;
     hvbo[1]++ ;


   }
   hvbo[2]=hvbo[0]+hvbo[1]*10 ;
   if(hvbo[2]>20) {hvbo[0]=0;hvbo[1]=0;}

}
}

void key_subb_hvbo( )
{
if(key_first_flag==2&&key_subb==0)     //高通下调键
{
      key_subb=1;
     delay(2);   //消抖延时
   hvbo[0]--;
   if(hvbo[0]<0)
   {
     hvbo[0]=9;
     hvbo[1]-- ;
     if(hvbo[1]<0) hvbo[1]=2;

   }
   hvbo[2]=hvbo[0]+hvbo[1]*10 ;
   if(hvbo[2]==29) {hvbo[0]=0;hvbo[1]=2;}


}
}
/************************************
 确认按键
********************************/
void key_quren_flag()
{
if(queren==0)
{
delay(10);
queren=1;
 quren_flag++;
if(quren_flag>1)  { quren_flag=0; key_first_flag=0;       }
}
}
/************************************
 切换按键
********************************/
void key_qiehuan_flag()
{
if(qiehuan==0)
{
 qiehuan=1;
 qiehuan_flag0++;
 if( qiehuan_flag0 >1 ){ qiehuan_flag0 =0;}
 }


}

/*************************************
显示
***************************************/
void Dispaly()
{

/******************************
开机初始化  显示
*********************************/
if (key_first_flag==-1 )
{
F_ge=0;
F_shi=0;
L_ge=0;
L_shi=0;

L_bai=0;
F_bai=1;
P0=shibie[0];
delay(1)  ;
F_bai=0;

L_bai=1;
P0=shibie[1];
delay(1) ;
L_bai=0;



}
/********************************
   放大设置  显示
*********************************/
else if (key_first_flag==0 )
{

F_ge=1;
P0=dis[0];         //个位显示0
delay(1)  ;
F_ge=0;

F_shi=1;
P0=dis[fangda[1]];
delay(1);
F_shi=0;

F_bai=1;
P0=shibie[2];
delay(1)  ;
F_bai=0;
}
/********************************
  确认 放大倍数
*******************************/
if (quren_flag==1 )
{
F_ge=1;
P0=dis[0];
delay(1)  ;
F_ge=0;

F_shi=1;
P0=dis[fangda[1]];
delay(1);
F_shi=0;

F_bai=1;
P0=shibie[3];
delay(1)  ;
F_bai=0;
}
/********************************
   低通  设置   显示
***********************************/
else if (key_first_flag==1 )
{

L_ge=1;
P0= dis[lvbo[0]];
delay(1)  ;
L_ge=0;

L_shi=1;
P0= dis[lvbo[1]];
delay(1)  ;
L_shi=0;

L_bai=1;
P0=shibie[4] ;
delay(1)  ;
L_bai=0;
}
/*****************************
低通  确认
***************************************/
 if (quren_flag==1&&qiehuan_flag0==0 )   
{
L_ge=1;
P0= dis[lvbo[0]];
delay(1)  ;
L_ge=0;

L_shi=1;
P0= dis[lvbo[1]];
delay(1)  ;
L_shi=0;

L_bai=1;
P0=shibie[5];
delay(1)  ;
L_bai=0;
}
/**********************************
  高通设置  显示
***********************************/
else if (key_first_flag==2)  //高通也是用L_ge等的原因是因为高低通是同样的数码管显示
{

L_ge=1;
P0= dis[hvbo[0]];
delay(1)  ;
L_ge=0;

L_shi=1;
P0= dis[hvbo[1]];
delay(1)  ;
L_shi=0;

L_bai=1;
P0=shibie[6] ;
delay(1)  ;
L_bai=0;
}
/***************************************
高通确认
***************************************/
 if (quren_flag==1&&qiehuan_flag0==1)
{

L_ge=1;
P0= dis[hvbo[0]];
delay(1)  ;
L_ge=0;

L_shi=1;
P0= dis[hvbo[1]];
delay(1)  ;
L_shi=0;

L_bai=1;
P0=shibie[7];
delay(1)  ;
L_bai=0;
}
}
/****************************************
中断初始化 定时器1
******************************************/
void initial()
{
TMOD=0X11;
TR1=0;
TH1=0XD8;
TL1=0XF0;
TR1=1;
ET1=1;
EA=1;
}
/********************************
定时器1中断操作   定时器的作用未知?
*********************************/
 timer1_display ()  interrupt 3
{
Dispaly() ;
TH1=0Xe5;
TL1=0XF0;
TR1=1;
}
  //按键消除抖动延时程序
  void delays(uchar h)
  {
     uchar i;
     for(i=h;i>0;i--);
   }
uchar keyscan(void)    //键盘扫描程序
  {
      uchar scode,recode;
      P1=0XF0;  // 列置为1,用此来判断是否有键按下
      if((P1&0XF0)!=0XF0)  //不相等说明可能有键按下去
        {
           delay1(25);//消除按键抖动
           if((P1&0XF0)!=0XF0) // 去抖动后仍然不相等,说明有键按下
            {
              scode=0xfe;  //实逐行扫描,即只给一行赋0,其它行都为1
              while((scode&0x01)!=0x10)//判断是否扫描到了最后一行
               {
                 P1=scode;//输出行扫描
                 if((P1&0XF0)!=0XF0) //说明本行有键按下,此时是从单片机中读入此时的数据
                   {
                      recode=(P1&0XF0)|0X0F;//求出列扫描码,既按键所在的列
                      return((~scode)+(~recode));//返回按键代码
                    }
                  else scode=(scode<<=1)|0x01;//扫描下一行
              }
            }
          }
          return(0);       //如果没有按键按下,返回0
   }

void read_key() //读出键盘的值
{
uchar key;
 key=keyscan();  //键盘扫描
             delay(5);      //按键消除抖动
             switch(key)
              {
                case 0x11: key_moshi=0;break;
                case 0x21: qiehuan=0;break;
                case 0x41: key_subb=0;break;
                case 0x81: key_plus=0;break;

               }
}
/*****************************************
       MCP4110    数字电位器设定电阻
******************************************/
void write_mcp4110( uchar command,uchar m_data  )
{
uchar i,j,k;
cs=1;
sclk=1;
for(k=0;k<10;k++);//延时
cs=0;
sclk=0;
for(k=0;k<10;k++);//延时
for(i=0;i<8;i++)

{
if(command&0x80) si=1;
else      si=0;
sclk=0;
for(k=0;k<10;k++);//延时
sclk=1;
for(k=0;k<10;k++);//延时
command= command<<1;
}
for(j=0;j<8;j++)
{
if(m_data&0x80) si=1;
 else      si=0;
sclk=0;
for(k=0;k<10;k++);//延时
sclk=1;
for(k=0;k<10;k++);//延时
m_data= m_data<<1;
}
sclk=1;
cs=1;


}

void max262_addr(uchar i) //对MAX262进行设定
{
     if(i==0) {A3=0;A2=0;A1=0;A0=0; }
else if(i==1){A3=0;A2=0;A1=0;A0=1; }
else if(i==2){A3=0;A2=0;A1=1;A0=0; }
else if(i==3){A3=0;A2=0;A1=1;A0=1; }
else if(i==4){A3=0;A2=1;A1=0;A0=0; }
else if(i==5){A3=0;A2=1;A1=0;A0=1; }
else if(i==6){A3=0;A2=1;A1=1;A0=0; }
else if(i==7){A3=0;A2=1;A1=1;A0=1; }
else if(i==8){A3=1;A2=0;A1=0;A0=0; }
else if(i==9){A3=1;A2=0;A1=0;A0=1; }
else if(i==10){A3=1;A2=0;A1=1;A0=0; }
else if(i==11){A3=1;A2=0;A1=1;A0=1; }
else if(i==12){A3=1;A2=1;A1=0;A0=0; }
else if(i==13){A3=1;A2=1;A1=0;A0=1; }
else if(i==14){A3=1;A2=1;A1=1;A0=0; }
else if(i==15){A3=1;A2=1;A1=1;A0=1; }
}
void D0D1_WITRE(uchar num0,uchar num1)  //对MAX262的D0 D1写入数据
{
 if (num0==1)       D0=1;
 else if  (num0==0) D0=0;
 if (num1==1)  D1=1;
 else if  (num1==0) D1=0;
}
void  lvbo_A_1()        //262滤波器A为低通
{
                  WR_262=1;
                  for (time=0;time++;time<20) ;
                  max262_addr(0) ;    //滤波器A方式1选择
                  D0D1_WITRE(1,0) ;    //
                  for (time=0;time++;time<20) ;
                  WR_262=0 ;
                  for (time=0;time++;time<50) ;
                  WR_262=1;
                  for (time=0;time++;time<20) ;

⌨️ 快捷键说明

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