华东师范大学计算机科学技术系上机实践报告Word格式文档下载.docx
- 文档编号:19818299
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:15
- 大小:238.32KB
华东师范大学计算机科学技术系上机实践报告Word格式文档下载.docx
《华东师范大学计算机科学技术系上机实践报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《华东师范大学计算机科学技术系上机实践报告Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
图1
图2
实际物理连接如下图(图3),黄色的线为P1.1,给蜂鸣器提供信号,红色的线接到开发板上露出的VCC上,绛红色的线接到DVSS1上,为地。
图3
蜂鸣器部分如下图,就是用了某个板上的蜂鸣器部分。
图4
LED3和LED4,Keyboard部分如下图(图5)
图5
八位数码管部分如下图(图6)
图6
2.软件部分:
定义LED3作为时间指示器,每一秒钟改变一次状态(亮-->
灭/灭-->
亮)。
定义LED4作为settime或者setalarm的指示器,若亮则表示在settime状态,若灭则表示在设置alarm状态。
开机默认状态是setalarm状态。
定义K1作为改变成settime状态的键,按下K1后,进入settime状态。
定义K2作为改变成setalarm状态的键,按下K2后,进入setalarm状态。
定义K3作为改变设置第几个数
定义K4作为改变设置数的value
使用WDT的普通定时器功能,为时钟和蜂鸣器来提供时钟信号。
因为时钟需要的频率为1HZ,蜂鸣器在低频率下无法出声。
则在WDT的中断函数中有如下处理:
设置WDTCTL=WDT_MDLY_0_5,即2KHZ,然后设置staticsecond_cnt=0,当它到达2000,即1s,再修改全局变量time_1s_ok,当主程序读到time_1s_ok这个标志,就对时间进行更新(在数码管上增加1s)。
当alarm_ok==1(即闹钟设定的时间和当前时间相等时)就按照2KHZ的频率来让蜂鸣器发声,并通过alarm_cnt==4000来控制蜂鸣器只响2s。
#pragmavector=WDT_VECTOR
__interruptvoidWDT_Interrupt(void)
{
staticintsecond_cnt=0;
staticintalarm_cnt=0;
if(alarm_ok)
{
P1OUT^=0x02;
//P1.1outputToggle
alarm_cnt++;
if(alarm_cnt==4000)alarm_ok=0;
}
second_cnt++;
if(second_cnt==2000)
time_1s_ok=1;
second_cnt=0;
P1OUT^=0x01;
}
读取键值部分就参照例程KB12,通过延时来消除抖动。
进行实验,了解有中断和轮询两种方式来读取键值。
/************************************************************
*key_Event(),检测键盘是否有键按下,如果有获取键值
*************************************************************/
voidkey_Event(void){
unsignedchartmp;
P1OUT&
=0x01;
//设置P1OUT输出值
tmp=P1IN;
//获取p1IN
if((key_Pressed==0x00)&
&
((tmp&
0xf0)<
0xf0))
{//是否有键按下
key_Pressed=1;
//如果有按键按下,设置key_Pressed标识
delay();
//消除抖动
check_Key();
//调用check_Key(),获取键值
}elseif((key_Pressed==1)&
0xf0)==0xf0))
{//是否按键已经释放
key_Pressed=0;
//清除key_Pressed标识
key_Flag=1;
//设置key_Flag标识
在数码管显示部分也参照例程,在自己的main函数中只需要修改led_Buf的内容,再在while循环中的末尾加一个led_Display(),因为while循环的速度很快,所以通过led_Display()可以实现动态刷新。
/****************************************************
*LED显示,该函数可以放到定时器中断中
****************************************************/
voidled_Display(){
unsignedtmp;
tmp=0x01;
P3OUT=NUM_LED[led_Buf[led_Ctrl]];
//设置显示值
P4OUT|=0x02;
//打开数据锁存器
P4OUT&
=0XFD;
//关闭数据锁存
P3OUT=~(tmp<
<
led_Ctrl);
//设置那只LED显示
P4OUT|=0x01;
//打开控制锁存
=0XFE;
//关闭控制锁存
led_Ctrl=(led_Ctrl+1)%LED_IN_USE;
//设置下一个要显示的LED
四、实验内容
在MSP430的资源和外接蜂鸣器的基础上,编写一个带校时和闹钟的时钟系统软件。
主要的流程的伪代码是
while
(1)
if(time_1s_ok)
{
修改time[]中数据,并修改led8中的数据
判断如果time[]中的值和alarm[]中的值数据一样,setalarm_ok标志位
}
key_Event();
//读取键值
switch(key_value)//处理键值的子模块
casekey_set_time:
casekey_set_alarm:
casekey_change_state:
casekey_change_value:
在程序中增加一个return_time的变量,设置目的是在设置time或者alarm过程中,如果20s没有按键事件发生,则返回显示时间状态。
状态转换图如下图:
五、实验步骤
1.配置好硬件环境,外接上蜂鸣器。
2.设计软件,上机调试运行。
六、调试过程、结果和分析
1.因为这个实验实际是综合以前的LED数码管,Keyboard,WDT的部分,遇到的问题不是特别多,在开始在调试的时候发现无论怎样修改程序,在实验板上跑出的结果都是一样的(不是我修改的程序的正确结果)。
因为以前碰到过类似情况,是通过Projectclean清除以前生成的Object代码,再重新生成就可以了。
但是这次没有效果。
经过很长时间的查错才发现是在项目的设置里面,选择的是Simulator,而不是FlashOnlineDebug。
所以程序一直没有下载到目标板上,目标板上跑的是以前固化在上面的程序。
2.在最初Key_board读取键值时没有参考例程采用消除抖动,就自己直接写的一个读取键值。
尽管以前原理课上也讲过需要消除抖动,但是自己没有一个直观印象。
通过实验发现得到的结果一直不对,问题就是出在按下一次键会读出几次键值。
这种硬件部分的问题只有通过真正的实践才会了解,否则光看看原理脱离硬件,自己推测的结果往往是不正确的。
然后结合硬件和原理,了解读键值可以通过中断和轮询两种方法来进行。
在这次写的程序里面直接采用例程的voidkey_Event(void),通过轮询来读取键值。
实际操作时可以对其中通过delay来消抖进行优化,使用一个Timer来控制Press,Release之类的状态转换。
七、总结
八、附件
#defineMSP430F449_H0
#include<
msp430x44x.h>
#ifndefLED_IN_USE
#include"
..//..//led//led.c"
#endif
#ifndefKEY_BOARD
keyboard12.c"
#definekey_set_time1
#definekey_set_alarm2
#definekey_change_state3
#definekey_change_value10
unsignedchartime_1_alarm_2;
unsignedchartime[3],time_set[3],alarm_set[3];
unsignedchardis_buff[6];
unsignedchartime_1s_ok,alarm_ok;
unsignedcharclock_state=6,return_time=0;
voidsetWDT(intmode)
{
unsignedinttmp;
if(mode==1)
{//定时器模式
WDTCTL=WDT_MDLY_0_5;
//1000ms中断间隔
IE1|=WDTIE;
//使能WDT中断
P1DIR|=0x01;
//P1.0outputmode
P1DIR|=0x02;
//P1.1outputmode
P5DIR|=0x02;
//P5.1outputmode
_EINT();
//开中断
}elseif(mode==0)
{//看门狗模式
WDTCTL=WDT_ARST_250;
//设置看门狗时间间隔为ms
//在系统加电后,默认子系统时钟频率是M
for(tmp=0x7fff;
tmp>
0;
tmp--);
//延迟
//P5.1outputmode
P1OUT|=0x01;
//lightLED4
//延迟,执行一次tmp--至少要用个指令
voidtime_to_disbuffer(unsignedchar*time)//时钟显示送显示缓冲区函数
unsignedchari,j=0;
for(i=0;
i<
3;
i++)
led_Buf[(5-(j++))]=time[i]%10;
led_Buf[(5-(j++))]=time[i]/10;
/**********************************************************
*函数说明:
*WDT中断函数
*
************************************************************/
staticintsecond_cnt=0;
/*********************************************
*main()函数
*********************************************/
voidmain(void)
intposition=0;
intvalue=0;
inti;
setWDT
(1);
//设置程序运行在看门狗模式
time_1_alarm_2=1;
//初始化开始在设置什么
clock_state=6;
P5OUT|=0x02;
time_1s_ok=0;
//WDTCTL=WDTHOLD+WDTPW;
//停止看门狗
init_LED();
//初始化LED
init_Keyboard();
//初始化键盘
alarm_ok=0;
if(time_1s_ok)//1s到
time_1s_ok=0;
//point_on=~point_on;
//秒闪烁标志
if(++time[0]>
=60)//秒加,以下为时间调整
{
time[0]=0;
//if(!
play_on);
//时间到,播放音乐
if(++time[1]>
=60)
{
time[1]=0;
if(++time[2]>
=24)time[2]=0;
}
}
if((++return_time>
=20)&
(clock_state!
=6))clock_state=6;
if(clock_state==6)time_to_disbuffer(time);
//match
if((alarm_set[0]==time[0])&
(alarm_set[1]==time[1])&
(alarm_set[2]==time[2]))
alarm_ok=1;
//if(key_stime_ok)
key_Event();
//检测按键事件
if(key_Flag==1)//检测key_val里是否有键值可以读取
{
key_Flag=0;
//恢复键盘按键标识
switch(key_val)
casekey_set_time:
//settime
clock_state=6;
time_1_alarm_2=1;
//亮led4
P5OUT|=0x02;
break;
casekey_set_alarm:
//setalarm
time_1_alarm_2=2;
//灭led4
P5OUT&
=~(0x02);
casekey_change_state:
if(time_1_alarm_2==1)
{
return_time=0;
//响应
if(++clock_state>
=7)clock_state=0;
if(clock_state==0)
{
for(i=0;
time_set[i]=0;
time_to_disbuffer(time_set);
}
if(clock_state==6)
time[i]=time_set[i];
time_to_disbuffer(time);
}
else//time_1_alarm_2==2
alarm_set[i]=0;
time_to_disbuffer(alarm_set);
//for(i=0;
//time[i]=alarm_set[i];
casekey_change_value:
if(clock_state!
=6)
if(clock_state%2)time_set[clock_state/2]+=10;
else
{
if((time_set[clock_state/2]%10)==9)
time_set[clock_state/2]-=9;
else
time_set[clock_state/2]+=1;
}//endif
if(time_set[0]>
=60)time_set[0]-=60;
if(time_set[1]>
=60)time_set[1]-=60;
if(time_set[2]>
=24)time_set[2]-=10;
}//endif
}//endcase
if(clock_state%2)alarm_set[clock_state/2]+=10;
if((alarm_set[clock_state/2]%10)==9)
alarm_set[clock_state/2]-=9;
alarm_set[clock_state/2]+=1;
if(alarm_set[0]>
=60)alarm_set[0]-=60;
if(alarm_set[1]>
=60)alarm_set[1]-=60;
if(alarm_set[2]>
=24)alarm_set[2]-=10;
default:
}//endswitch
}//endif
}//endif
led_Display();
//使用LED数据
}//endwhile
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华东师范 大学计算机 科学技术 上机 实践 报告