msp430入门小程序.doc_第1页
msp430入门小程序.doc_第2页
msp430入门小程序.doc_第3页
msp430入门小程序.doc_第4页
msp430入门小程序.doc_第5页
免费预览已结束,剩余33页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编者寄语:假期出参加TI竞赛,把所有的程序都写出来了,或许有些你没看懂,欢迎加扣273948017咨询,430爱好者一个,作为新手从我这里学起把!或许我有些不好的地方,望大家谅解!/简单输出流水灯程序#include msp430g2553.hunsigned int i=8000;int main( void ) / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;/看门狗不解释 P1DIR=BIT6+BIT0;/设置p1输出 while(1)/可以多加一些灯 P1OUT=BIT0;while(i-);/P1.0灯亮 P1OUT=BIT6;while(i-);/P1.6灯亮 /独立按键程序/p1.0为led,p1.3为按键#include msp430g2553.hint main( void ) / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;/看门狗不解释 P1DIR=BIT0;/P1.0为led,显示按键起作用 P1OUT=BIT0+BIT3;/P1IN低电平跳转 P1REN=BIT3;/上拉电阻,缺了好像不能用 while(1) if(P1IN&BIT3)/按键没按下 P1OUT=BIT0+BIT3;/led亮 else P1OUT=BIT3;/led灭 P1口中断#include unsigned char flag=0; /任务标志void Iint_Port1(void); /函数声明void main(void) WDTCTL=WDTPW+WDTHOLD; /关闭看门狗 Iint_Port1(); /初始化p1.0 _EINT(); /开总中断允许 while(1) LPM3; /进入低功耗模式3,I/O口中断可将其唤醒 if(!flag) P1OUT=BIT0; /中断服务程序 else if(flag) P1OUT=BIT6; /其他任务 #include unsigned char flag=0; /任务标志void Iint_Port1(void); /函数声明void main(void) WDTCTL=WDTPW+WDTHOLD; /关闭看门狗 Iint_Port1(); /初始化p1.0 _EINT(); /开总中断允许 while(1) LPM3; /进入低功耗模式3,I/O口中断可将其唤醒 if(!flag) P1OUT=BIT0; /中断服务程序 else if(flag) P1OUT=BIT6; /其他任务 #pragmavector=PORT1_VECTOR_interruptvoidPort_1(void) P1IFG=0; /多源中断,需靠软件清除P1IFG flag=1; /置任务标志 _BIC_SR_IRQ(LPM3_bits); /将CPU从睡眠模式唤醒void Iint_Port1(void) P1DIR|=BIT0+BIT6;P1OUT=BIT0; P1DIR&=BIT3; /设置为输入方向 P1SEL&=BIT3; /设置为普通I/O口功能 P1IES|=BIT3; /选择下降沿触发 P1IE|=BIT3; /打开中断允许 P1IFG=0; /P1IES的切换可能使P1IFG置位,需清除 P1IFG=0; /多源中断,需靠软件清除P1IFG flag=1; /置任务标志 _BIC_SR_IRQ(LPM3_bits); /将CPU从睡眠模式唤醒void Iint_Port1(void) P1DIR|=BIT0+BIT6;P1OUT=BIT0; P1DIR&=BIT3; /设置为输入方向 P1SEL&=BIT3; /设置为普通I/O口功能 P1IES|=BIT3; /选择下降沿触发 P1IE|=BIT3; /打开中断允许 P1IFG=0; /P1IES的切换可能使P1IFG置位,需清除 / 端口1的中断服务历程 #pragma vector=PORT1_VECTOR _interrupt void Port_1(void) P2OUT = 0x01; / P1.0 状态翻转 P1IFG &= 0x10; / P1.4 中断标志清零 /ADC#include io430.h#define uint unsigned int #define uchar unsigned charuint ad;void delayl(uint n)uint j,k;for(j=n;j0;j-)for(k=100;k0;k-);void dis(uint x,uint y,uint z)P1DIR=0xff;P1OUT=0x00;P2OUT=0x07;P2OUT|=BIT3; P1OUT=x;P2OUT&=BIT0;delayl(1);P2OUT|=BIT0; P1OUT=y;P2OUT&=BIT1;delayl(1);P2OUT|=BIT1; P1OUT=z;P2OUT&=BIT2;delayl(1);P2OUT|=BIT2; P2OUT&=BIT3;void adc() uint i,j=10; P1DIR=0x00;P1REN=0xff;P1OUT=0x00; /P2OUT&=BIT0; /for(i=511;i0;i-)P2OUT=BIT1;while(j-); ad=P1IN;P1REN=0x00;int main( void )uint x,y,z; / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P2DIR=0xff;P2OUT=0x07;P2REN=0x07; while(1)/ad=345; adc(); x=ad/100;y=ad/10%10;z=ad%10; dis(x,y,z); 比较器a比较器A模块以下图可以看出比较器A的结构大概可以分4部分构成,分别为模拟输入,比较器A核心,低通虑波器,基准电压部分和中断部分组成。首先,整个比较器A的工作必需由CAON位置为1时才能工作的,此位属CACTL1控制寄存器。单片机上电时此位是为0的,也就是说比较器是不工作的。以下大概讲述几个部分电路的功能和一些相关信息。模拟输入电路:外部模拟引脚信号CA0,CA1(正负端)可以分别由P2CA0,P2CA1位控制开或关。经过软件的设置可以分别与内部的几个基准电压进行比较(0.5VCC,0.25VCC,三极管门值电压)或外部其中的电压进行比较。应用的硬件比较可以分为以下三种组合:两个外部引脚输入信号进行比较其中一个外部引脚信号与内部的0.5VCC或0.25VCC比较其中一个外部引脚信号与内部基准电压比较参考电压发生器参考电压电路是可以由CARSEL,CARERF0,CARERF1位来控制电压的产生。通过软件设置可以选择几种电压输出到比较器的输入中作为比较,当然此参考电压也可以通过单片机的引脚往外部提供参考电压之用。比较器A核心比较器CAON位控制开关,CAEX位控制位控制方向。低通虑波器低通虑波器只需一个CAF位来控制此虑波器的功能开与关。此虑波器功能是用于消除比较器输出信号的毛剌,以保证信号的质量和中断请求的可靠性。中断请求比较器A模块是具有中断功能的,如比较器功能CAIE中断允许开了,在CAIF信号产生时将生产中断(当然GIE要为1时)。比较器A模块是具有中断独立向量的,是一个单独的中断,CUP接受请求后会硬件自动清除中断标志位CAIFG。比较器模块相关寄存器说明CACTL1比较器控制寄存器1CAEX:控制内部比较器A的输入信号和输出信号的方向CARSEL:控制内部参考电压加到比较器A的正输入端还是负输入端由结构图可以看出,CAEX,CARSEL在不同设置时,比较器A输入端的所加的参考电压是有不同的.请参考以下列表:-CARSELCAEX参考电压接入端 0 0 内部参考源加到比较器的正端 0 1 内部参考源加到比较器的负端 1 0 内部参考源加到比较器的负端 1 1 内部参考源加到比较器的正端CAREF1, CAREF0选择参考源:0使用外部参考1选择0.25VCC为参考电压2选择0.5VCC为参考电压3选择二极管电压为参考电压,须参见具体IC的资料CAON:控制比较器A的打开与关闭0关闭比较器工作1打开比较器工作CAIES:中断边沿触发模式选择0上升沿使中断标志CAIFG置位1下降沿使中断标志CAIFG置位CAIE:比较器中断允许0禁止中断1允许中断CAIFG:比较器中断标志0没有中断请求1有中断请求标志信号CACTL2比较器控制寄存器2P2CA1:控制输入端CA10外部引脚信号不与比较器A连接1外部引脚信号与比较器A连接P2CA0:控制输入端CA00外部引脚信号不与比较器A连接1外部引脚信号与比较器A连接CAF:选择比较器输出端是否经过RC低通滤波器0开通RC低通滤波器1直通信号CAOUT:比较器A输出的信号0 CA0小于CA11 CA0大于CA1CAPD端口禁止寄存器比较器A模块的输入输出与IO口共用引脚,可以控制IO端口输入缓冲器的通断开关.CAPD控制位初始化为0,则端口输入缓冲器有效.当相应位为1时,端口输入缓冲器无效。程序范例:#include void main (void)WDTCTL = WDTPW + WDTHOLD;/停止WDTCAPD |= 0x08;/断开与IO端口输入CACTL2 = P2CA0;/设置P2.3为+compCCTL0 = CCIE;/ CCR0允许中断TACTL = TASSEL_2 + ID_3 + MC_2;/ SMCLK/8,计数模式_EINT();/开总中断while (1) /循环CACTL1 = 0x00;/没有参考电压_BIS_SR(LPM0_bits);/进入LPM0CACTL1 = CAREF0 + CAON;/ 0.25*Vcc=P2.3,比较器开_BIS_SR(LPM0_bits);/再次进入LPM0CACTL1 = CAREF1 + CAON;/ 0.5*Vcc=P2.3,比较器开_BIS_SR(LPM0_bits);/再次进入LPM0CACTL1 = CAREF1 + CAREF0 + CAON;/ 0.55V on P2.3,比较器开_BIS_SR(LPM0_bits);/再次进入LPM0/ Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR_interrupt void Timer_A (void)_BIC_SR_IRQ(LPM0_bits);/退出LMP0模式定时器中断#include msp430g2553.h#include int i;void main(void) WDTCTL = WDTPW + WDTHOLD; / Stop WDT P1DIR |= 0x01; / P1.0 output CCTL0 = CCIE; / CCR0 interrupt enabled CCR0 = 50000; TACTL = TASSEL_2 + MC_2; / SMCLK, contmode i=0; _BIS_SR(LPM0_bits + GIE); / Enter LPM0 w/ interrupt/ Timer A0 interrupt service routine#pragma vector=TIMER0_A0_VECTOR_interrupt void Timer_A (void) if(i20) P1OUT = 0x01; / Toggle P1.0 /CCR0 += 50000; / Add Offset to CCR0 i=0; i+; /7528#include unsigned int i=1;void xie() P1DIR |= 0xff; / P1.0 output P2DIR|=0x07; P2OUT&=0xfe;/选中DACA P1OUT=i; P2OUT|=0x01;/选中DACB P1OUT=i; P2OUT|=0x02;/禁止写入 P2OUT|=0x04;/void main(void) WDTCTL = WDTPW + WDTHOLD; / Stop WDT xie(); while(1) P1DIR&=BIT3;P1REN=BIT3;P1OUT|=BIT3; if(!(P1IN&BIT3)i=i129)i=1;P1OUT=BIT6;/按键中断#includevoidmain(void)WDTCTL=WDTPW+WDTHOLD;/StopwatchdogtimerP1DIR|=0x01;/SetP1.0tooutputdirectionP1OUT=0x08;/P1.3set,elseresetP1REN|=0x08;P1IE|=0x08;/P1.3interruptenabledP1IES|=0x08;/P1.3Hi/loedgeP1IFG&=0x08;/P1.3IFGcleared_BIS_SR(LPM4_bits+GIE);/EnterLPM4w/interrupt/Port1interruptserviceroutine#pragmavector=PORT1_VECTOR_interruptvoidPort_1(void)P1OUT=0x01;/P1.0=toggleP1IFG&=0x08;/P1.4IFGcleared /1602#include io430.h#include in430.h#define uint unsigned int#define uchar unsigned char uchar table=kaigeshuaiqi;uchar table1=hello welcome;uint m=1;void delay(uint z)uint i,j;for(i=z;i0;i-)for(j=100;j0;j-);void write_com(uchar com) /写入P2OUT&=BIT4; /LCD 选择输入命令P1OUT=com; /向P0 口输入命令delay(5); /延时P2OUT|=BIT5; /打开LCD 使能delay(5); /一个高脉冲P2OUT&=BIT5; /关闭LCD 使能void write_data(uchar date) P2OUT|=BIT4; /设置为输入数据P1OUT=date; /将数据赋给P0 口delay(5); /延时P2OUT|=BIT5; /置高delay(5); /高脉冲P2OUT&=BIT5; /置低完成高脉冲void init()P2OUT&=BIT5; write_com(0x38); /设置16x2 显示5x7 点阵,8 位数据接口write_com(0x0c); /设置开始显示不显示光标write_com(0x06); /写一个字符后地址指针加1write_com(0x01); /显示清零数据指针清零void dis(uint x)uint y,z,k; y=x/100;z=x/10%10;k=x%10;write_com(0x86); /将数据指针第一行第一个字处,write_data(y+0);write_data(z+0);write_data(k+0);delay(100);int main( void ) uint num; / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;P1DIR=0xff;P2DIR=0xff;P2OUT&=BIT3;while(1)init();write_com(0x84); /将数据指针第一行第一个字处,for(num=0;num12;num+)/write_data(tablenum);delay(1000);write_com(0x80+0X44);for(num=0;num13;num+)write_data(table1num);delay(1000);/m+;/delay(5);/write_com(0x80+0x40); /定义指针位置/for(num=0;num999)num=0;/while(1)for(num=0;num4;num+)write_com(0x18);/write_com(0x1c);/右移delay(2000);for(num=0;num4;num+)/write_com(0x18);/左移write_com(0x1c);/右移delay(2000);/12864/main()#include #include lcd12864.h#include lcd12864.cunsigned char const t=床前明月光, 举头望明月, 凝是地上霜。 低头思故乡。 ;void main() WDTCTL = WDTPW + WDTHOLD; P1DIR|=0xff; P2DIR|=0xff; P2SEL=0; io_init(); lcd_init (); chn_disp1(t); /Write_Num(0x86,767,0); while(1);* LCD12864程序 程序说明:本程序为带字库的LCD12864驱动程序,选择LCD12864的串口工作模式。利用 本程序LCD12864可显示汉字、数字和数组。 */ MSP430G2433 LCD12864/ +-+ +-+/ | | | |/ | | | | / | | | RS|-VCC/ | P2.6|-|R/W |/ | P2.7|-|CLK | / | | | | / | | | RST|-VCC/ | | | |/ | | | PSB|-GND/ | | | | / +-+ +-+/*#include msp430G2553.h#include LCD12864.hunsigned int Disp_Tab8;/* 名 称:io_init(void)* 功 能:LCD12864所用的IO口初始化* 入口参数:无* 出口参数:无*/void io_init(void) P2SEL &= (BIT6+BIT7); P2DIR |= BIT6+BIT7; /P1OUT =0; P1SEL = 0xFF; /P1SEL|=BIT6; P1DIR = 0;/* 名 称:wr_lcd(uchr func,uchr data)* 功 能:往LCD12864写入一个字节。func=comm,则写入的是命令; func=commdat,则写入的是数据* 入口参数:func和data* 出口参数:无*/void wr_lcd(uchr func,uchr data) uchr i,i1,i3,i2,CF; SID_H; for(i=0;i5;i+) SCK_H; SCK_L; /5起始位 SID_L; SCK_H; SCK_L;/写使能 if(func=1) SID_H; else SID_L; SCK_H; SCK_L;/功能位 SID_L; SCK_H; SCK_L;/写0 for(i3=0;i32;i3+) for(i1=0;i14;i1+) CF=data&0x80; if(CF=0x80) SID_H; else SID_L; SCK_H; SCK_L; data=data1; for(i2=0;i24;i2+) SID_L; SCK_H; SCK_L; /* 名 称:lcd_init (void)* 功 能:对LCD12864初始化* 入口参数:无* 出口参数:无*/void lcd_init (void) wr_lcd (comm,0x30); /30-基本指令动作 wr_lcd (comm,0x01); /清屏,地址指针指向00H delay_ms(100); wr_lcd (comm,0x06); /光标的移动方向 wr_lcd (comm,0x0c); /开显示,关游标/* 名 称:chn_disp1 (uchr const *chn)* 功 能:LCD12864显示数组* 入口参数:const *chn,要显示的数组* 出口参数:无*/void chn_disp1 (uchr const *chn) uchr i,j; /wr_lcd (comm,0x30); wr_lcd (comm,0x80); for(j=0;j4;j+) for (i=0;i=0;i-) /拆分数字 if(i=(5-point) /小数点 DispBuffi=.; else DispBuffi=(Num%10)+0x30; Num/=10; for(i=0;i4-point;i+) /消隐无效0 if (DispBuffi=0x30) DispBuffi= ; else break; wr_lcd (comm,addr); for(i=0;i6;i+) wr_lcd (dat,DispBuffi); #define uchr unsigned char#define SID_H P2OUT |= BIT6#define SID_L P2OUT &= BIT6#define SCK_H P2OUT |= BIT7#define SCK_L P2OUT &= BIT7#define comm 0#define dat 1#define CPU_F (double)1000000) /时钟定义在1MHz#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)/精确延时1us #define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0) /精确延时1msextern unsigned int Disp_Tab8;extern void wr_lcd(uchr func,uchr data);extern void lcd_init (void);extern void chn_disp1 (uchr const *chn);extern void Write_Num(int addr,int val1,int val2);extern void io_init(void);/ADC#include msp430g2553.h#include lcd12864.h#include lcd12864.c#define uint unsigned intuint adc,k,i;double v;unsigned char const t= V ;void main(void) WDTCTL = WDTPW + WDTHOLD; ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; / ADC10ON, interrupt enabled ADC10CTL1 = INCH_4; / input A1 ADC10AE0 |= 0x10; / PA.1 ADC option select P1DIR=0; P2DIR=0xff; io_init(); lcd_init (); chn_disp1(t);Write_Num(0x82,k,2); for (;) ADC10CTL0 |= ENC + ADC10SC; / Sampling and conversion start _bis_SR_register(GIE); / LPM0, ADC10_ISR will force exit if (ADC10MEM 0x1FF); / Clear P1.0 LED off / Set P1.0 LED on adc=ADC10MEM; v=17.75*adc/51.2; k=(uint)v; Write_Num(0x82,k,2);i=8000;while(i-); / ADC10 interrupt service routine#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR(void) _bic_SR_register_on_exit(CPUOFF); / Clear CPUOFF bit from 0(SR)/deng#include #define uint unsigned int uint j=1000,k,p,m;uint x=0x04,0x01,0x08,0x10,0x20, 0x80,0x02,0x80,0x20,0x10, 0x08,0x01,0x04,0x25,0x8c, 0x16,0x25,0x8c,0x16,0x8c, 0x25,0x16,0x8c,0x25,0x16,/5 0xBf,0xBf,0xBf,0xBf,0xBf, 0X80,0X20,0X10,0X08,0X01, 0X02,0X02,0X80,0X20,0X10, 0X08,0X01,0X02,0X02,0X80, 0X20,0X10,0X08,0X01,0X02,/10 0X04,0X04,0X04,0XFF,0XFF, 0XFF,0XFF,0XFF,0X04,0X04, 0X04,0X1D,0X04,0X04,0X04, 0XB4;uint y=0xf8,0xf8,0xf8,0xf8,0xf8, 0xf8,0xf8,0xf8,0xf8,0xf8, 0xf8,0xf8,0xf8,0xf8,0xf8, 0xf8,0xf8,0xf8,0xf8,0xf8, 0xf8,0xf8,0xf8,0xf8,0xf8,/5 0xfe,0xfb,0xfd,0xfb,0xfe, 0XFE,0XFE,0XFE,0XFE,0XFE, 0XFE,0XFB,0XFB,0XFB,0XFB, 0XFB,0XFB,0XFB,0XFD,0XFD, 0XFD,0XFD,0XFD,0XFD,0XFD,/10 0XFD,0XFB,0XFE,0XFE,0XFB, 0XFD,0XFB,0XFE,0XFE,0XFB, 0XFD,0XFD,0XFE,0XFB,0XFD, 0XFD; void delayl(uint i) uint j,k; for(j=i;j0;j-) for(k=100;k0;k-); void main(void)uint i; WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timer P1DIR |= 0xff; P2DIR=0x07;/ Set P1.0 to output direction / P1.3set, else reset P2REN |= 0; P2IE |= BIT3+BIT5+BIT4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论