课题松翰SN8P2602B开发参考代码.docx

上传人:b****5 文档编号:3721230 上传时间:2022-11-24 格式:DOCX 页数:38 大小:30.55KB
下载 相关 举报
课题松翰SN8P2602B开发参考代码.docx_第1页
第1页 / 共38页
课题松翰SN8P2602B开发参考代码.docx_第2页
第2页 / 共38页
课题松翰SN8P2602B开发参考代码.docx_第3页
第3页 / 共38页
课题松翰SN8P2602B开发参考代码.docx_第4页
第4页 / 共38页
课题松翰SN8P2602B开发参考代码.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

课题松翰SN8P2602B开发参考代码.docx

《课题松翰SN8P2602B开发参考代码.docx》由会员分享,可在线阅读,更多相关《课题松翰SN8P2602B开发参考代码.docx(38页珍藏版)》请在冰豆网上搜索。

课题松翰SN8P2602B开发参考代码.docx

课题松翰SN8P2602B开发参考代码

松翰SN8P2602B开发参考代码

本章选择了一些简单的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//声明库

voidmain(void)//主函数

{

unsignedinti;//变量声明

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

voidmain(void)

{

unsignedinti;

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。

#include

voidmain(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]voidTimer_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

#defineXTOFF0x40;

voidmain(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]voidTimer_A(void)//定时器A中断函数

{

P3OUT^=BIT7;//P3.7位取反

}

(2)使用32768Hz晶体产生1s信号的程序如下:

#include

voidmain(void)

{

WDTCTL=WDTPW+WDTHOLD;

TACTL=TASSEL0+TACLR+MC0;

CCTL0=CCIE;

CCR0=16384;

P3DIR|=BIT7;

_EINT();

while

(1);

}

interrupt[TIMERA0_VECTOR]voidTimer_A(void)

{

P3OUT^=BIT7;

}

(3)看门狗使输出P3.7引脚连接的发光二极管每秒闪烁一次的例子:

#include

voidmain(void)

{

WDTCTL=WDTPW+WDTTMSEL+WDTSSEL;

IE1|=WDTIE;

P3DIR|=BIT7;

_EINT();

while

(1);

}

interrupt[WDT_VECTOR]voidWDT_interrupt(void)

{

P3OUT^=BIT7;

}

例5:

P4和P5输出口连接的数码管显示1和2。

#include

voidmain(void)

{

unsignedcharseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//定义七段译码的共阳数码管显示数组

//hgfgdcba

//0=11000000

//1=11111001

//2=10100100

//……

//9=10010000

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

voidmain(void)

{

inti,x;//声明数据类型

unsignedcharseg[]={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秒使数码管

更换显示,并顺序点亮发光二极管。

#include

#defineXTOFF0x40;

unsignedinti=0,j=0;//声明数据类型

unsignedcharseg_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//数码管字型码数组

unsignedintbit[8]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080};

//发光二极管点亮顺序数组

voidmain(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口输出为01111110

_EINT();调用C430编译器内部函数使能中断

while

(1);//没有循环体的无限次while循环

}

interrupt[TIMERA0_VECTOR]voidTimer_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//声明库文件

charKey_Pressed(void);//声明被调用函数

voidmain(void)

{

unsignedcharseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//共阳数码管字型码数组

unsignedinti=0;//声明数据类型

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

P1DIR&=~BIT0;//P1.0引脚设置成输入,该引脚连接的按键按下时,按键输出低电平

P4DIR=0xff;//P4口设置为输出,连接共阳数码管

P4OUT=seg[8];//P4口输出数字8

while

(1)//无限次while循环

{

if(Key_Pressed())//调用按键函数,如果按键函数返回1,

SimpoPDFPasswordRemoverUnregisteredVersion-www.M微控设计网中国MSP430单片机专业网站

基于模拟前端信号处理与控制技术的专业论坛、网站

www.M微控设计网

Page6of21

基于模拟前端信号处理与控制技术的专业论坛、网站

P4OUT=seg[i++];//则数码管字型数组下标加1,选择相应的七段字型从

//P4口输出

if(i>9)//如果i大于9,则使i=0

i=0;

}

}

charKey_Pressed(void)//按键函数

{

unsignedinti;//声明变量i

while(!

(P1IN&BIT0));//当P1输入寄存器P1IN的第0位为0时,开始while循环

for(i=0;i<8000;i++);//延时一段时间,消除按键抖动

if(!

(P1IN&BIT0))//如果P1输入寄存器P1IN的第0位还是0,则返回1,表示按键按下

return1;

else//否则认为按键未按下,返回0

return0;

}

例9:

将P6口输入的模拟电压AD转换后,从P4、P5口连接的数码管输出。

使用AD单通道多次转换,采集P6.0输入的模拟电压值(变化范围:

0~3.3V),转换为数字量。

建立二维数组和通过顺序查表的方法得出采集回来的电压值。

然后通过数码管显示当前电压值,显

示跟随输入的模拟电压的变化。

由于只有两位数码管,故显示电压值精确到小数点后一位,如当前

输入电压2.37V,则显示2.4V。

可用万用表检测显示是否准确。

#include"msp430x14x.h"声明库

voidInit(void);//声明初始化函数

interrupt[ADC_VECTOR]voidADC12(void);//声明AD转换中断函数

unsignedintResult;声明变量

unsignedintTable[4][10]={{0x040,0x0BC,0x138,0x1B4,0x230,0x2AC,0x328,0x3A4,0x420,0x49C},

{0x518,0x594,0x610,0x68C,0x708,0x784,0x800,0x87C,0x8F8,0x974},

{0x9F0,0xA6C,0xAE8,0xB64,0xBE0,0xC5C,0xC08,0xD54,0xDD0,0xE4C},

{0xEC8,0xF44,0xFC0,0xFFF}};

//该数组元素用于与AD转换的电压数值相比较,如果某个数组元素稍大于等于AD转换后的电压数

//值,则将此元素输出

voidmain(void)//主函数

{P4DIR=0XFF;//P4口设置为输出

P5DIR=0XFF;//P5口设置为输出

Init();//调用初始化函数

_EINT();//使能中断

ADC12CTL0|=ENC+ADC12SC;//设置转换控制寄存器ADC12CTL0,ENC=0x002使转换允许位为1,

//意味着可以启动转换,同时ADC12TL0中的低电平位可以被修改。

//ADC12SC=0x001使采样/转换控制位为1,如果采样信号SAMPCON由

//采样定时器产生(SHP=1),则ASC12SC=1将产生一次转换

while

(1);//无限次的while循环

}

voidInit(void)//初始化函数

{

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

P6SEL|=0x01;//设置P6口的P6.0引脚为外围模块AD转换器的模拟信号输入引脚

ADC12CTL0&=~ENC;//复位转换允许位

ADC12CTL0=ADC12ON+SHT0_2+REFON+REF2_5V;//TurnonandsetupADC12

//设置转换控制寄存器ADC12CTL0,ADC12ON=0x010,使ADC12内核工作

//SHT0_2=2*0x100,确定采样周期为4×tADC12CLK×4

//REFON=0x020,内部参考电压打开

//REF2_5V=0x040,选择内部参考电压发生器的电压为2.5V

ADC12CTL1=SHP+CONSEQ_2;//设置AD转换控制寄存器ADC12CTL1

//SHP=0x0200设置SAMPON来自采样定时器,采样信号上升沿触发采样

//CONSEQ_2=2*2设置工作模式为单通道、多次转换模式

ADC12MCTL0=SREF_0;//设置通道0的转换存储控制寄存器ADC12MCTL0,

//SREF_0=0*0x10选择参考电压为VR+=AVCC,VR-=AVSS,因此输入模拟信号

//范围是3.3V~0V。

ADC12IE|=BIT0;//设置中断允许寄存器ADC12IE,将第0位置1,使通道A0转换后产生中断

}

interrupt[ADC_VECTOR]voidADC12(void)//AD转换中断函数

{

unsignedcharseg_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//声明无小数点显示的数码管七段字型码数组

unsignedcharseg_8[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

//声明有小数点显示的数码管七段字型码数组

unsignedi,j;//声明变量数据类型

ADC12CTL0&=~ENC;//设置AD转换控制寄存器ADC12CTL0,ENC=0x002,~ENC=0xFFD,停止AD转换

for(i=0;i<4;i++)//扫描Table数组行下标

{

for(j=0;j<10;j++)//扫描Table数组列下标

{if(ADC12MEM0<=Table[i][j])

gotoxxx;//如果Table数组元素大于转换数值,则转到标号xxx

}

}

xxx:

{P4OUT=seg_7[j];//P4口输出

P5OUT=seg_8[i];}//P5口输出

ADC12CTL0|=ENC+ADC12SC;//使能再次转换

}

例10:

模拟比较器实验

接电位器于端口P2.3,用来输入模拟电压值(0~3.3V)。

参考电压选取0.5VCC,待测电压由P2.3

端输入,如果待测电压大于参考电压,P1.0端口的LED点亮,反之熄灭。

注意:

顺时针调节电位器,输入的模拟电压值增大。

#include

voidmain(void)

{

WDTCTL=WDTPW+WDTHOLD;

P3DIR|=BIT0;//P3口的第0引脚为输入

CACTL1=CARSEL+CAREF1+CAON;//设置控制寄存器CACTL1,

//CARSEL=0x40,设置内部参考电压,当CAEX=0时参考电平加在(-)端

//CAREF1=0x20,选择0.5×VCC作为参考电压

//CAON=0x08,打开比较器

CACTL2=P2CA0;//设置控制寄存器CACTL2,

//P2CA0=0x04,设置外部引脚信号连接在比较器输入端

while

(1)//无限次循环

{

if((CACTL2&CAOUT)==CAOUT)//CAOUT=0x01,如果比较器输出为1

//若CACTL2寄存器的第0位为1,则表示输入电压

//大于参考电压

P3OUT&=~BIT0;//则P3的第0引脚输出低电平,相连的发光二极管亮

else

P3OUT|=BIT0;//否则,P3的第0引脚输出高电平,相连的发光二极管灭

}

}

例11:

MSPF149的UART向PC机的RS232串口发送字符串。

单片机UART以9600波特率,8个数据位,无校验位,1个停止位。

单片机上电后连续向PC发送字符

串,利用串口调试助手可以显示发送的内容。

需要发送其他英文会话可以改变Data[]数组内容。

#include

voidInit(void);//声明初始化函数

charData[20]="xialaoshinihao!

";//发送的字符串

voidmain(void)

{

unsignedinti;

WDTCTL=WDTPW+WDTHOLD;

Init();//调用初始化函数

while

(1)//无限次循环

{

for(i=0;i<=20;i++)

{

TXBUF0=Data[i];//向缓冲器送入待发送数据

while((UTCTL0&0x01)==0);//发送缓冲器有待发数据时,UTCTL0的第0位复位,进入等待

}

}

}

voidInit(void)

{

UCTL0&=~SWRST;//USART控制寄存器

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

当前位置:首页 > 小学教育 > 语文

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

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