电脑通过串口给MSP430F149的P6和P4口一次性赋值
msp430f149技术资料

MSP430是德州公司新开发的一类具有16位总线的带FLASH的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器。
具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M的时钟。
由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化,MSP430系列将会得到越来越多人的喜爱。
第三章MSP430F149 资源的应用介绍及开发第一节中断介绍及存储器段介绍中断在MSP430中得以广泛的应用,它可以快速进入中断程序,之后返回中断前的状态,其时序为:PC执行程序中断允许置位SR中的GIE置位 EINT(中断开)中断到,中断标志位(IFG)置位从中断向量表中读取中断程序的入口地址,进入中断程序执行中断程序中断允许位复位 RETI中断返回回到原来地址。
具体应用将会在应用程序中的到应用。
有关中断源和中断优先级及中断允许位、中断标志位在参考资料1上有详细介绍。
MSP430单片机的片上存储器共为64K,表示为图:第三节 P 口MSP430F149有6个8位的P口,其中P1、P2口占两个中断向量,共可以接16 个中断源,还可以直接利用 P口的输入输出寄存器,直接对外进行通信。
MSP430F149四路输出12864显示

#include <msp430f149.h>#define Num_of_Results 8#define BIT(x) (1 << (x))#define uchar unsigned char#define uint unsigned intuchar shuzi[] = {"0123456789."};const uchar *ptr[10];static uint results[Num_of_Results]; //保存ADC转换结果的数组static uint results1[Num_of_Results]; //保存ADC转换结果的数组static uint results2[Num_of_Results]; //保存ADC转换结果的数组static uint results3[Num_of_Results]; //保存ADC转换结果的数组void Trans_val(uint Hex_Val);void Trans_val1(uint Hex_V al);void Trans_val2(uint Hex_V al);void Trans_val3(uint Hex_V al);extern const unsigned char shuzi_table[];void Send(uchar type,uchar transdata);/**********液晶控制IO的宏定义*************/#define cyCS 0 //P3.0,片选信号#define cySID 1 //P3.1,串行数据#define cyCLK 2 //P3.2,同步时钟#define cyPORT P3OUT#define cyDDR P3DIR/*******************************************函数名称:delay_Nus功能:延时N个us的时间参数:n--延时长度返回值:无********************************************/void delay_Nus(uint n){uchar i;for(i = n;i > 0;i--)_NOP();}/*******************************************函数名称:delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/void delay_1ms(void){uchar i;for(i = 150;i > 0;i--) _NOP();}/*******************************************函数名称:delay_Nms功能:延时N个ms的时间参数:无返回值:无********************************************/void delay_Nms(uint n){uint i = 0;for(i = n;i > 0;i--)delay_1ms();}/*******************************************函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/void Ini_Lcd(void){cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出delay_Nms(100); //延时等待液晶完成复位Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/delay_Nus(72);Send(0,0x02); /*DDRAM地址归位*/delay_Nus(72);Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/delay_Nus(72);Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/delay_Nus(72);Send(0,0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ delay_Nus(72);}/*******************************************函数名称:Send功能:MCU向液晶模块发送1一个字节的数据参数:type--数据类型,0--控制命令,1--显示数据transdata--发送的数据返回值:无********************************************/void Send(uchar type,uchar transdata){uchar firstbyte = 0xf8;uchar temp;uchar i,j = 3;if(type) firstbyte |= 0x02;cyPORT |= BIT(cyCS);cyPORT &= ~BIT(cyCLK);while(j > 0){if(j == 3) temp = firstbyte;else if(j == 2) temp = transdata&0xf0;else temp = (transdata << 4) & 0xf0;for(i = 8;i > 0;i--){if(temp & 0x80) cyPORT |= BIT(cySID);else cyPORT &= ~BIT(cySID);cyPORT |= BIT(cyCLK);temp <<= 1;cyPORT &= ~BIT(cyCLK);}//三个字节之间一定要有足够的延时,否则易出现时序问题if(j == 3) delay_Nus(600);else delay_Nus(200);j--;}cyPORT &= ~BIT(cySID);cyPORT &= ~BIT(cyCS);}/*******************************************函数名称:Clear_GDRAM功能:清除液晶GDRAM内部的随机数据参数:无返回值:无********************************************/void Clear_GDRAM(void){uchar i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,0x00);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,0x00);}}Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Disp_HZ功能:显示汉字程序参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示数据的个数返回值:无********************************************/void Disp_HZ(uchar addr,const uchar * pt,uchar num){uchar i;Send(0,addr);for(i = 0;i < (num*2);i++)Send(1,*(pt++));}/*********************************************************** *名称:LCD_pos()*功能:设置液晶的显示位置*入口参数:x:第几行,1~4对应第1行~第4行* y:第几列,0~15对应第1列~第16列*出口参数:无*范例:LCD_pos(2,3) //第二行,第四列***********************************************************/ void LCD_pos(uchar x,uchar y){uchar pos;switch(y){case 1:pos=0x80;break;case 2:pos=0x90;break;case 3:pos=0x88;break;case 4:pos=0x98;break;default:pos=0x80;}pos += x;Send(0,pos);}void Write_pos(uchar y,uchar x) //写地址等效LCD_pos(){LCD_pos(y,x);}void Set_pos(uchar y,uchar x) //按自然习惯设置行列位置{LCD_pos(y,x);}/*******************************************函数名称:Disp1Char功能:在某个位置显示一个字符参数:x--位置的列坐标y--位置的行坐标data--显示的字符数据返回值:无********************************************/void Disp1Char(uchar x,uchar y,uchar data){LCD_pos( x, y );Send( 1,data );}/************************主函数****************************/ void main(void){WDTCTL = WDTPW+WDTHOLD; //关闭看门狗/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;Ini_Lcd();delay_Nms(100);Clear_GDRAM();delay_Nms(100);P6SEL |= 0x0f; // 使能ADC通道ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间ADC12CTL1 = SHP+CONSEQ_3; // 使用采样定时器ADC12MCTL0 = INCH_0;ADC12MCTL1 = INCH_1;ADC12MCTL2 = INCH_2;ADC12MCTL3 = INCH_3+EOS;ADC12IE = 0x08; // 使能ADC中断ADC12IFG = 0x08;ADC12CTL0 |= ENC; // 使能转换ADC12CTL0 |= ADC12SC; // 开始转换_EINT();_BIS_SR(LPM0_bits+GIE);}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6.0口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uint index = 0;results[index++] = ADC12MEM0; // Move resultsif(index == Num_of_Results){uchar i;unsigned long sum = 0;index = 0;for(i = 0; i < Num_of_Results; i++){sum += results[i];}sum >>= 3; //除以8Trans_val(sum);}static uint index1 = 0;results1[index1++] = ADC12MEM1; // Move results if(index1 == Num_of_Results){uchar i1;unsigned long sum1 = 0;index1 = 0;for(i1 = 0; i1 < Num_of_Results; i1++){sum1 += results1[i1];}sum1>>= 3; //除以8Trans_val1(sum1);}static uint index2 = 0;results2[index2++] = ADC12MEM2; // Move results if(index2 == Num_of_Results){uchar i2;unsigned long sum2 = 0;index2 = 0;for(i2 = 0; i2 < Num_of_Results; i2++){sum2 += results2[i2];}sum2>>= 3; //除以8Trans_val2(sum2);}static uint index3 = 0;results3[index3++] = ADC12MEM3; // Move resultsif(index3 == Num_of_Results){uchar i3;unsigned long sum3 = 0;index3 = 0;for(i3 = 0; i3 < Num_of_Results; i3++){sum3 += results3[i3];}sum3>>=3; //除以8Trans_val3(sum3);}}/*******************************************函数名称:Trans_val功能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_V al--16进制数据n--变换时的分母等于2的n次方返回值:无********************************************/void Trans_val(uint Hex_Val){unsigned long caltmp;uint Curr_Volt;uchar t,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^n ptr[0] = Curr_V olt / 100; //Hex->Dec变换t = Curr_V olt - (ptr[0] * 100);ptr[2] = t / 10;ptr[3] = t - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),1,shuzi[ptr[i]]);}void Trans_val1(uint Hex_V al){unsigned long caltmp;uint Curr_Volt;uchar t1,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^nptr[0] = Curr_V olt / 100; //Hex->Dec变换t1 = Curr_Volt - (ptr[0] * 100);ptr[2] = t1 / 10;ptr[3] = t1 - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),2,shuzi[ptr[i]]);}void Trans_val2(uint Hex_V al){unsigned long caltmp;uint Curr_Volt;uchar t2,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^nptr[0] = Curr_V olt / 100; //Hex->Dec变换t2 = Curr_Volt - (ptr[0] * 100);ptr[2] = t2 / 10;ptr[3] = t2 - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),3,shuzi[ptr[i]]);}void Trans_val3(uint Hex_V al){unsigned long caltmp;uint Curr_Volt;uchar t3,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^nptr[0] = Curr_V olt / 100; //Hex->Dec变换t3 = Curr_Volt - (ptr[0] * 100);ptr[2] = t3 / 10;ptr[3] = t3 - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),4,shuzi[ptr[i]]);}。
第三章 MSP430F149通用数字端口

PxOUT 寄存器每一位是相应引脚配置为通用 O 输出时的输出值。
0 PxOUT.0
PxOUT.x=0,输出低电平
PxOUT.x=1,输出高电平
例:
P2DIR |=BIT0+BIT2+BIT4;//将 P2.0/P2.2/P2.4 设置为输出
P2OUT |=BIT0+BIT2+BIT4;//P2.0/P2.2/P2.4 输出高电平
P6DIR |=BIT0;//P6.0 设置为输出 P6OUT |=BIT0;//P6.0 输出高电平关闭 LED 灯
P1IES &=~BIT0;//P1.0 中断上升沿触发 P1IFG &=~BIT0;//清除 P1.0 中断标志 P1IE |=BIT0;//允许 P1.0 中断 _EINT();//开放系统中断 while(1) {
P6OUT ^=(BIT0+BIT2+BIT4+BIT6);//P6.0/2/4/6 端口 LED 闪烁 for(i=0;i<50000;i++);//延时 } }
应用二:软件定时,使 P6.0 输出方波使 LED 灯闪烁。程序如下:
#include <msp430x14x.h> void main( void ) {
PxIFG.x=0,没有中断发生
PxIFG.x=1,有中断发生
注意:写 PxOUT.x、PxDIR.x 将导致相应标志位 PxIFG.x 置位;I/O 脚上的中断事件
必须保持 1.5 倍 MCLK 周期以上才能保证中断被识别并使相应标志位置位。
(7)中断触发沿选择寄存器 PxIES(x=1,2)
7 PxIES.7
应用三:在 P3.0 上产生方波,将 P3.0 与 P1.0 相连,P1.0 接收中断,在中断程序中
MSP430F149的USART0的UART方式

MSP430F149的USART0的UART方式MSP430F149 的USART0 的UART 方式(UCTL0 中的SYNC 位清0)用于串口通信,以下是一段初始化过程:P3SEL |= 0x30;P3DIR |= BIT4;ME1 |= UTXE0 + URXE0; //允许USART0 接受和发送UCTL0 |= CHAR;U0TCTL|=SSEL1;UBR00 = 0x68;//波特率9600UBR10 = 0x00;UMCTL0 = 0x40;UCTL0 &= ~SWRST;IE1|=URXIE0;__enable_interrupt();首先是设置引脚的方向,RX 为输入,TX 为输出,所以TX 的DIR 位应设为1。
ME1 是功能模块,即允许UART 的接收和发送,CHAR 置1 是设置数据为8 位,SSELx 选择UART 的时钟源,波特率的设置可以用MSP430 波特率计算器来算。
IE1 中的UTXIE0 和URXIE0 分别用来使能接收和发送中断,中断标志分别为UTXIFG0 和URXIFG0,UTXIFG0 置1 表示等待新的数据写入发送寄存器,即上一次发送已完成,而URXIFG0 置1 表示已接收到数据并装入接收缓存寄存器中void main(){Init();while(1){for(num=0;num{//发数组TXBUF0=T[num];//数据被写入发送缓冲寄存器,发送中断标志清0while ((IFG1 & UTXIFG0)!=0x80);//等待中断标志置1,即等待接收完成}num=0;while(1);}}#pragma vector=USART0RX_VECTOR__interrupt void UART0RX (void){R[num]=RXBUF0;//当读接收寄缓冲存器时,接收中断标志清0num++;if(num==5) num=0;}tips:感谢大家的阅读,本文由我司收集整编。
电脑用串口协议给MSP430F149的P6P5P4赋值读取P2P1口状态

使用MSP430F149芯片,透过串口与电脑通信,波特率9600,8数据,无校验。
使用32.768k 晶振,使用P3.6和P3.7口作为发送和接收口,使用异步通信USART1,采用查询形式。
实现通信,当单片机接收到以S结尾时表示命令结束:以WR开始的字符串时,中间的数据最好是二进制的16位,单片机会把中间的数据高八位赋值给P6口,把中间的数据低八位赋值给P4口;以WO开始的字符串时,中间的数据最好是二进制的8位,单片机会把中间的数据赋值给P5口;以RI开始的字符串时,读取P2口P1口的状态,显示到电脑上,高八位是P2口的状态,低八位是P1口的状态。
#include <msp430x14x.h>#include <stdio.h>#include <math.h>typedef unsigned char uchar;typedef unsigned int uint;unsigned char RecBuf[30],pobuf[16],p5obuf[8]; //接收数据缓存unsigned char Rindex; //接收数据计数unsigned int ti,bpobuf,bp5obuf;unsigned char pi,pj;unsigned int rip1,rip2;uchar string[8];char stringa[10],stringb[10];//这里的这个就真的很重要。
void Delays(void);void PutString(char *ptr);void convert (uchar *a,int n);char *itoa(int num, char *str, int radix);int trans2(int x);/********************主函数**********************/void main(void){char *tishi = " MCU sends \n";char *huiche = " \n";char *kongge = " \0 ";P4DIR = 0xff; //设置P4口方向为输出P5DIR = 0xff; //设置P5口方向为输出P6DIR = 0xff; //设置P6口方向为输出P1DIR =0X00; //设置P1口方向为输入P2DIR =0X00;WDTCTL = WDTPW + WDTHOLD; // 关狗P3DIR |=BIT1; //D15灯加上,实验正确P3OUT |=BIT1; ////D15灯加上,实验正确P3SEL |= 0xC0; // P3.6,7 = USART1 TXD/RXDME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXDUCTL1 |= CHAR; // 8-bit characterUTCTL1 |= SSEL0; // UCLK = ACLKUBR01 = 0x03; // 32k/9600 - 3.41UBR11 = 0x00; //UMCTL1 = 0x4A; // ModulationUCTL1 &= ~SWRST; // Initialize USART state machinePutString(tishi);while(1){if(IFG2 & URXIFG1) //如果收到字符{RecBuf[Rindex++] = RXBUF1;if(RecBuf[Rindex-1]=='S') //接收完毕{Rindex=0;if((RecBuf[1]=='R')&&(RecBuf[0]=='W')) //接收完毕{TXBUF1 = '\n';for (ti=0;ti<=15;ti++){pobuf[ti]=RecBuf[ti+2];}for(int i=0;pobuf[i]!='\0';++i){bpobuf = bpobuf*2 + pobuf[i] - '0';}pi=(unsigned char)(bpobuf&0xff);pj=(unsigned char)((bpobuf>>8)&0xff);P4OUT=pi;P6OUT=pj;IFG2 |= UTXIFG1;}else if((RecBuf[1]=='O')&&(RecBuf[0]=='W')){TXBUF1 = '\n';for (ti=0;ti<=7;ti++){p5obuf[ti]=RecBuf[ti+2];}for(int i=0;p5obuf[i]!='\0';++i){bp5obuf = bp5obuf*2 + p5obuf[i] - '0';}P5OUT=bp5obuf;IFG2 |= UTXIFG1;//记得设置P5口方向为输出}else if((RecBuf[1]=='I')&&(RecBuf[0]=='R')){rip1=P1IN;rip2=P2IN;*itoa(rip1, stringa, 2);*itoa(rip2, stringb, 2);PutString(stringb);PutString(kongge);PutString(stringa);PutString(huiche);//TXBUF1 = rip1;//类型不匹配,不能赋值IFG2 |= UTXIFG1;// TXBUF1 = '\n'; //放这里也不对,还是只发送两位}}}}}/*函数名称:PutSting功能:向PC机发送字符串参数:无回值:无*/void PutString(char *ptr){//当今调试,之所以发完八位后还继续发乱码是因为这里的这个条件,//所以把stringb字符定义成9位的,这样就有个空字符了,这样//就遇到空字符停止发送了。
MSP430F149开发板套件用户手册

联系人:黄先生 电 话:13638654514 Q Q:50924175 E -- Mail: dr ago nhzw@163. co m
技术支持: 论 坛 : ht t p: // www. smar t - dz. cn/ bbs QQ 群:57829880
斯玛特精品电子工作室
目录
一、可选套件 ........................................................................................... 4 二、产品介绍 ........................................................................................... 7
斯玛特精品电子工作室
一、可选套件
图 1 MSP430F149 开发板和 LCD1602 字符液晶
斯玛特精品电子工作室
图 2 MSP430F149 开发板和 LCD12864 图形液晶
斯玛特精品电子工作室
15) 一个红外线遥控接口:红外线遥控解码实验;
16) 24C16 串行 EEPROM:可以进行 SPI EEPROM 读写实验;
17) 一个 DS1302 时钟芯片:实现实时时钟实验;
18) DS18B20 单总线数字温度传感器:可以用单片机控制它来测量温
度;
19) 一个 nRF905 接口;nRF905 通过 SPI 接口实现无线收发实验;
仿真器; 5) 复位按钮:用于手工复位单片机 6) IO 扩展口:两组 25*2 排针扩展口,引出单片机 P1~P5 全部 I/O 引
脚; 7) CR1220 3V 电池(开发板反面):为时钟芯片提供电源,保证掉电
MSP430F149的ADC操作

MSP430F149的ADC操作1)ADC图解图1 ADC的原理图理解:1.ADC的时钟来源可以有四个(ACLK/MCLK/SMCLK/ADC12SO)由ADC12SSELx来选择。
并且可以由ADC12DIVx控制选择分频。
2.ADC的采样参考电压可以由SREF0,SREF1来选择四种参考电压。
3.INCHx控制选择模拟电压输入口。
4.SHSx选择控制方式。
2)ADC的内核1.ADC的转换公式当采样最高电压高过或等于参考电压的时候,是最大值0FFFH。
当采样最低电压低于或是等于参考电压的时候,是最小值000H。
2.控制ADC12的内核可以通过ADC12CTL0和ADC12CTL1两个寄存器来控制。
当不使用的时候可以通过ADC12ON位来控制关闭内核以达到低功耗的目的。
当修改转换使能标志ENC的时候,要先判断ADC12内核是否在进行转换工作,如果在转换工作期间关闭ENC(置零)那么最终得到错误的结果。
3)ADC的时钟来源ADC可以有四种时钟来源。
而ADC12OSC是ADC内置的一个时钟源,大概频率在5MHZ左右,不过该时钟源由个人设备、供电电压和外部温度的影响很大。
4)ADC的参考电压发生器ADC内部可以提供一个可以产生1.5V或是2.5V的产考电压发生器。
当设计使用的时候,需要将一个10uF的电容和一个0.1uF的电容并联到它的输出端。
而且使用的时候,打开发生器至少需要等待17ms以让参考电压达到一个稳定的值。
5)ADC的低功耗当ADC内核不适用的时候,它会自动进入关闭模式,在使用的时候自动苏醒。
而它的参考电压却不会自动关闭,要用手通过REFON手动关闭。
6)ADC的采样保持触发源它的触发源由四种选择。
1.ADC12SC位控制。
2.定时器A输出控制3.定时器B输出控制4.定时器B输出控制7)ADC的采样保持时间ADC的采样保持时间有两种模式。
1.拓展型采样时钟模式。
这个时候,采样的时间由SHI决定,也就是当SHI上升沿的时候开始采样,下降沿的时候结束采样。
MSP430F149定时数据采集程序[调试通过]
![MSP430F149定时数据采集程序[调试通过]](https://img.taocdn.com/s3/m/882d8e5abe23482fb4da4cf0.png)
// 初始化
Init_ADC(); Init_TimerA(); _EINT();
// 打开中断
#pragma vector=TIMERA0_VECTOR //定时器 A0 的中断函数
__interrupt void TimerA_ISR(void)
{
float AD_data;
char a;
char b;
int m;
int n;
// 读出转换结果
P5OUT^=BIT6;
while((ADC12IFG & BIT7)==0) ; //判断有没有转换结束
}
void Init_ADC(void) {
//P6SEL = BIT7; ADC12CTL0 &= ~(ENC);
//设置 P6.7 为模拟输入 A7 //设置 ENC 为 0,从而可以修改 ADC12 寄存器的值
ADC12CTL0 += ADC12ON+MSH; //开 A/D 转换,允许多次采样
P3SEL=0x00; //LCD 所需端口设置 P3DIR=0xFF; P3OUT&=~BIT5; //74HC245 的 DIR 为低电平,输入方向由 B 端到 A 端
P5SEL=0x00; P5DIR=0xFF; P5OUT=0x00;
//P5 输出
P4SEL=0x00; P4DIR=0xFF; P4OUT=0x00;
//P4 输出
P6SEL=0xF0; P6DIR=0xFF; P6OUT=0x00; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序功能:使用MSP430F149芯片,透过串口与电脑通信,波特率9600,8数据,无校验。
使用32.768k晶振,使用P3.6和P3.7口作为发送和接收口,使用异步通信USART1,采用查询形式。
实现通信,当单片机接收到以S结尾以W开始的字符串时,中间的数据最好是二进制的16位,单片机会把中间的数据高八位赋值给P6口,把中间的数据低八位赋值给P4口。
程序代码:
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
unsigned char RecBuf[30],pobuf[16]; //接收数据缓存
unsigned char Rindex; //接收数据计数
unsigned int ti,bpobuf;
unsigned char pi,pj;
void Delays(void);
void PutString(uchar *ptr);
/********************主函数**********************/
void main(void)
{
uchar *tishi = " MCU sends ";
P4DIR = 0xff; //设置P4口方向为输出
P6DIR = 0xff; //设置P6口方向为输出
// P4OUT = 0x55; //一开一连P4口的0-7位依次是10101010,
/* P6DIR = 0XFF; //添加另外的继电器
P6OUT = 0XAA; //P4.0 P4.1*/
WDTCTL = WDTPW + WDTHOLD; // 关狗
P3DIR |=BIT1; //D15灯加上,实验正确
P3OUT |=BIT1; ////D15灯加上,实验正确
P3SEL |= 0xC0; // P3.6,7 = USART1 TXD/RXD
ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
UCTL1 |= CHAR; // 8-bit character
UTCTL1 |= SSEL0; // UCLK = ACLK
UBR01 = 0x03; // 32k/9600 - 3.41
UBR11 = 0x00; //
UMCTL1 = 0x4A; // Modulation
UCTL1 &= ~SWRST; // Initialize USART state machine // IE2 |= URXIE1; // Enable USART1 RX interrupt
// _EINT();
PutString(tishi);
while(1)
{
if(IFG2 & URXIFG1) //如果收到字符
{
RecBuf[Rindex++] = RXBUF1;
if(RecBuf[Rindex-1]=='S') //接收完毕
{
Rindex=0;
if((RecBuf[1]=='R')&&(RecBuf[0]=='W')) //接收完毕
{
TXBUF1 = '\n';
for (ti=0;ti<=15;ti++)
{pobuf[ti]=RecBuf[ti+2];}
for(int i=0;pobuf[i]!='\0';++i)
{bpobuf = bpobuf*2 + pobuf[i] - '0';}
pi=(unsigned char)(bpobuf&0xff);
pj=(unsigned char)((bpobuf>>8)&0xff);
P4OUT=pi;P6OUT=pj;IFG2 |= UTXIFG1;
}
}
}
}
}
/*函数名称:PutSting功能:向PC机发送字符串参数:无回值:无*/
void PutString(uchar *ptr)
{
while(*ptr != '\0')
{
while (!(IFG2 & UTXIFG1)); // TX缓存空闲?
TXBUF1 = *ptr++; // 发送数据
}
while (!(IFG2 & UTXIFG1))
{TXBUF1 = '\n';} }。