您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页MSP430全部程序学习

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

#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; else

P2OUT|=BIT4; }

三:数码管实验

功能:编程实现6个数码管依次显示1到6

/******************************************************************************

____ ____ ____ ____ ____ ____ f| a |b | | | | | | | | | | |____| |____| |____| |____| |____| |____| e| g |c | | | | | | | | | | |____| |____| |____| |____| |____| |____|

d LED6 | LED5 | LED4 | LED3 | LED2 | LED1 | | | | | |

.--P4.7 段码1选通 P5.2--P5.7 位码0导通

// 跳线P14 P15 P5 P6 P7 P8

*******************************************************************************/

#include\"msp430x14x.h\"

#define uchar unsigned char

unsigned 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

#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; else

if((P6IN&0X04)==0) x=11;//x=1; else

if((P6IN&0X08)==0) x=10;//x=2; else

if((P6IN&0X10)==0) x=9; else {

P6OUT=0XBF;// //扫描第二列 if((P6IN&0X02)==0X00) x=8; //x=0; else

if((P6IN&0X04)==0) x=7;//x=1; else

if((P6IN&0X08)==0) x=6;//x=2; else

if((P6IN&0X10)==0) x=5; else {

P6OUT=0XDF; //扫描第三列 if((P6IN&0X02)==0X00) x=4; //x=0; else

if((P6IN&0X04)==0) x=3;//x=1; else

if((P6IN&0X08)==0) x=2;//x=2; else

if((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

void main(void) {

WDTCTL = WDT_MDLY_0_0; // Set Watchdog Timer interval to ~30ms

IE1 |= WDTIE; // Enable WDT interrupt P1DIR |= 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

void main(void) {

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

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.

// 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

void main(void) {

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P1DIR |= 0x02; // Set P1.1 to output direction

TBCTL = TBSSEL_1 + TBCLR; // ACLK, clear TBR TBCCTL0 = CCIE; // TRCCR0 interrupt enabled

TBCCR0 = 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|-

// --|RST XOUT|- // | |

// | P3.4|------------> // | | 9600 // | P3.5|<------------ //

// 跳线 串行( P8 P9) 数码管( P14 P15 P5 P6 P7 P8)

***************************************************************** #include #include \"led.h\"

#define uchar unsigned char

extern 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 machine IE1 |= URXIE0; // Enable USART0 RX interrupt 接受数据能中断

}

/*****************串口发送字符串程序*****************/

void UartStr(unsigned char *p) { *p=0x02;

//unsigned char str unsigned 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\\\n\");

UartStr(\"a--1,b--2,c--3,d--4,e--5,f--6\\r\\\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|-

// --|RST XOUT|- // | |

// | P3.6|------------> // | | 9600 // | P3.7|<------------ //

// 跳线 串行( P8 )

*****************************************************************#include

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 character UTCTL1 |= SSEL0; // UCLK = ACLK UBR01 = 0x03; // 32768/9600 UBR11 = 0x00; //

UMCTL1 = 0x4a; // modulation P3SEL |= 0xC0;

UCTL1 &= ~SWRST; // Initialize USART state machine

IE2 |= URXIE1; // Enable USART1 RX interrupt

}

//********************发送数据****************************

void Uart_Str(unsigned char number,unsigned char *p) {

unsigned char i;

for (i=0;iwhile (!(IFG2 & UTXIFG1));// USART0 TX buffer ready? TXBUF1 =*p++; // RXBUF0 to TXBUF0 while ((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 TXBUF0 while ((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

#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 timer

ADC12MCTL7|=INCH_7;

ADC12IE = 0x0080; // Enable interrupt 使能中断 ADC12IFG.0 对应于 ADC12MEM0

ADC12CTL0 |= ENC; // Conversion enabled 使能转换

led5_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 off else

led5_high; // Set P2.4 LED on if (ADC12MEM7 < 0x6FF)

led6_low; // Clear P2.5 LED off else

led6_high;

if (ADC12MEM7 < 0x9FF)

led7_low; // Clear P2.6 LED off else

led7_high;

if (ADC12MEM7 < 0xCFF)

led8_low; // Clear P2.7 LED off else

led8_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 char

unsigned 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 7 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,//8 9 A B C D E F 0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E, //G H I J K L M N 0x4F,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\\\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 #include \"24c16.h\"

#define uchar unsigned char

extern 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

#include \"Uart.h\"

/*****************串口初试化设置********************/ void uart_org(void) {

ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD

UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00= 0x03; // 32768/9600 UBR10= 0x00; UMCTL0= 0x4a;

P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD

P3DIR |= 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 TXBUF0 while ((UTCTL0 & TXEPT) == 0); } _NOP(); }

/*****************串口发送字符串程序*****************/ void Uart_Str(unsigned char number,unsigned char *p) {

unsigned char i;

for (i=0;iwhile (!(IFG1 & UTXIFG0));// USART0 TX buffer ready? TXBUF0 =*p++; // RXBUF0 to TXBUF0 while ((UTCTL0 & TXEPT) == 0); } _NOP(); }

实用文档.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务