完整word版msp430单片机实验报告.docx
《完整word版msp430单片机实验报告.docx》由会员分享,可在线阅读,更多相关《完整word版msp430单片机实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
完整word版msp430单片机实验报告
实验报告
课程名称:
单片机原理及应用
实验题目:
实用多功能定时器
学生姓名:
谢照
学号:
2014110144
专业班级:
自动化
二零一六年五月七日
一、课程实验目的...................................................................................1
二、实验要求..............................................................................................1
三、课程实验硬件电路.............................................................................2
3.1、硬件电路结构....................................................................................2
3.2、电路原理............................................................................................2
3.2.1、显示电路.........................................................................................2
3.2.2、按键检测电路.................................................................................3
四、实验步骤..............................................................................................6
五、软件设计..............................................................................................6
5.1、倒计时主程序.....................................................................................6
5.2、中断程序设计......................................................................................7
六、调试与结论..........................................................................................7
七、附录........................................................................................................8
一、目的
(1)熟练运用CCS开发环境和Proteus仿真软件,巩固和加深单片机原理课程知识的理解和运用。
(2)综合本学期所学的按键检测以及液晶的动态显示原理,设计出以MSP430G2553为核心的以LCD1602为显示的倒计时系统。
(3)熟悉各元器件的性能和设置元件参数,进一步提高学生单片机应用系统的设计能力。
(4)培养学生综合分析问题、发现问题和解决问题的能力。
二、实验要求
(1)设计一个倒计时器,定时范围99分60秒,用液晶作为显示器。
4个按键控制,分别是分钟加一、秒钟加一、清零和开始停止键。
按分钟加一键时,分钟显示值加1,最大99;按秒钟加一键时,秒钟显示值加1,最大60;按清零键时,分钟、秒钟显示值都清零;按开始键,则开始倒计时。
显示值为零时停止倒计时,且报警器报警,直到按停止键报警器停止报警。
按开始键后,分钟加一、秒钟加一、清零键不起作用。
按停止键可以暂停。
倒计时为零后,按停止键,显示值恢复设定值,按开始键又可以工作。
(2)总体要求如下:
1、方案论证,确定总体电路原理图。
2、画硬件仿真电路图。
3、绘制程序流程图,编写C语言源程序。
4、安装调试,实现倒计时器的基本功能。
三、硬件电路
3.1、电路结构图:
多功能定时器主要由三个最基本模块组成,一是以LCD1602液晶为基础的显示电路,二是以四个按键为核心的控制电路,三是以MSP430G2553为核心的信号发生电路。
3.2、电路原理:
3.2.1显示电路
(1)LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。
因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)
(2)由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。
驱动模块具有八位数据总线,外加一些电源接口和控制信号。
而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。
由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。
LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:
(3)LCD1602共有11条控制指令如表:
3.2.2按键检测电路
按键检测电路
(1)单片机IO口独立按键检测原理:
由电路原理图可以看出,按键的一端与电源地相连,另一端与单片机的P1口相连,这也就意味着当按键按下的时候与按键相连单片机IO口将被拉低,换句话说,当单片机检测到与按键相连的IO口被拉低就证明此按键被按下,那门我们将此功能上一个层次来说呢,按键就是一个人机接口。
那么按键的操作并没有我们想象的“按下松开”那么简单,在实际应用中,手动操作需要消抖。
(2)按键的消抖:
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。
由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
按键的抖动,可用硬件或软件两种方法。
(3)按键按下产生的波形图
(3)硬件与非消抖
图中两个“与非”门构成一个RS触发器。
当按键未按下时,输出为1;当键按下时,输出为0。
此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。
也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。
这一点通过分析RS触发器的工作过程很容易得到验证。
(4)软件延时消抖
如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~20ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~20ms的延时,待后沿抖动消失后才能转入该键的处理程序。
本实验中采用软件延时消抖。
四、实验步骤:
1.用Proteus设计1602液晶显示接口电路;
2.在CCS中编写液晶显示控制语言C程序,编译通过后,与Proteus联合调试;
3.在Proteus中仿真模拟。
实验电路图:
五、软件设计
5.1倒时计器主程序
程序的的开始时先设定延时时间,检测按键是否按下,如果有按键按下,进入相应的按键处理函数。
每当进入定时中断一次变量秒钟自动减一,当秒钟等于0时即为计时一分,此时分钟减一,秒钟重新赋初值,并且之前设定的倒计时初值自动减一,同时进行相关的显示
5.2中断程序设计
本程序以中断加查询的方法来检测按键是否按下,中断大约每秒钟查询一次,当有按键按下时,程序进入中断服务函数,清零中断标志位,并进入按键查询函数,判断按键功能,然后执行相应的操作,达到设定时间和清零的效果。
六、调试与结论
调试的任务是利用开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现硬件故障。
程序的调试应一个模块一个模块地进行,首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等.最后逐步将各子程序连接起来进行联调。
本系统的程序的编写就是在CCS软件中用C语言完成的。
在程序中用到了一个中断,为了使倒计时的时间准确,必须计算延时时间,当程序完成之后,生成HEX文件。
再利用Proteus软件进行仿真。
经过仿真和测试,程序在运行时完全没有闪烁。
在程序中,每一秒钟检测中断一次,变量秒自减。
电路中的四个个按键可以分别用来设定倒计时的计数范围,经过测试与分析,此系统稳定可用,满足设计要求。
附录:
程序
#include
#include"string.h"
#defineucharunsignedchar
#defineuintunsignedint
voidP24_Onclick();
voidP25_Onclick();
voidP26_Onclick();
voidP27_Onclick();
voiddisplay();
voidwrite_dat(uchardat);
voidwrite_com(ucharcom);//写命令函数
#defineCPU_F((double)1100000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelayms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
constuchartable1[]="TIME:
";
constuchartable2[]="00:
00";
constuchartable3[]="0123456789";
#defineSET_RSP2OUT|=BIT0
#defineRST_RSP2OUT&=~BIT0
#defineSET_RWP2OUT|=BIT1
#defineRST_RWP2OUT&=~BIT1
#defineSET_EP2OUT|=BIT2
#defineRST_EP2OUT&=~BIT2
ucharconstled_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharkey,flag=0;
unsignedchardisp_buf[4];
intfen=0,miao=0;
voidwrite_com(ucharcom)//写命令函数
{
RST_RS;
RST_RW;
P1OUT=com;
SET_E;
delay_us
(1);
RST_E;
}
voidwrite_dat(uchardat)
{
SET_RS;
RST_RW;
P1OUT=dat;
SET_E;
delay_us
(1);
RST_E;
}
voidsystem_Initial(void)
{
P1DIR=0xFF;
P1SEL=0x00;
P1OUT=0x00;
P2IE|=(BIT4+BIT5+BIT6+BIT7);
P2IES|=(BIT4+BIT5+BIT6+BIT7);
P2IFG&=~(BIT4+BIT5+BIT6+BIT7);
//液晶初始化
P2DIR=BIT0+BIT1+BIT2;
RST_E;
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
delay_us(5);
write_com(0x01);//显示清屏
delay_us(5);
write_com(0x0C);//显示开关,光标设置
delay_us(5);
write_com(0x06);//显示开关,光标设置
delay_us(5);
_EINT();
}
voidP2_IODect()
{
unsignedintPush_Key=0;
Push_Key=P2IFG&(~P2DIR);
__delay_cycles(10000);
if((P2IN&Push_Key)==0)
{
switch(Push_Key){
//caseBIT0:
P10_Onclick();break;
//caseBIT1:
P11_Onclick();break;
//caseBIT2:
P12_Onclick();break;
//caseBIT3:
P13_Onclick();break;
caseBIT4:
P24_Onclick();break;
caseBIT5:
P25_Onclick();break;
caseBIT6:
P26_Onclick();break;
caseBIT7:
P27_Onclick();break;
default:
break;
}
}
}
voidP24_Onclick()
{
if(flag==1)flag=0;
elseflag=1;
}
voidP25_Onclick()
{
fen=0;
miao=0;
display();
}
voidP26_Onclick()
{
fen++;
display();
}
voidP27_Onclick()
{
miao++;
display();
}
voiddisplay()
{
unsignedchari;
disp_buf[3]=fen/10;
disp_buf[2]=fen%10;
disp_buf[1]=miao/10;
disp_buf[0]=miao%10;
write_com(0x80);//数据指针设置,第一行显示
delay_us(5);
for(i=0;iwrite_dat(table1[i]);
write_com(0x80+0x40);//数据指针设置,第二行显示
delay_us(5);
write_dat(table3[disp_buf[3]]);
write_com(0x80+0x41);//数据指针设置,第二行显示
delay_us(5);
write_dat(table3[disp_buf[2]]);
write_com(0x80+0x42);//数据指针设置,第二行显示
delay_us(5);
write_dat(table2[2]);
write_com(0x80+0x43);//数据指针设置,第二行显示
delay_us(5);
write_dat(table3[disp_buf[1]]);
write_com(0x80+0x44);//数据指针设置,第二行显示
delay_us(5);
write_dat(table3[disp_buf[0]]);
}
#pragmavector=PORT2_VECTOR
__interruptvoidPort_2(void)
{
P2_IODect();
P2IFG=0;
}
voidmain(void)
{
P4DIR=0xFF;
P4OUT&=~BIT0;
WDTCTL=WDTPW+WDTHOLD;
system_Initial();
flag=0;
while
(1)
{
if(flag==1)
{
if(fen==0)
{
if(miao>0)miao--;
else
{
do
{
P4OUT^=BIT0;
delayms
(1);
}
while(flag==1);
}
}
else
{
if(miao>0)miao--;
else{miao=59;fen--;}
}
display();
}
else
{
display();
P4OUT&=~BIT0;
}
delayms(1000);
}
}