📄 msp430f135pro.txt
字号:
#include <msp430x13x.h>
#include <stdio.h>
#include <math.h>
#include "s0607jl.h"
//__interrupt void rxd_485(void);
//__interrupt void txd_485(void);
//void send_process(void);
/*位置1*/
uint bitset(uint var,uchar bitno)
{
return (var)|=(1<<(bitno));
}
/*位清0*/
uint bitclr(uint var,uchar bitno)
{
return (var)&=~(1<<(bitno));
}
/*位测试*/
uchar bittest(uint var,uchar bitno)
{
if((var>>bitno)&0x01==1)return 1;
else return 0;
}
/*系统延时子程序1us*/
void delay_1us(void)
{
asm("nop");
}
/*系统延时子程序us*/
void delay_us(uint n)
{
uint i=0;
for(i=0;i<n;i++)
delay_1us();
}
/*系统延时子程序1ms*/
void delay_1ms(void)
{
uint i;
for(i=1;i<(XTAL*143-2);i++)
;
}
/*系统延时子程序ms*/
void delay(uchar time)
{
uchar tt;
for(tt=0;tt<time;tt++)
delay_1ms();
}
void load_info(void)
{
uchar i,sum;
uint t;
char *Flash_ptr; // Flash pointer
FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator
FCTL3=FWKEY; // Clear Lock bit
Flash_ptr = (char *) 0x1000; // Initialize Flash pointer SegA
for(i=0,sum=0;i<=9;i++)
{
t=FCTL3;
while(bittest(t,0)){t=FCTL3;} //测试BUSY位
adjust[i]=*Flash_ptr++ ; // Read value from flash
if(i<9)sum+=adjust[i];
else
{
if(sum!=adjust[9]){for(t=0;t<=9;i++)adjust[t]=0;}
}
}
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
}
void save_info(void)
{
uchar i,sum;
uint t;
char *Flash_ptr; // Flash pointer
_DINT();
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator
Flash_ptr = (char *) 0x1000; // Initialize Flash pointer SegA
FCTL3=FWKEY; // Clear Lock bit
t=FCTL3;
while(bittest(t,0)){t=FCTL3;} //测试BUSY位
FCTL1 = FWKEY + ERASE; // Set Erase bit
*Flash_ptr = 0; // Dummy write to erase Flash segment
t=FCTL3;
while(bittest(t,0)){t=FCTL3;} //测试BUSY位
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for(i=0,sum=0;i<=9;i++)
{
t=FCTL3;
while(bittest(t,0)){t=FCTL3;} //测试BUSY位
sum+=adjust[i];
if(i==9)
{sum=sum-adjust[9];*Flash_ptr++ = sum;}
else
{*Flash_ptr++ = adjust[i];} // Write value to flash
}
t=FCTL3;
while(bittest(t,0)){t=FCTL3;} //测试BUSY位
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
//WDTCTL = WDT_ARST_1000; // WDT 8ms, ACLK, interval timer
_EINT();
}
#pragma vector=TIMERA1_VECTOR
__interrupt void timer()
{ //uint t;
//t=TAIV;
TACTL&=~(MC1+TAIFG);
ticks++;
if(ticks>=6024)
{
ticks=0;
seconds++;
LED_count++;
if((LED_count>0x50)&&(LED_count<0xA0)) //系统运行灯
P5OUT |=0x08; //P5.3 LED ON
if(LED_count==0xA0)
{
P5OUT &=0xF7; //P5.3 LED OFF
LED_count=0;
}
if(seconds>=60)
{
seconds=0;minutes++;
if(minutes>=60){minutes=0;}
}
}
if(!ad_begin)
{
ADC12CTL0 &=~ENC;
ADC12CTL0 |=ENC+ADC12SC;
}
TAR=1328; //166us
TACTL|=MC1;
}
uchar read_fl()
{
uchar fl;
fl=P2IN;
return fl;
}
uchar read_k()
{
uchar k;
k=P4IN;
return k;
}
uchar read_z()
{
uchar z;
z=P5IN;
return z&0x07;
}
#pragma vector=UART0RX_VECTOR
__interrupt void rxd_485(void)
{
uint t;
t=U0RXBUF;
switch(rec_step) //检查接收帧是否完整
{
case 0:
if(t==txd_adr) //地址为01则进入串口中断,否则不进入中断
{
rec_step=1;
U0RCTL &= ~URXWIE; //clear URXWIE=0, RX Wake up interrupt enable with data
rec_sum=t;
rec_count=0;
rec_buf[rec_count++]=t;
}
break;
case 1:
rec_buf[rec_count++]=t; //第一位正确,接收全部数据,并检验
rec_sum+=t;
if(com_flag)
{
if(rec_count>=6)//检验正确,进入发送数据处理子程序
{
rec_step=0;
U0RCTL |=URXWIE; //set URXWIE=1, RX Wake up interrupt enable with adddress
rec_sum=rec_sum-t-rec_buf[4];
if(rec_buf[4]==((uchar)(rec_sum>>8))&&(rec_buf[5]==(uchar)rec_sum))
{
if(rec_buf[1]<=0x12)send_process();
else send_process1();//za=1;
}
}
}
else
{
if(rec_count>=13)//检验正确,进入发送数据处理子程序
{
rec_step=0;
U0RCTL |=URXWIE; //set URXWIE=1, RX Wake up interrupt enable with adddress
rec_sum=rec_sum-t-rec_buf[11];
if(rec_buf[11]==((uchar)(rec_sum>>8))&&(rec_buf[12]==(uchar)rec_sum))
{
send_processadj();
}
}
}
break;
default:break;
}
}
#pragma vector=UART0TX_VECTOR
__interrupt void txd_485(void)
{
U0TCTL &=~TXWAKE ;
if(com_flag)
{
if(send_count>10)
{
ME1 &=~UTXIE0;
send_sum=0;
send_count=0;
DIS_485; //三极管驱动信号相反
delay_time=0;
return;
}
}
else
{
if(send_count>22)
{
ME1 &=~UTXIE0;
send_sum=0;
send_count=0;
DIS_485; //三极管驱动信号相反
delay_time=0;
return;
}
}
U0TXBUF =send_buf[send_count++];
}
#pragma vector=ADC_VECTOR
__interrupt void ad_interrupt(void)
{
uint t;
//t=ADC12IV;
//ADC12IFG=0;
//ADC12CTL0 &=~ENC;
//ADC12CTL0 |=ENC+ADC12SC;
switch(adc_step)
{
case 0x00:xx[adc_count]=ADC12MEM0;
break;
case 0x01:xx[adc_count]=ADC12MEM1;
break;
case 0x02:xx[adc_count]=ADC12MEM2;
break;
case 0x03:xx[adc_count]=ADC12MEM0;
break;
case 0x04:xx[adc_count]=ADC12MEM1;
break;
case 0x05:xx[adc_count]=ADC12MEM2;
break;
case 0x06:xx[adc_count]=ADC12MEM3;
break;
case 0x07:xx[adc_count]=ADC12MEM4;
break;
case 0x08:xx[adc_count]=ADC12MEM5;
break;
default:break;
}
t=ADC12MEM5;
if(adc_count<MAX_AD_COUNT)
{
adc_count++;
}
else
{
ad_begin=1;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void fre_count(void)
{
uint t;
ulong f;
if((P1IFG&0x02)==0x02)
{
P1IFG=P1IFG&0xFD;
/*
if(A_W<2000)//原来为小于100V,改为小于20V频率上传为0
{
FRE_A=0;
return;
}
*/
cura_time=TBR; //中断后读取T0时间为当前时间
if(cura_time>prea_time)t=cura_time-prea_time; //如果没有溢出,当前时间-上次时间=周期
else t=65535-prea_time+cura_time; //如果溢出,65536-上次时间+当前时间=周期
//if((t>=30000)||(t<=15000))t=20000;
prea_time=cura_time;
if((t<=30000)&&(t>=15000))
{
fredata_a++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -