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

📄 shiyan.c

📁 基于dsPIC30F的 智能型变压器有载分接开关参数综合测试仪 C语言
💻 C
📖 第 1 页 / 共 4 页
字号:
#define __dsPIC30F4014__
#include <p30f4014.h>
#include <math.h>
#include <uart.h>
#include <timer.h>
#include<spi.h>

//定义配置位

#define  nop()  asm("nop")
#define	 CLRWDT() asm("clrwdt")

#define  ADL     PORTBbits.RB0 
#define  ADY     PORTBbits.RB1  
#define  KEY1    PORTBbits.RB3  
#define  KEY2    PORTBbits.RB4 
#define  KEY3    PORTBbits.RB5 
#define  KEY4    PORTCbits.RC13  
#define  DASCLK  PORTDbits.RD9  
#define  DADIN   PORTDbits.RD3        
#define  LCDD    PORTFbits.RF2  
#define  LCDK    PORTFbits.RF3  
#define  PR      PORTFbits.RF4
#define  PT      PORTFbits.RF5
#define  PDSR    PORTFbits.RF6 
#define  PCTS    PORTBbits.RB2 
#define  IO1     PORTDbits.RD8 
#define  IO2     PORTDbits.RD2
#define  IO3     PORTBbits.RB8 
#define  IO4     PORTBbits.RB12
#define  DY1     PORTBbits.RB9
#define  DY2     PORTBbits.RB10
#define  DL1     PORTDbits.RD0
#define  DL2     PORTDbits.RD1
#define  SLCK    PORTFbits.RF1
#define  SIO     PORTFbits.RF0
#define  SRET    PORTAbits.RA11

//定义变量



//函数声明

void delay(unsigned int delay);
void inital(void);
void uart1int(void);
void ADDY(void);
void ADDL(void);
void InitLCD(void);
void LCDOutData(unsigned char dat);
void LCDOutCONT(unsigned char dat);
void SUBYEAR(void)
void SUBMONTH(void)
void SUBDAY(void)
void SUBHUOR(void)
void SUBMINUTE(void)
void SUBSECOND(void)
void SHIJIAN(void)
void CELIANG(void)
void ADDYEAR(void)
void ADDMONTH(void)
void ADDDAY(void)
void ADDHUOR(void)
void ADDMINUTE(void)
void ADDSECOND(void)
void SHIJTZ2(void)
void SHIJTZ3(void)
void SHIJTZ4(void)
void SHIJTZ5(void)
void SHIJTZ6(void)
void SHIJTZ7(void)
void CHUSHIXS(void)
void DAYIN(void)
void SJ(void)
void CL(void)
void CL1(void)
void CL2(void)
void CL3(void)
void TIAOZHENGSJ(void)
void XIANSHISJ(void)
void InitUART2(void) 
unsigned char UART2Write(unsigned char AA)
void __attribute__((__interrupt__)) _U2TXInterrupt(void)  
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
void _attribute_((_interrupt_))_key(void)
unsigned int DAWrite(unsigned int AA)
unsigned int SZWrite(unsigned int AA,unsigned int BB)  
unsigned int SZRead(unsigned int AA,unsigned int BB)


float dianya,dianliu;
float A,B,C,D,E,F;
unsigned int baudvalue;                                 // Holds the value of baud register
unsigned int U2MODEvalue;                               // Holds the value of uart config reg 
unsigned int U2STAvalue;                                // Holds the information regarding uart TX & RX interrupt modes


int main (void)
{
  unsigned char a1,b1,c1,d1;
  //unsigned char ch_status1,ch_status2; 
 // int c,d,e,f,g,i;
  //int max1, max2;
 // int min1, min2;
 // unsigned int base;
 // volatile unsigned int fudu1,fudu2;
  //double  maxd1,mind1,maxd2,mind2;
 // double  FuDud1,FuDud2;
  inital();
  delay(5000);
  InitLCD();
  a1=0x80;
  b1=0x41;
  LCDOutCONT(a1);
  delay(500);
  LCDOutData(b1);
  
}


  //延时子程序
void delay(unsigned int delay)
{
    while (--delay);
} 


  //系统初始化
void inital(void)
{
  
  TRISBbits.TRISB3=1;         // set KEY1 is input
  TRISBbits.TRISB4=1;         // set KEY2 is input
  TRISBbits.TRISB5=1;         // set KEY3 is input
  TRISCbits.TRISC13=1;        // set KEY4 is input
  TRISBbits.TRISB9=0;         // set DY1 is output
  TRISBbits.TRISB10=0;        // set DY2 is output
  TRISDbits.TRISD0=0;         // set DL0 is output
  TRISDbits.TRISD1=0;         // set DL1 is output 
  TRISDbits.TRISD8=0;         // set I/O1 is output
  TRISDbits.TRISD2=0;         // set I/O2 is output
  TRISBbits.TRISB8=0;         // set I/O3 is output
  TRISBbits.TRISB12=0;        // set I/O4 is output
  TRISFbits.TRISF2=1;         // set LCDD is input
  TRISFbits.TRISF3=1;         // set LCDK is input
   
}
 


   //电流采样
void ADDL(void)
{  
   IEC0bits.ADIE=0;
   ADPCFG=0XFFFE;
   ADCON1=0X000;
   ADCHS=0X0000;
   ADCSSL=0;
   ADCON3=0X0002;
   ADCON2=0;
   ADCON1bits.ADON=1;
   ADCON1bits.DONE=0;
   ADCON1bits.SAMP=1;
   delay(200);
   ADCON1bits.SAMP=0;
   while(ADCON1bits.DONE);
   DIANLIU=ADCBUF0;

}
   

    //电压采样
void ADDY(void)
{  
   IEC0bits.ADIE=0;
   ADPCFG=0XFFFD;
   ADCON1=0X000;
   ADCHS=0X0001;
   ADCSSL=0;
   ADCON3=0X0002;
   ADCON2=0;
   ADCON1bits.ADON=1;
   ADCON1bits.DONE=0;
   ADCON1bits.SAMP=1;
   delay(200);
   ADCON1bits.SAMP=0;
   while(ADCON1bits.DONE);
   DIANYA=ADCBUF1;
}



//LCD数据字输入程序
void LCDOutData(unsigned char dat) 
{ 
    int i;
    DELAY(500)
    W0=dat;
    TRISFDbits.TRISF2=0;
    TRISFDbits.TRISF3=0; 			//设置F口的2、3为输出 
    for(i=0,i<5,i++)
      { 
         LCDD=1;				        	//开始传输
         LCDK=0;
         LCDK=1;
      }
   
	LCDD=0;                        //写入到数据寄存器
    LCDK=1;
    LCDK=0;
	LCDD=1;
    LCDK=1;
    LCDK=0;
	LCDD=0;
    LCDK=1;
    LCDK=0;
    W0<<8;
 
    for(i=0,i<4,i++)
       {if ((W0<<1)&0x80)
          {
            LCDD=1;
          }
        else 
          {
            LCDD=0;
          }
        LCDK=1;
        LCDK=0;
       }
    
    for(i=0,i<4,i++)
      { 
         LCDD=0;				        	//4结束
         LCDK=1;
         LCDK=0;
      }
                              
   for(i=0,i<4,i++)
       {if ((W0<<1)&0x80)
          {
            LCDD=1;
          }
        else 
          {
            LCDD=0;
          }
        LCDK=1;
        LCDK=0;
       }
    
    for(i=0,i<4,i++)
      { 
         LCDD=0;				        	//4结束
         LCDK=1;
         LCDK=0;
      }
    
    DELAY(500);
}


//LCD控制字输入程序
void LCDOutCONT(unsigned char dat) 
{ 
     int i;
    DELAY(500)
    W0=dat;
    TRISFDbits.TRISF2=0;
    TRISFDbits.TRISF3=0; 			//设置F口的2、3为输出 
    for(i=0,i<5,i++)
      { 
         LCDD=1;				        	//开始传输
         LCDK=0;
         LCDK=1;
      }
   
	LCDD=0;                         //写入到控制寄存器
    LCDK=1;
    LCDK=0;
	LCDD=0;
    LCDK=1;
    LCDK=0;
	LCDD=0;
    LCDK=1;
    LCDK=0;
    W0<<8;
 
    for(i=0,i<4,i++)
       {if ((W0<<1)&0x80)
          {
            LCDD=1;
          }
        else 
          {
            LCDD=0;
          }
        LCDK=1;
        LCDK=0;
       }
    
    for(i=0,i<4,i++)
      { 
         LCDD=0;				        	//4结束
         LCDK=1;
         LCDK=0;
      }
                              
   for(i=0,i<4,i++)
       {if ((W0<<1)&0x80)
          {
            LCDD=1;
          }
        else 
          {
            LCDD=0;
          }
        LCDK=1;
        LCDK=0;
       }
    
    for(i=0,i<4,i++)
      { 
         LCDD=0;				        	//4结束
         LCDK=1;
         LCDK=0;
      }
    
    DELAY(500);
}  




//LCD初始化程序
void InitLCD(void)
{
    DELAY(500);
    LCDOutCONT(0x30);
    DELAY(500);   
    LCDOutCONT(0x30);
    DELAY(500);
    LCDOutCONT(0x0c);
    DELAY(500);
    LCDOutCONT(0x01);
    DELAY(500);
    LCDOutCONT(0x07);
    DELAY(500); 
}



//键盘初始化程序
void keyinitial(void)
{ 
  CNEN1bits.CN5=1;       //中断使能
  CNEN1bits.CN6=1;  
  CNEN1bits.CN7=1;

  
  CNPU1bits.CN1PUE=1;
  CNPU1bits.CN5PUE=1;
  CNPU1bits.CN6PUE=1;
  
}




//键盘中断程序
void _attribute_((_interrupt_))_key(void)
{
 int K;
 IFS0bits.CNIF=0;            //清中断标志位
  K=1500;                    //延时
  while (--K);

  if(PORTBbits.RB3==0)
  {
     if(D!=0)
      {
      if(D==1)
        SUBYEAR(void);            //年数减
      if(D==2)
        SUBMONTH(void);           //月数减
      if(D==3)
        SUBDAY(void);             //天数减
      if(D==4)
        SUBHUOR(void);            //时数减
      if(D==5)
        SUBMINUTE(void);          //分数减
      if(D==6)
        SUBSECOND(void);          //秒数减
      }
     else if(C!=0)
        {
          if(--C<1)
           C=3;
           SHIJIAN(void);                    //时间显示、调整、返回选择。
        }
     else if(B!=0)
        {
          if(--B<1)                          //量程选择
             B=4;
             CELIANG(void);
        }
     else if(--A<1)
        A=3;                                 //在初始化中要将A=1。选择测量、时钟、打印。
    }

  if(PORTBbits.RB4==0)
     {
      if(D!=0)
        { 
        if(D==1)         
           ADDYEAR(void);              //年数加
        if(D==2)
           ADDMONTH(void);             //月数加
        if(D==3)
           ADDDAY(void);               //天数加
        if(D==4)
           ADDHUOR(void);              //时数加
        if(D==5)
           ADDMINUTE(void);            //分数加
        if(D==6)
           ADDSECOND(void);            //秒数加
        }
     else if(C!=0)
        {
          if(++C>3)
             C=1;
             SHIJIAN(void);                    //时间显示、调整、返回选择。
        }
     else if(B!=0)
        {
          if(++B>4)                          //量程选择
             B=1;
             CELIANG(void);
        }
     else if(++A>3)
        A=1;                                 //在初始化中要将A=1。选择测量、时钟、打印。
    }


   if(PORTBbits.RB5==0)
    {  if(D!=0)                 //是否为时钟调整
       {
         if(D==1)               //年调整完成
          {
           D++;
           SHIJTZ2(void);//调整到月显示
          }
         if(D==2)               //月调整完成
          {
           D++;
           SHIJTZ3(void);//调整到天显示
          }
         if(D==3)               //天调整完成
          {
           D++;
           SHIJTZ4(void);//调整到时显示
          }
         if(D==4)               //时调整完成
          {
           D++;
           SHIJTZ5(void);//调整到分显示
          }
         if(D==5)               //分调整完成
          {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -