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

📄 yc.c

📁 msp430为核心
💻 C
📖 第 1 页 / 共 5 页
字号:
#pragma language=extended

#include  <stdio.h>
#include <io430x14x.h>
#include <intrinsics.h>
#include <math.h>
#include <string.h>
#include  "yc.h"
#include  "yc1.h"

/*FLASH操作函数*/
void flash_init(void)
{
	FCTL2=FWKEY+FSSEL1+FN0;   			//时钟源:SMCLK,不分频
}

void flash_clear(INT16S *p)
{
	while((FCTL3&BUSY)==BUSY);
  FCTL1=FWKEY+ERASE;							//段擦除
  FCTL3=FWKEY;										//解锁
	*p=0;                           //空写
}

void flash_clear_byte(INT8U *p)
{
	while((FCTL3&BUSY)==BUSY);
  FCTL1=FWKEY+ERASE;							//段擦除
  FCTL3=FWKEY;										//解锁
	*p=0;                           //空写
}

void flash_wt_word(INT16S *p,INT16S value)
{
	while((FCTL3&BUSY)==BUSY);
  FCTL3=FWKEY;                    //解锁
	FCTL1=FWKEY+WRT;                //编程
	*p=value;
  FCTL1=FWKEY;                    //不编程
  FCTL3=FWKEY+LOCK;								//闭锁
  while((FCTL3&BUSY)==BUSY);
}

void flash_wt_byte(INT8U *p,INT8U value)
{
	while((FCTL3&BUSY)==BUSY);
  FCTL3=FWKEY;                    //解锁
	FCTL1=FWKEY+WRT;                //编程
	*p=value;
  FCTL1=FWKEY;                    //不编程
  FCTL3=FWKEY+LOCK;								//闭锁
  while((FCTL3&BUSY)==BUSY);
}
/*FLASH操作函数*/

INT8U sum_check(INT8U *check_data,INT8U len)
{
	INT16U v;
  INT8U i,sum;	
	v=0;
	for(i=0;i<len;i++)
	v+=*(check_data+i);
	sum=v&0xff;	
	sum=~sum+1;
	sum=sum&0x7f;
	sum=sum|0x40;
	return sum;
}

void word_to_byte(INT16S *p1,INT8U *p2,INT8U len)  
{
	INT8U 	i;
	INT16S v;
	
	for(i=0;i<len;i++)
	   {
	   	 v=*(p1+i);
		   *p2++=v & 0xFF;
		   *p2++=(v>>8) & 0xFF;
	   }
}

void byte_to_byte(INT8U *p1,INT8U *p2,INT8U len)  
{
	INT8U i;
	
	for(i=0;i<len;i++)
	   {*p2=*(p1+i);
		   *p2++;
	   }
}

void read_sys_factor(void)
{
	INT8U  i;
	INT16S *p;
	INT8U  *p1;

 p=(INT16S *)flash_addr_b;	
 for(i=0;i<16;i++)
    {kch[i]=*p;
     p++;
 	 }
 	 
 p1=(INT8U *)flash_addr_a;
 for(i=0;i<90;i++)
    {peizhi[i]=*p1;
     *p1++;
 	 }
 for(i=0;i<12;i++)
    phone[i]=peizhi[i];
    	 
 p_full=((INT16U)peizhi[13]<<8)+peizhi[12];
 p_alarm=((INT16U)peizhi[15]<<8)+peizhi[14];
 
 for(i=0;i<12;i++)
   server_certer[i]=peizhi[16+i];
   
 for(i=0;i<16;i++)
    dc_name[i]=peizhi[i+28];
   
 for(i=0;i<8;i++)
    sms_name[i]=peizhi[i+44];
    
 for(i=0;i<2;i++)
    sms_blank[i]=peizhi[i+52];   
   
 for(i=0;i<32;i++)
   yx_name[i]=peizhi[i+54];
   
 for(i=0;i<2;i++)
   dc1_mandu[i]=peizhi[i+86];

 for(i=0;i<2;i++)
   dc2_mandu[i]=peizhi[i+88];     
   	
 for(i=0;i<YX_BYTE_NUM;i++)
				yx_polarity[i]=0xfe;

 	 if(sms_blank[1]!=0)
	    sms_blank_flag=(sms_blank[0]-0x30)*10+(sms_blank[1]-0x30);
	 else
	 	sms_blank_flag=sms_blank[0]-0x30;
	
  if(((sms_blank[0]==0x00)&&(sms_blank[1]==0x00))||((sms_blank[0]==0xff)&&(sms_blank[1]==0xff))||((sms_blank[0]==0x30)&&(sms_blank[1]==0x30)))
 		   sms_blank_flag=2;
 		   
 sms_blank_flag_back=sms_blank_flag;

	my_id=P5IN & 0xf;
}

void com_write_mem(INT16U addr,INT8U *p,INT8U len)
{
	INT8U  i,n;
	INT16U temp;
	INT16S *p1;
	INT8U *p2;
		
	if (len>com_msg_byte) len=com_msg_byte;
	if (addr>=flash_addr_b&&addr<flash_addr_a)     /*模拟量通道系数区*/
				{
				for(i=0;i<16;i++)
								 kch_bak[i]=kch[i];

				 n=(addr-flash_addr_b)>>1;              //除2操作
				 len=len>>1;
				 for(i=0;i<len;i++)
								{
									temp=*(p+1);
								  kch_bak[n+i]=(temp<<8)+*p;
								  p=p+2;
								}

				 p1=(INT16S *)flash_addr_b;
				 __disable_interrupt();
				 WDTCTL = WDTPW + WDTHOLD;
				 flash_clear(p1);
				 p1=(INT16S *)flash_addr_b;
				 for(i=0;i<16;i++)
				    {
				    	flash_wt_word(p1,kch_bak[i]);
				      p1++;
				 		}
			   __enable_interrupt();

				 p1=(INT16S *)flash_addr_b;			
					for (i=0;i<16;i++)
									{
										if (*p1!=kch_bak[i])
													{
														wt_mem_err=0;
														i=16;
													}
										p1++;
									}
               
					if (wt_mem_err!=0)
								{
									wt_mem_err=0x55;
									for (i=0;i<16;i++)
											kch[i]=kch_bak[i];
								}
				}
	if (addr>=flash_addr_a&&addr<flash_addr_ab) /*电话号码与站名区 12字节号码 4字节的压力设置12字节短信服务中心*/
				{
				for(i=0;i<90;i++)
								peizhi_bak[i]=peizhi[i];

				 n=addr-flash_addr_a;				 
				 for(i=0;i<len;i++)
								{
								 peizhi_bak[i+n]=*p++;								
								}

				 p2=(INT8U *)flash_addr_a;
				 
				 __disable_interrupt();
				 WDTCTL = WDTPW + WDTHOLD;
				 flash_clear_byte(p2);
				 p2=(INT8U *)flash_addr_a;
				 for(i=0;i<90;i++)
				    {
					    flash_wt_byte(p2,peizhi_bak[i]);
					    *p2++;
					    P3OUT^=0x08;      // P3.0=RUN(output),P3.3=WATCH_DOG(output)
				 	  }
				 	 __enable_interrupt();

				 p2=(INT8U *)flash_addr_a;		
				 for (i=0;i<90;i++)
						{
							if (*p2!=peizhi_bak[i])
										{
											wt_mem_err=0;
											i=90;
										}
							*p2++;
						}
               
				 if (wt_mem_err!=0)
						{
							wt_mem_err=0x55;
							for (i=0;i<12;i++)
							phone[i]=peizhi_bak[i];
							p_full=((INT16U)peizhi_bak[13]<<8)+peizhi_bak[12];
							p_alarm=((INT16U)peizhi_bak[15]<<8)+peizhi_bak[14];
							for(i=0;i<12;i++)
							server_certer[i]=peizhi_bak[16+i];
							for(i=0;i<16;i++)
							dc_name[i]=peizhi_bak[i+28];
							for(i=0;i<8;i++)
							sms_name[i]=peizhi_bak[i+44];
							for(i=0;i<2;i++)
							sms_blank[i]=peizhi_bak[i+52];
							for(i=0;i<32;i++)
							yx_name[i]=peizhi_bak[i+54];
							for(i=0;i<2;i++)
							dc1_mandu[i]=peizhi_bak[i+86];
							for(i=0;i<2;i++)
							dc2_mandu[i]=peizhi_bak[i+88];
						}
				}

read_sys_factor();
}

void delay(INT16U cnt) 
{INT16U k,i;  
	
	k=0; 
	for(i=0;i<cnt;i++)                          	
		  k++;  
}

INT16U PPPfcs16(INT8U *cp, INT16U len) 
{
  INT16U fcs;
  fcs=0xffff;
  while (len--)
    fcs=(fcs>>8)^fcstab[(fcs^(*cp++))&0xff];
  return (fcs);
}

INT8U  bittst(INT8U *p,INT16U n)
{   
  INT16U v;
  v= *p & bit1_tab[n];
  if (v!=0)	v= 0xff;
  return v;
}

void com_init(INT8U port)
{	

	memset(&com0_tx_buf[0],0,16);
	memset(&com0_rx_buf[0],0,16);
	
	memset(&com1_tx_buf[0],0,256);
	memset(&com1_rx_buf[0],0,128);
		
  com_rx_count[port]=0;
  com_tx_count[port]=0;
  com_tx_point[port]=0;
  com_rx_ok[port]=0;
  com_rx_time[port]=0;
  com_tx_time[port]=1000;
  				
  
  if (port==0)                  /*与变频器通讯 4800 n 8 1*/
  {
    U0CTL&=~SWRST;
    U0CTL = CHAR+PENA;             //8-bit character
    U0TCTL=SSEL1;        				   //UCLK = SMCLK   
    U0BR0 = 0x82;                  //8M/4800 =1666.66
    U0BR1 = 0x06;                  //
    U0MCTL = 0x55;                 //modulation 01010101 
    ME1|=URXE0 +UTXE0;    				 //Enable USART0 TXD/RXD
    //IE1|=URXIE0+UTXIE0;          //Enable USART0 RX TX interrupt
    P3SEL|=0x30;									 //P3.4,5=USART0 TXD/RXD
    P3DIR|=0x10;									 //P3.4 OUTPUT
  }
  else if (port==1)             /* 与tc35i通讯或和掌上电脑通讯 4800 n 8 1*/
  {
    U1CTL&=~SWRST;
    U1CTL= CHAR;            			 //8-bit character 
    U1TCTL=SSEL1;        				   //UCLK = SMCLK   
    U1BR0 = 0x82;                  //8M/4800 =1666.66
    U1BR1 = 0x06;                  //
    U1MCTL = 0x55;                 //modulation 01010101 
    ME2|=URXE1 +UTXE1;    				 //Enable USART1 TXD/RXD
    //IE2|=URXIE1+UTXIE1;          //Enable USART1 RX TX interrupt
    P3SEL|=0xc0;									 //P3.6,7=USART1 TXD/RXD
    P3DIR|=0x40;									 //P3.6 OUTPUT
  }

}

void timerb_init(void)
{
	time_per=8000;
	TBCTL=TBSSEL1+TBCLR;     			//SMCLK, clear TBR,1分频
  TBCCTL0=CCIE;                 //比较寄存器0中断
  TBCCR0=time_per;							//T=0.625ms
  TBCTL|=MC0;                   //增计数模式
}

void adc12_init(void)
{
	ADC12CTL0&=~ENC;              //停止A/D转换
//单通道单次采样/转换,信号源ADC12SC,采样信号来自采样定时器
// ADC12CTL0=ADC12ON+REF2_5V+REFON;	  														//开启ADC内核
 ADC12CTL0=ADC12ON+REF2_5V+REFON+SHT0_2+SHT0_1+SHT0_0;	          //开启ADC内核
 ADC12CTL1=ADC12SSEL1+SHP;																				//时钟源MCLK
 ADC12IE=0;
 ADC12CTL0|=ENC;
}

void yc_init(void)
{
	INT8U  i;
	INT16S *p;
	
	p=&yc.DC[0];
	for(i=0;i<yc_words;i++)
				{
				 *p=0;
				 p++;
				}
				
	ad_point=0;
	
	fourier_flag=0;
	fourier_index=0;
  wt_mem_err=0x55;
}

void com_handle()
{
	INT8U cc;
	if ((IFG1&URXIFG0)==URXIFG0)
	{
		cc=U0RXBUF;
		com0_rx_buf[com_rx_count[0]]=cc;
		com_rx_count[0]=(com_rx_count[0]+1);
		com_rx_time[0]=50;
	}
	if (com_tx_count[0]>0 && ((IFG1 & UTXIFG0) == UTXIFG0))
	{
		U0TXBUF=com0_tx_buf[com_tx_point[0]++];
		com_tx_count[0]--;
	}

	if ((IFG2&URXIFG1)==URXIFG1)
	{
		cc=U1RXBUF;
		com1_rx_buf[com_rx_count[1]]=cc;
		com_rx_count[1]=(com_rx_count[1]+1);
		com_rx_time[1]=50;
	}
	if (com_tx_count[1]>0 && ((IFG2 & UTXIFG1) == UTXIFG1))
	{
		U1TXBUF=com1_tx_buf[com_tx_point[1]++];
		com_tx_count[1]--;
		if (com_tx_count[1]==0) com_tx_time[1]=200;
	}
}

void sms_init()
{
 gsmint_cnt=0;
 sms_send_flag=0;
 sms_wait_begin=0;
 sms_wait_time=0;
 sms_start=0;
 sms_at_flag=0;
 sms_state=0;
 poweroff_flag=0;
 begin_time=0;
 check_wait_time=0;
 poweroff=0;
 MainTxdGsmProcc=0;
 sms_check_flag=0;
 repeat_time=0;
 entry_time=0;
 tx_simlat=0;
 simlat_timer=0;
 }

void read_yx()
{
  INT8U i;
  
  yx_now[0]= P2IN;														//YX1-8
  
  for(i=0;i<YX_BYTE_NUM;i++)
    yx_now[i] ^=yx_polarity[i];	
}

void check_yx()
{INT8U i,j;
 INT16U k;

⌨️ 快捷键说明

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