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

📄 main.c

📁 Total_Program(太阳能追踪程序)
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * main.c
 */
#include "msp430x54xA.h"
#include "cry12864.h"
#include "keypad.h"
#include"BoardConfigure.h"
typedef unsigned char uchar;
typedef long int  lint;
typedef unsigned int  uint;
#define   Num_of_Results   8

/**** 变量定义区   ****/
extern uchar t_sec,t_min,t_hour;		//时钟数据
extern uchar Num;
extern uchar h1,h2;
extern uchar  t_min,m1,m2;
extern uchar   t_sec,s1,s2;
extern uchar key_val;
uint u_data,i_data,P_data,W0_data=0,W_data;				//电压,电流,功率,电能数据
uint u1,u2,i1,i2,p1,p2,p3,p4,p5,p6,j1,j2,j3,j4,j5,j6,j7;
uint t_data;
volatile unsigned int A0results[Num_of_Results];
volatile unsigned int A1results[Num_of_Results];
volatile unsigned int A2results[Num_of_Results];
volatile unsigned int A3results[Num_of_Results];
void ADS_Config(signed int temp_config_value);
signed int WriteSPI(unsigned int config, unsigned char mode);
signed int ADS_Read(void);
unsigned int PWM_Value; 
float PID_Set;
float CurrentValue ;
float MinValue;	
float MaxValue; 
float PID_Measure;
extern unsigned char m_AN;
struct PID
{
  float Ki;
  float Kp;
  float Kd;
  float E2;
  float E1;
  float E;
  float OutPut;
  float ValueSet;
} Control;
float Voltage12,Voltage34,CH1_CH2;
volatile int ADC_Result;
/**** 函数定义区   ****/
void display_lcd(void);
void display_UI(void);
void GPIO_Init();
void init_clock(void);
void SPI_Init(void);
void PID_Init(void);
unsigned int PID_Work();

/***************************主函数***************************/
void main( void )
{
	WDTCTL = WDTPW+WDTHOLD;
               
        GPIO_Init();
        SPI_Init();
        TBCCR0 = 99;
        TBCCTL3 |= OUTMOD_6;                                     
        TBCCR3 = 50;                                            // pwm initValue 50%
        TBCCTL4 |= OUTMOD_2;	 
        TBCCR4 = 50;
        TBCTL = TBSSEL_2 + MC_3 + TBCLR;                        //SMCLK,Up-Down,clr
        PID_Init();

	//P5DIR |= 0x03;				//板载LED1、LED2指示灯
	P6SEL |= 0x0f;                            // P6.0 ADC option select
	
	ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_8;         // Sampling time, ADC12 on
	ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3;       // Use sampling timer, repeated sequence
	ADC12MCTL0 = ADC12INCH_0;                 // ref+=AVcc, channel = A0
	ADC12MCTL1 = ADC12INCH_1;                 // ref+=AVcc, channel = A1
	ADC12MCTL2 = ADC12INCH_2;                 // ref+=AVcc, channel = A2
	ADC12MCTL3 = ADC12INCH_3+ADC12EOS;        // ref+=AVcc, channel = A3, end seq.
	ADC12IE = 0x08;                           // Enable ADC12IFG.3
	ADC12CTL0 |= ADC12ENC;                    // Enable conversions
	ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
	 // Initialize LFXT1
	P7SEL |= 0x03;                            // Select XT1
	UCSCTL6 &= ~(XT1OFF);                     // XT1 On
	UCSCTL6 |= XCAP_3;                        // Internal load cap

	// Loop until XT1,XT2 & DCO fault flag is cleared
	do
	{
	  UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
	                                          // Clear XT2,XT1,DCO fault flags
	  SFRIFG1 &= ~OFIFG;                      // Clear fault flags
	}while (SFRIFG1&OFIFG);                   // Test oscillator fault flag
       
	// Configure RTC_A
	RTCCTL01 |= RTCTEVIE + RTCRDYIE + RTCBCD + RTCHOLD + RTCMODE;
	                                          // RTC enable, BCD mode, RTC hold
	                                          // enable RTC read ready interrupt
	                                          // enable RTC time event interrupt
	

	Init_Lcd();                  //初始化液晶
        display_lcd();				//液晶屏显示相关信息
	Init_Keypad();				//初始化按键
        __bis_SR_register(GIE);	
	while(1)					//进入死循环
	{
		
                ADS_Config(0xB583);                          //config AIN3,AIN4 ,Namely difference channe2
                ADC_Result = ADS_Read();			          // Read data from ch1,the last time result
                Voltage34 = ADC_Result*1.0/32768*2.048;
                __delay_cycles(10000);
                ADS_Config(0x8583);                          //config AIN1,AIN2,Namely difference ch1
                ADC_Result = ADS_Read();			          // Read data from ch1,the last time result
		Voltage12 = ADC_Result*1.0/32768*2.048;
                 __delay_cycles(10000);
                CH1_CH2 = Voltage34-Voltage12; 
                Key_Event();			//判断按键
		Key_Mode();
		Key_start();
		Key_stop();
                if(m_AN==1)//dymatic mode
                {
                    if(key_val==5)
                    {
                        PID_Measure = CH1_CH2;
                        TBCCR3 = PID_Work();
                        TBCCR4 = TBCCR3;
                    }
                    if(key_val==6)
                    {
                        TBCCR3 = 50;
                        TBCCR4 = 50;
                    }
                }
		Key_Cursor();
		Key_add();
		Key_dec();
                display_lcd();
            
	}

}


/***************************lcd 显示相关信息***************************/
void display_lcd(void)
{
    uchar i;
    u_data=(uint)(((lint)A0results[0]*33)/4096);		//电压
    i_data=(uint)(((lint)A1results[0]*33)/4096);		//电流
    P_data=u_data*i_data*Num;			//功率

     u1=u_data/10;
     u2=u_data%10;


    i1=i_data/10;
    i2=i_data%10;


    p1=P_data/100;
    p5=p1/10;
    p6=p1%10;
    p2=P_data%100;
    p3=p2/10;
    p4=p2%10;

  
    j1=W_data/100;
    j2=j1/100;			//百位
    j3=j2/10;
    j4=j2%10;
    j5=j1%100;
    j6=j5/10;			//十位
    j7=j5%10;			//个位
    Write_Cmd(0x80);            //写第一行的显示地址
    for(i = 0; i < 16; i++)   //显示h:m:s 00:00:00对应的字符
    {
    	switch(i)
    	{
    		case 0:  Write_Data(0x68);break;//"h"
                case 1:  Write_Data(0x3a);break;//":"
    		case 2:  Write_Data(0x6d);break;//"m"
                case 3:  Write_Data(0x3a);break;//":"
    		case 4:  Write_Data(0x73);break;//"s"
    		case 5:  Write_Data(0x3a);break;//":"
    		case 6:  Write_Data(0x30+h1);break;//"0"
    		case 7:  Write_Data(0x30+h2);break;//"0"
    		case 8:  Write_Data(0x20);break;//"space"
    		case 9:  Write_Data(0x3a);break;//":"
    		case 10: Write_Data(0x30+m1);break;//"0"
    		case 11: Write_Data(0x30+m2);break;//"0"
    		case 12: Write_Data(0x20);break;//"space"
    		case 13: Write_Data(0x3a);break;//":"
    		case 14: Write_Data(0x30+s1);break;//"0"
    		case 15: Write_Data(0x30+s2);break;//"0"
    		default:break;
    	}
    }
    Write_Cmd(0x90);            //写第二行的显示地址
    for(i = 0; i < 16; i++)   //显示Power:对应的字符
    {
    	switch(i)
    	{
    		case 0:  Write_Data(0x50);break;//"P"
    		case 1:  Write_Data(0x6f);break;//"o"
    		case 2:  Write_Data(0x77);break;//"w"
    		case 3:  Write_Data(0x65);break;//"e"
    		case 4:  Write_Data(0x72);break;//"r"
    		case 5:  Write_Data(0x3a);break;//":"
    		case 6:  Write_Data(0x20);break;//"space"
    		case 7:  Write_Data(0x20);break;//"space"
    		case 8:  Write_Data(0x20);break;//"space"
    		case 9:  Write_Data(0x20);break;//"space"
    		case 10: Write_Data(0x30+p5);break;//"0"
    		case 11: Write_Data(0x30+p6);break;//"0"
    		case 12: Write_Data(0x2e);break;//"."
    		case 13: Write_Data(0x30+p3);break;//"0"
    		case 14: Write_Data(0x30+p4);break;//"0"
    		case 15: Write_Data(0x57);break;//"W"
    		default:break;
    	}
    }  
    Write_Cmd(0x88);            //写第三行的显示地址
    for(i = 0; i < 16; i++)    //显示Energy:对应的字符
    {
    	switch(i)
    	{
    		case 0:  Write_Data(0x45);break;//"E"
    		case 1:  Write_Data(0x6e);break;//"n"
    		case 2:  Write_Data(0x65);break;//"e"
    		case 3:  Write_Data(0x72);break;//"r"
    		case 4:  Write_Data(0x67);break;//"g"
    		case 5:  Write_Data(0x79);break;//"y"
    		case 6:  Write_Data(0x3a);break;//":"
    		case 7:  Write_Data(0x20);break;//"space"
    		case 8:  Write_Data(0x20);break;//"space"

⌨️ 快捷键说明

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