#include <msp430x14x.h>
#include "Config.h" //開發板配置頭文件,主要配置IO端口信息
#include "LCD1602.c"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uint count=0;
float sv=0;
float sv1=0;
float ev=0;
float v=0;
float p=0;
int i=0;
float jifen=0;
void Port_Init()
{
P1SEL &= ~(BIT0+BIT4+ BIT5+BIT6+BIT7); //設置IO口為普通I/O模式
P1DIR &= ~ (BIT0+BIT4+ BIT5+BIT6+BIT7); //設置IO口方向為輸入
P1IE|=(BIT0+BIT4+BIT5+BIT6+BIT7);
P1IES|=(BIT0+BIT4+BIT5+BIT6+BIT7);
P1IFG&=~(BIT0+BIT4+BIT5+BIT6+BIT7);
}
void PID()
{
sv=4.0*count/600*60;
count=0;
ev=sv1-sv;
v=5.5*ev;
TACCR1=TACCR1+v;
if((-200<ev)&&(ev<200))
{
jifen=jifen+ev;
jifen=jifen>=6000?6000:jifen;
}
else
{
jifen=0;
}
TACCR1=TACCR1+v*10+(int)(jifen);
if(TACCR1>=10000)
{
TACCR1=10000;
}
}
void PWM_Init(void) //產生10KHZ、占空比為50%的PWM信號
{
P1SEL |= BIT2; //P12口輸出PWM信號
P1DIR |= BIT2; //P12口接入一個LED發光二極管
TACCR0 = 10000; //CCR0
TACCR1 = 0; //CCR1,占空比50%,可以更改,LED燈亮度會變化
TACCTL1 = OUTMOD_7 ;//復位/置位
TACTL |= TASSEL_2 + MC_1+ID_3; //SMCLK做時鐘源,1分頻,增加計數模式
}
void TIMEB_INIT(void)
{
TBCTL |= TBSSEL_2 + MC_1+ID_3+TBCLR+TBIE;
TBCCR0 = 9999;
}
void main(void)
{
Clock_Init();
WDTCTL=WDT_ADLY_250; //看門狗設置
IE1|=WDTIE; //系統時鐘設置
Port_Init(); //端口初始化
Close_LED(); //關閉數碼管顯示
PWM_Init(); //設置TIMERA,P12輸出PWM信號
_EINT();
LCDPort_init();
delay_ms(100); //延時100ms
LCD_init(); //液晶參數初始化設置
LCD_clear();
while(1) //無限循環
{
uchar display[6]={0, 0, 0,0,0,0};
LCD_write_str(0,0,"n0=");
LCD_write_str(0,1,"n1=");
display[0]=((uint)sv)%10;
display[1]=((uint)sv)/10%10;
display[2]=((uint)sv)/100;
//display[3]=((uint)sv)/1000%10;
//display1[0]=((uint)TACCR1)/10000;
display[3]=((uint)sv1)%10;
display[4]=((uint)sv1)/10%10;
display[5]=((uint)sv1)/100;
LCD_write_char(4,0, display[2]+0x30);
LCD_write_char(5,0, display[1]+0x30);
LCD_write_char(6,0, display[0]+0x30);
//LCD_write_char(7,0, display[1]+0x30);
//LCD_write_char(8,0, display[0]+0x30);
LCD_write_char(4,1, display[5]+0x30);
LCD_write_char(5,1, display[4]+0x30);
LCD_write_char(6,1, display[3]+0x30);
if ((P1IN & BIT4)==0x00)
{
delay_ms(20);
if ((P1IN & BIT4)==0x00)
{
TACCR1 = 0;
}
while(!(P1IN & BIT4));
}
if ((P1IN & BIT5)==0x00)
{
delay_ms(20);
if ((P1IN & BIT5)==0x00)
{
TACCR1 = 5000;
sv1=330;
}
while(!(P1IN & BIT5));
}
if ((P1IN & BIT6)==0x00)
{
delay_ms(20);
if ((P1IN & BIT6)==0x00)
{
sv1=sv1+10;//if(TACCR1<=55000)
//TACCR1 = TACCR1+5000;
// else
//TACCR1 = 60000;
}
while(!(P1IN & BIT6));
}
if ((P1IN & BIT7)==0x00)
{
delay_ms(20);
if ((P1IN & BIT7)==0x00)
{
sv1=sv1-10;//if(TACCR1>=5000)
//TACCR1 = TACCR1-5000;
// else
//TACCR1 =0;
}
while(!(P1IN & BIT7));
}
}
}
#pragma vector =PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
if ((P1IFG |0xFE)==0xFF)
{
count++;
}
P1IFG=0;
}
#pragma vector =WDT_VECTOR
__interrupt void WDT_IRQ(void)
{
PID();
}
|