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

📄 kdfd.c

📁 2001电子设计大赛《宽带放大器》的源程序
💻 C
字号:
/************************************************
宽频放大器,有以下功能:
预置增益,增益加/减,显示输出电压有效值,自动增益

  显示有效值.
  增益输入及加减
  自动增益没有实现
   7/27
************************************************/

#include<reg51.h>
#include<absacc.h>
#define COM_8279 XBYTE[0X3FFF]
#define DAT_8279 XBYTE[0X3FFE]
#define DAC0832 XBYTE[0X7fff]
#define uchar unsigned char
#define uint unsigned int
#define sint signed int




sbit clflag=ACC^7;
sbit CS_187=P1^4;
sbit SDO_187=P1^5;
sbit SCK_187=P1^3;

/***********************************************
anjian=1,2,3,4,5,6 (对应8279 FIFO内低6位数值:1,2,3,8,9,10
分别对应: 自动增益 ,取消增益
显示有效值,预置增益,增益加,增益减
************************************************/
uchar anjian;

uint ad_value=0,gain_value=10;

uchar diss[8]={0x3f,0x06,0x00,0x00,0x00,0x00,0x00,0x00};  //显示数组

uchar display[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数字数组

uchar t;             // 为按键判断出在display[t]中的位置
uchar gainh,gainl,flag_gi=0,flag_input=0,flag_gainhl;
uchar gainhl[2]={0x00,0x00};
uchar flag=0;

float rsm;
uchar zd,flag_zd=0;

void init()
{
	//其他初始化待定
    EA=1;
    EX1=1;
	COM_8279=0xd1;             //总清除命令
	do
	{
		ACC=COM_8279;
	}while(clflag==1);    //等待清除
	COM_8279=0x00;    //显示方式:8 位,左入口;键盘方式:编码扫描键盘,双键锁定
	COM_8279=0x3f;       //分频次数31 ,8279工作频率在100KHz左右
	COM_8279=0xb0;       // 显示RAM 恢复显示
}

void delay()
{
	uint i;
	for(i=0;i<32800;i++)
		;
}

uchar deky(void)                 //判断FIFO有键按下函数
{
	uchar k;
	k=COM_8279;                         //读入 8279 状态字
	return(k&0x0f);               // 非0有键按下
}

void jianzhi(uchar h)          // 键盘值判断,在数组display[t]选择对应的段码值
{
    if(h==0)
        t=0;
    else if(h==1)
        t=1;
    else if(h==2)
    {
        if(flag_zd==1)
             t=3;
        else
             t=2;
     }
    else if(h==3)
        t=3;
    else if(h==8)
        t=4;
    else if(h==9)
        t=5;
    else if(h==10)
        t=6;
    else if(h==11)
        t=7;
    else if(h==16)
        t=8;
    else if(h==17)
        t=9;

	// 增益输入部分
	if(flag_input!=0)
	{
		gainhl[flag_gainhl]=t;
		flag_input--;
		flag_gainhl++;
		if(flag_gainhl==1)
			diss[0]=display[gainhl[0]];
		if(flag_gainhl==2)
		{
			diss[0]=display[gainhl[1]];
			diss[1]=display[gainhl[0]];
		}
		if(flag_gainhl>1)
		{
			flag_gainhl=0;
                        flag_input=0;
		}
		t=0;
	}
}

void int1() interrupt 2         //键盘中断处理函数
{
	uchar i;
	while(deky()==0)                   //判断FIFO有键按否,若无则等待
	{;}
	COM_8279=0x40;                            //读FIFO RAM 命令
	i=DAT_8279;                              //取键盘数据低6位
	i=i&0x3f;
	anjian=i;                           //把按键值赋给 anjian (是FIFO中低6位的值)
	jianzhi(anjian);

}

void disp()                   //显示函数
{
	uchar i,m=0;
    COM_8279=0x90;
	for(i=0;i<8;i++)          //写显示 8位 RAM
	{
		COM_8279=i+0x90;
		DAT_8279=diss[m];
		//delay();
		m++;
		if(m>7)
			m=0;
	}
}


void da0832(uchar dazhi)
{
	if(flag_zd==1)
	{
		if(dazhi>707)
		{
			zd-=1;
			DAC0832=zd;
		}
		else if(dazhi<-707)
		{
			zd+=1;
			DAC0832=zd;
		}
	}
	else
	{
		if(dazhi==10)
			DAC0832=68;
		else if(dazhi==16)
			DAC0832=111;
		else if(dazhi==22)
			DAC0832=127;
		else if(dazhi==28)
			DAC0832=145;
		else if(dazhi==34)
			DAC0832=160;
	}

}


void max187()
{
	uchar i=0,t=0;

	CS_187=0;
	for(i=0;i<9;i++)    //延时8.5uS,等待转换结束
	{;}
	SCK_187=1;
	SCK_187=0;

	//开始读数据

	for(i=0;i<12;i++)
	{
		SDO_187=1;
		SCK_187=1;
		t=SDO_187;
		if(t==1)
			ad_value=ad_value|0x0001;
		SCK_187=0;
		if(i<11)
			ad_value<<=1;
	}
	i=i;
	i=i;
	i=i;
    CS_187=1;
}

void rms_true()
{
    uchar i,m;
	uint adzhi;//注意adzhi 的类型!!!!!!!!!!!!!!!!!!!!!!
	flag_zd=0;
        flag=0;
    while(t==3)
    {
        max187();

		// 峰值到有效值的转换
		rsm=((float)(ad_value))/0.707;                //  (2*ad_value/1000)/1.414
		adzhi=rsm;
		for(i=0;i<8;i++)
		{
			m=adzhi%10;
			adzhi=adzhi/10;
			if(i==3)
			{
				diss[i]=display[m]|0x80;
			}
                        else if(i>3)
                                diss[i]=0x00;
			else
				diss[i]=display[m];
		}
		disp();
        ad_value=0;
        delay();
    }
}

void gain_input()
{
	uchar i=0,n;
	flag_zd=0;
        flag=1;
        flag_input=2;
	for(n=0;n<8;n++)    //显示数组清零
	{
                if(n>1)
                     diss[n]=0x00;
                else
                     diss[n]=0x3f;
	}


	while(flag_input!=0)        //等待输入预置增益
	{
		disp();
	}
	gain_value=gainhl[0]*10+gainhl[1];
	//	diss[0]=display[gainl];
	//	diss[1]=display[gainh];
	da0832(gain_value);                    // 增益控制部分,增益值到DAC 输入值的转换

}

void gain_id()
{
	uchar i,m,dz;
        if(flag==1)
        {
	if(t==5)
	{
		if(gain_value<34)
			gain_value=gain_value+6;
		else
			gain_value=34;
		dz=gain_value;
		da0832(gain_value);
		for(i=0;i<2;i++)
		{
			m=dz%10;
			dz=dz/10;
			diss[i]=display[m];
		}

		t=0;
	}
	else if(t==6)
	{
		if(gain_value>10)
			gain_value-=6;
		else
			gain_value=10;
		dz=gain_value;                  //!!!!!!!!!!ad_value gain_value
		da0832(gain_value);
		for(i=0;i<2;i++)
		{
			m=dz%10;
			dz=dz/10;
			diss[i]=display[m];
		}
		t=0;
	}
        }

}

void gain_zd()
{
	sint dif;
        uint m;
	uchar i,n;
	flag_zd=1;
        flag=0;
	zd=68;
	while(t==1)
	{
		max187();
	
		dif=7070-ad_value;
		if(dif>707)
		{
                        m=ad_value;
			da0832(zd);
			
			for(i=0;i<4;i++)
			{
				n=m%10;
				diss[i]=display[n];
				m=m/10;
			}
		}
		else if(dif<-707)
		{
                        m=ad_value;
			da0832(zd);
			
			for(i=0;i<4;i++)
			{
				n=m%10;
				diss[i]=display[n];
				m=m/10;
			}
		}
		disp();
                delay();
	}
}

void main(void)
{
	init();
	da0832(gain_value);
	while(1)
	{
		if(t==1)
			gain_zd();
		else if(t==3)
			rms_true();
		 if(t==4)
			gain_input();
		else if(t==5||t==6)
			gain_id();
		disp();
	}
}

⌨️ 快捷键说明

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