MSP430_C语言程序讲解
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 位操作C语言编程
MSP430 位操作C 语言编程前言随着MCU 种类不断的增多,我们可选择的范围也越来越大,以前很多做51 的朋友,又开始为自己寻找新的猎物了,MSP430 无疑成为他们的首选目标。
因此,大多数程序员想轻松地实现过渡,那就是,把以前做的51C程序尽可能多的移植到430 平台中,很不幸,由于处理器架构不同,直接做这些工作起来确实相当困难。
首先是位操作问题,51 程序中充彻着大量的位操作,因此,不得不采用变通的方法来做,以下描述了在IAR 编译平台中实现位操作的大致方法,但必须注意到,采用IO 头文件方式的程序,能够实现类似于51 的位编程语句,但并不是真正的位操作,仅仅是语法表达为一个位操作。
方法1--宏定义方式我们来看对一个端口中位0(BIT0)的位操作程序是如何实现的,因此,假定P1.0 是输出,P1.1 是输入。
定义位操作宏如下:#define P1BIT0_OUT_HIGH P1OUT |=BIT0#define P1BIT0_OUT_LOW P1OUT &=~BIT0#define P1BIT1_IN P1IN &=BIT1 注:BIT0,BIT1 定义在相应430 器件的头文件中使用位操作......P1BIT0_OUT_HIGH; //输出P1.0 为高if(P1BIT_IN) P1BIT0_OUT_LOW; //如果P1.1 输入高,则输出P1.0 低......从某种程度上,这种编程方法具备高级语言的编程特点,具有很好的可读性,可移植性也不错,也是目前用的比较多的方法。
但是缺点,是不能把宏定义统一起来,每个宏需要程序员自己定义,由此,在多项目管理中,对代码的移植性带来了一些问题。
同时,也存在着一些潜在的问题,例如,无意的错误定义等。
这给程序调试多多少少带来一些负面影响。
方法2--使用IO 头文件方式IAR 除了提供目前我们经常使用的mspx43xxx.h 头文件外,其实,也定义了可以进行位操作的寄存器结构定义。
Msp430频率计c语言代码实现
Msp430频率计c语言代码实现#include <msp430x14x.h>#define uint unsigned intuint i,f;unsigned char table[] = " Hz";//******************延时函数*******************************void delay(uint z){uint t,y;for(t=z;t>0;t--)for(y=110;y>0;y--);}//*******************写命令********************************** void write_com(unsigned char com){P3OUT&=~BIT0; //作为RS选择端低电平有效P3OUT&=~BIT1; //rw位置低P4OUT = com;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//*******************写数据********************************** void write_data(unsigned char date){P3OUT|=BIT0; //作为RS选择端高电平有效P3OUT&=~BIT1 ; //rw位置低P4OUT=date;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//********************初始化***********************************void init(){P3DIR=0xff; //P3输出作控制口P3SEL=0;P3OUT=0x00;P3OUT&=~BIT2; //EP3OUT&=~BIT0; //RSP4DIR=0XFF; //P4输出作数据口P4SEL=0;P4OUT=0X00;write_com(0x38); //显示模式设置write_com(0x0c); //开显示,不显光标write_com(0x06); //数据地址指针write_com(0x01); //清屏_BIS_SR(GIE); //开总中断}//********************液晶显示函数************************void display(unsigned char x,unsigned char *p){unsigned int NUM;write_com(x);for(NUM=0;NUM<10;NUM++){write_data(table[NUM]);}}//***********************主函数**************************************************void main(void){WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptTACTL = TASSEL_0 + TACLR + TAIE + MC1; //定时器A选择外部时钟源,开中断,连续计数模式P1DIR &= ~BIT0; //P1.0输入P1SEL |= BIT0; //P1.0做定时器A的外部信号源输入端口_EINT(); //开总中断while(1){if(f != 0){IE1 &= ~WDTIE; //关看门狗中断table[0] = f/100000 + '0'; //设置液晶输出数组table[1] = f/10000 - 10*(f/100000) + '0';table[2] = f/1000 - 10*(f/10000) + '0';table[3] = f/100 - 10*(f/1000) + '0';table[4] = f/10 - 10*(f/100) + '0';table[5] = f - 10*(f/10) + '0';init();while(1){display(0x80,table); //液晶显示}}}}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){i = TAR;f = 4*i;}。
msp430 C 程序
>>>>>>>>>>>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;}>>>>>>>>>>>cry1602.h<<<<<<<<<<<void DispNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr); void LocateXY(unsigned char x,unsigned char y);void Disp1Char(unsigned char x,unsigned char y,unsigned char data);void LcdReset(void);void LcdWriteCommand(unsigned char cmd,unsigned char chk);void LcdWriteData( unsigned char data );void WaitForEnable(void);void Delay5ms(void);void Delay400ms(void);>>>>>>>>>>>cry1602.c<<<<<<<<<<<#include <msp430x14x.h>#include "cry1602.h"typedef unsigned char uchar;typedef unsigned int uint;/**************宏定义***************/#define DataDir P4DIR#define DataPort P4OUT#define Busy 0x80#define CtrlDir P3DIR#define CLR_RS P3OUT&=~BIT0; //RS = P3.0 #define SET_RS P3OUT|=BIT0;#define CLR_RW P3OUT&=~BIT1; //RW = P3.1#define SET_RW P3OUT|=BIT1;#define CLR_EN P3OUT&=~BIT2; //EN = P3.2#define SET_EN P3OUT|=BIT2;/*******************************************函数名称:DispNchar功 能:让液晶从某个位置起连续显示N个字符参 数:x--位置的列坐标y--位置的行坐标n--字符个数ptr--指向字符存放位置的指针返回值 :无********************************************/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) {uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y ^= 1;}}}/*******************************************函数名称:LocateXY功 能:向液晶输入显示字符位置的坐标信息参 数:x--位置的列坐标y--位置的行坐标返回值 :无********************************************/void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; //如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);}/*******************************************函数名称:Disp1Char功 能:在某个位置显示一个字符参 数:x--位置的列坐标y--位置的行坐标data--显示的字符数据返回值 :无********************************************/void Disp1Char(uchar x,uchar y,uchar data){LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功 能:对1602液晶模块进行复位操作参 数:无返回值 :无********************************************/void LcdReset(void){CtrlDir |= 0x07; //控制线端口设为输出状态 DataDir = 0xFF; //数据端口设为输出状态 LcdWriteCommand(0x38, 0); //规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); //显示模式设置LcdWriteCommand(0x08, 1); //显示关闭LcdWriteCommand(0x01, 1); //显示清屏LcdWriteCommand(0x06, 1); //写字符时整体不移动LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁}函数名称:LcdWriteCommand功 能:向液晶模块写入命令参 数:cmd--命令,chk--是否判忙的标志,1:判忙,0:不判返回值 :无********************************************/void LcdWriteCommand(uchar cmd,uchar chk){if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort = cmd; //将命令字写入数据端口 _NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数:data--显示字符数据返回值 :无********************************************/void LcdWriteData( uchar data ){WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功 能:等待1602液晶完成内部操作参 数:无返回值 :无void WaitForEnable(void){P4DIR &= 0x00; //将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P4IN & Busy)!=0); //检测忙标志CLR_EN;P4DIR |= 0xFF; //将P4口切换为输出状态}/******************************************* 函数名称:Delay5ms功 能:延时约5ms参 数:无返回值 :无********************************************/ void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms功 能:延时约400ms参 数:无返回值 :无********************************************/ void Delay400ms(void){uchar i=50;uint j;while(i--){j=7269;while(j--);}}>>>>>>>>>>>IIC.h<<<<<<<<<<<void Set_IO(void);void delay(void);void start(void);void stop(void);void mack(void);void mnack(void);unsigned char check(void);void write1(void);void write0(void);void write1byte(unsigned char wdata);unsigned char writeNbyte(unsigned char * outbuffer,unsigned char n); unsigned char read1byte(void);void readNbyte(unsigned char * inbuffer,unsigned char n); >>>>>>>>>>>IIC.c<<<<<<<<<<<#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define SCL_H P1OUT |= BIT1#define SCL_L P1OUT &= ~BIT1#define SDA_H P1OUT |= BIT0#define SDA_L P1OUT &= ~BIT0#define SCL_out P1DIR |= BIT1 //SCL设置为输出模式#define SDA_in P1DIR &= ~BIT0 //SDA改成输入模式#define SDA_out P1DIR |= BIT0 //SDA变回输出模式#define SDA_val P1IN&BIT0 //SDA的位值#define TRUE 1#define FALSE 0/*******************************************函数名称:Set_IO功 能:设置IIC对应IO为输出方向并输出高电平参 数:无返回值 :无********************************************/void Set_IO(void){SCL_out;SDA_out;SCL_H;SDA_H;}/******************************************* 函数名称:delay功 能:延时约100us的时间参 数:无返回值 :无********************************************/ void delay(void){uchar i;for(i = 0;i < 15;i++)_NOP();}/******************************************* 函数名称:start功 能:完成IIC的起始条件操作参 数:无返回值 :无********************************************/ void start(void){SCL_H;SDA_H;delay();SDA_L;delay();SCL_L;delay();}/******************************************* 函数名称:stop功 能:完成IIC的终止条件操作参 数:无返回值 :无********************************************/ void stop(void){SCL_H;SDA_L;delay();SDA_H;delay();}/*******************************************函数名称:check功 能:检查从机的应答操作参 数:无返回值 :从机是否有应答:1--有,0--无********************************************/ uchar check(void){uchar slaveack;SDA_in;SCL_H;delay();slaveack = SDA_val; //读入SDA数值SCL_L;delay();SDA_out;if(slaveack) return FALSE;else return TRUE;}/******************************************* 函数名称:write1功 能:向IIC总线发送一个1参 数:无返回值 :无********************************************/ void write1(void){SDA_H;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write0功 能:向IIC总线发送一个0参 数:无返回值 :无********************************************/ void write0(void){SDA_L;delay();SCL_H;delay();SCL_L;delay();}/*******************************************函数名称:write1byte功 能:向IIC总线发送一个字节的数据参 数:wdata--发送的数据返回值 :无********************************************/void write1byte(uchar wdata){uchar i;for(i = 8;i > 0;i--){if(wdata & 0x80) write1();else write0();wdata <<= 1;}}>>>>>>>>>>>EEPROM.h<<<<<<<<<<<unsigned char Write_1Byte(unsigned char wdata,unsigned char dataaddress); unsigned char Write_NByte(unsigned char * outbuf,unsigned char n,unsigned char dataaddress);unsigned char Read_1Byte_currentaddress(void);unsigned char Read_NByte_currentaddress(unsigned char * readbuf,unsigned char n); unsigned char Read_1Byte_Randomaddress(unsigned char dataaddress);unsigned char Read_NByte_Randomaddress(unsigned char * readbuf,unsigned char n,unsigned char dataaddress);>>>>>>>>>>>EEPROM.c<<<<<<<<<<<#include "IIC.h"typedef unsigned char uchar;typedef unsigned int uint;#define deviceaddress 0xa0 //AT24C02的设备地址/*******************************************函数名称:delay_10ms功 能:延时约6ms,等待EEPROM完成内部写入参 数:无返回值 :无********************************************/void delay_10ms(void){uint i = 1000;while(i--);}/*******************************************函数名称:Write_1Byte功 能:向EEPROM中写入1个字节的数据参 数:Wdata--写入的数据dataaddress--数据的写入地址返回值 :写入结果:1--成功,0--失败********************************************/uchar Write_1Byte(uchar wdata,uchar dataaddress){start();write1byte(deviceaddress);if(check()) write1byte(dataaddress);else return 0;if(check()) write1byte(wdata);else return 0;if(check()) stop();else return 0;delay_10ms(); //等待EEPROM完成内部写入return 1;}/*******************************************函数名称:Write_NByte功 能:向EEPROM中写入N个字节的数据参 数:outbuf--指向写入数据存放首地址的指针n--数据个数,最大不能超过8,由页地址决定其最大长度dataaddress--数据写入的首地址返回值 :写入结果:1--成功,0--失败********************************************/uchar Write_NByte(uchar * outbuf,uchar n,uchar dataaddress){uchar flag;start();write1byte(deviceaddress); //写入器件地址if(check() == 1)write1byte(dataaddress); //写入数据字地址 elsereturn 0;if(check())flag=writeNbyte(outbuf,n);elsereturn 0;delay_10ms(); //等待EEPROM完成内部写入 if(flag) return 1;else return 0;}/*******************************************函数名称:Read_1Byte_currentaddress功 能:从EEPROM的当前地址读取1个字节的数据参 数:无返回值 :读取的数据********************************************/ uchar Read_1Byte_currentaddress(void){uchar temp;start();write1byte((deviceaddress|0x01));if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_currentaddress功 能:从EEPROM的当前地址读取N个字节的数据参 数:readbuf--指向保存数据地址的指针n--读取数据的个数返回值 :读取结果:1--成功,0--失败********************************************/ uchar Read_NByte_currentaddress(uchar * readbuf,uchar n) {start();write1byte((deviceaddress|0x01));if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}/*******************************************函数名称:Read_1Byte_Randomaddress功 能:从EEPROM的指定地址读取1个字节的数据参 数:dataaddress--数据读取的地址返回值 :读取的数据********************************************/uchar Read_1Byte_Randomaddress(uchar dataaddress){uchar temp;start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte((deviceaddress|0x01));}elsereturn 0;if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_Randomaddress功 能:从EEPROM的指定地址读取N个字节的数据参 数:readbuf--指向保存数据地址的指针n--读取数据的个数dataaddress--数据读取的首地址返回值 :读取结果:1--成功,0--失败********************************************/uchar Read_NByte_Randomaddress(uchar * readbuf,uchar n,uchar dataaddress) {start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte(deviceaddress|0x01);}elsereturn 0;if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}>>>>>>>>>>>ds1302.h<<<<<<<<<<< void delay(unsigned int time);void Reset_DS1302(void);void Write1Byte(unsigned char wdata);unsigned char Read1Byte(void);void W_Data(unsigned char addr, unsigned char wdata); unsigned char R_Data(unsigned char addr);void BurstWrite1302(unsigned char *ptr);void BurstRead1302(unsigned char *ptr);void BurstWriteRAM(unsigned char *ptr);void BurstReadRAM(unsigned char *ptr);void Set_DS1302(unsigned char *ptr);void Get_DS1302(unsigned char *ptr); >>>>>>>>>>>ds1302.c<<<<<<<<<<< #include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;/**************宏定义***************/#define DS_RST BIT7 //DS_RST = P2.7#define DS_SCL BIT5 //DS_SCL = P2.5#define DS_SDA BIT6 //DS_SDA = P2.6#define DS_RST_IN P2DIR &= ~DS_RST#define DS_RST_OUT P2DIR |= DS_RST#define DS_RST0 P2OUT &= ~DS_RST#define DS_RST1 P2OUT |= DS_RST#define DS_SCL_IN P2DIR &= ~DS_SCL#define DS_SCL_OUT P2DIR |= DS_SCL#define DS_SCL0 P2OUT &= ~DS_SCL#define DS_SCL1 P2OUT |= DS_SCL#define DS_SDA_IN P2DIR &= ~DS_SDA#define DS_SDA_OUT P2DIR |= DS_SDA#define DS_SDA0 P2OUT &= ~DS_SDA#define DS_SDA1 P2OUT |= DS_SDA#define DS_SDA_BIT P2IN & DS_SDA/*******************************************函数名称:delay功 能:延时一段时间参 数:time--延时长度返回值 :无********************************************/ void delay(uint time){uint i;for(i=0;i<time;i++) _NOP();}/*******************************************函数名称:Reset_DS1302功 能:对DS1302进行复位操作参 数:无返回值 :无********************************************/ void Reset_DS1302(void){DS_RST_OUT; //RST对应的IO设置为输出状态DS_SCL_OUT; //SCLK对应的IO设置为输出状态 DS_SCL0; //SCLK=0DS_RST0; //RST=0delay(10);DS_SCL1; //SCLK=1}/*******************************************函数名称:Write1Byte功 能:对DS1302写入1个字节的数据参 数:wdata--写入的数据返回值 :无********************************************/ void Write1Byte(uchar wdata){uchar i;DS_SDA_OUT; //SDA对应的IO设置为输出状态 DS_RST1; //REST=1;for(i=8; i>0; i--){if(wdata&0x01) DS_SDA1;else DS_SDA0;DS_SCL0;delay(10);DS_SCL1;delay(10);wdata >>=1;}}/******************************************* 函数名称:Read1Byte功 能:从DS1302读出1个字节的数据参 数:无返回值 :读出的一个字节数据********************************************/ uchar Read1Byte(void){uchar i;uchar rdata=0X00;DS_SDA_IN; //SDA对应的IO设置为输入状态 DS_RST1; //REST=1;for(i=8; i>0; i--){DS_SCL1;delay(10);DS_SCL0;delay(10);rdata >>=1;if(DS_SDA_BIT) rdata |= 0x80;}return(rdata);}/******************************************* 函数名称:W_Data功 能:向某个寄存器写入一个字节数据参 数:addr--寄存器地址wdata--写入的数据返回值 :无********************************************/ void W_Data(uchar addr, uchar wdata){DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(addr); //写入地址Write1Byte(wdata); //写入数据DS_SCL1;DS_RST0;}/*******************************************函数名称:R_Data功 能:从某个寄存器读出一个字节数据参 数:addr--寄存器地址返回值 :读出的数据********************************************/uchar R_Data(uchar addr){uchar rdata;DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(addr); //写入地址rdata = Read1Byte(); //读出数据DS_SCL1;DS_RST0;return(rdata);}/*******************************************函数名称:BurstWrite1302功 能:以burst方式向DS1302写入批量时间数据参 数:ptr--指向时间数据存放地址的指针返回值 :读出的数据说 明:时间数据的存放格式是:秒,分,时,日,月,星期,年,控制 【7个数据(BCD格式)+1个控制】********************************************/void BurstWrite1302(uchar *ptr){uchar i;W_Data(0x8e,0x00); //允许写入DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xbe); // 0xbe:时钟多字节写入命令for (i=8; i>0; i--){Write1Byte(*ptr++);}DS_SCL1;DS_RST0;W_Data(0x8e,0x80); // 禁止写入}/*******************************************函数名称:BurstRead1302功 能:以burst方式从DS1302读出批量时间数据参 数:ptr--指向存放时间数据地址的指针返回值 :无说 明:时间数据的存放格式是:秒,分,时,日,月,星期,年,控制 【7个数据(BCD格式)+1个控制】********************************************/void BurstRead1302(uchar *ptr){uchar i;DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xbf); //0xbf:时钟多字节读命令for (i=8; i>0; i--){*ptr++ = Read1Byte();}DS_SCL1;DS_RST0;}/*******************************************函数名称:BurstWriteRAM功 能:以burst方式向DS1302的RAM中写入批量数据参 数:ptr--指向存放数据地址的指针返回值 :无说明 :共写入31个字节的数据********************************************/void BurstWriteRAM(uchar *ptr){uchar i;W_Data(0x8e,0x00); //允许写入DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xfe); //0xfe:RAM多字节写命令for (i = 31; i>0; i--) //RAM共有31个字节{Write1Byte(*ptr++);}DS_SCL1;DS_RST0;W_Data(0x8e,0x80); //禁止写入}/*******************************************函数名称:BurstReadRAM功 能:以burst方式从DS1302的RAM中读出批量数据参 数:ptr--指向数据存放地址的指针返回值 :无说明 :共读出31个字节的数据********************************************/void BurstReadRAM(uchar *ptr){uchar i;DS_RST0;DS_SCL0;_NOP();DS_RST1;Write1Byte(0xff); //0xff:RAM的多字节读命令for (i=31; i>0; i--){*ptr++ = Read1Byte();}DS_SCL1;DS_RST0;}/*******************************************函数名称:Set_DS1302功 能:设置DS1302内部的时间参 数:ptr--指向存放数据地址的指针返回值 :无说明 :写入数据的格式:秒 分 时 日 月 星期 年 【共7个字节】 ********************************************/void Set_DS1302(uchar *ptr){uchar i;uchar addr = 0x80;W_Data(0x8e,0x00); //允许写入for(i =7;i>0;i--){W_Data(addr,*ptr++);addr += 2;}W_Data(0x8e,0x80); //禁止}/*********************************************************** 名称: Get_DS1302* 说明:* 功能: 读取DS1302当前时间* 调用: R_Data(uchar addr)* 输入: ucCurtime: 保存当前时间地址。
msp430的一些常用的C语言控制程序---RS232
msp430的一些常用的C语言控制程序---RS232//需要调试助手辅助才能观察到收或接的数据#include//void OSC_Init(void); void USATR0_Init(void);//void main(){WDTCTL = WDTPW + WDTHOLD;OSC_Init();USATR0_Init();_BIS_SR(GIE);//用调试助手可以检测,也可以结合按键观察到数据的传输}//void OSC_Init(void){BSCTL1 &= ~XT2OFF;//XT2 振荡器开启do //清OSCFault 标志{ IFG1 &= ~OFIFG; for (i=0xFF;i>0;i--); } while((IFG1&OFIFG));BSCTL2 |= (SELM_1 + SELS);//MCLK = XT2CLK,SMCLK = XT2CLK}//void USATR0_Init(void){P3SEL |= (BIT4 + BIT5);//选择端口的第二功能ME1 |= (UTXE0 + URXE0);//工作模式1,UART0 使能UCTL0 |= CHAR ;//发送字长,八位UTCTL0 |= (SSEL0 + SSEL1);//选择时钟源,用于确定波特率发生器的时钟源,选择辅助时钟ACLK,子系统时钟SMCLKUBR00 = 0x9F;//波特率选择寄存器低位UBR10 = 0x01;//波特率选择寄存器高位UMCTL0 = 0xB5;//波特率调整寄存器UCTL0 &= ~SWRST;//USATR 状态机初始化复位IE1 |= URXIE0;//允许USATR 中断}#pragma vector=UART0RX_VECTOR__interrupt void uart0_rx(void){while(!(IFG1 & UTXIFG0));//等待,看看接收寄存器里面是不是有数据TXBUF0 = RXBUF0;//将接收过来的数据在发出去}tips:感谢大家的阅读,本文由我司收集整编。
MSP430单片机C语言编程
TACTL |= MC0; //设置定时器工作模式为加计数到CCR0初值
P3DIR = 0XFF; //P3口为输出
P4DIR = 0XFF; //P4口为输出
P5DIR = 0XFF; //P5口为输出
P3OUT = 0X7E; //P3口输出为0111 1110
void main (void)
{
WDTCTL= WDTPW + WDTTMSEL+WDTSSEL;
IE1|=WDTIE;
P3DIR |=BIT7;
_EINT();
while(1);
}
interrupt[WDT_VECTOR] void WDT_interrupt (void)
P3DIR |=BIT7; //将P3.7设置为输出
_EINT(); //调用C430编译器内部函数,使能中断
while(1); //无限次循环
}
interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A中断函数
{
P3OUT ^= BIT7; //P3.7位取反
右侧数码管与P4口相连,a~g,h对应P4.0~P4.7
(2)发光二极管
8 个发光二极管与P3 口连接
(3)按钮:
左侧8个按钮与P2口相连,引脚号标在按钮上方
右侧8个按钮与P1口相连,引脚号标在按钮上方
(4)P2.3引脚还是模拟比较器输入
(5)P6.0,P6.1引脚连接模拟量电位器,用于模拟量实验
//定义七段译码的共阳数码管显示数组
// hgfg dcba
MSP430单片机C语言的基本结构
MSP430单片机C语言的基本结构王晓宁2013/1/28随着单片机处理速度的加快和存储容量的加大以及相应的开发软件中增强的代码优化功能,用C语言编写的程序其代码效率和运行速度已堪与汇编程序相媲美,而且C语言程序因其平易性、结构化、易维护性和可移植性而日益广泛地应用于单片机的开发中。
用C语言编程时必须结合单片机的特点,不同品牌、不同系列或不同型号的单片机其内部资源、寄存器名称等都会不同,因此其软件的开发必须结合实际的硬件来进行。
但C语言的程序结构还是有许多共性的,下面结合MSP430单片机大致说一下C程序的基本结构。
C语言的程序结构还是比较规范的,一般包括头文件、宏定义、变量定义、函数定义、一个主函数main( )、以及中断处理函数等。
在多文件的管理中,还包括自定义的头文件等。
根据不同的情形,一个完整的C程序可以有不同的具体结构,但其框架基本上还是固定的。
下面通过几个简单的小例子来看一下C 程序的几种结构。
在此之前,先说一下C中的赋值方式。
很多情况下,C程序就是在那儿完成一些赋值操作。
|= 是“或”运算,&=是“与”运算,^= 是“异或”运算。
比如BIT0已经在430的头文件里定义为:BIT0=0x0001,0x0001是16进制计数,转成2进制就是(低八位),那么P1OUT|=BIT0,是一个什么结果?这是一个“或”运算(英文称or)。
首先P1OUT是一个在头文件中定义好的寄存器,是8位的,因此,我们可以把P1OUT就当成一个变量名好了,只不过这个变量是在头文件中定义的,我们直接拿来用即可。
P1OUT 的取值就是在~之间(二进制)。
因此不管P1OUT原先的值是多少,P1OUT|=BIT0就是(设P1OUT原先的值为xxxxxxxx)xxxxxxxx跟进行或运算,最低位(即BIT0)的值肯定是1的,而对其它位没有影响。
因此这样赋值后P1OUT=xxxxxxx1,达到了让BIT0位等于1(称为“置1”)的目的。
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_c语言
一、实验目的1.巩固编写和调试C语言程序的方法;2.了解简单电路的控制方法二、实验任务1.简单电子表的设计用8 个发光二极管以秒为单位显示时间值,按下面步骤完成一个简单电子表的设计:1)硬件连线:用跳线将L6~L1 分别与P2.5~P2.0 连接,L6~L1 用于显示秒值;用双口杜邦线将L7 与P5.0 连接,L8 与P5.1 连接,L8~L7 用于显示分钟值;蜂鸣器的控制端Buzz 与P4.1 连接;2)编写完整程序:计数秒值,用8 个发光二极管以二进制将时间显示出来,如图3-1,其中高两位显示分钟值(L8、L7),低6 位显示秒值(L6~L1),每60 秒,分钟值加1,黑色表示灯亮,则显示的时间表示表示3 分27 秒。
每计数到4 分钟时,控制蜂鸣器发出一报警声,然后又从0 开始重新计数。
其中1 秒时间可通过执行for(i=0;i<0x3FFFF;i++); 语句所花时间来调整。
实验的硬件图如下所示经过编写和调试程序,下面的程序可以满足试验的要求。
#include "io430.h"int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P2SEL=0;P1SEL=0;P2DIR=0xFF;P1DIR=0xFF;unsignedinti,j,k,m;for(k=0;k<4;){for(j=0;j<60;j++){P2OUT=j;for(i=0;i<0xFFFF;i++);}k++;P1OUT=k;for(m=0;m<0x3FFFF;m++);}}3)(选做)增加按键控制功能:当按下KEY2 键时清零;按下KEY3 键时开始(或称继续)计时;按下KEY4 键时暂停计时。
硬件图如下图所示:程序如下所示#include "io430.h"void delay(unsigned inti) //定义一个1秒钟延时函数{unsignedint j;while(i--){for(j=0;j<125;j++);}}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1SEL=0x00;P1DIR=0X00;P2SEL=0X00;P2DIR=0XFF;P4SEL_bit.P1=0;P4DIR_bit.P1=1;P5SEL=0x00;P5DIR=0xff;unsignedintl,m;while(1){P4OUT_bit.P1=1;P5OUT=0xff;P2OUT=0xff;if(P1IN_bit.P3==0){while(1){m=0;loop1:while(m<=3){for(l=0;l<60;l++){P2OUT=~l;if(P1IN_bit.P4==0){P2OUT=~l;P5OUT=~m;while((P1IN_bit.P3)&1==1);}if(P1IN_bit.P2==0){P2OUT=0xff;P5OUT=0xff;while((P1IN_bit.P3)&1==1){;} goto loop1;;}delay(100);}m++;P5OUT=~m;if((P5OUT&0x03)==0x03){ P4OUT_bit.P1=0;delay(10);P4OUT_bit.P1=1;P2OUT=0xff;}}}}}}思考题:1)如果硬件连线是将发光二极管LED8~LED1 分别与P2.7~P2.0 连接,按键Key4~Key2 分别与P1.4~P1.2 连接,蜂鸣器BUZZ 与P6.5 连接的话,实验板上连线,如何编程实现任务1?答:和选做部分几乎一样,只要改一下端口的连接,不在赘述了。
MSP430单片机实用C语言程序基础
MSP430系列单片机实用C语言程序设计——March 2, 2011扩展的关键字1.asm也可以写成__asm。
功能是在C程序中直接嵌入汇编语言。
语法:asm(“string”);其中string必须是有效的汇编语句。
2.__interrupt放在函数前面,标志中断函数。
下面这段程序是异步串行口UART0的接收中断函数。
UART0RX_VECTOR为异步串行口UART0的接收中断向量。
举例:#pragma vector=UART0RX_VECTOR__interrupt void UART0_R(void) //UART0接收中断{TXBUF0=RXBUF0;}3.__monitor放在函数前面,功能是但这一函数执行的时候自动关闭中断。
应该尽量缩短这样的函数,否则,中断事件无法得到及时的响应。
4.__no_init放在全局变量前面,功能是使程序启动时不为变量赋初值。
5.__raw编译中断函数时,编译器会自动生成一段代码,首先保存当时所用到CPU内寄存器的内容,退出中断程序时再进行恢复。
将__raw放在中断函数前可以禁止保存CPU内寄存器的过程,当然退出时也不会恢复。
是否为中断函数使用此关键字要根据需要而定。
6.__regvar放在变量前面,作用是声明变量为寄存器变量。
可以用于整数、指针、32位浮点数以及只含有一个元素的结构和联合。
寄存器变量的地址只能为R4或者R5,也不能用指针指向这个寄存器变量,而且必须用__no_init禁止初始化。
如:__regvar __no_init unsigned char q0 @ __R4;其他不常用的关键字还有:__data16、__intrinsic、__noreturn、__root、__task、__word16。
内部函数本节将介绍内部函数的原型和功能。
1.__bcd_add_shortunsigned short __bcd_add_short(unsigned short, unsigned short);功能:两个16位BCD格式的数相加,返回和。
MSP430系列C编译器编程指南
1.3.1 用户需要什么
装有 HP-UX 9.X 最小 的 HP9000/700 工作站 或装有 SunOS 4.X 最小 或 Solaris 2.X 最小 的 Sun4/SPARC 工作站
利尔达电子 中国 有限公司 TEL 0571-88800000 FAX 0571-88805970
-2-
MSP430 系列 C 编译器编程指南
1 插入第 1 张安装盘 2 双击 M ain 程序组中 File Manager 文件管理器 图标 3 在 File Manager 文件管理器 工具栏中单击磁盘图标 4 双击 Setup.exe 图标 然后按照屏幕上的指示操作
1.2.5 从 Windows 3.1X 或 NT3.51 运行
进入程序管理器 Program Manager 并双击 IAR Embedded Workbench 图标
1.2.3 从 Windows 95 或 NT4.0 运行
1 单击任务栏中 Start(开始)按钮 然后单击 Programs 程序 和 IAR Embedded Workbench 2 单击 IAR Embedded Workbench
1.2.4 从 Windows 3.1X 或 NT3.51 安装
1.2.1 用户需要什么
利尔达电子 中国 有限公司 TEL 0571-88800000 FAX 0571-88805970
-1-
MSP430 系列 C 编译器编程指南
z Windows95, Windows NT 3.51 或更高版本 或 Windows 3.1 X z 多达 15M 字节的自由磁盘空间 用于嵌入式 Workbench z 最少 4M 字节的 RAM 用于 IAR 应用程序 如果用户正在使用 C-SPY 那么用户应当在 C-SPY 之前安装 Workbench
基于msp430的i2c模拟总线程序讲解
//等待写操作完成
EEPROM_AckPolling();
//写入数据
EEPROM_ByteWrite(0*0003,0*78);
//等待写操作完成
EEPROM_AckPolling();
//写入数据
EEPROM_ByteWrite(0*0004,0*9A);
//等待写操作完成
EEPROM_AckPolling(); //写入数据 EEPROM_ByteWrite(0*0005,0*BC); //等待写操作完成 EEPROM_AckPolling(); //读出数据,随机读 Data[0] = EEPROM_RandomRead(0*0000); //地址自动加 1 //读出数据,当前地址读 Data[1] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读 Data[2] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读 Data[3] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读 Data[4] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读 Data[5] = EEPROM_CurrentAddressRead(); } IIC.C *include <MSP430*16*.h> *include "IIC.h" *define SLAVEADDR 0*50; int t*_count; int r*_count; unsigned char I2CBuffer[3];
//去除 I2CEN 位 U0CTL &= ~I2CEN; I2CTCTL |= I2CRM; //使能 I2C 模块 U0CTL |= I2CEN; //设置 NACKIFG 标志 I2CIFG = NACKIFG; while (NACKIFG & I2CIFG) {
msp430f149的24c02标准C语言程序
机,msp430,avr单片机,单片机开发板单片机教程网()是专业提供各种单片机教程、资料、程序,为初学者打造一个良好的学习交流的平台!msp430f149的24c02标准C语言程序#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define SCL_H P3OUT |= BIT3#define SCL_L P3OUT &= ~BIT3#define SDA_H P3OUT |= BIT1#define SDA_L P3OUT &= ~BIT1#define SDA_in P3DIR &= ~BIT1 //SDA改成输入模式#define SDA_out P3DIR |= BIT1 //SDA变回输出模式#define SDA_val P3IN&BIT1 //SDA的位值#define TRUE 1#define FALSE 0#define deviceaddress 0xa0 //AT24C02的设备地址/********************************************//*******************************************函数名称:delay功能:延时约15us的时间参数:无返回值:无********************************************/void delay(void){uchar i;for(i = 0;i 15;i++)_NOP();}/******************************************* 函数名称:start功能:完成IIC的起始条件操作参数:无返回值:无********************************************/ void start(void){SCL_H;SDA_H;delay();SDA_L;delay();SCL_L;delay();}/******************************************* 函数名称:stop功能:完成IIC的终止条件操作参数:无返回值:无********************************************/ void stop(void) {SDA_L;delay();SCL_H;delay();SDA_H;delay();}/*******************************************函数名称:mack功能:完成IIC的主机应答操作参数:无返回值:无********************************************/void mack(void){SDA_L;SCL_H;delay();SCL_L;_NOP();_NOP();SDA_H;delay();}/******************************************* 函数名称:mnack功能:完成IIC的主机无应答操作参数:无返回值:无********************************************/ void mnack(void){SDA_H;_NOP(); _NOP();SCL_H;delay();SCL_L;_NOP(); _NOP();SDA_L;delay();}/**********检查应答信号函数******************/ /*如果返回值为1则证明有应答信号,反之没有*/ /******************************************* 函数名称:check功能:检查从机的应答操作参数:无返回值:从机是否有应答:1--有,0--无********************************************/ uchar check(void){uchar slaveack;SDA_H;_NOP(); _NOP();SCL_H;SDA_in;_NOP(); _NOP();slaveack = SDA_val; //读入SDA数值SCL_L;delay();SDA_out;if(slaveack) return FALSE;else return TRUE;}/******************************************* 函数名称:write1功能:向IIC总线发送一个1参数:无返回值:无********************************************/ void write1(void){SDA_H;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write0功能:向IIC总线发送一个0参数:无返回值:无********************************************/ void write0(void){SDA_L;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write1byte功能:向IIC总线发送一个字节的数据参数:wdata--发送的数据返回值:无********************************************/ void write1byte(uchar wdata){uchar i;for(i = 8;i > 0;i--){if(wdata & 0x80) write1();else write0();wdata <= 1;}SDA_H;_NOP();}/******************************************* 函数名称:writeNbyte功能:向IIC总线发送N个字节的数据参数:outbuffer--指向发送数据存放首地址的指针n--数据的个数返回值:发送是否成功的标志:1--成功,0--失败********************************************/ uchar writeNbyte(uchar * outbuffer,uchar n) {uchar i;for(i = 0;i n;i++){write1byte(* outbuffer);if(check()){outbuffer++;}else{stop();return FALSE;}}stop();return TRUE;}/******************************************* 函数名称:read1byte功能:从IIC总线读取一个字节参数:无返回值:读取的数据********************************************/ uchar read1byte(void){uchar rdata = 0x00,i;uchar flag;for(i = 0;i 8;i++){SDA_H;delay();SCL_H;SDA_in;delay();flag = SDA_val;rdata <= 1;if(flag) rdata |= 0x01;SDA_out;SCL_L;delay();}return rdata;}/******************************************* 函数名称:readNbyte功能:从IIC总线读取N个字节的数据参数:inbuffer--读取后数据存放的首地址n--数据的个数返回值:无********************************************/ void readNbyte(uchar * inbuffer,uchar n){uchar i;for(i = 0;i n;i++){inbuffer[i] = read1byte();if(i (n-1)) mack();else mnack();}stop();}/*******************************************函数名称:delay_10ms功能:延时约6ms,等待EEPROM完成内部写入参数:无返回值:无********************************************/ void delay_10ms(void){uint i = 1000;while(i--);}/*******************************************函数名称:Write_1Byte功能:向EEPROM中写入1个字节的数据参数:Wdata--写入的数据dataaddress--数据的写入地址返回值:写入结果:1--成功,0--失败********************************************/ uchar Write_1Byte(uchar wdata,uchar dataaddress) {start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check())write1byte(wdata);elsereturn 0;if(check()) stop();else return 0;delay_10ms(); //等待EEPROM完成内部写入return 1;}/*******************************************函数名称:Write_NByte功能:向EEPROM中写入N个字节的数据参数:outbuf--指向写入数据存放首地址的指针n--数据个数,最大不能超过8,由页地址决定其最大长度dataaddress--数据写入的首地址返回值:写入结果:1--成功,0--失败********************************************/uchar Write_NByte(uchar * outbuf,uchar n,uchar dataaddress) {uchar flag;start();write1byte(deviceaddress); //写入器件地址if(check() == 1)write1byte(dataaddress); //写入数据字地址elsereturn 0;if(check())flag=writeNbyte(outbuf,n);elsereturn 0;delay_10ms(); //等待EEPROM完成内部写入if(flag) return 1;else return 0;}/*******************************************函数名称:Read_1Byte_currentaddress功能:从EEPROM的当前地址读取1个字节的数据参数:无返回值:读取的数据********************************************/uchar Read_1Byte_currentaddress(void){uchar temp;start();write1byte((deviceaddress|0x01));if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_currentaddress功能:从EEPROM的当前地址读取N个字节的数据参数:readbuf--指向保存数据地址的指针n--读取数据的个数返回值:读取结果:1--成功,0--失败********************************************/uchar Read_NByte_currentaddress(uchar * readbuf,uchar n) {start();write1byte((deviceaddress|0x01));if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}/*******************************************函数名称:Read_1Byte_Randomaddress功能:从EEPROM的指定地址读取1个字节的数据参数:dataaddress--数据读取的地址返回值:读取的数据********************************************/uchar Read_1Byte_Randomaddress(uchar dataaddress){uchar temp;start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte((deviceaddress|0x01));}elsereturn 0;if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_Randomaddress功能:从EEPROM的指定地址读取N个字节的数据参数:readbuf--指向保存数据地址的指针n--读取数据的个数dataaddress--数据读取的首地址返回值:读取结果:1--成功,0--失败********************************************/uchar Read_NByte_Randomaddress(uchar * readbuf,uchar n,uchar dataaddress){start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte(deviceaddress|0x01);}elsereturn 0;if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}本例程是基于msp430f149单片机的24C02的程序,主要让我们熟悉的掌握IIC 协议的操作,虽然没有写主函数进行读写操作,但是这模块化非常实用,无论是扩展成24C16还是其它I2C对新手朋友有非常好的参考价值。
第5章第3节MSP430_C语言程序设计(自学)
第5章第3节C语言程序结构简介用EW430下的Help一、C语言程序结构二、C语言中的端口操作(可位域操作)三、C语言程序举例或查看安装目录\\\_\430\doc\EW430CompilerReference.pdf一、C语言程序结构与汇编语言相比,C语言的优点:1.对CPU的寄存器、寻址方式、指令系统不要求了解,对存储器和I/O组织有简单了解即可; 2.寄存器和存储器的分配、寻址及数据类型等细节由C编译器自动管理;3.程序由函数构成,程序结构化;4.可调用系统提供的许多标准子程序;55.编程及调试时间缩短,效率提高;6.移植性比较好C语言上机过程一.创建一个C语言项目(Creat a New Project/C/main)二.设置项目属性(Options…) (MCU类型、Debugger类型等)三.编写源程序并添加到项目中四.编译和连接(compile、make 或Rebuild All)MCU(D b)五.下载程序到目标MCU(Debug)六.调试和运行(Go、Step Over、View/Registers、memory四、五、六中出现有问题,返回二、三步骤IAR msp430C下给p的程序模板#include "io430.h"int main( void ){WDTCTL = WDTPW + WDTHOLD; // Stop watchdog ……//用户程序return 0;}//IAR 的C 语言程序结构与一般C 程序基本相同包含头文件#include <io430.h>//带初始化全局变量定义(在RAM 区)unsigned char STD[45]={"Hi , this is MSP430."};//未初始化全局变量定义(在RAM 区)int a, b, c;//函数声明subN(void );//函数定义void main ( void ){数据说明部分;//局部变量定义执行语句部分;subN(实际参数); //子程调用……}void subN (形式参数){数据说明部分;//局部变量定义执行语句部分;……}程序格式¾程序由函数构成, 函数由语句组成¾语句以分号”;”作为结束符, 注意不是分隔符¾程序由主函数main( ) 标识程序入口,用户程序从函数main( ) 的第一条语句开始执行,程序执行完毕的标志是函数main()中的代码执行完毕¾标识符区分大小写,不能在变量名、函数名、关键字中插入空格和空行¾关键字及编译预处理命令用小写字母书写¾程序用大括号{ }表示程序的层次范围¾程序没有行的概念,可任意书写,但为了可读性,书写一对大括号时根据层次采用缩格和列向对齐方式。
MSP430全部程序学习
一:基础实验功能:控制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 ~30msIE1 |= 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/RXD UCTL1 |= 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/RXD P3DIR |= 0x10;UCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= 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();}(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。
MSP430C语言解析
北京理工大学
数据类型
数据类型
条件语句 开关语句 循环语句 返回语句
表达式语句(结构)
语句表达形式有3种(a、b、c):
a
if(条件表达式) 语句
b
if(条件表达式) 语句1
else 语句2
c
if(条件表达式) 语句1
else if(条件表达式) 语句2
数据类型的变量a;
联合数据类型与结构在形式上非常相似,但是数 据表示的含义和存储方式是完全不同的。结构类 型所占的内存空间是它的各成员所占空间之和, 而联合类型所占用的内存空间是它的需用字节数 最多的成员所占空间。
Union data { Int x; Float y; Char Z } a;
Int age;//年龄;整型; long number;//省份证号码,长整形;
struct birth data;
}
所谓联合类型,是指将不同的数据组织成一个整 体,他们在内存中间共同占用一个内存区域。
Union 联合名 {成员列表};
联合
Union data
{ int x; float y; char Z; } a; 定义了一个联合数据类型data,定义了这一联合
内部函数和外部函数
struct 结构名 {成员列表} ;
例如: Struct student {long int id;//学号,长整形 char name[20];//姓名,字符串 char sex;//性别; char address[40];//住址,字符串;
Int age;//年龄;整型; long number;//省份证号码,长整形;
形式参数说明
{
局部变量定义
MSP430开发入门基础 C语言编程起步
MSP430开发入门基础C语言编程起步讲解430的书现在也有很多了,不过大多数都是详细说明底层硬件结构的,看了不免有些空洞和枯燥,我认为了解一个MCU的操作首先要对其基础特性有所了解,然后再仔细研究各模块的功能。
1.首先你要知道msp430的存储器结构。
典型微处理器的结构有两种:冯。
诺依曼结构程序存储器和数据存储器统一编码;哈佛结构程序存储器和数据存储器;msp430系列单片机属于前者,而常用的mcs51系列属于后者。
0-0xf特殊功能寄存器;0x10-0x1ff外围模块寄存器;0x200-?根据不同型号地址从低向高扩展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存储剩下的从0xffff开始向下扩展,根据不同容量,例如149为60KB,0xffff-0x11002.复位信号是MCU工作的起点,430的复位信号有两种:上电复位信号POR和上电清除信号PUC。
POR信号只在上电和RST/NMI复位管脚被设置为复位功能,且低电平时系统复位。
而PUC信号是POR信号产生,以及其他如看门狗定时溢出、安全键值出现错误是产生。
但是,无论那种信号触发的复位,都会使msp430在地址0xffff处读取复位中断向量,然后程序从中断向量所指的地址开始执行。
复位后的状态不写了,详见参考书,嘿嘿。
3.系统时钟是一个程序运行的指挥官,时序和中断也是整个程序的核心和中轴线。
430最多有三个振荡器,DCO内部振荡器;LFXT1外接低频振荡器,常见的32768HZ,不用外接负载电容;也可接高频450KHZ-8M,需接负载电容;XT2接高频450KHZ-8M,加外接电容。
(经验中发现,接XT2时,需要注意自己开启XT2,并延时50us等待XT2起振,然后手工清除IFG1中的OFIFG位,其操作顺序为:打开XT2-》等待XT2稳定-》切换系统时钟为XT2)430有三种时钟信号:MCLK系统主时钟,可分频1 2 4 8,供cpu使用,其他外围模块在有选择情况下也可使用;SMCLK系统子时钟,供外围模块使用,可选则不同振荡器产生的时钟信号;ACLK辅助时钟,只能由LFXT1产生,供外围模块。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)使用32768Hz晶体产生1s信号的程序如下:
#include <msp430x14x.h> void main (void) { WDTCTL= WDTPW + WDTHOLD; TACTL =TASSEL0+TACLR+MC0; CCTL0 = CCIE; CCR0 =16384; P3DIR |=BIT7; _EINT(); while(1); Page 3 of 21 基于模拟前端信号处理与控制技术的专业论坛,网站
基于模拟前端信号处理与控制技术的专业论坛,网站
微控设计网
中国MSP430单片机专业网站
微控设计网
} interrupt[TIMERA0_VECTOR] void Timer_A (void) { P3OUT ^= BIT7; } (3)看门狗使输出 P3.7 引脚连接的发光二极管每秒闪烁一次的例子: #include <msp430x14x.h> void main (void) { WDTCTL= WDTPW + WDTTMSEL+WDTSSEL; IE1|=WDTIE; P3DIR |=BIT7; _EINT(); while(1); } interrupt[WDT_VECTOR] void WDT_interrupt (void) { P3OUT ^= BIT7; } 例 5: P4 和 P5 输出口连接的数码管显示 1 和 2. #include <msp430x14x.h> void main(void) { unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义七段译码的共阳数码管显示数组 // hgfg dcba //0=1100 0000 //1=1111 1001 //2=1010 0100 //…… //9=1001 0000 WDTCTL=WDTPW+WDTHOLD; //关闭看门狗,以便于调试 P4DIR=0XFF; //设置P4口为输出 P5DIR=0XFF;//设置P5口为输出 P4OUT=seg[1];//向P4口输出数组的第1个元素,数字1的段码 P5OUT=seg[2];//向P5口输出数组的第2个元素,数字2的段码 } 例 6:与 P5 口连接的数码管加 1 计数,与 P4 口相连的数码管显示数字 8. #include <msp430x14x.h> void main(void) { int i,x; //声明数据类型 unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; WDTCTL=WDTPW+WDTHOLD;//关看门狗 P4DIR=0XFF; //P4口为输出,连接有共阳极数码管 P5DIR=0XFF; //P5口为输出,连接有共阳极数码管 P4OUT=seg[8]; //P4输出数字8 P5OUT=seg[0]; //P5输出数字0 while(1) //无限次While循环 { for(i=0;i<=9;i++) //循环变量I从0到9循环 for(x=0;x<20000;x++) //没有循环体的for循环,用于延迟时间 P5OUT=seg[i]; //按照循环变量i的数值,取MSP430单片机专业网站
微控设计网
微控设计网 中国 MSP430 单片机专业网站 MSP430 C 语言例题
由微控技术论坛会员 Slam 提供
Page 1 of 21 基于模拟前端信号处理与控制技术的专业论坛,网站
微控设计网
#include <msp430x14x.h> #define XTOFF 0x40; unsigned int i=0,j=0; //声明数据类型 unsigned char seg_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管字型码数组 unsigned int bit[8]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080}; //发光二极管点亮顺序数组 void main (void) { WDTCTL= WDTPW + WDTHOLD; //关看门狗 TACTL = TASSEL0 + TACLR; // 设置定时器A控制寄存器, // TASSEL0=0x0100,选择辅助时钟ACLK(32kHz) // TACLR=0x0004,清除定时器A计数器 CCTL0 = CCIE; //使能定时器A捕捉与中断功能,CCIE=0x0010 CCR0 =32768; // 设置计数器CCR0初值 TACTL |= MC0; //设置定时器工作模式为加计数到CCR0初值 P3DIR = 0XFF; //P3口为输出 P4DIR = 0XFF; //P4口为输出 P5DIR = 0XFF; //P5口为输出 P3OUT = 0X7E; //P3口输出为0111 1110 _EINT(); 调用C430编译器内部函数使能中断 while(1); //没有循环体的无限次while循环 } interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A的中断函数 { i+=1; i每次循环加1 if (i==10) //如果i=1 { i=0; //使i=0 j+=1; j每次加1 P3OUT ^= bit[j]; //数组的第j个元素取反后从P3口输出,使发光二极管顺序点亮 if (j==6) //如果j=6 { j=0; 使j=0 } } P4OUT =seg_7[i];//数码管字型数组中取第i个元素,送到P4口输出 P5OUT = seg_7[j]; //数码管字型数组中取第j个元素,送到P5口输出 }
例 2:8 个发光二极管 1,3,5,7 与 2,4,6,8 交替发光的例子
#include <msp430x14x.h> void main(void) { unsigned int i; WDTCTL=WDTPW+WDTHOLD; P3DIR=0XFF; //设置P3口为输出 while(1) { for (i=0;i<20000;i++) P3OUT=0X55; //使发光二极管1,3,5,7 灭,2,4,6,8亮 for (i=0;i<20000;i++) P3OUT=0XAA;//使发光二极管1,3,5,7亮,2,4,6,8灭 } } 例 3:定时器控制的发光二极管闪烁.这里使用了 MSP430F149 芯片的 32768Hz 低频晶体振荡器作为时钟 源.用定时器 A 定时 1s,发光二极管灭 0.5s,亮.0.5s. Page 2 of 21 基于模拟前端信号处理与控制技术的专业论坛,网站
例7:使用定时器输出精确的秒信号.从0开始计时,数码管显示0~60秒,每隔10秒使数码管 更换显示,并顺序点亮发光二极管.
Page 4 of 21 基于模拟前端信号处理与控制技术的专业论坛,网站
基于模拟前端信号处理与控制技术的专业论坛,网站
微控设计网
中国MSP430单片机专业网站
9.1 通过 C 语言编程例入门 MSP430C 语言编程
如下例子都在 MSP430F149 实验板上通过验证. 例 1:使与 P3 口的 P3.0 引脚连接的发光二极管闪烁.
#include <msp430x14x.h> //声明库 void main(void) //主函数 { unsigned int i; //变量声明 WDTCTL=WDTPW+WDTHOLD; //关掉看门狗 P3DIR |=BIT0; //设置P3.0为输出,这里BIT0=0x0001 while(1) //无限次while循环 { for (i=0;i<20000;i++) //for语句,i为循环变量,i每次循环加1,当i<20000时, //循环延时 P3OUT=0x00; 使P3.0输出低电平,发光二极管亮,(低电平使发光二极管亮) for (i=0;i<20000;i++) //再次循环延时 P3OUT=0x01; 使P3.0输出高电平,发光二极管灭,(高电平使发光二极管灭) } }
基于模拟前端信号处理与控制技术的专业论坛,网站
微控设计网
中国MSP430单片机专业网站
微控设计网
#include <msp430x14x.h> void main (void) { WDTCTL= WDTPW + WDTHOLD; //设置看门狗控制寄存器,关看门狗 TACTL = TASSEL0 + TACLR; // 设置定时器A控制寄存器, // TASSEL0=0x0100,选择辅助时钟ACLK, // TACLR=0x0004,清除定时器A计数器 CCTL0 = CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 CCR0 =16384; //设置捕获/比较寄存器,初始值为16384,对于32768Hz的频率,相当于0.5s P3DIR |=BIT7; //P3.7为输出 TACTL |= MC0; //设置定时器A控制寄存器,MC0=0x0010,使计数模式为增计数 _EINT(); //使能中断,这是一个C编译器支持的内部过程. while(1); //无限次while循环 } interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A的CC0中断处理程序 //TIMERA0_VECTOR=6*2,等于基地址0xFFE0+12=0xFFEC { P3OUT ^= BIT7; //将P3.7引脚取反,就是使发光二极管闪烁 } 例 4:选择不同的时钟源,使 P3.7 连接的发光二极管闪烁. (1)使用 XT2 时钟源,8MHz 频率,用定时器 A 分频,产生 1s 脉冲,使 P3.7 引脚的发光二极管闪烁. #include <msp430x14x.h> #define XTOFF 0x40; void main (void) { WDTCTL= WDTPW + WDTHOLD; //关闭看门狗 BCSCTL1 &= ~XT2OFF; //基础时钟控制寄存器BCSCTL1的第7位置0,使XT2启动 BCSCTL2 = SELS + DIVS1 + DIVS0; //基础时钟控制寄存器BCSCTL2设置,第3位置1,选择 //XT2CLK作为SMCLK时钟;将第2和第1位置1,使分频比为8 TACTL =0x02D4; //定时器A控制寄存器设置,第2位置1:清除;第4,5位置1,0:加计数模式 //加计数至CCR0,然后重新开始;第6,7位1,1,所以是8分频;第8,9位是 //0,1,所以TA使用SMCLK时钟. CCTL0 = CCIE; //CCIE=0x0010,使能定时器A中断 CCR0 =62500; //设置计数器CCR0的初值,((8MHz/8)/8)/2=62500,相当于0.5s的时间 P3DIR |=BIT7; //将P3.7设置为输出 _EINT(); //调用C430编译器内部函数,使能中断 while(1); //无限次循环 } interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A中断函数 { P3OUT ^= BIT7; //P3.7位取反 }