武汉工程科技学院MSP430F169课程设计报告.docx
《武汉工程科技学院MSP430F169课程设计报告.docx》由会员分享,可在线阅读,更多相关《武汉工程科技学院MSP430F169课程设计报告.docx(14页珍藏版)》请在冰点文库上搜索。
武汉工程科技学院MSP430F169课程设计报告
MSP430课程设计报告
学部:
机械与电子信息学院
专业:
通信工程
班级:
通信一班
学号:
姓名:
指导教师:
侯自良
2015年6月
一.MSP430F169中+5V和+3.3V电压输出硬件设计
图1-1
如图1-1LM7805把输入的7~9电压转化为稳定的+5V输出电压,LM7805输出的+5V电压作为AMS1117的输入电压,经过AMS1117把+5V的电压转化为稳定的+3.3V电压。
LM7805能输出稳定+5V电压,AMS1117-3.3V能输出稳定的3.3V电压。
稳定的+5V电压为外围一些芯片提供电压,稳定的3.3V电压作为MSP430的工作电压提供源。
在+5V输出电压与地之间和+3.3V电压与地之间并联100uF和104pF的电容进行滤波。
二.MSP430最小系统电路的硬件设计
图1-2
如图1-2所示,430芯片的1脚与64接3.3V的电压给芯片提供电压,与地之间并联100uF和104的电容进行滤波,提供稳定的电压输入。
8脚与9脚接一个32768的晶振,可由软件选作各个外围模块的时钟信号,一般用于低速外设。
52和53脚接一个8M的晶振作为系统主时钟,主要用于CPU和系统。
芯片内部有个DCO振荡器。
MSP430共有3个振荡器。
RST复位端低电平有效,按键按下产生低电平,芯片进行复位。
三.MSP430跑马灯的硬软件电路设计
1.MSP430跑马灯的硬件电路设计
图1-3
MSP430的第20-27引脚为P2口,对应P2.0-P2.7,P2口的P2.0-P2.7与74HC573的D0-D7一一对应,74HC573的Q0-Q7为输出,分别接发光二极管后与100Ω串联接地。
74HC573为8位锁存器,其1脚为输出使能,低电平有效,电路中将其接地,所以74HC573的8位Q端为直通输出。
74HC573的第11引脚LE为输入使能端,高电平有效,电路中将其接入+5V高电平。
2.MSP430跑马灯的软件设计
#include
#defineucharunsignedchar
#defineuintunsignedint
//***************************************************************
//延时
//****************************************************************
voiddelay(uintn)
{
uinta;
while(n--)
for(a=0;a<=1538;a++);
}
//***********************************
//初始化小灯的相关引脚
//***********************************
voidinit_shu_led(void)
{
P2DIR=0xff;//小灯的引脚设置
P2SEL=0x00;
}
//********************************************************
//跑马灯led闪亮
//*******************************************************
voidrun_led(void)
{
uchari,j;
uinttemp;
for(i=1;i<10;i++)
{
for(temp=0;temp<256;temp+=i)
{
P2OUT=temp;
delay(200);
}
}
for(i=0,j=0x01;i<10;)
{
P2OUT=j;
delay(200);
j=j<<1;
if(j==0)
{
i++;
j++;
}
}
for(i=0,j=0x80;i<10;)
{
P2OUT=j;
delay(200);
j=j>>1;
if(j==0)
{
i++;
j=0x80;
}
}
}
//************************************************************
//时钟初始化选择8M晶振
//*************************************************************
voidint_clk(void)
{
uchari;
BCSCTL1&=~XT2OFF;
BCSCTL2|=SELM_2+SELS;
do
{
IFG1&=~OFIFG;
for(i=0;i<200;i++);
}while(IFG1&OFIFG);
}
//**************************************************************
//主函数
//**************************************************************
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
init_shu_led();//初始化数码管和LED灯
int_clk();
while
(1)
{
run_led();
}
}
在以上程序中:
#include为MSP430中定义的MSP430F169的特殊功能寄存器功能头文件。
#defineucharunsignedchar#defineuintunsignedint声明uchar和uint的类型
delay()函数进行延时以便眼睛能看到小灯闪烁变化。
init_shu_led()函数初始化小灯的引脚,LED小灯与MSP430的P2.0-P2.7相联,设置P2口为输出。
int_clk()函数初始化时钟,选择8M晶振。
run_led()函数中先对变量temp进行加i计数,采用双重循环方式,第一遍i=1,temp计数,每次加1,计数范围从0-255,达到256归零。
每计数一次,将结果送P2OUT,发光二极管显示。
第二遍i=i+1=2,temp=temp+i.即temp每次加2,直到temp<256在对temp归零。
这一循环过程直到i=9,在每次送P2OUT显示后,经延时后,以便能看到LED灯的闪烁。
然后进入跑马灯左移位程序P2OUT=j;delay(200);j=j<<1(左移一位);循环移位10遍,再进入右移位程序,循环10遍,run_led()函数执行完,进入主程序。
四.MSP430键盘控制及键号显示电路的软硬件设计
1.MSP430键盘控制及键号显示电路的硬件设计
图1-4
MSP430键盘控制及显示电路如图1-4所示,键盘控制及显示电路包括键盘控制电路和键号显示电路。
键盘控制电路。
按键一端与10K电路相联,另一端接地。
在10K电阻与按键之间引出导线与MSP430的P4口相连,端口40-47与MSP430的P4.0-P4.7相对应,设置P4口为输入状态就能读出输入的高低电平。
比如第三个按键按下,则输入的为11011111,P4IN为11011111,
通过读取P4IN的值就能确定那个按键按下。
在电阻与按键之间引出导线与P4口相联时,还作为74HC21(4输入与门)的输入端,74HC21最终输出端与MSP430的15引脚相联,MSP430的第15引脚为P1.3,P1.3具有中断功能。
当8个按键没有按键下时,74HC21的输出电平为高电平。
8个按键中任意一个按键按下时74HC21输出由高电平变为低电平.74HC21的功能为:
只要有一个输入端为低电平,其输出端为低电平。
此下降沿触发MSP430的P1.3口的中断,对键盘控制采用的是中断搜索方式。
键号的数码显示采用MSP430的SPI串口方式,第一片74HC164的AB引脚与MSP430的29引脚相联,MSP430的29的第二功能为SIMO0输出SPI数据。
四片74HC164采用级联的方式,因为SPI串口发送数据从高位到低位,所以前一片的最高位QH与第二片的AB引脚相联。
74HC164的第九引脚CLR接低电平进行清除输出数据,在这改为接高电平。
4片74HC164的CLK共同接在MSP430的31引脚,其对应为UCLK0,输出SPI模式的时钟信号。
四个数码管显示键号,按下一个按键后与第一片74HC164相对应的数码管显示按键号,该数码管原先显示的数字在第二个数码管中显示,与此对应,数码管显示的数字依次移一位。
2.MSP430键盘控制及键号显示的程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharkey1=10;
constucharsegment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//***************************************************************
//延时
//****************************************************************
voiddelay(uintn)
{
uinta;
while(n--)
for(a=0;a<=1538;a++);
}
//***********************************
//初始化数码管与键盘的相关引脚
//***********************************
voidinit_shu_led(void)
{
P4DIR=0x00;//按键引脚输入
P1IES=0x08;//按键中断的相关设置
P1IFG=0x00;
P1IE=0x08;//开P1.3引脚的中断
}
//*******************************
//初始SPI模式通过SPI与164相连
//*******************************
voidint_spi(void)
{
U0CTL=CHAR+SYNC+MM+SWRST;//8位SPI,主模式
U0TCTL=SSEL0+SSEL1+STC;//ACLK时钟,3线
U0TCTL|=CKPH;//上升输出数据,164上升沿输入数据
U0TCTL&=~CKPL;//延时半个周期缓冲
U0BR0=0x02;
U0BR1=0x00;
U0MCTL=0x000;
ME1|=USPIE0;//模块使能
U0CTL&=~SWRST;//SPI使能
IE1&=~UTXIE0;//接收禁止使能
IE1&=~URXIE0;//发送禁止使能
P3SEL|=0x0e;//P3.1-P3.3第二功能
P3DIR|=0xff;//P3口输出
}
//***********************************************************
//在数码管上显示数字
//**********************************************************
voiddisplay(uchardata)
{
while((IFG1&UTXIFG0)==0);
U0TXBUF=segment[data];
}
//************************************************************
//时钟初始化选择8M晶振
//*************************************************************
voidint_clk()
{
uchari;
BCSCTL1&=~XT2OFF;
BCSCTL2|=SELM_2+SELS;
do
{
IFG1&=~OFIFG;
for(i=0;i<200;i++);
}while(IFG1&OFIFG);
}
//**************************************************************
//主函数
//**************************************************************
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
uchari;
init_shu_led();
int_clk();
int_spi();
for(i=0;i<4;i++)//上电开始没有按键按下数码管显示“-”
display(key1);
_EINT();//开总中断
LPM1;
}
//**********************************************************
//按键的中断服务程序
//***********************************************************
#pragmavector=PORT1_VECTOR
__interruptvoidport_1(void)
{
_DINT();
ucharkey;
key=P4IN;
if(key!
=0xff)
{
delay(50);
key=P4IN;
if(key!
=0xff)
{
key=P4IN;
switch(key)
{
case0xfe:
key1=1;break;
case0xfd:
key1=2;break;
case0xfb:
key1=3;break;
case0xf7:
key1=4;break;
case0xef:
key1=5;break;
case0xdf:
key1=6;break;
case0xbf:
key1=7;break;
case0x7f:
key1=8;break;
default:
key1=0;
}
display(key1);
}
}
P1IFG=0x00;
_EINT();
}
键盘控制程序采用中断的方式进入,即有人按下任意一个按键,则P1口的中断启动,进入查询模式,通过扫描P4IN的值来确定哪个按键按下,然后显示键号。
以上程序中:
delay()函数进行延时,在去抖中用到。
init_shu_led()初始化相关引脚的功能,P4引脚设置为输入模式,P1.3设置为中断模式。
int_spi()函数进行设置SPI串口的相关操作,U0TCTL|=CKPH;设置MSP430在上升输出数据,而74HC164在上升沿输入数据,U0TCTL&=~CKPL;作用是延时半个周期以便MSP430输出的数据在74HC164的上升沿到来时数据已经在SIMO0线上。
在P1口的中断函数中,关闭总中断_DINT()禁止在处理P1.3中断服务中又产生了中断,
delay(50)进行按键的去抖动,在switch中查询P4IN的值来确定哪个按键被按下,display(key1)用来显示按键的键号,在中断服务函数的最后进行去中断标志位和开中断。
五.总结与体会