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

📄 wuxian.c

📁 系统以MSP430F2274单片机为核心
💻 C
字号:
/*********************************
包含头文件
**********************************/
#include "msp430x22x4.h"

/*********************************
定义位操作
**********************************/
#define CSWDT_1 P1OUT |=BIT1        //CSWDT(看门狗片选)
#define CSWDT_0  P1OUT &=~BIT1
#define SCK_1   P3OUT |=BIT3        //SCK(看门狗时钟)
#define SCK_0   P3OUT &=~BIT3

#define ADCS_1  P2OUT |=BIT3     //ADCS(AD片选)       
#define ADCS_0  P2OUT &=~BIT3     
#define ADCLK_1  P2OUT |=BIT1    //ADCLK(AD时钟)
#define ADCLK_0  P2OUT &=~BIT1


#define CLR_1 P3OUT |=BIT7          //CLR(PLD清零端)
#define CLR_0  P3OUT &=~BIT7        
#define SEL_1   P3OUT |=BIT6        //SEL(PLD高低字节选择)
#define SEL_0   P3OUT &=~BIT6

#define LED_1 P1OUT |=BIT3          //LED亮灭操作
#define LED_0 P1OUT &=~BIT3


/*********************************
定义全局变量
**********************************/
__no_init char data[20] @0x0400;          //串口接收数据存储区
unsigned char pldbyte_h=0,pldbyte_l=0;    //PLD计数值高、低字节
unsigned char advalue=0;                  //AD转换结果


/*********************************
声明相关程序
**********************************/
void sysclock_init();                     //系统时钟初始化
void usart_init();                        //串口初始化程序
void ad_init();                           //AD初始化程序
void pld_init();                          //PLD初始化程序
void interrupt_init();                    //中断初始化程序
void wdtclear_init(); 
void clear_wdt();                         //清狗程序 
void read_pld();                          //PLD读取程序
unsigned char ad_conver();                //AD转换程序
void dely4us();                           //延时程序
void delay_us();


/*********************************
主程序
**********************************/
int main( void )
{
  sysclock_init();                       //系统时钟初始化
  wdtclear_init();                       //看门狗清零初始化
  usart_init();                          //串口初始化
  ad_init();                             //AD初始化
  pld_init();                            //PLD初始化
  interrupt_init();                      //中断初始化
  
  while(1)                               //死循环清狗
  {
   clear_wdt();
  }
 
}

/*********************************
系统时钟初始化程序
**********************************/
void sysclock_init()
{
  WDTCTL  =WDTPW+WDTHOLD;
  BCSCTL1 =CALBC1_1MHZ;                     //设定DCO为1MHZ
  DCOCTL  =CALDCO_1MHZ;
  
  volatile unsigned int n;
 /* do                                        //等待晶振稳定
  {
    IFG1 &=~OFIFG;
    for(n=5000;n>0;n--);
  }  while(OFIFG&IFG1); */
  
   for(n=5000;n>0;n--);
  
}



/*********************************
串口通信初始化程序
**********************************/
void usart_init()
{
  P1DIR |=BIT3;                            //P1.3--LED,
  P1OUT &=~BIT3;                           //LED灭
  P3SEL |=BIT4+BIT5;                       //p3.4--TX,P3.5--RX    
  P3DIR |=BIT4+BIT0; 
  
  UCA0CTL0=0x00;                            //8位,无奇偶校验,LSB first,1位停止,UART 模式,异步
  UCA0CTL1 |=UCSSEL0+UCSSEL1;               //时钟源选择SMCLK晶振
  UCA0BR1=0;                                //设置波特率1000000/9600=104.1
  UCA0BR0=104;
  //UCA0MCTL |=UCBRS1;                        
  //UCA0MCTL=0x06;
  UCA0CTL1 &=~UCSWRST;                      //退出USCI设置
  
}



/*********************************
AD初始化程序
**********************************/
void ad_init()
{
  P2DIR |=BIT1+BIT3;          //P2.1-ADCLK(AD时钟),P2.3--ADCS(AD片选),P1.1--DATAIN(AD数据输出)
  P2OUT |=BIT1+BIT3;          //ADCLK=1,ADCS=1
  
  
}


/*********************************
PLD初始化程序
**********************************/
void pld_init()
{
  P3DIR |=BIT6+BIT7;         //P3.6-SEL(PLD高低字节选择,SEL=1选择高字节,SEL=0选择低字节),
                             //P3.7-CLR(PLD清零端,CLR=1清零,CLR=0正常计数)
  CLR_1;                     //PLD先清零,然后开始计数
  delay_us(5);
  CLR_0;             
}


/*********************************
中断初始化程序
**********************************/
void interrupt_init()
{
  IE2 |=UCA0RXIE;                            //使能串口接收中断
  //_BIS_SR(LPM3_bits+GIE);                   //进入低功耗3并使能总中断
  _BIS_SR(GIE);                               //使能总中断
  _NOP();
  
}


/*********************************
看门狗清零初始化程序
**********************************/
void wdtclear_init()
{
  P1DIR |=BIT1;                       //P1.1-CSWDT(看门狗片选,低有效)
  P3DIR |=BIT3;                       //P3.3-SCK(看门狗时钟)
  CSWDT_1;                           //看门狗无效
 
}



/*********************************
PLD读取程序
**********************************/
void read_pld()
{
  
  SEL_1;                       //选择PLD高字节                         
  pldbyte_h=P4IN;              //从P4口读取高字节
  SEL_0;                       //选择PLD高字节   
  pldbyte_l=P4IN;              //从P4口读取高字节
 
 
}



/*********************************
AD转换程序
**********************************/
unsigned char ad_conver()
{
  unsigned char j,addata=0;
  ADCS_1;
  ADCS_0;
  ADCS_1;              //AD复位
  ADCLK_0;             //时钟准备
  dely4us();           //延时
  ADCS_0;              //AD使能             
  dely4us();           //延时等待
  for(j=0;j<8;j++)     //输入采样转换时钟

    
  {
    ADCLK_1;
    ADCLK_0;
  }
  
  ADCS_1;             //拉高片选端,开始转换
  delay_us(16);       //等待转换
  ADCS_0;             //读取转换结果
  dely4us();
  
  for(j=0;j<8;j++)    //一次读取AD输出的8位数据
  {
   ADCLK_1;           //AD在时钟上升沿输出数据
   addata<<=1;
   
   if(P1IN & 0x01)
   {
      addata |=0x01;
   }
   
   ADCLK_0;
  }
  return addata;      //返回转换结果
  
}


/*******************************************

清狗程序
*********************************************/
void clear_wdt(void)
{
	CSWDT_0;                  //在看门狗片选端施加一个由高到低的电平,清狗
	CSWDT_1;
	CSWDT_0;
	SCK_0 ;
}


/*********************************
延时4us
**********************************/
void dely4us()
{
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  
}


/*********************************
延时
**********************************/
void delay_us(unsigned int k)
{
  unsigned j;
  for(j=k;j>0;j--)
  {
    _NOP();
  }
}


/*********************************
串口中断服务程序
**********************************/
#pragma vector =USCIAB0RX_VECTOR
__interrupt void rx_isr(void)
{
  clear_wdt();
  unsigned int m;
  //P1OUT ^=BIT3;                  //每收一帧LED翻转一次
  LED_1;
  data[0]=UCA0RXBUF;             //将收到的数据放入0x0400开始的RAM地址                  
  if(data[0]==0xAA)              //如果地址正确,回发数据  (3个字节)  
    {
      UCA0TXBUF=0xAA;            //首先回传地址
      for(m=2000;m>0;m--);
      
      UCA0TXBUF=0x00;            //3字节数据的最高字节
      for(m=2000;m>0;m--);
      
      read_pld();                //调用子函数,读取PLD计数值
      UCA0TXBUF=pldbyte_h;       //发送PLD计数值高字节
      for(m=2000;m>0;m--);       //延时
      UCA0TXBUF=pldbyte_l;       //发送PLD计数值低字节
      for(m=2000;m>0;m--);       //延时
      
      advalue=ad_conver();       //调用子函数,读取AD转换结果
      UCA0TXBUF= advalue;        //发送AD转换值
      for(m=2000;m>0;m--);       //延时,等待当前发送完毕
      
      UCA0TXBUF=0xFF;            //结束字节
      for(m=2000;m>0;m--);
    }
  LED_0;
  clear_wdt();
}
 





⌨️ 快捷键说明

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