📄 kdfd.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 + -