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

📄 工频.txt

📁 本程序实现测量工频频率、功率因数、有功功率、无功功率、电压、电流等功能
💻 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 + -