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分频。
- 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位取反 }