📄 perfcet.c
字号:
#include<C8051F330.h>
#include<math.h>
sbit mode = P0^5; //mode
sbit led1 = P0^6;
sbit led2 = P0^7;
sbit key2 = P0^4; //frquency
unsigned int data sf = 0;
unsigned int data pl = 0;
unsigned char state = 0;
unsigned int code buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xbf};
unsigned int xdata TABLE[150];
void sine(void) //计算正弦波
{
unsigned int data y;
unsigned int data i;
for(i=0;i<150;i++)
{
y=sin(3.1415*2*i/150)*512+512;
if (y>1023) y=1023;
TABLE[i]=y;
}
}
void SysClkInit(void) //配置系统时钟
{
OSCICN |= 0x03; //22.11 MHz
OSCICL=OSCICL+22;
}
void SystemInit(void) //系统配置
{
PCA0MD &= ~0x40; //禁止看门狗定时器
EA = 1;
}
void PortInit(void) //端口配置
{
P0SKIP = 0x0d;
P0MDIN = 0xf3; //配置P0、P1口输入输出方式
P0MDOUT = 0xff;
XBR1 = 0x40;
P1MDOUT = 0xff;
ADC0CN = 0X00;
IE=0x81; //开外部中断
IT01CF=0x45; //设置P0.5,0.4外部中断0,1
TMR2RLH=(65536-10000)/256;
TMR2RLL=(65536-10000)%256;
}
void delayms(int n) //延时n秒
{
unsigned int i;
for(;n>0;n--)
{
for(i=2211;i>0;i--);
}
}
void myoutput(int n) //输出译码
{
P1 = buff[n];
}
void Thermometer(void)
{
char flag;
unsigned int Temp1;
float temp;
unsigned int ge,shi,fen;
REF0CN = 0x0e; //选择3.3v
AMX0P = 0x10;
AMX0N = 0x11;
ADC0CF=(22114800/2500000)<<3; //ADC转换时钟
ADC0CF&=~0x07;
AD0EN = 1;
led1 = 1;
led2 = 1; ///////////初始化灯
delayms(2);
AD0BUSY=1;//开始转换
delayms(2);
while(!AD0INT);
Temp1 = ADC0H;
Temp1 <<= 8;
Temp1 &= 0xff00;
Temp1 |= ADC0L;
temp = (3.22*Temp1-776)/2.86;//(112*Temp1/47-776)*50/143;
shi = (int)temp/10;
ge = (int)temp%10;
fen = (int)(temp*10)%10;
myoutput(shi);
while(state)
goto flag1;
delayms(1000);
myoutput(ge);
while(state)
goto flag1;
delayms(1000);
myoutput(10);
while(state)
goto flag1;
delayms(500);
myoutput(fen);
while(state)
goto flag1;
delayms(2000);
flag1:
flag = 1;
}
void Voltager() ///////////////////////////////////////////////////////////////////////////////////2路电压测量
{
char flag;
float dianya1,dianya2;
int shi1,ge1,fen1,shi2,ge2,fen2; //第一路由P0.2进入,第二路由P0.3进入
unsigned int Temp1,Temp2;
led1 = 1;
led2 = 0;
REF0CN = 0x0a;
AMX0P = 0x02;AMX0N = 0x11; //测量第一路的电压值;
ADC0CF = (22114800/2500000)<<3; //ADC转换时钟
ADC0CF &= ~0x07;
AD0EN = 1;
delayms(2);
AD0BUSY = 1;
delayms(2);while(!AD0INT);
Temp1 = ADC0H;
Temp1 <<= 8;
Temp1 &= 0xff00;
Temp1 |= ADC0L;
dianya1 = 3.3/1024*Temp1;
shi1 = (int)dianya1/10;
ge1 = (int)dianya1%10;
fen1 = (int)(dianya1*10)%10;
AD0BUSY = 0;
delayms(20);
AMX0P = 0x03;AMX0N = 0x11;
delayms(2);AD0BUSY = 1;delayms(2);while(!AD0INT);
Temp2 = ADC0H;
Temp2 <<= 8;
Temp2 &= 0xff00;
Temp2 |= ADC0L;
dianya2 = 3.3/1024*Temp2;
shi2 = (int)dianya2/10;
ge2 = (int)dianya2%10;
fen2 = (int)(dianya2*10)%10;
myoutput(1);
while(state != 1)
goto flag1;
delayms(500);
myoutput(11);
while(state != 1)
goto flag1;
delayms(1000);
myoutput(shi1);
while(state != 1)
goto flag1;
delayms(1000);
myoutput(ge1);
while(state != 1)
goto flag1;
delayms(1000);
myoutput(10);
while(state != 1)
goto flag1;
delayms(500);
myoutput(fen1);
while(state != 1)
goto flag1;
delayms(1000);
myoutput(2);
while(state != 1)
goto flag1;
delayms(500);
myoutput(11);
while(state != 1)
goto flag1;
delayms(1000);
myoutput(shi2);
delayms(1000);
while(state != 1)
goto flag1;
myoutput(ge2);
delayms(1000);
while(state != 1)
goto flag1;
myoutput(10);
while(state != 1)
goto flag1;
delayms(1000);
myoutput(fen2);
while(state != 1)
goto flag1;
delayms(2000);
flag1:
flag = 1;
}
void DAC0_Init(void)
{
OSCICN |= 0x03;//bu分频 24MHz
REF0CN = 0x0f;//参考电压
IDA0CN = 0xf1;
EX1 = 1;
//IP = 0x05;
ET2 = 1;
TR2 = 1;
AD0EN = 0;
led1 = 0;
led2 = 0;
}
void DAC0_Des(void)
{
EX1 = 0;
ET2 = 0;
TR2 = 0;
}
void keyint(void) interrupt 2 using 2
{
delayms(20);
switch (pl)
{
case 0: pl=1;
TMR2RLH=(65536-1300)/256;
TMR2RLL=(65536-1300)%256;
break;
case 1: pl=2;
TMR2RLH=(65536-130)/256;
TMR2RLL=(65536-130)%256;
break;
case 2: pl=3;
TMR2RLH=(65536-13)/256;
TMR2RLL=(65536-13)%256;
break;
case 3: pl=0;
TMR2RLH=(65536-13000)/256;
TMR2RLL=(65536-13000)%256;
break;
}
while(!key2);
delayms(20);
}
void Timer2_ISR (void) interrupt 5 using 3 //定时器2中断
{
unsigned int temp;
TF2H = 0; // 清除T2溢出标志
myoutput(pl);
temp = TABLE[sf];
temp <<= 6;
temp &= 0x00c0;
IDA0L = temp;
temp = TABLE[sf];
temp >>= 2;
IDA0H = temp;
sf++;
if(sf>149)
sf = 0;
}
/*void fungen()
{
while(mode);
delayms(20);
while(mode);
state++;
if(state == 3)
state = 0;
}*/
void timer0(void) interrupt 0 using 1
{
delayms(20);
if(state < 3)
state++;
else
state = 0;
while(!mode);
delayms(20);
}
void main()
{
SystemInit(); //系统配置
SysClkInit(); //配置系统时钟
PortInit(); //端口配置
sine();
while(1)
{
switch(state)
{
case 0:
DAC0_Des();Thermometer();
break;
case 1:
Voltager();
break;
case 2:
DAC0_Init();break;
default:
state = 0;break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -