msp430入门小程序.docx

上传人:b****3 文档编号:3851854 上传时间:2022-11-25 格式:DOCX 页数:47 大小:30.92KB
下载 相关 举报
msp430入门小程序.docx_第1页
第1页 / 共47页
msp430入门小程序.docx_第2页
第2页 / 共47页
msp430入门小程序.docx_第3页
第3页 / 共47页
msp430入门小程序.docx_第4页
第4页 / 共47页
msp430入门小程序.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

msp430入门小程序.docx

《msp430入门小程序.docx》由会员分享,可在线阅读,更多相关《msp430入门小程序.docx(47页珍藏版)》请在冰豆网上搜索。

msp430入门小程序.docx

msp430入门小程序

//红绿灯交换闪烁

#include"msp430g2553.h"

unsignedinti=8000;

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

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.h"

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;//看门狗不解释

P1DIR=BIT0;//P1.0为led,显示按键起作用

P1OUT=BIT0+BIT3;//P1IN低电平跳转

P1REN=BIT3;//上拉电阻,缺了好像不能用

while

(1)

{

if(P1IN&BIT3)//按键没按下

P1OUT=BIT0+BIT3;//led亮

elseP1OUT=BIT3;//led灭

}

}

P1口中断

 

#include

unsignedcharflag=0;//任务标志

voidIint_Port1(void);//函数声明

voidmain(void)

{WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

Iint_Port1();//初始化p1.0

_EINT();//开总中断允许

while

(1)

{

LPM3;//进入低功耗模式3,I/O口中断可将其唤醒

if(!

flag){P1OUT=BIT0;}//中断服务程序

elseif(flag){P1OUT=BIT6;}//其他任务

}

}

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

{P1IFG=0;//多源中断,需靠软件清除P1IFG

flag=1;//置任务标志

_BIC_SR_IRQ(LPM3_bits);//将CPU从睡眠模式唤醒

}

voidIint_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从睡眠模式唤醒

}

 

//端口1的中断服务历程

#pragmavector=PORT1_VECTOR

__interruptvoidPort_1(void)

{

P2OUT^=0x01;//P1.0状态翻转

P1IFG&=~0x10;//P1.4中断标志清零

}//ADC

#include"io430.h"

#defineuintunsignedint

#defineucharunsignedchar

uintad;

voiddelayl(uintn)

{uintj,k;

for(j=n;j>0;j--)

for(k=100;k>0;k--);

}

voiddis(uintx,uinty,uintz)

{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;

}

voidadc()

{uinti,j=10;

P1DIR=0x00;P1REN=0xff;P1OUT=0x00;

//P2OUT&=~BIT0;

//for(i=511;i>0;i--){P2OUT^=BIT1;while(j--);}

ad=P1IN;P1REN=0x00;

}

 

intmain(void)

{uintx,y,z;

//Stopwatchdogtimertopreventtimeoutreset

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 比较器控制寄存器1

   

CAEX:

 控制内部比较器A的输入信号和输出信号的方向

CARSEL:

控制内部参考电压加到比较器A的正输入端还是负输入端 

由结构图可以看出,CAEX,CARSEL在不同设置时,比较器A输入端的所加的参考电压是有不同的.

请参考以下列表:

----------------------------------- 

CARSEL   CAEX     参考电压接入端

  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 比较器控制寄存器2

   

P2CA1:

控制输入端CA1

 0 外部引脚信号不与比较器A连接

 1 外部引脚信号与比较器A连接

P2CA0:

控制输入端CA0

 0 外部引脚信号不与比较器A连接

 1 外部引脚信号与比较器A连接

CAF:

 选择比较器输出端是否经过RC低通滤波器

 0 开通RC低通滤波器

 1 直通信号

CAOUT:

 比较器A输出的信号

 0CA0小于CA1

 1CA0大于CA1

CAPD 端口禁止寄存器

  比较器A模块的输入输出与IO口共用引脚,可以控制IO端口输入缓冲器的通断开关.CAPD控制位初始化为0,则端口输入缓冲器有效.当相应位为1时,端口输入缓冲器无效。

程序范例:

#include

voidmain(void)

 {

  WDTCTL=WDTPW+WDTHOLD;     // 停止WDT

  CAPD|=0x08;           // 断开与IO端口输入

  CACTL2=P2CA0;          // 设置P2.3为+comp

  CCTL0=CCIE;           //CCR0 允许中断

  TACTL=TASSEL_2+ID_3+MC_2;  //SMCLK/8,计数模式

  _EINT();             // 开总中断

 while

(1)// 循环

 {

  CACTL1=0x00;          // 没有参考电压

  _BIS_SR(LPM0_bits);        // 进入LPM0

  CACTL1=CAREF0+CAON;      //0.25*Vcc=P2.3, 比较器开

  _BIS_SR(LPM0_bits);        // 再次进入LPM0

  CACTL1=CAREF1+CAON;      //0.5*Vcc=P2.3, 比较器开

  _BIS_SR(LPM0_bits);        // 再次进入 LPM0

  CACTL1=CAREF1+CAREF0+CAON;  //0.55VonP2.3,比较器开

  _BIS_SR(LPM0_bits);        // 再次进入LPM0

 }

}

//TimerA0interruptserviceroutine

#pragmavector=TIMERA0_VECTOR

__interruptvoidTimer_A(void)

{

 _BIC_SR_IRQ(LPM0_bits);       //退出LMP0模式

}

定时器中断

#include"msp430g2553.h"

#include

inti;

voidmain(void)

{

WDTCTL=WDTPW+WDTHOLD;//StopWDT

P1DIR|=0x01;//P1.0output

CCTL0=CCIE;//CCR0interruptenabled

CCR0=50000;

TACTL=TASSEL_2+MC_2;//SMCLK,contmode

i=0;

_BIS_SR(LPM0_bits+GIE);//EnterLPM0w/interrupt

}

//TimerA0interruptserviceroutine

#pragmavector=TIMER0_A0_VECTOR

__interruptvoidTimer_A(void)

{

if(i>20){

P1OUT^=0x01;//ToggleP1.0

//CCR0+=50000;//AddOffsettoCCR0

i=0;

}

i++;

}

//7528

#include

unsignedinti=1;

voidxie()

{

P1DIR|=0xff;//P1.0output

P2DIR|=0x07;

P2OUT&=0xfe;//选中DACA

P1OUT=i;

P2OUT|=0x01;//选中DACB

P1OUT=i;

P2OUT|=0x02;//禁止写入

P2OUT|=0x04;//

}

voidmain(void)

{

WDTCTL=WDTPW+WDTHOLD;//StopWDT

xie();

while

(1)

{P1DIR&=~BIT3;P1REN=BIT3;P1OUT|=BIT3;

if(!

(P1IN&BIT3)){i=i<<1;while(!

(P1IN&BIT3));xie();if(i>129)i=1;P1OUT^=BIT6;}

}

}

//按键中断

#include  

void main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

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

  P1OUT =  0x08;                            // P1.3set, else reset

  P1REN |= 0x08;                              

  P1IE |= 0x08;                             // P1.3 interrupt enabled

  P1IES |= 0x08;                            // P1.3 Hi/lo edge

  P1IFG &= ~0x08;                           // P1.3 IFG cleared

  _BIS_SR(LPM4_bits + GIE);                 // Enter LPM4 w/interrupt

}

// Port 1 interrupt service routine

#pragma vector=PORT1_VECTOR

__interrupt void Port_1(void)

{

  P1OUT ^= 0x01;                            // P1.0 = toggle

  P1IFG &= ~0x08;                           // P1.4 IFG cleared

}

//1602

#include"io430.h"

#include"in430.h"

#defineuintunsignedint

#defineucharunsignedchar

uchartable[]="kaigeshuaiqi";

uchartable1[]="hellowelcome";

uintm=1;

voiddelay(uintz)

{uinti,j;

for(i=z;i>0;i--)

for(j=100;j>0;j--);

}

 

voidwrite_com(ucharcom)//写入

{

P2OUT&=~BIT4;//LCD选择输入命令

P1OUT=com;//向P0口输入命令

delay(5);//延时

P2OUT|=BIT5;//打开LCD使能

delay(5);//一个高脉冲

P2OUT&=~BIT5;//关闭LCD使能

}

voidwrite_data(uchardate)

{

P2OUT|=BIT4;//设置为输入数据

P1OUT=date;//将数据赋给P0口

delay(5);//延时

P2OUT|=BIT5;//置高

delay(5);//高脉冲

P2OUT&=~BIT5;//置低完成高脉冲

}

voidinit()

{

P2OUT&=~BIT5;

write_com(0x38);//设置16x2显示5x7点阵,8位数据接口

write_com(0x0c);//设置开始显示不显示光标

write_com(0x06);//写一个字符后地址指针加1

write_com(0x01);//显示清零数据指针清零

}

voiddis(uintx)

{uinty,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);

}

intmain(void)

{uintnum;

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

P1DIR=0xff;

P2DIR=0xff;

P2OUT&=~BIT3;

while

(1)

{init();

write_com(0x84);//将数据指针第一行第一个字处,

for(num=0;num<12;num++)

//{

{write_data(table[num]);

delay(1000);}

write_com(0x80+0X44);

for(num=0;num<13;num++)

{write_data(table1[num]);

delay(1000);}

//m++;

//delay(5);

//}

//write_com(0x80+0x40);//定义指针位置

//for(num=0;num<12;num++)

//{

//write_data(table1[num]);

//write_data(m+'0'+10);

//dis(num);num++;

//if(num>999){num=0;}

//}

while

(1){

for(num=0;num<4;num++)

{

write_com(0x18);

//write_com(0x1c);//右移

delay(2000);

}

for(num=0;num<4;num++)

{

//write_com(0x18);//左移

write_com(0x1c);//右移

delay(2000);

}}

}

}

//12864

//main()

 

#include

#include"lcd12864.h"

#include"lcd12864.c"

unsignedcharconstt[]={"床前明月光,"

"举头望明月,"

"凝是地上霜。

"

"低头思故乡。

"};

voidmain()

{

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可显示汉字、数字和数组。

*/

//

//MSP430G2433LCD12864

//+-------------------++----+

//||||

//||||

//|||RS|--VCC

//|P2.6|-->|R/W|

//|P2.7|-->|CLK|

//||||

//|||RST|--VCC

//||||

//|||PSB|--GND

//||||

//+-------------------++----+

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

#include"msp430G2553.h"

#include"LCD12864.h"

unsignedintDisp_Tab[8];

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

*名称:

io_init(void)

*功能:

LCD12864所用的IO口初始化

*入口参数:

*出口参数:

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

voidio_init(void)

{

P2SEL&=~(BIT6+BIT7);

P2DIR|=BIT6+BIT7;

//P1OUT=0;

P1SEL=0xFF;

//P1SEL|=BIT6;

P1DIR=0;

}

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

*名称:

wr_lcd(uchrfunc,uchrdata)

*功能:

往LCD12864写入一个字节。

func=comm,则写入的是命令;

func=commdat,则写入的是数据

*入口参数:

func和data

*出口参数:

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

v

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1