📄 工频.txt
字号:
#include <iom128v.h>
#include <math.h>
#define ICP1 PIND4
#define uchar unsigned char
#define uint unsigned int
/*pinlv*/
uchar flag=0;//标志位
uint rise1,rise2;
uchar ov,k=0;
unsigned long t;
unsigned char lcd_buff[5]={0,0,0,0,0};
const unsigned char table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,
0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
/*pinlv*/
/*****************caidi***************/
float p1,p2;
float p,d=1.047;
float AD[180];
float ma[10];
//unsigned int max;
unsigned int b;
float cc,ad,max;
//unsigned int ad;
unsigned char flag2,h=0;
unsigned char flag1=0;
unsigned char time0;
unsigned char lcd_buff0[4]={0,0,0,0};
/***************caidi************************/
/* 定义OCMJ4X8端口 */
//DATA_PORT=PORTA
#define data_port PORTA
//ASK=PORTE.6
#define ask (PINE&0x40)
//ANSWER=PORTE.7
#define set_answer asm("sbi 0x03,7")
#define clr_answer asm("cbi 0x03,7")
//RESTE=PORTC.3
#define set_reset asm("sbi 0x15,3")
#define clr_reset asm("cbi 0x15,3")
#define wait asm("nop\n nop")
/**********************************************/
/* OCMJ4X8LCD初始化 */
/**********************************************/
void ocmj_init(void)
{
MCUCR=0;
DDRA=0xff;
PORTA=0xff;
DDRE=0b10000000;
PORTE=0xff;
clr_reset;//LCD复位
delay_ms(10);
set_reset;
clr_answer;
delay_ms(10);
}
/**********************************************/
/* 写数据到LCD */
/**********************************************/
void ocmj_write(unsigned char data)
{
while(ask!=0)
;
data_port=data;
wait;
set_answer;
wait;
while(ask==0)
;
clr_answer;
}
/**********************************************/
/* 写ASCII8*16(F9)或8*8(F1)*/
/**********************************************/
void write_ASCII(unsigned type,unsigned x,unsigned y,unsigned data)
{
ocmj_write(type);
ocmj_write(x);
ocmj_write(y);
ocmj_write(data);
}
/***************************************************/
/**************************************************/
/* 传送bmp点阵数据到LCD */
/* x:0~15(字节为单位) y:0~64 */
/* bmp_p:指向图形数据的指针 */
/* high:位图高度(点阵行为单位) */
/* width:位图宽度(以字节为单位)? */
/**************************************************/
void bmp_tran(unsigned char x,unsigned char y,unsigned char high,unsigned char width,const unsigned char *bmp_p)
{
unsigned char i,j;
x+=4;
for(j=0;j<high;j++)
{
for(i=0;i<width;i++)
{
ocmj_write(0xf3);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*bmp_p);
bmp_p++;
x++;
}
x-=width;
y++;
}
}
/***************************************************/
/* 传送LCD内部汉字数据到LCD */
/* x:0x02~0x09 y:0x00~0x03 */
/***************************************************/
void hz_tran(unsigned char x,unsigned char y,unsigned char q,unsigned char w)
{
ocmj_write(0xf0);
ocmj_write(x);
ocmj_write(y);
ocmj_write(q);
ocmj_write(w);
}
/* 传送LCD内部汉字数据到LCD */
/* x:0x00~0x07 y:0x00~0x03 */
void hz_tran1(unsigned char x,unsigned char y,unsigned char *hz_p)
{
x+=2;
while((*hz_p)!=0)
{
ocmj_write(0xf0);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*hz_p-0xa0);
hz_p++;
ocmj_write(*hz_p-0xa0);
hz_p++;
if(x<0x09)
x++;
else
{
x=0x02;
y++;
}
}
}
/***************************************************/
//开机界面子程序
/***************************************************/
void delay_ms(unsigned int x)
{
unsigned int i;
for(i=1;i<(unsigned int)(x*1000-2);i++)
;
}
/*开机界面程序*/
void xianshi(void)
{
unsigned char i;
//ocmj_init();//初始化
ocmj_write(0xf4);//清屏
//工频参数测量
hz_tran(9,1,25,04);//传送内部汉字
for(i=0;i<=15;i++)
{ocmj_write(0xf7);
delay_ms(4);
}
hz_tran(9,1,38,21);
for(i=0;i<=15;i++)
{ocmj_write(0xf7);
delay_ms(4);
}
hz_tran(9,1,18,46);
for(i=0;i<=15;i++)
{ocmj_write(0xf7);
delay_ms(4);
}
hz_tran(9,1,42,93);
for(i=0;i<=15;i++)
{ocmj_write(0xf7);
delay_ms(4);
}
hz_tran(9,1,18,66);
for(i=0;i<=15;i++)
{ocmj_write(0xf7);
delay_ms(4);
}
hz_tran(9,1,33,31);
for(i=0;i<=15;i++)
{ocmj_write(0xf7);
delay_ms(4);
}
hz_tran(9,1,50,39);
for(i=0;i<=7;i++)
{ocmj_write(0xf7);
delay_ms(4);
}
ocmj_write(0xf5);
delay_ms(10);//延时
ocmj_write(0xf6);
delay_ms(10);
ocmj_write(0xf5);
delay_ms(10);
ocmj_write(0xf6);
delay_ms(10);
for(i=0;i<=32;i++)
{
ocmj_write(0xf5);
delay_ms(5);
}
//课题组成员
hz_tran1(0,0,"课题组成员");
write_ASCII(0xf1,14,4,58);
hz_tran1(3,1,"权宁辉");
hz_tran1(3,2,"马希望");
hz_tran1(3,3,"周望君");
for(i=0;i<=10;i++)
delay_ms(10);
//指导老师
for(i=0;i<2;i++)
{
ocmj_write(0xf4);
delay_ms(50);
hz_tran1(2,1,"指导老师");
write_ASCII(0xf1,16,22,58);
delay_ms(50);
}
hz_tran1(3,2,"张一斌");
for(i=0;i<=15;i++)
delay_ms(1000);
ocmj_write(0xf4);
qiao();
}
void qiao()
{
//敲键测试
hz_tran1(2,0,"敲键测试");
//按0健测电压
write_ASCII(0xf1,4,19,48);
hz_tran1(1,1,"电压");
delay_ms(299);
//按1健测电流
write_ASCII(0xf1,4,35,49);
hz_tran1(1,2,"电流");
delay_ms(299);
//按2健测相角
write_ASCII(0xf1,4,51,50);
hz_tran1(1,3,"相角");
delay_ms(299);
//按3健测频率
write_ASCII(0xf1,11,19,51);
hz_tran1(4,1,"频率");
delay_ms(299);
//按4健测有功功率
write_ASCII(0xf1,11,35,52);
hz_tran1(4,2,"有功功率");
delay_ms(299);
//按5健测无功功率
write_ASCII(0xf1,11,51,53);
hz_tran1(4,3,"无功功率");
}
/*延时程序*/
void delay(unsigned int x)
{
unsigned int i;
for(i=0;i<x;i++)
{ ; ; }
}
/*void delay(unsigned int x)
{
unsigned int i;
for(i=0;i<x;i++)
for(i=0;i<10;i++);
}*/
/******频率测量子程序**********/
#pragma interrupt_handler time1_ov:15
void time1_ov(void)
{
ov++;
}
#pragma interrupt_handler time1_capt:12
void time1_capt(void)
{
if(ICP1)
{ if(k==0)
{
rise1=ICR1;
k++;
}
else
{
rise2=ICR1;
t=(unsigned long)rise2-(unsigned long)rise1+ov*65535;//计算结果
t=62500*1.048/t;
flag=1;//置标志位;
k=0;
delay(1000);
ov=0;
}
}
}
void lcd_display(void)
{
write_ASCII(0xf9,13,16,table[lcd_buff[4]]);
write_ASCII(0xf9,14,16,table[lcd_buff[3]]);
write_ASCII(0xf9,15,16,table[lcd_buff[2]]);
write_ASCII(0xf9,16,16,table[lcd_buff[1]]);
write_ASCII(0xf9,17,16,table[lcd_buff[0]]);
}
void zhuan()
{
lcd_buff[4]=t/10000;
lcd_buff[3]=t%10000/1000;
lcd_buff[2]=t%1000/100;
lcd_buff[1]=(t%100)/10;
lcd_buff[0]=t%10;
}
void cepin()
{
SREG=0X80;
DDRD=~(1<<4);
PORTD=0XFF;
TCNT1=0;
TIMSK=0X24;//TC1捕获中断允许
TCCR1A=0X00;
TCCR1B=0x43;//TC1初始化,64分频,上升沿触发
//TCCR1B=0x44;
while(1)
{
if(flag==1) break;
}
ocmj_init();
hz_tran(2,1,43,89);
hz_tran(3,1,18,66);
hz_tran(4,1,38,21);
hz_tran(5,1,34,42);
write_ASCII(0xf9,12,16,58);
// while(1)
//{
zhuan();
delay(500);
lcd_display();
// }
}
/****************************采集子程序************************************/
void lcd_display1(void)
{
write_ASCII(0xf9,11,16,table[lcd_buff0[0]]);
write_ASCII(0xf9,12,16,0x2e);
write_ASCII(0xf9,13,16,table[lcd_buff0[1]]);
write_ASCII(0xf9,14,16,table[lcd_buff0[2]]);
write_ASCII(0xf9,15,16,table[lcd_buff0[3]]);
}
void time_init()
{
TCCR0=0;
SREG=0X80;
TIMSK=0x01;//溢出中断允许
ASSR=0;
TCNT0=200;
//TCNT0=227;
TCCR0=0x02;//系统时钟8分频
}
#pragma interrupt_handler time0_yichu:17
void time0_yichu()
{
TCNT0=200;
//TCNT0=227;
time0=1;
flag1=1;
DDRB=0XFF;
PORTB=0;
}
void initial_ADC( void)
{
SREG=0X80; //开中断
ADMUX=0X03; //ADC3通道 右对齐
ADCSRA=0Xc8; //外部参考电压,AREF=5V;开ADC转换,单次模式,ADC中断开,
//时钟分频无
flag1=0;
}
/*****************************************/
#pragma interrupt_handler ADC128:22
void ADC128(void)
{
unsigned char count;
// ad=(float)ADC*5/1024;
// AD[h]=ad;
flag2=1;
for ( count=0;count<12;count++)
{
ad=(float)ADC*5/1024;
AD[h]+=ad;
delay(2);
}
AD[h]=ad/12;
}
void caidi()
{
unsigned char i;
for(i=0;i<360;i++)
{
time_init();
while(flag1==0) ;
initial_ADC();
while(flag2!=1) ;
h++;
flag2=0;
}
}
void zhuan1()
{
unsigned char i;
lcd_buff0[0]=b/1000;
lcd_buff0[1]=b%1000/100;
lcd_buff0[2]=b%100/10;
lcd_buff0[3]=b%10;
}
void zuida()
{
unsigned char i;
max=AD[0];
for(i=0;i<180;i++)
{
if(AD[i]>max)max=AD[i];
else
i++;
}
}
void caiyang()
{
unsigned char i;
for(i=0;i<10;i++)
{
caidi();
delay(50);
zuida();
ma[i]=max;
}
max=(ma[0]+ma[1]+ma[2]+ma[3]+ma[4]+ma[5]+ma[6]+ma[7]+ma[8]+ma[9])/10.0;
max=max/1.414;
}
/***********功率显示子程序***********************/
void lcd_display2(void)
{
write_ASCII(0xf9,13,16,table[lcd_buff0[0]]);
write_ASCII(0xf9,14,16,0x2e);
write_ASCII(0xf9,15,16,table[lcd_buff0[1]]);
write_ASCII(0xf9,16,16,table[lcd_buff0[2]]);
write_ASCII(0xf9,17,16,table[lcd_buff0[3]]);
}
/*键盘程序*/
/*键盘扫描函数,没有键按下返回0x7f*/
unsigned char scan_key(void)
{
unsigned char i,temp;
//DDRD=0xdf;
//PORTD=0xff;
DDRB=0x0f;
PORTB=0xff;
for (i=0;i<4;i++)
{
PORTB=~(1<<i); //键盘线扫描
// delay(10); //等待低电平稳定
delay(5);
temp=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
if (temp!=0xf0)//如果有键按下,延时10ms消抖
{
//delay(10); //可消除显示抖动
delay(5);
temp=PINB&0xf0;//再读键盘
if (temp!=0xf0)
{
temp&=0xf0;
switch (temp) //计算键值
{
case 0x70:temp=15-(3-i)*4;break;
case 0xb0:temp=14-(3-i)*4;break;
case 0xd0:temp=13-(3-i)*4;break;
case 0xe0:temp=12-(3-i)*4;break;
default:temp=0x7f;
}
return temp;
}
}
PORTB=0xff;
}
return 0x7f;
}
unsigned char keypad(void)
{
unsigned char temp1,temp2;
temp1=scan_key();
if (temp1==0x7f) return 0x7f;
do
temp2=scan_key();
while (temp1==temp2);
return temp1;
}
void main()
{
unsigned char qq;
float p1,p2;
ocmj_init();
xianshi();//显示开机界面
while(1)
{
//qq=scan_key();
qq=keypad();
switch(qq)
{
case 0:
DDRG=0XFF;
PORTG=~(1<<0);//PG0(33)为0选则电压
ocmj_write(0xf4);
hz_tran1(1,1,"电流");
write_ASCII(0xf9,10,16,58);
caiyang();
b=(unsigned int)(max*1000);
zhuan1();
lcd_display1();
break;
case 1:
DDRG=0XFF;
PORTG=1<<0;//PG0(33)为1则选电流
ocmj_write(0xf4);
hz_tran1(1,1,"电压");
write_ASCII(0xf9,10,16,58);
caiyang();
b=(unsigned int)(max*1000);
zhuan1();
lcd_display1();
break;
case 2:
ocmj_init();
ocmj_write(0xf4);
qiao();
break;
case 3:
ocmj_write(0xf4);
cepin();
break;
case 4:
// float p1,p2;
ocmj_write(0xf4);
hz_tran1(0,1,"有功功率");
write_ASCII(0xf9,12,16,58);
DDRG=0xff;
PORTG=~(1<<0);
caiyang();
p1=max;
delay(10);
PORTG=1<<0;
caiyang();
p2=max;
p=p1*p2*cos(d);
b=(unsigned int)(p*1000);
zhuan1();
lcd_display2();
break;
case 5:
//float p1,p2;
ocmj_write(0xf4);
hz_tran1(0,1,"无功功率");
write_ASCII(0xf9,12,16,58);
DDRG=0xff;
PORTG=~(1<<0);
caiyang();
p1=max;
delay(10);
PORTG=1<<0;
caiyang();
p2=max;
p=p1*p2*sin(d);
b=(unsigned int)(p*1000);
zhuan1();
lcd_display2();
break;
}
/*if(scan_key()==3)
{
ocmj_write(0xf4);
cepin();
}
if(scan_key()==0)//测量电压
{
DDRG=0XFF;
PORTG=~(1<<0);//PG0(33)为0选则电压
ocmj_write(0xf4);
hz_tran1(1,1,"电流");
write_ASCII(0xf9,10,16,58);
caiyang();
b=(unsigned int)(max*1000);
zhuan1();
lcd_display1();
}
if(scan_key()==1)
{
DDRG=0XFF;
PORTG=1<<0;//PG0(33)为1则选电流
ocmj_write(0xf4);
hz_tran1(1,1,"电压");
write_ASCII(0xf9,10,16,58);
caiyang();
b=(unsigned int)(max*1000);
zhuan1();
lcd_display1();
}
if(scan_key()==2)//返回主菜单
{
ocmj_init();
ocmj_write(0xf4);
qiao();
}
if(scan_key()==4)//测有功功率
{
float p1,p2;
ocmj_write(0xf4);
hz_tran1(0,1,"有功功率");
write_ASCII(0xf9,12,16,58);
DDRG=0xff;
PORTG=~(1<<0);
caiyang();
p1=max;
delay(10);
PORTG=1<<0;
caiyang();
p2=max;
p=p1*p2*cos(d);
b=(unsigned int)(p*1000);
zhuan1();
lcd_display2();
}
if(scan_key()==5)//测无功功率
{
float p1,p2;
ocmj_write(0xf4);
hz_tran1(0,1,"无功功率");
write_ASCII(0xf9,12,16,58);
DDRG=0xff;
PORTG=~(1<<0);
caiyang();
p1=max;
delay(10);
PORTG=1<<0;
caiyang();
p2=max;
p=p1*p2*sin(d);
b=(unsigned int)(p*1000);
zhuan1();
lcd_display2();
}*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -