MSP430精确延时程序汇总

合集下载

MSP430全部程序学习

MSP430全部程序学习

M S P430全部程序学习-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN一:基础实验功能:控制IO口实现流水灯的一次点亮并循环下去#include"msp430x14x.h"void delay(unsigned int a){unsigned int i,j;for(j=a;j>0;j--)for(i=80;i>0;i--);}void main(void){WDTCTL=WDTPW+WDTHOLD;P2DIR|=0XF0; //1111-0000 1表示输出,0表示输入P2OUT&=0X0F; //0000-1111 输出寄存器while(1){P2OUT|=BIT4;delay(800);P2OUT|=BIT5;delay(800);P2OUT|=BIT6;delay(800);P2OUT|=BIT7;delay(800);P2OUT&=0X0F;delay(800);}}二:IO口控制(IO口中断)实验功能:利用IO口中断实现按键中断,当按键按下时对应LED等亮#include<msp430x14x.h>#pragma vector=PORT2_VECTOR //声明中断源是IO口2 的中断__interrupt void port2(void);void main(void){WDTCTL=WDTPW+WDTHOLD;_EINT();P2DIR|=BIT4;P2DIR&=~BIT0;P2IE|=BIT0 ;P2IES|=BIT0 ;_BIS_SR(LPM3_bits + GIE); //开总中断并使CPU进入低功耗模式while(1);}__interrupt void port2(void){if((P2IN&BIT0)==BIT0)P2OUT&=~BIT4;elseP2OUT|=BIT4;}三:数码管实验功能:编程实现6个数码管依次显示1到6/******************************************************************** **********____ ____ ____ ____ ____ ____f| a |b | | | | | | | | | ||____| |____| |____| |____| |____| |____|e| g |c | | | | | | | | | ||____| |____| |____| |____| |____| |____|d LED6 | LED5 | LED4 | LED3 | LED2 | LED1| | | | | |P5.7 P5.6 P5.5 P5.4 P5.3 P5.2a--P4.0 b--P4.1 c--P4.2 d--P4.3 e--P4.4 f--P4.5 g--P4.6.--P4.7 段码1选通P5.2--P5.7 位码0导通// 跳线P14 P15 P5 P6 P7 P8********************************************************************* **********/#include"msp430x14x.h"#define uchar unsigned charunsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};void display(uchar i,uchar j){P5OUT=seg[i];P4OUT=table[j];}void main(){WDTCTL=WDTPW+WDTHOLD;P5DIR|=(BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);P4DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);while(1){display(0,1);display(1,2);display(2,3);display(3,4);display(4,5);display(5,6);}}四:独立按键综合实验//*************************************************************** // 描述:// 有按键中断时,LED5,LED6,LED7,LED8亮与灭;//// 跳线:P9 P10 P17*************************************************************** #include <msp430x14x.h>#define led5_pout P2DIR|=BIT4 //通讯状态指示灯设置为输出口#define led5_high P2OUT|=BIT4 //通讯状态指示灯输出高点亮指示灯#define led5_low P2OUT&=~BIT4 //通讯状态指示灯输出低关闭指示灯#define led6_pout P2DIR|=BIT5 //通讯状态指示灯设置为输出口#define led6_high P2OUT|=BIT5 //通讯状态指示灯输出高点亮指示灯#define led6_low P2OUT&=~BIT5 //通讯状态指示灯输出低关闭指示灯#define led7_pout P2DIR|=BIT6 //通讯状态指示灯设置为输出口#define led7_high P2OUT|=BIT6 //通讯状态指示灯输出高点亮指示灯#define led7_low P2OUT&=~BIT6 //通讯状态指示灯输出低关闭指示灯#define led8_pout P2DIR|=BIT7 //通讯状态指示灯设置为输出口#define led8_high P2OUT|=BIT7 //通讯状态指示灯输出高点亮指示灯#define led8_low P2OUT&=~BIT7 //通讯状态指示灯输出低关闭指示灯unsigned char led5,led6,led7,led8,flag;void delay(unsigned int i){while(i--);}void IOinit(void){led5_pout;led6_pout;led7_pout;led8_pout;led5_low;led6_low;led7_low;led8_low;P2IE|=BIT0+BIT1+BIT2+BIT3;P2IES|=BIT0+BIT1+BIT2+BIT3;}void main(void){WDTCTL=WDTPW+WDTHOLD;IOinit();_EINT();while(1){switch(flag){case 1: if(led5%2)led5_high;else led5_low;flag=0;break;case 2: if(led6%2)led6_high; else led6_low;flag=0;break;case 3: if(led7%2)led7_high; else led7_low;flag=0;break;case 4: if(led8%2)led8_high; else led8_low;flag=0;break;default: break;}_BIS_SR(LPM3_bits+GIE);}}#pragma vector=PORT2_VECTOR __interrupt void port2 (void) {delay(40000);//去抖;if((P2IFG&BIT0)==BIT0){led5++;flag=1;}if((P2IFG&BIT1)==BIT1){led6++;flag=2;}if((P2IFG&BIT2)==BIT2){led7++;flag=3;}if((P2IFG&BIT3)==BIT3){led8++;flag=4;}P2IFG=0;_BIC_SR_IRQ(LPM3_bits);}五:行列式键盘实验/**************************************************************** // P6.7 P6.6 P6.5 +3V// | | | |// P6.1------ /---- /----- /----R--|// | | | |// P6.2------ /---- /----- /----R--|// | | | |// P6.3------ /---- /----- /----R--|// | | | |// P6.4------ /---- /----- /----R--|// 跳线 P2 P3****************************************************************/ #include"msp430x14x.h"#include"key.h"void delay(unsigned int i){while(i--);}unsigned char key(void){unsigned char x=0XFF;P6DIR=0XE0;P6OUT=0X7F;// //扫描第一列if((P6IN&0X02)==0X00)x=12; //x=0;elseif((P6IN&0X04)==0)x=11;//x=1;elseif((P6IN&0X08)==0)x=10;//x=2;elseif((P6IN&0X10)==0)x=9;else{P6OUT=0XBF;// //扫描第二列if((P6IN&0X02)==0X00)x=8; //x=0;elseif((P6IN&0X04)==0)x=7;//x=1;elseif((P6IN&0X08)==0)x=6;//x=2;elseif((P6IN&0X10)==0)x=5;else{P6OUT=0XDF; //扫描第三列 if((P6IN&0X02)==0X00)x=4; //x=0;elseif((P6IN&0X04)==0)x=3;//x=1;elseif((P6IN&0X08)==0)x=2;//x=2;elseif((P6IN&0X10)==0)x=1;}}return(x);}unsigned char get_key(void){unsigned char x,y;if((P6IN&0X1F)!=0X1F){delay(20);if((P6IN&0X1F)!=0X1F){x=key();if(x!=0xFF)y=x;}}return y;}六:看门狗程序//*************************************************************** *// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P1.1|-->LED//*************************************************************** *#include <msp430x14x.h>void main(void){WDTCTL = WDT_MDLY_0_064; // Set Watchdog Timer interval to ~30ms IE1 |= WDTIE; // Enable WDT interruptP1DIR |= 0x02; // Set P1.1 to output direction_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P1OUT ^= 0x02; // Toggle P1.1 using exclusive-OR}七:TimerA 定时/计数器//*************************************************************** *// MSP-FET430P140 Demo - Timer_A, Toggle P1.1/TA0, Up Mode, 32kHz ACLK //// Description: Toggle P1.1 using hardware TA0 output. Timer_A is configured // for up mode with CCR0 defining period, TA0 also output on P1.1. In this// example, CCR0 is loaded with 1000-1 and TA0 will toggle P1.1 at TACLK/1000.// Thus the output frequency on P1.1 will be the TACLK/2000. No CPU or software// resources required. Normal operating mode is LPM3.// As coded with TACLK = ACLK, P1.1 output frequency = 32768/2000 =16.384Hz.// ACLK = TACLK = 32kHz, MCLK = default DCO ~800kHz// //* External watch crystal installed on XIN XOUT is required for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P1.1/TA0|--> ACLK/2000//// 跳线:J10 Timer_A P0//*************************************************************** *#include <msp430x14x.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP1DIR |= 0x02; // P1.1 output 选择P1.1为输出P1SEL |= 0x02; // P1.1 option select外围模块CCTL0 = OUTMOD_4; // CCR0 toggle mode 输出为反转模式CCR0 = 1000-1;TACTL = TASSEL_1 + MC_1; // ACLK, upmode_BIS_SR(LPM3_bits); // Enter LPM3 w/interrupt}//#include//typedef unsigned char uchar;//typedef unsigned int uint;//uchar flag=0;//void main(void)//{// WDTCTL=WDTPW+WDTHOLD;// BCSCTL1 &= ~XT2OFF;// BCSCTL2 |=SELS+DIVS_3;// P3DIR |= BIT4;// TACTL=TASSEL_2+MC_2+TAIE;//_BIS_SR(LPW0_bits+GIE);//}//Timer_A3 Interrupt Vector( TATV) handler//#pragma vector=TIMERA1_VECTOR//__interrupt void Timer_A(void)//{// switch(TAIV)// {// case 2: break;// case 4: break;// case 10: P4OUT ^=BIT5;// break;// }//}//Timer A0 interrupt service routine//#pragma vector=TIMERA0_VECTOR//__interrupt void Timer_A (void)//{// P4OUT ^= BIT5;//}八:TimerB 定时/计数器//***************************************************************/ // MSP-FET430P140 Demo - Timer_B, Toggle P1.1, CCR0 Up Mode ISR, 32kHz ACLK// Description: Toggle P1.1 using software and the TB_0 ISR. Timer_B is// configured for up mode, thus the timer overflows when TBR counts// to CCR0. In this example, CCR0 is loaded with 1000-1.// Toggle rate = 32768Hz/(2*1000) = 16.384Hz// ACLK = TBCLK = 32kHz, MCLK = SMCLK = default DCO ~800kHz// //* An external watch crystal on XIN XOUT is required for ACLK *////// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P1.1|-->LED//// 跳线:J10 Timer_A P0//*************************************************************** *#include <msp430x14x.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP1DIR |= 0x02; // Set P1.1 to output directionTBCTL = TBSSEL_1 + TBCLR; // ACLK, clear TBRTBCCTL0 = CCIE; // TRCCR0 interrupt enabledTBCCR0 = 1000-1;TBCTL = TBSSEL_1 + MC_1; // ACLK, upmode_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt}// Timer B0 interrupt service routine#pragma vector=TIMERB0_VECTOR__interrupt void Timer_B (void){P1OUT ^= 0x02; // Toggle P1.1 using exclusive-OR}九:串口通信实验一/**************************************************************** // MSP-FET430P140 Demo - USART0,//// Description: USART0 RX interrupt triggers TX Echo. Though not required, // Baud rate divider with 3.2768Mhz XTAL @9600 = 3.2768MHz/9600 = 0003h;// MSP430F149// -----------------// /|\| XIN|-// | | | 3.2768MHz// --|RST XOUT|-// | |// | P3.4|------------>// | | 9600// | P3.5|<------------//// 跳线串行( P8 P9) 数码管( P14 P15 P5 P6 P7 P8)***************************************************************** #include <msp430x14x.h>#include "led.h"#define uchar unsigned charextern unsigned char num[11];extern unsigned char wei[7];extern void display(uchar W,uchar sz);uchar aa;/*****************串口初试化设置********************/void uart_org(void){ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD //使能串口UCTL0 |= CHAR; // 8-bit character //数据格式为8位UTCTL0 |= SSEL0; // UCLK = ACLK //选择时钟来源UBR00= 0x03; // 32768/9600 //波特率寄存器低字节UBR10= 0x00; //波特率寄存器高字节UMCTL0= 0x4a; //由于波特率计数有余数,填写波特率调整寄存器 P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD 定义串口功能引脚P3DIR |= 0x10; //P3.4口为输出,其余为输人口UCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt 接受数据能中断}/*****************串口发送字符串程序*****************/void UartStr(unsigned char *p){ *p=0x02;//unsigned char strunsigned char i;for (i=0;*p!=0;i++) //准备要发送的数据{ //下句UTXIFG0=1则正在发送数据,即不再发送其它数据 while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?判断缓冲区是否为空TXBUF0 =*p++; // RXBUF0 to TXBUF0 //发送数据到串口while ((UTCTL0 & TXEPT) == 0); //判断数据是否发送完毕}_NOP();}void main(){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗uart_org( ); //串口初始化_EINT(); //总中断开启UartStr("请输入abcdef之一!\r\t\n");UartStr("a--1,b--2,c--3,d--4,e--5,f--6\r\t\n");while(1){switch (aa){case 97:display(0,1); break;case 98:display(1,2);break;case 99:display(2,3);break;case 100:display(3,4);break;case 101:display(4,5);break;case 102:display(5,6);break;default:break;}_BIS_SR(LPM3_bits+GIE); //初始化完毕,进入睡眠状态}}#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){aa=RXBUF0; //接收的数据赋值给 aa_BIC_SR_IRQ(LPM3_bits); //停止休眠}十:串口通信实验二/****************************************************************// MSP-FET430P140 Demo - USART1,//// Description: USART0 RX interrupt triggers TX Echo. Though not required, // Baud rate divider with 3.2768Mhz XTAL @9600 = 3.2768MHz/9600 = 0003h;// MSP430F149// -----------------// /|\| XIN|-// | | | 3.2768MHz// --|RST XOUT|-// | |// | P3.6|------------>// | | 9600// | P3.7|<------------//// 跳线串行( P8 )***************************************************************** #include <msp430x14x.h>unsigned char send,NR,zs;unsigned char tx_buf[20];//***************延时**********************************void delay( char i){unsigned char aa=10;while(aa--)while(i--);}//**************串口初试化设置************************/void uart_org(void){ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXDUCTL1 |= CHAR; // 8-bit characterUTCTL1 |= SSEL0; // UCLK = ACLKUBR01 = 0x03; // 32768/9600UBR11 = 0x00; //UMCTL1 = 0x4a; // modulationP3SEL |= 0xC0;UCTL1 &= ~SWRST; // Initialize USART state machineIE2 |= URXIE1; // Enable USART1 RX interrupt}//********************发送数据**************************** void Uart_Str(unsigned char number,unsigned char *p){unsigned char i;for (i=0;i<number;i++)//准备要发送的数据{while (!(IFG2 & UTXIFG1));// USART0 TX buffer ready?TXBUF1 =*p++; // RXBUF0 to TXBUF0while ((UTCTL1 & TXEPT) == 0);}_NOP();}//********************发送数据**************************** void UartStr(unsigned char *p){unsigned char i;for (i=0;*p!=0;i++)//准备要发送的数据{while (!(IFG2 & UTXIFG1));// USART0 TX buffer ready?TXBUF1 =*p++; // RXBUF0 to TXBUF0while ((UTCTL1 & TXEPT) == 0);}_NOP();}//***************接收串行数据***************************// void AddUsData(unsigned char sq0){if(NR<20){tx_buf[NR]=sq0;NR++;}}void main(void){WDTCTL=WDTPW+WDTHOLD;uart_org();//UartStr("unsigned char *p");while(1){delay(50);UartStr(tx_buf);// Uart_Str(zs,tx_buf);for(unsigned char i=zs;i>0;i--)tx_buf[i]=0;zs=0;NR=0;_BIS_SR(LPM3_bits+GIE);}}#pragma vector=UART1RX_VECTOR__interrupt void usart1_rx (void){zs++;AddUsData(RXBUF1);_BIC_SR_IRQ(LPM3_bits);}十一:AD转换实验//*************************************************************** *// MSP-FET430P140 Demo - ADC12, Sample A0, Set P1.0 if A0 > 0.5*AVcc //// Description: A single sample is made on A0 with reference to AVcc.// Software sets ADC10SC to start sample and conversion - ADC12SC// automatically cleared at EOC. ADC12 internal oscillator times sample (16x) // and conversion. In Mainloop MSP430 waits in LPM0 to save power until ADC12// conversion complete, ADC12_ISR will force exit from LPM0 in Mainloop on // reti. If A0 > 0.5*AVcc, P1.0 set, else reset.//// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// Vin-->|P6.7/A7 P2 |--> LED////*************************************************************** *#include <msp430x14x.h>#define led5_pout P2DIR|=BIT4 //通讯状态指示灯设置为输出口#define led5_high P2OUT|=BIT4 //通讯状态指示灯输出高点亮指示灯#define led5_low P2OUT&=~BIT4 //通讯状态指示灯输出低关闭指示灯#define led6_pout P2DIR|=BIT5 //通讯状态指示灯设置为输出口#define led6_high P2OUT|=BIT5 //通讯状态指示灯输出高点亮指示灯#define led6_low P2OUT&=~BIT5 //通讯状态指示灯输出低关闭指示灯#define led7_pout P2DIR|=BIT6 //通讯状态指示灯设置为输出口#define led7_high P2OUT|=BIT6 //通讯状态指示灯输出高点亮指示灯#define led7_low P2OUT&=~BIT6 //通讯状态指示灯输出低关闭指示灯#define led8_pout P2DIR|=BIT7 //通讯状态指示灯设置为输出口#define led8_high P2OUT|=BIT7 //通讯状态指示灯输出高点亮指示灯#define led8_low P2OUT&=~BIT7 //通讯状态指示灯输出低关闭指示灯void delay(unsigned int a){unsigned int i,j;for(j=a;j>0;j--)for(i=8;i>0;i--);}void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT_EINT();ADC12CTL0 = SHT0_2 + ADC12ON; // Set sampling time, turn on ADC12//上面语句是打开ADC12电源,并设置采样时间=2^2*(4*clk)=16clk即为16个时钟ADC12CTL1 = CSTARTADD_7 + SHP; // Use sampling timerADC12MCTL7|=INCH_7;ADC12IE = 0x0080; // Enable interrupt 使能中断 ADC12IFG.0 对应于ADC12MEM0ADC12CTL0 |= ENC; // Conversion enabled 使能转换P6SEL |= 0x80; // P6.0 ADC option select 定义P6.0为模拟输入通道0led5_pout;led6_pout;led7_pout;led8_pout;led5_low;led6_low;led7_low;led8_low;for (;;){ADC12CTL0 |= ADC12SC; // Sampling open 开始启动转换 _NOP();// _BIS_SR(CPUOFF + GIE); // LPM0, ADC12_ISR will force exit }}// ADC12 interrupt service routine#pragma vector=ADC_VECTOR__interrupt void ADC12_ISR (void){if (ADC12MEM7 < 0x3FF)led5_low; // Clear P2.4 LED offelseled5_high; // Set P2.4 LED onif (ADC12MEM7 < 0x6FF)led6_low; // Clear P2.5 LED offelseled6_high;if (ADC12MEM7 < 0x9FF)led7_low; // Clear P2.6 LED offelseled7_high;if (ADC12MEM7 < 0xCFF)led8_low; // Clear P2.7 LED offelseled8_high;// _BIC_SR_IRQ(CPUOFF); // Clear CPUOFF bit from 0(SR) }十二:IIC总线与24c16综合实验主程序//*************************************************************** // 描述:// 开机发送数给24C16,然后将数据读出,并通过串口工具显示;//// 跳线: P6 P8 P9//*************************************************************** #include "msp430x14x.h"#include "Uart.h"#include "24c16.h"#define uchar unsigned charunsigned char *D,*M,add,ACK_FLAG,flag;unsigned char MPM[32];//unsigned char DDT[32]=// {// 0xf3,0x16,0x69,0x21,0xd3,0x15,0xc5,0x23,// 0xb6,0x28,0x85,0x25,0xc3,0x24,0xd7,0x16,// 0xf3,0x16,0x69,0x21,0xd3,0x15,0xc5,0x23,// 0xb6,0x28,0x85,0x25,0xc3,0x24,0xd7,0x16// };unsigned char DDT[32]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,//0 1 2 3 4 5 6 70x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,//8 9 A B C D E F0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E, //G H I J K L M N0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56, //O P Q R S T U V};void main(void){unsigned int i;WDTCTL=WDTPW+WDTHOLD;uart_org();UartStr("开机测试成功!\r\t\n");D=(unsigned char*)DDT;add=0; //24C01内数据读写首地址M=(unsigned char*)MPM;delay(100);for(i=0;i<4;i++){send_word();delay(1000);add+=8;}add=10;for(i=0;i<32;i++)receive_word(i);Uart_Str(32,&MPM[0]);TXBUF0 = MPM[7];}子程序 24C16#include <msp430x14x.h>#include "24c16.h"#define uchar unsigned charextern uchar ACK_FLAG,add,*D,MPM[32]; void delay(unsigned int i){while(i-- > 0);}void start(void){SDA_OUT;SCL_OUT;SDA_0;SCL_0;delay(2);SDA_1;SCL_1;delay(2);SDA_0;delay(2);SCL_0;delay(3);SDA_1;}void stop(void){SDA_OUT;SCL_OUT;SDA_0;SCL_1;delay(2);SDA_1;}void send_byte(uchar data){uchar bi,i;bi=0x80;SDA_OUT;SCL_OUT;for(i=0;i<8;i++){if((data&bi)==bi) SDA_1;else SDA_0;SCL_1;delay(50);SCL_0;bi>>=1;}}uchar receive_byte(void){uchar i,temp=0x80,tempdata;tempdata=0;SDA_IN;SCL_OUT;for(i=0;i<8;i++){SCL_1;if((P5IN&BIT1)==BIT1) tempdata|=temp; temp>>=1;SCL_0;}return(tempdata);}void ack(void){SCL_OUT;SDA_IN;SCL_1;ACK_FLAG=0;if((P5IN&BIT1)) ACK_FLAG=1; SCL_0;delay(10);}void i2c_ack(uchar tm){SDA_OUT;SCL_OUT;if(tm==0) SDA_1;else SDA_0;delay(10);SCL_1;delay(10);SCL_0;delay(10);}void send_word(void){uchar i=0;while(1){start();delay(20);send_byte(0xa0);ack();if(ACK_FLAG) continue;send_byte(add);ack();if(ACK_FLAG) continue; for(i=0;i<8;i++){send_byte(*D++);ack();if(ACK_FLAG)continue;}if(!ACK_FLAG) break;}stop();}void receive_word(uchar add){uchar i;while(1){start();send_byte(0xa0);ack();if(ACK_FLAG) continue;send_byte(add);ack();if(ACK_FLAG) continue;start();send_byte(0xa1);ack();if(ACK_FLAG) continue;MPM[i++]=receive_byte();delay(5);i2c_ack(1);if(!ACK_FLAG) break;}stop();}子程序:uart#include <msp430x14x.h>#include "Uart.h"/*****************串口初试化设置********************/ void uart_org(void){ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00= 0x03; // 32768/9600UBR10= 0x00;UMCTL0= 0x4a;P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDP3DIR |= 0x10;UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt}/*****************串口发送字符串程序*****************/ void UartStr(unsigned char *p){unsigned char i;for (i=0;*p!=0;i++)//准备要发送的数据{while (!(IFG1 & UTXIFG0));// USART0 TX buffer ready?TXBUF0 =*p++; // RXBUF0 to TXBUF0while ((UTCTL0 & TXEPT) == 0);}_NOP();}/*****************串口发送字符串程序*****************/ void Uart_Str(unsigned char number,unsigned char *p){unsigned char i;for (i=0;i<number;i++)//准备要发送的数据{while (!(IFG1 & UTXIFG0));// USART0 TX buffer ready?TXBUF0 =*p++; // RXBUF0 to TXBUF0while ((UTCTL0 & TXEPT) == 0);}_NOP();}。

MSP430时钟设置程序

MSP430时钟设置程序

MSP430时钟设置程序MSP430时钟设置程序1/void main (void){unsigned int i;WDTCL = WDTPW+WDTHOLD; //停止看门狗P5DIR = 0x10; //设置P5.4输出P5SEL = 0x10; //设置P5.4口为外围模块用作MCLK信号输出BCSCTL1 &= ~XT2OFF; //使TX2有效,TX2上电时默认为关闭的.do{IFG1 &= ~OFIFG; //清振荡器失效标志for(i= 0xff; i>;0; i--); //延时,待稳定.}while ((IFG1 & OFIFG)!=0); //若振荡器失效标志有效BCSCTL2 |= SELM1; //使MCLK = XT2for(;;);}2/#include ;void main(void){unsigned int i;WDTCTL = WDTPW + WDTHOLD; //停止看门狗BCSCTL1 |= XTS;//设置时基寄存器1,使ACLK = LFXT1 = HF XTAL,也就是高频模式.P2DIR|= 0x01; //设置P2.0方向寄存器为输出P2SEL |= 0x01; //设置P2.0口为外围模块用作ACLK信号输出P1DIR |= 0x02; //设置P1.1方向寄存器为输do{IFG1 &= ~OFIFG; //清振荡器失效标志for (i = 0xFF; i >; 0; i--); //延时,待稳定}while ((IFG1 & OFIFG)); //若振荡器失效标志有效? BCSCTL2 |= SELM_3;//设置时基寄存器2,使主时钟信号MCLK = LFXT1 (可靠的) for (;;) //无穷循环{P1OUT |= 0x02; // P1.1 = 1P1OUT &= ~0x02; // P1.1 = 0}}1-LFXT1CLK:低频/高频时钟源.由外接晶体振荡器,而无需外接两个振荡电容器.较常使用的晶体振荡器是32768HZ。

【MSP430入门例程】:Timer A

【MSP430入门例程】:Timer A

MSP430F1系列定时器A结构图[1]TimerA模块结构组成在MSP430F1XX-TimerA的结构中,分别由TA基础模块、CCR0、CCR1、CCR2子模块。

TA基础模块:[1]TA基础子模块主要完成定时器时钟源的输入(时钟源的选择、分频)。

[2]TA定时器计数。

[3]定时器的工作模式设置。

CCR0、CCR1、CCR2子模块:CCRx全称为Capture Compare Register-捕获比较寄存器,这些子模块有着捕获和比较的功能。

捕获、比较信号的触发源可以从芯片的外部引脚、CPU的外围模块输入来。

同时CCRx子模块也有其输出信号OUT.x ,此OUT.x可以输出到芯片的外部引脚、或输入到CPU的外围模块中。

CCRx与TAR(Timer A Register - 简称:TAR )结合使可以实现特定的的功能。

常用TimerA可以实现功能:PWM信号输出功能:通过设置TA的工作模式,结合CCR0、CCR1或CCR2计数。

直从CCR0、CCR1或CCR2中子模块的OUT.x端输出。

Slope AD转换功能:利用定时器A与比较器A结合设计成斜边数模转换器。

实现软USART功能:利用CCR0子模块中的捕获输入功能,结合TAR实现通用串行异步通讯功能(USART)。

ADC12模块的采样信号:利用定时器的TAR或CCR0实现OUT.x输出得到ADC12模块所需要的采样触发信号。

其它应用...。

[2]TimerA 模块工作模式[TA工作模式]TA定时器的工作模式有4种,这4种模式由TACTL寄存器的MC1、MC0位控制:模式 MC1 MC0 功能说明停止0 0 TA为停止(上电状态)增计数0 1 TAR增计数至CCR0,然后回到0。

连续计数 1 0 TAR连续计数至FFFFH,然后回到0。

增/减计数 1 1 TAR增计数至CCR0,然后减计数至0。

[时钟输入]定时器A时钟源有4种选择,分别为外部时钟TACLK、辅助时钟ACLK、子系统时钟SMCLK及INCLK。

【精确延时函数】IAR(MSP430)中的精确延时函数

【精确延时函数】IAR(MSP430)中的精确延时函数

【精确延时函数】IAR(MSP430)中的精确延时函数在IAR 软件430 的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:具体如下【引用别人的,这个延时函数很高】:注意:__delay_cycles(x),x 必须是常量或则是常量表达式,如果是变量则编译报错!IAR FOR AVR 中精确软件延时方法在用单片机的时候常常会用到延时函数,430 也不例外,常见的形式有:void delay(unsigned int ms){unsigned int i,j;for( i=0;idelay_ms(1000);//延时1 秒-------------------------------------------------------------------------------------原因:__delay_cycles()是编译系统”涵数”,IAR编译时会替换成相应的循环代码.看图片,要求delay 100 指令(时钟)周期,编译后刚好100 周期.使用这种延时需要注意:ourdev/thread-756021-1-1.html#define _delay_us(A)__delay_cycles( (uint32) ( (double)(F_CPU) *((A)/1000000.0) + 0.5))#define _delay_ms(A)__delay_cycles( (uint32) ( (double)(F_CPU)*((A)/1000.0) + 0.5))#define _delay_s(A)__delay_cycles( (uint32) ( (double)(F_CPU)*((A)/1.0) + 0.5))tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

各种汇编延时程序大集合

各种汇编延时程序大集合
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R4, #10
SETB ET0
SETB EA
SETB TR0
SJMP $ ;
RET
DELAY: ;延时子程序(1秒)
MOV R0,#0AH
DELAY1: MOV R1,#00H
DELAY2: MOV R2,#0B2H
DJNZ ห้องสมุดไป่ตู้2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
MOV R2,#10 ;延时1秒
LCALL DELAY
*r5+5
DEL : MOV R5,#08H
DEL1: MOV R6,#0FFH
DEL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
;1秒延时子程序是以12MHz晶振
POP R0
POP R1
POP R2
RET
1:DEL: MOV R7, #200
DEL1: MOV R6, #123
NOP
DEL2: DJNZ R6, DEL2
D52: NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET
DELAY: ;延时1毫秒
PUSH PSW
SETB RS0
MOV R7,#50
D1: MOV R6,#10
D2: DJNZ R6,$
DJNZ R7,D1

超详细msp430示例程序汇编

超详细msp430示例程序汇编

一、基础_实验【10个】1、入门试验:LED闪烁(1个)2、时钟实验:设置MCLK、ACLK、SMCLK(1个)3、低功耗实验:设置低功耗模式(1个)4、IO端口试验:IO端口寄存器设置(1个)5、定时器:看门狗定时器、TimerA寄存器设置(2个)6、比较器:比较器A寄存器(1个)7、Flash:flash读写(1个)8、异步通信:异步通信寄存器设置(1个)9、ADC:ADC12寄存器设置(1个)二、开发板模块简单程序【56个】1、LED流水灯实验(红、黄、绿)(1)LED1:检测开发板(2)LED2:普通IO控制闪烁(3)LED3:PWM信号控制闪烁2、蜂鸣器实验(1)蜂鸣器1:单频音(步进变音调)(2)蜂鸣器2:奏乐(祝你平安)3、数码管实验(1)数码管1(显示123456)(2)数码管2(动态显示0~F)(3)数码管3(流动光圈)(4)数码管4(来回光标)4、4×1独立按键实验(1)4×1键盘1:扫描数码管显示(2)4×1键盘2:中断数码管显示(3)4×1键盘3:控制LED(4)4×1键盘4:控制蜂鸣器5、4×4矩阵键盘实验(1)4×4键盘1:行列扫描数码管显示(2)4×4键盘2:行列扫描1602液晶显示(3)4×4键盘3:控制LED蜂鸣器6、1602液晶实验(1)1602液晶1:动态字符显示(2)1602液晶2:静态字符显示(3)1602液晶3:内部时钟显示7、3.3V-5V电平转换实验(1)电平转换1:输出5V方波(2)电平转换2:输出不同占空比的方波(3)电平转换3:MCLK,SMCLK,ACLK8、RS232接口实验(1)RS232接口1:MCU发送数据PC机显示(2)RS232接口2:按键控制MCU发送数据PC机显示(3)RS232接口3:PC机发送数据MCU液晶显示(4)RS232接口4:MCU回发接收到的PC机数据(5)RS232接口5:RS232控制蜂鸣器9、RS485接口实验(1)RS485接口1:发送程序(2)RS485接口2:接收程序10、USB接口实验(1)USB接口1:简单连接测试(2)USB接口2:USB接收数据(3)USB接口3:USB发送数据11、PS2接口实验(1)PS2接口1:PS2控制1602显示(2)PS2接口2:PS2控制数码管显示(3)PS2接口3:PS2控制LED和蜂鸣器12、12-Bit高精度温度传感器实验(1)温度传感器1:DS18B20在数码管显示(2)温度传感器2:DS18B20在液晶显示13、RTC实时时钟实验(1)实时时钟1:DS1302测试(2)实时时钟2:DS1302电子钟14、2k Bit EEPROM实验(1)EEPROM1:AT24C02测试(2)EEPROM2:读出数据通过串口在PC机显示15、12-Bit模数转换器(ADC)接口实验(1)模数转换器1:ADC在数码管显示(2)模数转换器2:ADC在1602液晶在显示(3)模数转换器3:ADC通过串口在PC机显示16、8-Bit数模转换器(DAC)实验(1)数模转换器1:DAC控制LED(2)数模转换器2:DAC输出电压,ADC采样转换并在液晶上显示17、12864液晶实验(与12864液晶配套)(1)12864液晶并口1:字符显示(2)12864液晶并口2:汉字显示(3)12864液晶并口3:图形显示(4)12864液晶并口4:综合演示(5)12864液晶串口5:字符显示(6)12864液晶串口6:汉字显示(7)12864液晶串口7:图形显示(8)12864液晶串口8:综合演示18、射频模块CC1000实验(1)射频模块1:发送数据(2)射频模块2:接收数据19、ucos移植注:17、18程序随模块赠送三、开发板综合程序【30】1、键盘综合实验(1)4×4键盘+蜂鸣器+LED+数码管显示(2)4×4键盘+蜂鸣器+LED+1602液晶显示(3)4×4键盘+蜂鸣器+LED+PC机显示(4)PS2键盘+UART+PC机显示(5)PS2键盘+USB+PC机显示2、接口综合实验(1)USB UART(2)UART USB(3)RS232 RS485(4)RS485 RS2323、温度时间综合实验(1)DS18B20 + DS1302 + 数码管(2)DS18B20 + DS1302 + USB(3)DS18B20 + DS1302 + UART(4)DS18B20 + DS1302 + 16024、AD DA综合实验(1)ADC + 1602(2)ADC + UART(3)ADC + USB(4)DAC + LED + KEY(5)DAC + UART(6)DAC + USB(7)ADC + UART + DS1302(8)ADC + DAC + 1602 + KEY(9)ADC + DAC + UART + KEY5、其他综合实验(1)AT24C02高级应用(搜索,擦除,读出全部)(2)DS1302高级应用(内部RAM存取数据)6、12864液晶综合实验(1)汉字库(2)图形库7、3.2寸TFT触摸屏实验(1)静态图片(2)动画/***************************************************程序功能:BoardConfig.h 头文件---------------------------------------------------***************************************************/ typedef unsigned char uchar;typedef unsigned int uint;//控制位的宏定义#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7;#define Ctrl_0 P3OUT &= ~(BIT3 + BIT6 + BIT7) #define SRCLK_1 P3OUT |= BIT7#define SRCLK_0 P3OUT &= ~BIT7#define SER_1 P3OUT |= BIT6#define SER_0 P3OUT &= ~BIT6#define RCLK_1 P3OUT |= BIT3#define RCLK_0 P3OUT &= ~BIT3//板上资源配置函数void BoardConfig(uchar cmd){uchar i;Ctrl_Out;Ctrl_0;for(i = 0; i < 8; i++){SRCLK_0;if(cmd & 0x80) SER_1;else SER_0;SRCLK_1;cmd <<= 1;}RCLK_1;_NOP();RCLK_0;}/***************************************************程序功能:控制8个LED闪烁,用于测试下载功能是否正常---------------------------------------------------测试说明:观察LED闪烁***************************************************/#include <msp430x14x.h>//#include "BoardConfig.h"/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗// BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯CCTL0 = CCIE; //使能CCR0中断CCR0 = 2047; //设定周期0.5STACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式P6DIR = 0xff; //设置P6口方向为输出P6OUT = 0xff;_EINT(); //使能全局中断LPM3; //CPU进入LPM3模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){P6OUT ^= 0xff; //P2口输出取反}/***********************************************程序功能:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"------------------------------------------------测试说明:观察流水灯流动顺序和速度的变化************************************************//***********************************************程序功能:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"------------------------------------------------测试说明:观察流水灯流动顺序和速度的变化************************************************/#include <msp430x14x.h>#include "BoardConfig.h"uint i = 0,j = 0,dir = 0;uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗// BoardConfig(0xf0);CCTL0 = CCIE; //使能CCR0中断CCR0 = 50000;TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,8分频增计数模式P6DIR = 0xff; //设置P2口方向为输出P6OUT = 0xff;_EINT(); //使能全局中断LPM0; //CPU进入LPM0模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数,在这里通过标志控制流水灯的流动方向和流动速度参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){if(flag == 0){P6OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1}else if(flag == 1){P6OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8}else{if(dir) //灯的点亮顺序D8 -> D1,D1 -> D8,循环绕圈{P6OUT = ~(0x80>>(i++));}else{P6OUT = ~(0x01<<(i++));}}if(i == 8){i = 0;dir = ~dir;}j++;if(j == 40){i = 0;j = 0;flag++;if(flag == 4) flag = 0;switch(speed){case 0:TACTL &=~ (ID0 + ID1);TACTL |= ID_3;break;case 1:TACTL &=~ (ID0 + ID1);TACTL |= ID_2;break;case 2:TACTL &=~ (ID0 + ID1);TACTL |= ID_1;break;case 3:TACTL &=~ (ID0 + ID1);TACTL |= ID_0;break;default:break;}if(flag != 3) speed++;if(speed == 4) speed = 0;}}/*******************************************************程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁P2.3口输出方波的占空比为75%P2.4口输出方波的占空比为25%-------------------------------------------------------测试说明:观察LED的亮灭的时间长短用来连2.3到6.1口看*******************************************************/#include <msp430x14x.h>//#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // 关狗//BoardConfig(0xb0); // 关闭数码管和电平转换,打开流水灯P2DIR = 0xff; // P2端口设置为输出P2OUT = 0xff; // 关闭其他LEDP2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块CCR0 = 4096-1; // PWM周期为1SCCTL1 = OUTMOD_7; // CCR1 reset/setCCR1 = 3072; // CCR1 PWM duty cycleCCTL2 = OUTMOD_7; // CCR2 reset/setCCR2 = 1024; // CCR2 PWM duty cycleTACTL = TASSEL_1 + ID_3 + MC_1; // ACLK/8, up mode_BIS_SR(LPM3_bits); // Enter LPM3}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK//// Description: Output buffered MCLK, SMCLK and ACLK.// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//内部已经连好了的//// MSP430F149// -----------------// /|\| XIN|-// | | | 32k// --|RST XOUT|-// | |// | XT2IN|-// | | XTAL (455k - 8Mhz)// |RST XT2OUT|-// | |// | P5.4|-->MCLK = DCO Max// | P5.5|-->SMCLK = XT2// | P5.6|-->ACLK = 32kHz//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer DCOCTL = DCO0 + DCO1 + DCO2; // Max DCOBCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSELBCSCTL2 |= SELS; // SMCLK = XT2P5DIR |= 0x70; // P5.6,5,4 outputsP5SEL |= 0x70; // P5.6,5,5 optionswhile(1){}}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, LPM3 Using WDT ISR, 32kHz ACLK//// Description: This program operates MSP430 normally in LPM3, pulsing P3.4// at 4 second intervals. WDT ISR used to wake-up system. All I/O configured// as low outputs to eliminate floating inputs. Current consumption does// increase when LED is powered on P3.4. Demo for measuring LPM3 current.// ACLK= LFXT1/4= 32768/4, MCLK= SMCLK= default DCO// //* External watch crystal on XIN XOUT is required for ACLK *////暗久才亮一下和亮暗和时钟没关系啊// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.5|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);//BCSCTL1 |= DIVA_2; // ACLK/4WDTCTL = WDT_ADL Y_1000; // WDT 1s/4 interval timerIE1 |= WDTIE; // Enable WDT interruptP1DIR = 0xFF; // All P1.x outputsP1OUT = 0; // All P1.x resetP2DIR = 0xFF; // All P2.x outputsP2OUT = 0; // All P2.x resetP3DIR = 0xFF; // All P3.x outputsP3OUT = 0x30; // All P3.x resetP4DIR = 0xFF; // All P4.x outputsP4OUT = 0; // All P4.x resetP5DIR = 0xFF; // All P5.x outputsP5OUT = 0; // All P5.x resetP6DIR = 0xFF; // All P6.x outputsP6OUT = 0x80; // All P6.x resetwhile(1){uint i;_BIS_SR(LPM3_bits + GIE); // Enter LPM3P3OUT &= ~BIT5; // Set P3.5 LED on亮for (i = 18000; i>0; i--); // DelayP3OUT |= BIT5; // Clear P3.5 LED off暗}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)}//******************************************************************************* // MSP-FET430P140 Demo - Software Toggle P3.4//// Description: Toggle P3.4 by xor'ing P3.4 inside of a software loop.// ACLK= n/a, MCLK= SMCLK= default DCO ~800k//// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP3DIR |= BIT4; // Set P3.4 to output directionfor (;;){volatile unsigned int i;P3OUT ^= BIT4; // Toggle P3.4 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}}//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, DCO SMCLK//P3.4使用软件WDT中断时间。

msp430g2553定时一秒的程序

msp430g2553定时一秒的程序

#include "msp430g2553.h"//定时一秒unsigned char num;void main(){WDTCTL = WDTPW + WDTHOLD;BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZCCTL0|= CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断CCR0 =12000; //设置捕获/比较寄存器,初始值为12000,对于ACLK时钟频率为12khz的频率,相当于1sTA0CTL = TASSEL_1 +TACLR+MC_1; // 设置定时器A控制寄存器,P1SEL&=~BIT6; //P1.6为I/O口P1DIR |=BIT6; //P1.6为输出_EINT(); //使能中断,这是一个C编译器支持的内部过程。

while(1); //无限次while循环}#pragma vector=TIMER0_A0_VECTOR//固定的格式__interrupt void Timer_A (void) //定时器A的CC0中断处理程序必须是没有返回值的{P1OUT ^= BIT6; //将P3.7引脚取反,就是使发光二极管闪烁}#include "msp430g2553.h"unsigned int times,time1;void TimerA_Init(void){TACTL = TASSEL_1 + ID0 + TACLR ;CCTL0 = CCIE;CCR0 = 16432;TACTL |= MC0;}int main( void ){WDTCTL = WDTPW + WDTHOLD; TimerA_Init(); //定时器初使化P1DIR=0x01;_EINT(); // interrupt enablefor(;;);}#pragma vector = TIMER0_A0_VECTOR __interrupt void Timer_A (void){times++;if(times == 2){times = 0;P1OUT^=BIT0;}。

msp430延时函数

msp430延时函数

msp430延时函数#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))DCOCTL = CALDCO_8MHZ;BCSCTL1 = CALBC1_8MHZ;void delay(unsigned int ms){unsigned int i,j;for( i=0;i<ms;i++)for(j=0;j<1141;j++); //8MHz晶振时}#define CPU_F ((double)1000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))//虽然默认下是1m,但是为了安全起见,这里对其进行校准!DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;//经验证,这是1M下 5000 为1s 左右的样子!则0.2ms左右void delay(unsigned int time){unsigned int i,j;for(i = 0;i < time; i++){for(j = 0;j < 30; j++);}}经计算延时5ms 大概就是 20//尚未得知void Delay(unsigned int Time){while(Time){Time--;}}_EINT();//打开总中断,相当于51的EA=1;_DINT();//关闭总中断,相当于51的EA=0;_BIS_SR(LPM0_bits + GIE);_BIS_SR(CPUOFF)msp430f23x0.h 有#define ENABLE_INTERRUPTS _EINT()打开CCIE(比较模式),计数到CCR0时置位CCIFG,进入中断TIMERA0_VECTOR而打开TAIE,当定时器溢出时置位TAIFG,进入中断TIMERA1_VECTOR__enable_interrupt()比较专一,只是开中断。

MSP430程序指南

MSP430程序指南

MSP4301.时钟控制:430三个时钟源:LFXT1CLK低频时钟源,XT2CLK,高频时钟源,DCOCLK数控RC 振荡器。

2.三种时钟源可提供三种时钟信号:1.ACLK辅助时钟:ACLK是LFXT1CLK信号经过1、2、4、8分频得到的。

ACLK可由软件选作外围器件的时钟信号。

2.MCLK系统主时钟:可由软件来设置来源于低频时钟源,高频,数控。

之后可再经过1、2、4、8分频得到。

MCLK主要用于CPU和系统。

3.SMCLK:可有软件选这高频时钟来源,用于高速外围设备。

其中P1.4/SMCLK, P2.0/ACLK, P5.5/SMCLK, P5.6/ACLK。

时钟信号输出,可由PnSEL|=0xXX,l来设置特殊功能端口。

4.三个振荡器的控制位:1.低频LFXT1:OscOff;2.高频XT2CLK:XT2OFF;3.DCO:SCG0;5.一、时钟模块主要由三个寄存器来进行控制。

1.DCOCTL DCO控制器高三位:DCO.2、DCO.1 DCO.0定义8种频率之一,相邻两位相差10%,第五位详细调整频率。

其中DCO为7时表示选择最高频率。

2.BCSCTL1基本时钟控制器1位数7(最高)---XT2OFF:控制XT2的开启与关闭,0:开启;1:关闭。

6---------XTS:控制LFXT1工作模式:0:低频工作模式32768HZ;1:高频工作模式(前提接了相应的高频晶振)。

5,4--------DIV.1、DIV.0:控制ACLK分频(ACLK时钟来源于LFXT1)0:不分;1: 2分;2: 4分;3:8分;3-------XT5V:此位设置为0;2,1,0-----Rsel.0~Rsel.2 :0~7:最低标频~最高标频。

3.BCSCTL27,6-------SELM.1,SELM.0:选择MCLK时钟源(系统主时钟)0,1:DCOCLK为时钟源2:XT2CLK为时钟源3:时钟源为LFXT1CLK5,4-------DIVM.0,DIVM.1 选择MCLK分频。

msp430精确延时程序汇总

msp430精确延时程序汇总

430精确延时问题今天在晚上发现一种MSP430的精确延时方法,经测试,确实狠精确。

最低可以精确到1/OSC,例如:如果采用8MHz的晶体,那么最小延时就是125ns,已经利用示波器通过验证。

具体做法如下:先做如下预定义:#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))其中第一行中的8000000为时钟,可以根据自己时钟设置。

然后在程序中直接条用delay_us和delay_ms即可。

非常好用,入:delay_ms (1); //延时1msdelay_us(1); //延时1usdelay_us(0.125); //延时0.125us注意:最低延时只能是1/OSC,否则就没有延时了。

该方法缺点:不能传递变量,只能将常数作为参数IAR FOR 430中精确软件延时方法标签: IAR FOR软件延时2010-11-04 10:15IAR FOR 430中精确软件延时方法在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有:void delay(unsigned int ms){unsigned int i,j;for( i=0;i<ms;i++)for(j=0;j<1141;j++); //8MHz晶振时}复制代码//以上程序段在要求延时精度不高的场合可以用。

但在IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:(1):将以下这段代码复制到你的.C源文件中。

#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))复制代码(2):修改在#define CPU_F ((double)8000000) 语句里8000000 修改成你当前MSP430 CPU的主频频率,即CPU的MCLK。

430程序

430程序

一、I/O口P1SEL:功能选择寄存器。

0:I/O功能;1:外设模块功能。

默认IO口P1DIR:方向选择寄存器。

0:输入;1:输出。

默认输入P1OUT:输出寄存器。

0:输出低电平;1:输出高电平P1IN:输入寄存器。

0:输入低电平;1:输入高电平P1SEL|(或)=BIT0(0x01):P1.0得1,则是外设模块功能P1SEL&(与)=~BIT1(0x01)=BIT1(0xfe):P1.0得0,清零。

P1DIR=0x00:全部配置成输入P1OUT|=BIT1:P1.2口置1,输出高电平P1OUT^=0x01:异或,0不变,1取反花样流水(正流水,反流水,中间向两边,两边向中间)#include "msp430x14x.h"unsigned int i;unsigned int table[]={0x7e,0xbd,0xdb,0xe7};void delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR=0xff;while(1){for(i=0;i<8;i++){P1OUT=~(0x01<<i);delay(300);}for(i=0;i<8;i++){P1OUT=~(0x80>>i);delay(300);}for(i=0;i<4;i++){P1OUT=table[i];delay(300);}for(i=3;i>0;i--){P1OUT=table[i];delay(300);}}}二、时钟输入源ACLK 辅助系统时钟,MCLK 主系统时钟,SCLK 子系统时钟按键控制小灯轮流闪烁#include "msp430x14x.h"#define u8 unsigned char#define u16 unsigned int#define u32 unsigned longu8 m,k=0;#define CPU_F ((double)800000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P2DIR=0x00;P1DIR=0xff;P1OUT=0xff;P2IE=BIT1;//P2.1P2IES=BIT0;_EINT();//全局中断开while(1){if(k>0){P1OUT^=1<<k-1;delay_ms(100);}}}#pragma vector=PORT2_VECTOR__interrupt void PORT_2(){delay_ms(5);if((P2IN&BIT1)!=0){while(!(P2IN&BIT1));P1OUT=0xff;k++;if(k==9)k=1;}P2IFG=0x00;}三、计数器TACTL:Timer_A控制寄存器TAR:Timer_A计数器TAIV:中断向量寄存器CCTL0:捕获比较控制寄存器0CCR0:捕获比较寄存器0SSEL1、SSEL0选择定时器输入分频器的时钟源(01:辅助系统)ID1 ID0:00:不分频,01:2分频,10:4分频,11:8分频MC1,MC0计数模式控制位:00:停止模式,01:增计数模式(精确定时),10:连续计数模式(捕获比较)、11:增/减计数模式(精确定时,是增计数模式的2倍)CLR:定时器清除位TAIE:定时器中断允许位(0 禁止定时器溢出中断,1 允许定时器溢出中断)TAIFG:定时器溢出标志位(定时器由CCR0/0FFFFH计数到0时,TAIFG置位)增计数模式(0-65535):计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等时,定时器复位并从0开始重新计数。

MSP430编写的时钟程序

MSP430编写的时钟程序

void delay(uint x)//延时
{
uchar i;
while(x--)
for(i=100;i>0;i++);
}
void key_cor(void)//P2.6控制停止计数
{
if(!(P2IN&BIT6))//P2.6按键计数
{
delay(10);
delay(10);
LED[7]=~duma[sec%10];//秒为显示
LED[6]=~duma[sec/10];
for(i=0;i<8;i++)
{
P5OUT=0x10;
P4OUT=wema[i];
delay(1);
P4OUT=0xff;
}
}
else if((time%3)==2)
{
LED_h();
delay(10);
LED[1]=0xff;
LED[0]=0xff;
else if((time%3)==2)
{
LED_h();
delay(10);
LED[1]=0xff;
LED[0]=0xff;
for(i=0;i<8;i++)
{
P5OUT=0x10;
LED[3]=~duma[mit/10];
for(i=0;i<8;i++)
{
P5OUT=0x10;
P4OUT=wema[i];
delay(1);
P5OUT=0x08;
P4OUT=LED[i];
delay(1);

对MSP430单片机__delay_cycles精确延时的说明及改正

对MSP430单片机__delay_cycles精确延时的说明及改正

对MSP430单片机__delay_cycles精确延时的说明及改正在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题.IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的函数)以提供用户精确延时使用, 该函数原型是:__intrinsic void __delay_cycles(unsigned long __cycles);该内部函数实现__cycles个CPU周期的延时,但对于该参数的设置,我要陈述一下:__cycles需要我们传递的是CPU运行的周期个数网上普遍的用法是:#define CPU_CLOCK 8000000#define delay_us(us)__delay_cycles(CPU_CLOCK/1000000*(us))#define delay_ms(ms) __delay_cycles(CPU_CLOCK/1000*(ms))在CPU主时钟频率为8MHz时, 这确实没有问题, 但是这样的写法: #define CPU_CLOCK 8000000这很容易让人们想到, 可以通过修改它的值以实现对不同主频系统参数的统一,其实这是不正确的! 比如修改为#define CPU_CLOCK 32768以实现32KHz主频的延时...下面来计算看看:当系统主时钟频率CPU_CLOCK为8MHz时:频率 f = 8MHz = 8,000,000Hz机器周期 Tm = 1/f = 1/8MHz = 1/8us也就是说,一个机器周期(nop)的时长是1/8us,所以延时1us即8*Tm,同上面:#define delay_us(us) __delay_cycles(8*(us))#define delay_ms(ms) __delay_cycles(8000*(ms))按照上面的宏定义方法,我们把CPU_CLOCK定义成32768,那么:频率 f = 32KHz = 32,768Hz机器周期 Tm = 1/f = 1/32768Hz ~= 30.5us可想而知,CPU最短的指令执行周期为30.5us, 这时, 想延时1us, 这可能吗?所以, 简单地把上面的定义改成#define CPU_CLOCK 32768是绝对错误的.同样, 还有些朋友实现了0.5us的延时, 这在当f = 1MHz = 1000000Hz时也是不现实的, 此时机器周期Tm = 1us. 在f = 8Mhz时, 4个机器周期为0.5us 尚可.所以, 为避免引起错误的使用或不正确的理解,最好像下面这样定义宏: #if CPU_CLOCK == 8000000#define delay_us(us) __delay_cycles(8*(us))#define delay_ms(ms) __delay_cycles(8000*(ms)) #else#pragma error "CPU_CLOCK is defined implicitly!"#endif另外:__delay_cycles 并不是真正的函数, 只是提供编译器内联展开,该函数并不支持变量参数, 其参数只能是常数.。

MSP430单片机秒表程序(完整)

MSP430单片机秒表程序(完整)

MSP430单片机"秒表" 程序(完整)/*******************************************************基于MSP430F449单片机的秒表*功能:秒计时,8位数码管显示,包括小时、分钟、秒和毫秒*此程序同样适用于其他系列单片机*by:duyunfu1987******************************************************/#include "msp430x44x.h"#define DPYOUT P3OUT //数码管的段选输出口#define DPYCOM P2OUT //38译码器的ABC输入#define OPENOUT P2OUT |= BIT3 //74HC573使能锁存段选#define CLOSEOUT P2OUT &= ~BIT3//74HC573无效int hour,min,sec,ms; //缓冲区定义,小时、分钟、秒、毫秒int count = 0; //2ms计数,计到5时ms增1//共“阴”极数码管的码表unsigned char LED7CC[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//延时n(us)void delay_us(int n){ while(n-- >0)_NOP();}//延时n(ms)void delay_ms(int dms){ int i;while(dms-- >0){ for(i=0;i<250;i++);}}//初始化缓冲区与IO口void Init(){hour = 0;min = 0;sec = 0;ms = 0;P2SEL = 0;P3SEL = 0;P2DIR |= BIT0+BIT1+BIT2+ BIT3;//A B C 使能位P2DIR &= ~(BIT4+BIT5+BIT6); //按键P3DIR = 0xff;P3OUT = 0x00;}//8位数码管动态显示函数void display(){DPYOUT = 0;_NOP();DPYOUT = LED7CC[ms%10]; DPYCOM = 7;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[ms/10]; DPYCOM = 6;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec%10]|0x80; DPYCOM = 5;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec/10]; DPYCOM = 4;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min%10]|0x80; DPYCOM = 3;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min/10]; DPYCOM = 2;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour%10]|0x80; DPYCOM = 1;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour/10]; DPYCOM = 0;OPENOUT;CLOSEOUT;}//按键处理函数void key_deal(int key){switch(key){case 0x60: //START--开始计时{ BTCTL = BT_ADL Y_2;IE2 |= BTIE;_EINT();}break;case 0x50: //STOP -- 停止BTCTL |= BTHOLD; break;case 0x30: //CLEAR--缓冲区清零{ hour = 0;min = 0;sec = 0;ms = 0;}break;default : break;}display();}//主函数void main( void ){int key;// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;FLL_CTL0 |= XCAP18PF;Init();while(1){if((key = P2IN & 0x70)!=0x70){delay_ms(10);if((key = P2IN & 0x70)!=0x70){ key_deal(key);}}display();}}//BT中断服务程序,2ms计时#pragma vector = BASICTIMER_VECTOR__interrupt void BT_ISR(){count ++;if(count == 5){ count = 0;ms ++;}if(ms == 100){ms = 0;sec ++;if(sec == 60){sec = 0;min ++;if(min == 60){min = 0;hour ++;if(hour == 24)hour = 0;}}}}。

MSP430程序库之定时器TA的PWM输出

MSP430程序库之定时器TA的PWM输出

MSP430程序库之定时器TA 的PWM 输出定时器是单片机常用的其本设备,用来产生精确计时或是其他功能;msp430的定时器不仅可以完成精确定时,还能产生PWM 波形输出,和捕获时刻值(上升沿或是下降沿到来的时候)。

这里完成一个比较通用的PWM 波形产生程序。

1.硬件介绍:MSP430系列单片机的TimerA 结构复杂,功能强大,适合应用于工业控制,如数字化电机控制,电表和手持式仪表的理想配置。

它给开发人员提供了较多灵活的选择余地。

当PWM 不需要修改占空比和时间时,TimerA 能自动输出PWM ,而不需利用中断维持PWM 输出。

MSP430F16x 和MSP430F14x 单片机内部均含有两个定时器,TA 和TB ;TA 有三个模块,CCR0-CCR2;TB 含有CCR0-CCR67个模块;其中CCR0模块不能完整的输出PWM 波形(只有三种输出模式可用);TA 可以输出完整的2路PWM 波形;TB 可以输出6路完整的PWM 波形。

定时器的PWM 输出有有8种模式:输出模式0 输出模式:输出信号OUTx 由每个捕获/比较模块的控制寄存器CCTLx 中的OUTx 位定义,并在写入该寄存器后立即更新。

最终位OUTx 直通。

输出模式1 置位模式:输出信号在TAR 等于CCRx 时置位,并保持置位到定时器复位或选择另一种输出模式为止。

输出模式2 PWM 翻转/复位模式:输出在TAR 的值等于CCRx 时翻转,当TAR 的值等于CCR0时复位。

输出模式3 PWM 置位/复位模式:输出在TAR 的值等于CCRx 时置位,当TAR 的值等于CCR0时复位。

输出模式4 翻转模式:输出电平在TAR 的值等于CCRx 时翻转,输出周期是定时器周期的2倍。

输出模式5复位模式:输出在TAR 的值等于CCRx 时复位,并保持低电平直到选择另一种输出模式。

输出模式6PWM 翻转/置位模式:输出电平在TAR 的值等于CCRx 时翻转,当TAR 值等于CCR0时置位。

MSP430延时总结

MSP430延时总结

MSP430延时总结*****************************************软件延时************************************/# define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))/************************************************************** ************************/#define CPU_F((double)8000000)中的8000000表示的是你系统的时钟,该值要随你试验系统的改变而改变。

本例中8000000为MCLK=8MHz的意思。

以下例程是分别产生微秒级和毫秒级延时的示范,如果要实现不同的延时只要改变程序中的实参就可以了。

调用此程序时实参必是数字,而不能使用变量作为实参。

理论上各个延时函数可以达到如下精度:delay_us(1); //延时1usdelay_ms(1); //延时1msdelay_us(4.2); //延时4.2usdelay_ms(4.2); //延时4.2ms上诉例程我用MSP430F448平台测试,现将所用程序及实测结果发布如下,供各位参考:1MHZ主频下软件定时情况:程序:#include <msp430x44x.h>/*****************************************软件延时************************************/#define CPU_F ((double)1000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))/************************************************************** ************************///1000000是CPU的主频,即MCLK,需要随系统的改变而改变void main(void){WDTCTL = WDTPW + WDTHOLD;P1DIR = 0x22;P1SEL = 0x22;P2DIR=0X01;for(;;){delay_us(1);P2OUT^=0X01;}}结果://delay_us(1):实际延时时间为6.8us//delay_us(10); 实际延时时间为15.6us//delay_us(20); 实际延时时间为24.8us//delay_us(90); 实际延时时间为92us//delay_us(100); 实际延时时间为100us//delay_us(900); 实际延时时间为880us//delay_us(1000);实际延时时间为0.96ms//delay_ms(1); 实际延时时间为0.96ms//delay_ms(10); 实际延时时间为9.6ms//delay_ms(100); 实际延时时间为96ms//delay_ms(500); 实际延时时间为480ms//delay_ms(1000); 实际延时时间为950ms//delay_ms(10000); 实际延时时间为10s2MHZ主频如下:程序#include <msp430x44x.h>/*****************************************软件延时************************************/#define CPU_F ((double)2000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))/************************************************************** ************************///2000000是CPU的主频,即MCLK,需要随系统的改变而改变void main(void){WDTCTL = WDTPW + WDTHOLD;FLL_CTL0 |= XCAP18PF;SCFI0 |= FN_2;SCFQCTL = 60;P1DIR = 0x22;P1SEL = 0x22;P2DIR=0X01;for(;;){delay_ms(1000);P2OUT^=0X01;}}结果://delay_us(1):实际延时时间为4us//delay_us(10); 实际延时时间为13.2us//delay_us(20); 实际延时时间为23.2us//delay_us(90); 实际延时时间为92us//delay_us(100); 实际延时时间为104us//delay_us(900); 实际延时时间为900us//delay_us(1000);实际延时时间为1.04ms//delay_ms(1); 实际延时时间为1.04ms//delay_ms(10); 实际延时时间为10ms//delay_ms(100); 实际延时时间为100ms//delay_ms(500); 实际延时时间为500ms//delay_ms(1000); 实际延时时间为1000ms//delay_ms(10000); 实际延时时间为10s8MHZ主频:程序:#include <msp430x44x.h>/*****************************************软件延时************************************/#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))/************************************************************** ************************///8000000是CPU的主频,即MCLK,需要随系统的改变而改变void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerFLL_CTL0 |= DCOPLUS+XCAP18PF; // Set load capacitance for xtalSCFI0 |= FN_4; // x2 DCO, 4MHz nominal DCOSCFQCTL = 121; // (121+1) x 32768x 2= 8MhzP1DIR = 0x22; // P1.1 & P1.5 to output directionP1SEL = 0x22;P2DIR=0X01; // P1.1 & P1.5 to output MCLK & ACLKfor(;;){delay_ms(1000);P2OUT^=0X01;}}结果://delay_us(1):实际延时时间为1.75us//delay_us(10); 实际延时时间为10.80us//delay_us(20); 实际延时时间为20.8us//delay_us(90); 实际延时时间为90.5us//delay_us(100); 实际延时时间为100us//delay_us(900); 实际延时时间为900us//delay_us(1000);实际延时时间为1ms//delay_ms(1); 实际延时时间为1ms//delay_ms(10); 实际延时时间为10ms//delay_ms(100); 实际延时时间为100ms//delay_ms(500); 实际延时时间为500ms//delay_ms(1000); 实际延时时间为1s//delay_ms(10000); 实际延时时间为10s上述测试说明:程式用于20us以下的延时,误差会比较大,主频越高误差越小;大于20us小于1000ms的延时,定时时间几乎没有什么误差。

MSP430的软硬件C延时程序设计

MSP430的软硬件C延时程序设计

MSP430的软硬件C延时程序设计MSP430是超低功耗16位单片机,越来越受到电子工程师亲睐并得到广泛应用。

C程序直观,可读性好,易于移植和维护,已被很多单片机编程人员所采用。

MSP430集成开发环境(如IAR Embedded Workbench和AQ430)都集成了C编译器和C语言级调试器C—SPY。

但是C语言难以实现精确延时,这一直困扰着很多MSP430单片机程序员。

笔者在实际项目开发过程中,遇到很多需要严格时序控制的接口器件,如单总线数字温度传感器DSl8820、实时时钟芯片PCF8563(需要用普通]/o模拟12C总线时序)、三线制数字电位器AD8402、CF卡(Compact Flash Card)等都需要μs级甚至纳ns级精确延时;而一些慢速设备只需要ms到s级的延时。

为此,笔者提出了适合于不同延时级别需要的软件或硬件精确延时方法,并已实际应用,效果良好,大大缩短了开发周期。

1硬件延时MSP430单片机系统程序多采用事件驱动机制,即在没有外部事件触发的情况下CPU休眠于低功耗模式中。

当外部事件到来时,产生中断激活CPU,进入相应的中断服务程序(ISR)中。

中断响应程序只完成两个任务,一是置位相应事件的标志,二是使MCU退出低功耗模式。

主程序负责使MCU在低功耗模式和事件处理程序之间切换,即在主程序中设一个无限循环,系统初始化以后直接进入低功耗模式。

MCU被唤醒后,判断各标志是否置位。

如果是单一标志置位,那么MCU执行相应的事件处理程序,完成后转入低功耗模式;若是有多个标志同时置位,主程序按照事先排好的消息队列对它们依次判别并进行处理,所有事件处理完毕以后MCU休眠,系统进入低功耗状态(该消息队列的顺序是按照任务的重要性设定的优先级)。

在这种前后台系统中,由于主程序是无限循环,就必须关闭看门狗,与其闲置,不如用其定时器的功能作硬件延时。

使用MSP430单片机看门狗定时器实现任意时长精确延时,既满足了系统实时低功耗的要求,也弥补了使用无限循环延时的时间难确定和占用CPU时间长的缺点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

430精确延时问题
今天在晚上发现一种MSP430的精确延时方法,经测试,确实狠精确。

最低可以精确到1/OSC,例如:如果采用8MHz的晶体,那么最小延时就是125ns,已经利用示波器通过验证。

具体做法如下:
先做如下预定义:
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
其中第一行中的8000000为时钟,可以根据自己时钟设置。

然后在程序中直接条用delay_us和delay_ms即可。

非常好用,入:
delay_ms (1); //延时1ms
delay_us(1); //延时1us
delay_us(0.125); //延时0.125us
注意:最低延时只能是1/OSC,否则就没有延时了。

该方法缺点:不能传递变量,只能将常数作为参数
IAR FOR 430中精确软件延时方法
标签: IAR FOR软件延时2010-11-04 10:15
IAR FOR 430中精确软件延时方法
在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有:void delay(unsigned int ms)
{
unsigned int i,j;
for( i=0;i<ms;i++)
for(j=0;j<1141;j++); //8MHz晶振时
}
复制代码//以上程序段在要求延时精度不高的场合可以用。

但在IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:
(1):将以下这段代码复制到你的.C源文件中。

#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
复制代码(2):修改
在#define CPU_F ((double)8000000) 语句里8000000 修改成你当前MSP430 CPU的主频频率,即CPU的MCLK。

单位为HZ。

本例中的8000000为MCLK=8MHZ 的意思。

(3):使用范例
delay_us(1);//1 微秒的延时
delay_ms(1);//1 毫秒的延时
delay_us(3.5);//延时3.5微秒
delay_ms(3.5);//延时3.5毫秒
delay_ms(1000);//延时1秒
MSP430系列单片的中断实现与中断嵌套!
1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;
2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断优先级高还是低都不执行;
3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。

注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动
打开;
4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!
5)
对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;
对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用"EINT();"开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.
中断响应时间
中断的响应时间就是中断的响应过程的时间,中断的响应过程是当有事件产生,进入中断之前必须先记住当前正在做的事情,然后去处理发生的事情,处理这个过程的时间,叫做中断相应时间。

计算机中也是采用的这种方法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。

公示定义
计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。

对于占先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。

占先式内核的中断响应时间由下式给出:中断响应时间=关中断的最长时间+保护CPU内部寄存器的时间+进入中断服务函数的执行时间+开始执行中断服务例程(ISR)的第一条指令时间
问:msp430的C语言中,如何定义一个变量到绝对地址?
比如,如何将char数组str[12]的首地址定义到0300h
答:比如我们在UART应用中。

我们可以在指定地址定义接收缓存的首地,如下:__no_init char data_ptr[100] @ 0x0400;//定义接收缓存的首地址为0x0400
评论

回复
aida662011-07-22 14:22
又不能用。

iar for msp430里有没有__delay_cycles()这条指令。


回复
FIH2011-07-25 15:53
有的在intrinsics.h中,
/* Insert a delay with a specific number of cycles. */
__intrinsic void __delay_cycles(unsigned long __cycles);
,具体要看CPU时钟
试了半天还是iar自带的延时准啊!!__delay_cycles【转】(2011-08-07 09:23:52)
转载
标签:
杂谈
__delay_cycles();
一个mclk的周期延时。

比我自己算的准多了,tnnd我算了一个下午,算指令周期,看汇编代码,,算了半天,还有什么网上的n×5 + 6 ,,毛啊根本不是这样的,
我用的是dco 1mhz
软件算出来的结果差到八千里外了,,伤心。

肯定是哪里出了问题,不过好在最后我试一下__delay_cycles()
不错,这才是我要的us ms级别的延时函数,虽然是软件延时,但是用在微小时序操作上够用了吧!
具体如下【引用别人的,这个延时函数很高】:
注意:__delay_cycles(x),x必须是常量或则是常量表达式,如果是变量则编译报错!
IAR FOR A VR中精确软件延时方法
在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有:
void delay(unsigned int ms)
{
unsigned int i,j;
for( i=0;i<ms;i++)
for(j=0;j<1141;j++); //8MHz晶振时
}
复制代码//以上程序段在要求延时精度不高的场合可以用。

但在IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:
(1):将以下这段代码复制到你的.C源文件中。

#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
复制代码(2):修改
在#define CPU_F ((double)8000000) 语句里8000000 修改成你当前MSP430 CPU的主频频率,即CPU的MCLK。

单位为HZ。

本例中的8000000为MCLK=8MHZ 的意思。

(3):使用范例
delay_us(1);//1 微秒的延时
delay_ms(1);//1 毫秒的延时
delay_us(3.5);//延时3.5微秒
delay_ms(3.5);//延时3.5毫秒
delay_ms(1000);//延时1秒
-------------------------------------------------------------------------------------
原因:
__delay_cycles()是编译系统"涵数",IAR编译时会替换成相应的循环代码.
看图片,要求delay 100指令(时钟)周期,编译后刚好100周期.。

相关文档
最新文档