📄 main.c
字号:
/*
* 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 + -