📄 wuxian.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 + -