www.Microcontrol.cn
微控设计½
中½MSP430单片机专业½站
微控设计½
http://www.Microcontrol.cn
微控设计½
中½
MSP430
单片机专业½站
MSP430 C
语言例题
由微控技术论坛会员
Slam
提供
Page
1
of
21
基于模拟前端信号处理与控制技术的专业论坛、½站
基于模拟前端信号处理与控制技术的专业论坛、½站
www.Microcontrol.cn
微控设计½
中½MSP430单片机专业½站
Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.com
www.Microcontrol.cn
微控设计½
本章选择了一些简单的
C
语言程序例题,这些程序的结构简单,编程技巧不多,题目½然
简单,½是非常适合入门单片机的学习者学习
MSP430
单片机的
C
语言编程。
如下列出了
C
语言例题运行的
MSP430F149
实验板硬件资源环境,熟悉这些硬件资源,对
于理解程序非常重要。
(1)数码管:
左侧数码管与
P5
口相连,a~g,h 对应
P5.0~P5.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 引脚连接模拟量电½器,用于模拟量实验
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输出高电平,发光二极管灭,(高电平½发光二极管灭)
}
}
例
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
基于模拟前端信号处理与控制技术的专业论坛、½站
基于模拟前端信号处理与控制技术的专业论坛、½站
www.Microcontrol.cn
微控设计½
中½MSP430单片机专业½站
Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.com
www.Microcontrol.cn
微控设计½
#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½取反
}
(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
基于模拟前端信号处理与控制技术的专业论坛、½站
基于模拟前端信号处理与控制技术的专业论坛、½站
www.Microcontrol.cn
微控设计½
中½MSP430单片机专业½站
Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.com
www.Microcontrol.cn
微控设计½
}
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的数值,取出相应的数组元素
}
}
例7:
½用定时器输出精确的秒信号。从0开始计时,数码管显示0½60秒,每隔10秒½数码管
更换显示,并顺序点亮发光二极管。
Page
4
of
21
基于模拟前端信号处理与控制技术的专业论坛、½站
基于模拟前端信号处理与控制技术的专业论坛、½站
www.Microcontrol.cn
微控设计½
中½MSP430单片机专业½站
Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.com
www.Microcontrol.cn
微控设计½
#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口输出
}
例
8:连接在
P1.0
口的按键控制数码管显示数值,数码管显示按动次数。
#include <msp430x14x.h> //声明库文件
char Key_Pressed(void); //声明被调用½数
void main(void)
{
unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//共阳数码管字型码数组
unsigned int i=0; //声明数据类型
WDTCTL = WDTPW + WDTHOLD; //关看门狗
P1DIR &= ~BIT0; //P1.0引脚设½成输入,该引脚连接的按键按下时,按键输出½电平
P4DIR =0xff;
//P4口设½为输出,连接共阳数码管
P4OUT=seg[8]; //P4口输出数字8
while (1) //无限次while循环
{
if(Key_Pressed()) //调用按键½数,如果按键½数返回1,
Page
5
of
21
基于模拟前端信号处理与控制技术的专业论坛、½站
基于模拟前端信号处理与控制技术的专业论坛、½站
评论