📄 all.c
字号:
#include"reg51.h"
#include"INTRINS.H"
#include<math.h>
/*-----------------------------------------------------------------------*/
/*-------------------------变量定义--------------------------------------*/
sbit P10=P1^0;/*继电器控制2,1,3,4*/
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit AD9851_OUT=P1^4;/*AD8951信号源控制*/
sbit AD9851_CLK=P1^5;
sbit AD9851_FQUD=P1^6;
sbit TLC549_CS=P2^4;/*TLC549_AD采样控制*/
sbit TLC549_DATA=P2^3;
sbit TLC549_CLK=P2^2;
sbit KEY_LD=P2^0;/*串行按键控制*/
sbit KEY_CLK=P2^1;
sbit KEY_DAT=P3^4;
sbit KEY_IRQ=P3^5;
sbit Lcd_RS=P2^7;/*液晶显示控制*/
sbit Lcd_RW=P2^6 ;
sbit Lcd_CS=P2^5 ;
char n;
unsigned char nl=0,nk=0,number,key_value=0;
unsigned long INPUT=0;
unsigned char cvoltage;
float Ri=100,Rf=50000,Vs=11.4;/*******************Vs数值待定***************************/
unsigned long R=1000000;
float VL0,Vio,IVL0,IVL1,Iio,AVL0,Avd,KVL0,Kcmr;
float middle;
unsigned char seg[]=" 000.0000 ";
unsigned char dispram[8]={0,0,0,0,0,0,0,0};
/*---------------------------------------------------------------------*/
/*-----------------------------函数声明--------------------------------*/
void read(void);
void key_get();
void intimer(void);
//void SETUP_AD9851();
//void input(unsigned long datal,unsigned int datah);
unsigned char TLC549_AD(void);
void LcdWrite(unsigned char value , bit RS);
unsigned char LcdRead(bit RS);
void LcdWriteCmd(unsigned char value , unsigned char attrib);
void LcdWriteData(unsigned char value);
unsigned char LcdReadData();
void LcdInit(void);
void LocateXY(char x , char y);
void PutChar(char x , char y , char value);
void PutStr(char x , char y , char* str);
unsigned char Hex2Ascii(unsigned char hex);
void dispaly(void);
void team(float middle);
void delay(unsigned int time);
void Vio_test();
void Iio_test();
void Avd_test();
void Kcmr_test();
/*----------------------------------------------*/
/*------------通用延时程序----------------------*/
void delay(unsigned int time) // time*0.5ms延时
{
unsigned int i,j;
for(j=0;j<time;j++)
{
for(i=0;i<60;i++)
{;}
}
}
/*---------------------------------------------------*/
/*-------------------液晶显示模块--------------------*/
void LcdWrite(unsigned char value , bit RS)
{
Lcd_RS = RS ;
Lcd_RW = 0 ;
Lcd_CS = 0 ;
P0 = value ;
Lcd_CS = 1 ;
}
/***************************************
说明: LCD读函数,完成LCD读操作的物理时序
RS: 0 - 写指令
1 - 写数据
return: 读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
unsigned char rt ;
Lcd_RS = RS ;
Lcd_RW = 1 ;
P0 = 0xff ;
Lcd_CS = 0 ;
Lcd_CS = 0 ;
Lcd_CS = 0 ;
Lcd_CS = 0 ;
rt = P0 ;
Lcd_CS = 1 ;
return rt ;
}
/***************************************
说明: LCD写指令
value: 写的具体值
attrib: 0 - 不检测忙信号
1 - 监测忙信号
*****************************************/
void LcdWriteCmd(unsigned char value , unsigned char attrib)
{
if(attrib)
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 0);
}
/***************************************
说明: LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 1);
}
/***************************************
说明: LCD读数据
*****************************************/
unsigned char LcdReadData()
{
while( LcdRead(0)&0x80 ) ;
return LcdRead(1);
}
/***************************************
说明: LCD初始化函数
*****************************************/
void LcdInit(void)
{
delay(800);
LcdWriteCmd(0x38 , 0 );
delay(10);
LcdWriteCmd(0x38 , 0 );
delay(10);
LcdWriteCmd(0x38 , 0 );
delay(10);
LcdWriteCmd(0x38 , 1 );
LcdWriteCmd(0x08 , 1 );
LcdWriteCmd(0x01 , 1 );
LcdWriteCmd(0x06 , 1 );
LcdWriteCmd(0x0c , 1 );
}
/***************************************
说明: 设置光标定位
*****************************************/
void LocateXY(char x , char y)
{
unsigned char temp;
temp = x & 0xf;
y &= 0x1;
if ( y )temp |= 0x40;
temp |= 0x80;
LcdWriteCmd(temp,1);
}
/***************************************
说明: 显示字符
x: 横坐标 y: 纵坐标
value: 显示字符的ASC码
*****************************************/
void PutChar(char x , char y , char value)
{
LocateXY(x,y);
LcdWriteData(value);
}
/***************************************
说明: 显示字符串
*****************************************/
void PutStr(char x , char y , char* str)
{
unsigned char i,len=0;
while (str[len] >31)
len++;
for (i=0;i<len;i++)
{
PutChar(x++,y,str[i]);
if ( x == 16 )
{
x = 0; y ^= 1;
}
}
}
unsigned char Hex2Ascii(unsigned char hex)
{
if(hex>9)
return' ';
else
return(hex+'0');
}
void display(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(i==2)
seg[i+4]=46;
else
seg[i+4]=Hex2Ascii(dispram[i]);
}
}
void team(float middle)
{
long m;
m=(long)(middle*10000);
dispram[0]=m/1000000;
dispram[1]=(m%1000000)/100000;
dispram[2]=(m%100000)/10000;
dispram[4]=(m%10000)/1000;
dispram[5]=(m%1000)/100;
dispram[6]=(m%100)/10;
dispram[7]=m%10;
display();
delay(100);
}
/*-------------------------------------------------------*/
/*--------------------AD9851信号源模块-------------------*/
void input(unsigned long datal,unsigned int datah)
{
unsigned char m,n;
AD9851_FQUD=0;
for(n=0;n<32;n++)
{
AD9851_CLK=0;
if (datal&0x01)
AD9851_OUT=1;
else
AD9851_OUT=0;
AD9851_CLK=1;
datal=datal>>1;
}
for(m=0;m<8;m++)
{
AD9851_CLK=0;
if (datah&0x01)
AD9851_OUT=1;
else
AD9851_OUT=0;
AD9851_CLK=1;
datah=datah>>1;
}
AD9851_FQUD=1;
}
void SETUP_AD9851()/*初始化*/
{
input(0x00000000,0x01);
}
/*-----------------------------------------------------*/
/*---------------TLC549AD采样模块----------------------*/
unsigned char TLC549_AD(void)
{
char i;
unsigned char rt=0;
TLC549_DATA=1;
TLC549_CLK=0;
TLC549_CS=0;
if(TLC549_DATA&1)
rt|=0x80;
TLC549_CLK=1;
TLC549_CLK=0;
for(i=6;i>=0;i--)
{
TLC549_CLK=1;
if(TLC549_DATA&1)
rt|=1<<i;
TLC549_CLK=0;
}
TLC549_CLK=1;
TLC549_CS=1;
return rt;
}
/*------------------------------------------------------------*/
/*-------------------------串行按键模块-----------------------*/
void read()
{
KEY_LD=0;
KEY_CLK=1;
KEY_IRQ=1;
if(KEY_IRQ)
{
KEY_LD=1;
_nop_();
_nop_();
KEY_LD=0;
while(KEY_IRQ);
{
INPUT=0;
KEY_DAT=1;
for(n=14;n>=0;n--)
{
KEY_CLK = 0 ;
if(KEY_DAT)
INPUT|=1<<n;
KEY_CLK = 1 ;
}
}
}
}
void key_get()/*对应按键*/
{
switch(INPUT)
{
case 1:
key_value=1; break;/*切换键*/
case 2:
key_value=2; break;/*测量键*/
case 4:
key_value=3; break;
case 8:
key_value=4; break;
case 16:
key_value=5; break;
case 32:
key_value=6; break;
case 64:
key_value=7; break;
case 128:
key_value=8; break;
case 256:
key_value=9; break;
case 512:
key_value=10; break;
case 1024:
key_value=11; break;
case 2048:
key_value=12; break;
case 4096:
key_value=13; break;
case 8192:
key_value=14; break;
case 16384:
key_value=15; break;
case 32768:
key_value=16; break;
default: break;
}
}
/*---------------------------------------------------*/
/*----------------------测量模块---------------------*/
void Vio_test()
{
P10=1;
P11=1;
P12=0;
P13=0;/*继电器一次动作*/
_nop_();
_nop_();
cvoltage=TLC549_AD();
VL0=(float)cvoltage*5/255;
Vio=(float)(Ri*VL0/(Ri+Rf));
team(Vio);
}
void Iio_test()
{
/*继电器两次动作*/
/*第一次动作*/
P10=1;
P11=1;
P12=0;
P13=0;
_nop_();
_nop_();
cvoltage=TLC549_AD();
IVL0=(float)cvoltage*5/255;
/*第二次动作*/
P10=0;
P11=0;
P12=0;
P13=0;
_nop_();
_nop_();
cvoltage=TLC549_AD();
IVL1=(float)cvoltage*5/255;
Iio=(float)((Ri*(IVL1-IVL0))/(R*(Ri+Rf)));
team(Iio);
}
void Avd_test()
{
/*继电器一次动作*/
P10=1;
P11=1;
P12=0;
P13=1;
_nop_();
_nop_();
cvoltage=TLC549_AD();
AVL0=(float)cvoltage*5/255;
Avd=(float)(20*log((Vs*(Ri+Rf))/(AVL0*Ri)));
team(Avd);
}
void Kcmr_test()
{
/*继电器一次动作*/
P10=1;
P11=1;
P12=1;
P13=0;
_nop_();
_nop_();
cvoltage=TLC549_AD();
KVL0=(float)cvoltage*5/255;
Kcmr=(float)(20*log((Vs*(Ri+Rf))/(KVL0*Ri)));
team(Kcmr);
}
/*------------------------------------------*/
/*-----------------主函数-------------------*/
void main()
{
P1=0xff;
LcdInit();/*液晶初始化*/
PutStr(0,0," MEASURE ");
SETUP_AD9851();/*AD8951初始化*/
input(119,0x01);/*起始输出5HZ信号*/
intimer();
TR1=1;
while(1)
{
key_get();
switch(key_value)
{
case 1:
number=1;
PutStr(0,0,"Vio is ");
PutStr(0,1," Press Key5 ");
break;
case 2:
number=2;
PutStr(0,0,"Iio is ");
PutStr(0,1," Press Key5 ");
break;
case 3:
number=3;
PutStr(0,0,"Avd is ");
PutStr(0,1," Press Key5 ");
break;
case 4:
number=4;
PutStr(0,0,"Kcmr is ");
PutStr(0,1," Press Key5 ");
break;
case 5:
if(number==1)
{
Vio_test();
PutStr(0,1,seg);
}
else if(number==2)
{
Iio_test();
PutStr(0,1,seg);
}
else if(number==3)
{
Avd_test();
PutStr(0,1,seg);
}
else if(number==4)
{
Kcmr_test();
PutStr(0,1,seg);
}
break;
/*信号源频率控制键*/
case 6:P10=0;
nl++;
PutStr(0,0," +1HZ ");
PutStr(0,1," ");
input(119+23.9*nl,0x01);
break;
case 7:P11=0;
nl--;
PutStr(0,0," -1HZ ");
PutStr(0,1," ");
input(119-23.9*nl,0x01);
break;
case 8:P12=0;
nk++;
PutStr(0,0," +1KHZ ");
PutStr(0,1," ");
input(119+23860.9*nk,0x01);
break;
case 9:P10=1;
nk--;
PutStr(0,0," -1KHZ ");
PutStr(0,1," ");
input(119-23860.9*nk,0x01);
break;
default: break;
}
}
}
/*----------------------------------------------------*/
/*---------------定时中断模块-------------------------*/
void intimer(void)/*5ms定时中断*/
{
TMOD=0x10;
TH1=0xec;
TL1=0x78;
EA=1;
ET1=1;
}
void timer(void) interrupt 3 using 2
{
TH1=0xec;
TL1=0x78;
TF1=0;
TR1=0;
read();
TR1=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -