实例均已验证过,请用notepad++以C语言的方式查看,配合函数列表插件,否则会看的眼晕,点这里下载最新版
配合用户手册,相信应该很容易理解了吧,我看着感觉比较好的手册,波特率设置文档里已有,自己看看就明白了 ,点这里下载用户手册
添加一份比较好的材料 同样是寄存器和代码示例 点这里下载
时钟模块:
void 时钟源(支持四个时钟源)
{
外接晶振模块(以外接晶振频率高低划分的)
{
(1)LFXT1CLK,为低速/高速晶振源,通常接32.768kHz,也可以接(400kHz~16Mhz);
low frequency 低频 可通过软件设置来源
接低频振荡器。典型为接32768HZ的时钟振荡器,
在LF模式(XTS=0),直接连接在XIN与XOUT之间,
此时振荡器不需要接负载电容,软件控制XCAPx位来设置LF模式下内部提供的负载电容。
可选1、6、10、12.5pF。
F2xx增加了一个新的超低功耗晶振VLO(12kHz),具有500nA的待机模式。他的使用与LFXT1互斥。BCSCTL3|=LFXT1S1;//ACLK来源于VLO
(2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接(400kHz~16Mhz);
接450KHZ~8MHZ的标准晶体振荡器。外部标准晶体振荡器接在XT2IN和XT2OUT之间,此时需要接负载电容,不用时可以关闭。
低频振荡器主要用来降低能量消耗,如使用电池供电的系统,高频振荡器用来对事件做出快速反应或者供CPU进行大量运算
在HF模式(XTS=1),可以接450KHZ~8MHZ的标准晶体振荡器,
此时需要接负载电容.LXFT1产生的频率信号为ACLK.低速时钟需要上百毫秒的建立时间才能稳定下来.
}
内部晶振模块
{
(1)DCOCLK,数控振荡器,为内部晶振,由RC震荡回路构成;
(DCO是Digital Control Oscillation的缩写,即表示数字振荡器)
数控RC振荡器。它在芯片内部,不用时可以关闭。
DCO的振荡频率会受周围环境温度和MSP430工作电压的影响,且同一型号的芯片所产生的频率也不相同。
但DCO的调节功能可以改善它的性能,他的调节分为以下3步:
a:选择BCSCTL1.RSELx确定时钟的标称频率;
b:选择DCOCTL.DCOx在标称频率基础上分段粗调;
c:选择DCOCTL.MODx的值进行细调。
实例:
BCSCTL1 =CALBC1_8MHZ; //设定DCO为1MHZ
DCOCTL = CALDCO_8MHZ; //CALBC1_XMHZ和CALDCO_XMHZ共8个数据保存在Flash信息存储器Segment段0x10F8~0x10FF地址中。共可设置1,8,12,16MHZ。
(2)VLOCLK,内部低频振荡器,12kHz标准振荡器
}
}
void 时钟系统(四个时钟源可分成三个时钟系统)
{
(1)ACLK,Auxiliary Clock,辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数;
供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。
但ACLK只能由LFXT1进行1、2、4、8分频作为信号源。可以作为后台时钟用来唤醒CPU.
(2)MCLK,Master Clock,系统主时钟单元,为系统内核提供时钟,它可以通过软件从四个时钟源选择;
其实就是CPU时钟
除了CPU运算使用此时钟以外,外围模块也可以使用。
MCLK可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。
(3)SMCLK,Sub-Main Clock,系统子时钟,也是可以由软件选择时钟源。
供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。
SMCLK可以XT2CLK或者DCOCLK振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。
相关缩写
Basic Clock Module Registers(基础时钟寄存器)
DCO control register DCOCTL
Basic clock system control 1 BCSCTL1
Basic clock system control 2 BCSCTL2
Basic clock system control 3 BCSCTL3
SFR interrupt enable register 1 IE1
SFR interrupt flag register 1 IFG1
PUC复位后(就是默认情况),MCLK和SMCLK的信号源为DCO,DCO的振荡频率为800K或1MHZ。ACLK的信号源为LFXT1。
}
void 时钟相关寄存器(完成频率的选择功能 四个寄存器)
{
(1)DCOCTL,DCO控制寄存器,地址为56H,初始值为60H(控制内部振荡器时钟)
DCO2 DCO1 DCO0 MOD4 MOD3 MOD2 MOD1 MOD0
DCO0~DCO2: DCO Select Bit,定义了8种频率之一,而频率由注入直流发生器的电流定义。
MOD0~MOD4: Modulation Bit,频率的微调。
一般不需要DCO的场合保持默认初始值就行了。
(2)BCSCTL1 ,Basic Clock System Control 1,地址为57H,初始值为84H(用来设置ACLOCK)
XT2OFF XTS DIVA1 DIVA0 XT5V RSEL2 RSEL1 RSEL0
RSEL0~RSEL2: 选择某个内部电阻以决定标称频率.0最低,7最高。
XT5V: 1.
DIVA0~DIVA1:选择ACLK的分频系数。DIVA=0,1,2,3,ACLK的分频系数分别是1,2,4,8;
XTS: 选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1)。
XT2OFF: 控制XT2振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。
正常情况下把XT2OFF复位就可以了.
(3)BCSCTL2,Basic Clock System Control 2,地址为58H,初始值为00H(用来设置MCLOCKSMCLOCK)
SEM1 SELM0 DIVM1 DIVM0 SELS DIVS1 DIVS0 DCOR
DCOR: Enable External Resistor. 0,选择内部电阻;1,选择外部电阻
DIVS0~DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8
SELS: 选择SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.
DIVM0~1: 选择MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8.
SELM0~1: 选择MCLK的时钟源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK
我用的时候一般都把SMCLK与MCLK的时钟源选择为XT2。(外部高速时钟)
其它:
1. LFXT1: 一次有效的PUC信号将使OSCOFF复位,允许LFXT1工作,如果LFXT1信号没有用作SMCLK或MCLK,可软件置OSCOFF关闭LFXT1.
2. XT2: XT2产生XT2CLK时钟信号,如果XT2CLK信号没有用作时钟MCLK和SMCLK,可以通过置XT2OFF关闭XT2,PUC信号后置XT2OFF,即XT2的关闭的。
3. DCO振荡器:振荡器失效时,DCO振荡器会自动被选做MCLK的时钟源。如果DCO信号没有用作SMCLK和MCLK时钟信号时,可置SCG0位关闭DCO直流发生器。
4. 在PUC信号后,由DCOCLK作MCLK的时钟信号,根据需要可将MCLK的时钟源另外设置为LFXT1或XT2,设置顺序如下:
(1)清OSCOFF/XT2
(2)清OFIFG
(3)延时等待至少50uS
(4)再次检查OFIFG,如果仍置位,则重复(1)-(4)步,直到OFIFG=0为止。
(5)设置BCSCTL2的相应SELM。
MSP430内部含有晶体振荡器失效监测电路,当时钟信号丢失50us时,监测电路捕捉到振荡器失效。
监测LFXT1(工作在高频模式或低频模式)和XT2输出的时钟信号,
若失效,分别为LFXT1OF和XT2OF置位,振荡器失效标志位OFIFG置位。
如果MCLK信号来自LFXT1或者XT2,那么MSP430自动把MCLK的信号切换为DCO,这样可以保证程序继续运行。
当测试到晶体振荡器失效(LFXT1OF或XT2OF)时,振荡器失效标志位OFIFG置位,并且锁定到POR。
当OFIFG置位,MCLK来自DCO,并且如果OFIE置位,那么产生非屏蔽中断。
中断得到响应后,OFIE自动复位。OFIFG必须软件清零。失效源可以通过测试各个失效位识别。
补充:POR(Power-On-Reset)是上电复位信号,它只在以下两个事件发生时产生:
1、芯片上电。
2、RST/NMI设置成复位模式,在RST/NMI引脚上出现低电平信号。(Non Maskable Interrupt)——不可屏蔽中断(即CPU不能屏蔽)
POR信号的产生总会产生PUC(Power-UP-Clear)信号,但PUC信号的发生不会产生POR信号。PUC信号是上电清除信号,产生它的事件为:
1、发生POR信号。
2、处于看门狗模式下,看门狗定时时间到。
3、看门狗定时器写入错误的安全键值。
4、RST/NMI设置成NMI模式,在RST/NMI引脚上出现低电平信号,
5、FLASH存储器写入错误的安全键值。
}
实例分析
1、CPU运行在VLO时钟下:(VLO 内部慢速时钟)
这是最慢的时钟,在约12千赫兹下运行。因此,我们将通过可视化的LED闪烁的红色慢慢地在约每3秒钟率。我们可以让时钟系统默认这种状态,设置专门来操作VLO。我们将不使用任何ALCK外设时钟在此实验室工作,但你应该认识到,ACLK来自VLO时钟。
#include <msp430g2231.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器
P1DIR = 0x40; // P1.6 配置输出
P1OUT = 0; // 关闭LED
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO 选择低频震荡的来源 是32768 还是VLO
IFG1 &= ~OFIFG; // 清除OSCFault 标志 OFIFG=0表示稳定
__bis_SR_register(SCG1 + SCG0); // 关闭 DCO
BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = VLO/8
while(1)
{
P1OUT = 0x40; // 开启LED
_delay_cycles(100);
P1OUT = 0; // 关闭 LED
_delay_cycles(5000);
}
}
2、CPU运行在晶振(32768Hz)时钟下:(外部低速时钟)
晶体频率为32768赫兹,约3倍的VLO。如果我们在前面的代码中使用晶振,指示灯应闪烁大约每秒一次。你知道为什么32768赫兹是一个标准?这是因为这个数字是2的15次方,因此很容易用简单的数字计数电路,以每秒一次获得率 ——手表和其他时间时基。认识到ACLK来自外部晶振时钟。
#include <msp430g2231.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器
P1DIR = 0x41; // P1.0 和P1.6配置输出
P1OUT = 0x01; // 开启P1.0
BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 晶振
while(IFG1 & OFIFG)
{
IFG1 &= ~OFIFG; // 清除 OSCFault 标志 外部晶振 等待50us震稳 OFIFG=0表示稳定
_delay_cycles(100000); // 为可见的标志延时
}
P1OUT = 0; // 关闭P1
__bis_SR_register(SCG1 + SCG0); // 关闭 DCO
BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = 32768/8
while(1)
{
P1OUT = 0x40; // 开启 LED
_delay_cycles(100);
P1OUT = 0; //关闭LED
_delay_cycles(5000);
}
}
3、CPU运行在晶振(32768Hz)和DCO时钟下:
最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望ACLK上运行的VLO或32768赫兹晶振。由于ACLK在我们目前的代码是在晶体上运行,我们会打开DCO计算。
#include <msp430g2231.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
//上面是出场校准DCO的数据,存在FALSH的信息存储区,这个就是检测FLASH中是否还存在出场校准的时钟数据,因为FLASH擦除后是1,所以0xFF就代表已经被擦除了
while(1); // If cal const erased, 挂起
}
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; //设置DCO模式
P1DIR = 0x41; // P1.0 和P1.6配置输出
P1OUT = 0x01; // P1.0 开启
BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 选择低频震荡的来源 是32768 还是VLO
while(IFG1 & OFIFG)
{
IFG1 &= ~OFIFG; // 清除OSCFault 标志 外部晶振 等待50us震稳 OFIFG=0表示稳定
_delay_cycles(100000); // 为可见标志延时
}
P1OUT = 0; // P1.6 关闭
// __bis_SR_register(SCG1 + SCG0); // 关闭DCO
BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO
while(1)
{
P1OUT = 0x40; // P1.6 开启
_delay_cycles(100);
P1OUT = 0; //P1.6 关闭
_delay_cycles(5000);
}
}
4、CPU运行在DCO时钟下:(内部高速时钟)
最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望在VLO或者是晶振下运行ACLK。由于ACLK在我们目前的代码是在VLO上运行,我们会打开DCO运行。
#include <msp430g2231.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
//上面是出场校准DCO的数据,存在FALSH的信息存储区,这个就是检测FLASH中是否还存在出场校准的时钟数据,因为FLASH擦除后是1,所以0xFF就代表已经被擦除了
while(1); // If cal const erased,挂起
}
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // 设置DCO模式
P1DIR = 0x40; // P1.6 配置输出
P1OUT = 0; // P1关闭
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO 选择低频震荡的来源 是32768 还是VLO
IFG1 &= ~OFIFG; // 清除 OSCFault 标志
//__bis_SR_register(SCG1 + SCG0); // 关闭DCO
BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8
while(1)
{
P1OUT = 0x40; // P1.6 关闭
_delay_cycles(100);
P1OUT = 0; // P1.6 开启
_delay_cycles(5000);
}
}
}
端口模块:
void 端口输入输出
{
(1)输出流程:
P1DIR|=BIT0; //设置为输出
P1OUT|=BIT0; //P1.0输出高
(2)输入流程:
PIDIR&=~BIT0; //设置为输入
P1REN|=BIT0; //使用上拉下拉电阻模式
P1OUT|=BIT0; //设置为上拉电阻方式
//P1OUT&=~BIT0; //设置为下拉电阻方式
P1IES|=BIT3;//选择输入中断触发方式 边沿触发 0上升沿 1 下降沿 无电平触发
P1IFG&=~BIT3; //清楚中断标志
P1IE|=BIT3; //启动输入中断使能
以下为中断处理函数 的格式 写在main函数结束后的下面
void main()
{
.......;
}
//中断函数的格式
#pragma vector=PORT1_VECTOR //中断向量填写,vector 右边填写相应触发中断,下接对应中断向量的中断处理
__interrupt void PORT_1(void)// __interrupt void类型 函数名 ()
{
P1IFG&=~BIT3; //清楚中断标志
.......; //add your code here!
}
中断模式和扫描模式:
实例代码:
#include <msp430g2452.h>//输入为中断模式
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=BIT0;
P1IE|=BIT3; //启动输入中断使能
P1IES|=BIT3;//选择输入中断触发方式 边沿触发 0上升沿 1 下降沿 无电平触发
P1REN|=BIT3;
P1OUT|=BIT3;
P1IFG&=~BIT3;//按键输入中断标志清零
__enable_interrupt(); //启用全部中断
while(1);
}
#pragma vector=PORT1_VECTOR //中断向量填写,下接对应中断向量的中断处理
__interrupt void PORT_1(void)// __interrupt void类型 函数名 () 是格式
{
P1IFG&=~BIT3;
while((P1IN&BIT3)==0); //松手检测
P1OUT^=BIT0;
}
(3)使用引脚第二功能:
由P1SEL.X P1SEL2.X USIP.X JTAG MODE CAPD.Y ADC10AE.X 共同决定
JATG 是用TEST 和 RST引脚来实现下载调试的 区别于单片机的串口
(1)串口模块:
操作流程
#include <msp430g2553.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void uart_init()
{
UCA0CTL1|= UCSWRST;//表示正在配置串口寄存器
//UCA0CTL0|=UCMSB;
UCA0CTL1|=UCSSEL_2;
UCA0BR0=104; //波特率为9600
UCA0BR1=0;//波特率为9600
UCA0MCTL=UCBRS0;
P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能
P1SEL2 = BIT1 + BIT2; //将P1.1 P1.2设为第二功能
UCA0CTL1&=~UCSWRST;//串口寄存器配置完毕,以后便不可写入,除非重新打开 UCA0CTL1|= UCSWRST;
IE2|=UCA0RXIE;//开启接收中断 注倘若开启了发送中断,必须写发送中断处理函数 中断后清除中断标志 否则程序死掉
}
//以下为发送一个字符的程序
void send(uchar c)
{
UCA0TXBUF=c;
while(!(IFG2&UCA0TXIFG));
IFG2&=~UCA0TXIFG;
}
//以下为发送一个字符串的程序
void Uart0Sends(char *s)
{
while(*s!='\0')
{
UCA0TXBUF=*s;
while((IFG2&UCA0TXIFG)==0); //查询发送是否结束
IFG2&=~UCA0TXIFG; //清除发送一标志位
s++;
}
}
void port_init()
{
P1DIR&=~BIT3; //设置方向为输出
P1REN|=BIT3;//使用拉电阻模式
P1OUT|=BIT3;//选择上拉
P1IES|=BIT3;//触发方式为下降沿
P1IFG&=~BIT3;//清楚中断标志
P1IE|=BIT3;//输入中断使能
}
void main()
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
DCOCTL=CALDCO_1MHZ; //将DCO设为1mhz
BCSCTL1=CALBC1_1MHZ; //将DCO设为1mhz
uart_init(); //初始化串口
port_init(); //初始化端口
_BIS_SR(GIE); //启用全部中断
while(1)
{
Uart0Sends("b");
delay(20);
}
}
#pragma vector=USCIAB0RX_VECTOR //串口接收中断
__interrupt void get()
{
while(!(IFG2&UCA0RXIFG)); //标志位变 1 接收完成
uchar c;
c=UCA0RXBUF; //接收字符
IFG2&=~UCA0RXIFG; //清除接收中断标志
//UCA0TXBUF=c;
// 改用简单的延时 同时清楚发送标志位
//IFG2&=~UCA0TXIFG;
send(c);
send('m');
}
#pragma vector=PORT1_VECTOR
__interrupt void key()
{
send('k');
send('e');
send('y');
P1IFG&=~BIT3;
}
}
定时器模块:
实例代码:
#include <msp430g2553.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
{
while(1);
// If calibration constants erased, trap CPU!!
}
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
IFG1 &= ~OFIFG; // Clear OSCFault flag 使用外部晶振 最好加上等待起震
BCSCTL1 |= DIVA_3; // ACLK = VLO/8
BCSCTL2 |= SELM_3 + DIVM_3 + DIVS_3; // MCLK = DCO/8, SMCLK = DCO/8
P1DIR = 0x40; // P1.6 output (green LED)
P1OUT = 0; // LED off
//TACTL = TASSEL_2 + MC_1; // SMCLK, UP mode
TACTL = TASSEL_1 + MC_1; // ACLK, UP mode 设置定时器时钟来源
CCR0 = 5100;//Timer count 5100 定时器定时时间
CCR1 = 2000;//Timer count 100 //比较器参数
CCTL0 = CCIE; //interrupt enabled 定时器使能
//CCTL1 = CCIE; //interrupt enabled 比较器使能
_BIS_SR(LPM0_bits + GIE);//Enter Low Power Mode //进入CPUOFF 模式 打开总中断
for(;;);
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR //定时器中断
__interrupt void Timer_A0 (void)
{
P1OUT |= BIT6; // P1.6 output High
}
// Timer_A2 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR//比较器中断
__interrupt void Timer_A1(void)
{
switch( TA0IV ) //TA0IV=TAIV 比较器标志位
{
case 2: P1OUT &= ~BIT6;break;// P1.6 output Low //为2为 CCR1中断
case 4: break; //为4为CCR2中断
case 10: //为10为溢出中断
default :
}
}
}
比较器模块:
{实例代码:
#include<msp430g2553.h>
/*****************************************************
* 函数名: compare_init()
* 功能: 电压比较器 初始化
**************************************************/
void compare_init()
{
CACTL1 =CARSEL+CAON+CAREF_2; // CAEX=0 CARSEL =1 比较器 为反向比较 阈值为0.5vcc 打开比较器
CACTL2 =P2CA0; //设置比较输入口 P1.0为COMP+
//CAPD |=CAPD0; //断开与IO的输入
}
/*****************************************************
* 函数名: compare()
* 功能: 电压比较器 功能函数
**************************************************/
int compare()
{
if((CACTL2 | 0xFE)==0xFF) //CACTL2 COUT 置1
{
CACTL1 &= 0xfe; // CAIFG = 0
return 1;
}
else return 0;
}
void main()
{
compare_init() ;
P1DIR|=BIT6; //写完之后默认输出1
P1OUT=0;
while(1)
{
if(compare())
P1OUT|=BIT6;
else
P1OUT&=~BIT6;
}
}
AD采集:
#include <intrinsics.h>
#include <msp430g2553.h>
#include <msp430.h>
void delay_1ms(void);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
void lcd_diaoyong();
void lcd_diaoyong1();
void uart_init()
{
UCA0CTL1|= UCSWRST;//表示正在配置串口寄存器
//UCA0CTL0|=UCMSB;
UCA0CTL1|=UCSSEL_2;
UCA0BR0=104; //波特率为9600
UCA0BR1=0;//波特率为9600
UCA0MCTL=UCBRS0;
P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能
P1SEL2 = BIT1 + BIT2; //将P1.1 P1.2设为第二功能
UCA0CTL1&=~UCSWRST;//串口寄存器配置完毕,以后便不可写入,除非重新打开 UCA0CTL1|= UCSWRST;
IE2|=UCA0RXIE;//开启接收中断 注倘若开启了发送中断,必须写发送中断处理函数 中断后清除中断标志 否则程序死掉
}
void send(unsigned char c)
{
UCA0TXBUF=c;
while(!(IFG2&UCA0TXIFG));
IFG2&=~UCA0TXIFG;
}
unsigned int j=0,i=0;
unsigned int shuzhi=0,qushu=0;
void main()
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
DCOCTL=CALDCO_1MHZ; //将DCO设为1mhz
BCSCTL1=CALBC1_1MHZ; //将DCO设为1mhz
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled 采样、保持时间设置 ,ADC10开关,ADC中断使能
ADC10CTL1 = INCH_1; // input A1模拟信号输入选择通道A1即p1.1
ADC10AE0 |= 0x02; // PA.1 ADC option select使p1.1允许AD模拟输入信号
P1DIR |= 0x01; // Set P1.0 to output direction
TA0CCTL0 = CCIE; // CCR0 1ms中断
TA0CCR0 = 312;
TA0CTL = TASSEL_2 + MC_1; // SMCLK, upmode
//_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
TA1CCTL0 = CCIE; // CCR0 1ms中断
TA1CCR0 = 31200;
TA1CTL = TASSEL_2 + MC_1; // SMCLK, upmode
uart_init();
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
while(1);
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A (void)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start开始转换
qushu=ADC10MEM;
send(qushu/256);
send(qushu%256);
delay_1ms();
j++;
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A (void)
{
P1OUT ^= 0x01;
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
void delay_1us(void)
{
asm("nop");
}
void delay_nus(unsigned int n)
{
unsigned int i;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void)
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n)
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
#pragma vector=USCIAB0RX_VECTOR //串口接收中断
__interrupt void get()
{
unsigned char c;
c=UCA0RXBUF; //接收字符
IFG2&=~UCA0RXIFG; //清除接收中断标志
//UCA0TXBUF=c;
//while(!(IFG2&UCA0TXIFG)); 改用简单的延时 同时清楚发送标志位
//IFG2&=~UCA0TXIFG;
send(c);
send('m');
}
文章评论(0条评论)
登录后参与讨论