华东师范大学计算机科学技术系上机实践报告_第1页
华东师范大学计算机科学技术系上机实践报告_第2页
华东师范大学计算机科学技术系上机实践报告_第3页
华东师范大学计算机科学技术系上机实践报告_第4页
华东师范大学计算机科学技术系上机实践报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华东师范大学计算机科学技术系实验报告华东师范大学计算机科学技术系上机实践报告课程名称:年级:上机实践成绩:指导教师:姓名:创新实践成绩:上机实践名称:综合实验学号:上机实践日期:2009/6/9上机实践编号:No.6组号:1上机实践时间:2学时一、 实验目的利用MSP430的基本结构和外围模块来设计一个较为完整的作品二、 实验设备1. 硬件:PC机2. 软件:IAR Embedded Workbench IDE 集成开发环境,Windows XP。三、 实验原理这次实验设计了一个带校时和闹钟的时钟系统。通过K1K4四个按键,LED3LED4两个LED,外接蜂鸣器,和MSP430 来实现整个系统

2、。这个软件一上电就开始从00:00:00记时,可以通过键操作set_alarm,和set_time,当time到达和alarm中的预设值相同时,蜂鸣器响2s后停止(time还是在不断累加)。1.硬件部分: K1K4四个按键和LED3(P1.0),LED4(P5.1)都是开发板上已经连接好的。因为实验板上没有提供蜂鸣器,所以外接了一个蜂鸣器。参考实验原理图(图1)上的DVSS2 端口99接蜂鸣器的GND,并插上开发板上提供的一个VCC,来为蜂鸣器提供电源。然后再用(图2)P1.1作为蜂鸣器的信号来控制其发声。 图1 图2实际物理连接如下图(图3),黄色的线为P1.1,给蜂鸣器提供信号,红色的线接

3、到开发板上露出的VCC上,绛红色的线接到DVSS1上,为地。 图3蜂鸣器部分如下图,就是用了某个板上的蜂鸣器部分。 图4LED3和LED4,Keyboard部分如下图(图5) 图5八位数码管部分如下图(图6) 图62.软件部分:定义LED3 作为时间指示器,每一秒钟改变一次状态(亮->灭 / 灭->亮)。定义LED4 作为set time或者set alarm的指示器,若亮则表示在set time状态,若灭则表示在设置alarm状态。开机默认状态是set alarm状态。 定义K1 作为改变成set time 状态的键,按下K1后,进入set time 状态。定义K2 作为改变成s

4、et alarm 状态的键,按下K2后,进入set alarm 状态。定义K3 作为改变设置第几个数定义K4 作为改变设置数的value 使用WDT的普通定时器功能,为时钟和蜂鸣器来提供时钟信号。因为时钟需要的频率为1HZ,蜂鸣器在低频率下无法出声。则在WDT的中断函数中有如下处理: 设置WDTCTL = WDT_MDLY_0_5,即2KHZ,然后设置static second_cnt = 0,当它到达2000,即1s,再修改全局变量time_1s_ok,当主程序读到time_1s_ok这个标志,就对时间进行更新(在数码管上增加1s)。当alarm_ok = 1(即闹钟设定的时间和当前时间相等

5、时)就按照2KHZ的频率来让蜂鸣器发声,并通过alarm_cnt = 4000来控制蜂鸣器只响2s。#pragma vector = WDT_VECTOR _interrupt void WDT_Interrupt(void) static int second_cnt = 0;static int alarm_cnt = 0;if(alarm_ok)P1OUT = 0x02; / P1.1 output Toggle alarm_cnt+;if(alarm_cnt=4000) alarm_ok = 0;second_cnt+;if(second_cnt=2000)time_1s_ok = 1

6、;second_cnt = 0;P1OUT = 0x01; 读取键值部分就参照例程KB12,通过延时来消除抖动。进行实验,了解有中断和轮询两种方式来读取键值。/* key_Event(),检测键盘是否有键按下,如果有获取键值*/void key_Event(void) unsigned char tmp; P1OUT &= 0x01; / 设置P1OUT输出值 tmp = P1IN; / 获取p1IN if (key_Pressed =0x00)&&(tmp & 0xf0) < 0xf0) /是否有键按下 key_Pressed = 1; / 如果有按键按

7、下,设置key_Pressed标识 delay(); /消除抖动 check_Key(); / 调用check_Key(),获取键值 else if (key_Pressed =1)&&(tmp & 0xf0) = 0xf0) /是否按键已经释放 key_Pressed = 0; / 清除key_Pressed标识 key_Flag = 1; / 设置key_Flag标识 在数码管显示部分也参照例程,在自己的main函数中只需要修改led_Buf的内容,再在while循环中的末尾加一个led_Display(),因为while循环的速度很快,所以通过led_Displa

8、y()可以实现动态刷新。/* LED 显示 ,该函数可以放到定时器中断中*/void led_Display() unsigned tmp ; tmp = 0x01; P3OUT = NUM_LEDled_Bufled_Ctrl; / 设置显示值 P4OUT |= 0x02; / 打开数据锁存器 P4OUT &= 0XFD; / 关闭数据锁存 P3OUT = (tmp<<led_Ctrl); / 设置那只LED显示 P4OUT |= 0x01; / 打开控制锁存 P4OUT &= 0XFE; / 关闭控制锁存 led_Ctrl= (led_Ctrl +1) % LE

9、D_IN_USE; / 设置下一个要显示的LED 四、 实验内容在MSP430的资源和外接蜂鸣器的基础上,编写一个带校时和闹钟的时钟系统软件。主要的流程的伪代码是while(1)if(time_1s_ok)修改time中数据,并修改led8中的数据判断如果time中的值和alarm中的值数据一样,set alarm_ok 标志位key_Event(); /读取键值switch(key_value)/处理键值的子模块case key_set_time:case key_set_alarm:case key_change_state:case key_change_value:在程序中增加一个re

10、turn_time的变量,设置目的是在设置time或者alarm过程中,如果20s没有按键事件发生,则返回显示时间状态。状态转换图如下图:秒低位设置秒低位设置时钟显示秒高位设置分低位设置分高位设置时低位设置时高位设置秒高位设置分低位设置分高位设置时低位设置时高位设置闹钟时间五、 实验步骤1. 配置好硬件环境,外接上蜂鸣器。 2. 设计软件,上机调试运行。六、 调试过程、结果和分析1. 因为这个实验实际是综合以前的LED数码管,Keyboard,WDT的部分,遇到的问题不是特别多,在开始在调试的时候发现无论怎样修改程序,在实验板上跑出的结果都是一样的(不是我修改的程序的正确结果)。因为以前碰到过

11、类似情况,是通过Project à clean 清除以前生成的Object代码,再重新生成就可以了。但是这次没有效果。经过很长时间的查错才发现是在项目的设置里面,选择的是Simulator,而不是Flash Online Debug。所以程序一直没有下载到目标板上,目标板上跑的是以前固化在上面的程序。2. 在最初Key_board读取键值时没有参考例程采用消除抖动,就自己直接写的一个读取键值。尽管以前原理课上也讲过需要消除抖动,但是自己没有一个直观印象。通过实验发现得到的结果一直不对,问题就是出在按下一次键会读出几次键值。这种硬件部分的问题只有通过真正的实践才会了解,否则光看看原理脱

12、离硬件,自己推测的结果往往是不正确的。然后结合硬件和原理,了解读键值可以通过中断和轮询两种方法来进行。在这次写的程序里面直接采用例程的void key_Event(void) ,通过轮询来读取键值。实际操作时可以对其中通过delay来消抖进行优化,使用一个Timer来控制Press, Release之类的状态转换。七、 总结八、 附件#define MSP430F449_H 0#include <msp430x44x.h>#ifndef LED_IN_USE#include "././led/led.c"#endif#ifndef KEY_BOARD#inclu

13、de "keyboard12.c"#endif#define key_set_time 1#define key_set_alarm 2#define key_change_state 3#define key_change_value 10unsigned char time_1_alarm_2;unsigned char time3,time_set3,alarm_set3;unsigned char dis_buff6;unsigned char time_1s_ok,alarm_ok;unsigned char clock_state = 6,return_time

14、=0;void setWDT(int mode)unsigned int tmp;if(mode=1) / 定时器模式WDTCTL = WDT_MDLY_0_5; / 1000ms中断间隔IE1 |= WDTIE; / 使能WDT 中断P1DIR |= 0x01; / P1.0 output mode P1DIR |= 0x02; / P1.1 output mode P5DIR |= 0x02; / P5.1 output mode _EINT(); / 开中断 else if(mode=0) /看门狗模式WDTCTL = WDT_ARST_250; /设置看门狗时间间隔为ms/在系统加电后

15、,默认子系统时钟频率是M for(tmp=0x7fff;tmp>0;tmp-);/延迟P1DIR |= 0x01; /P5.1 output mode P1OUT |= 0x01; /light LED4 for(tmp=0x7fff;tmp>0;tmp-); /延迟,执行一次tmp-至少要用个指令 void time_to_disbuffer(unsigned char *time) /时钟显示送显示缓冲区函数unsigned char i,j=0;for(i=0;i<3;i+)led_Buf(5-(j+) = timei%10;led_Buf(5-(j+) = timei

16、/10;/* 函数说明:* WDT中断函数*/#pragma vector = WDT_VECTOR _interrupt void WDT_Interrupt(void) static int second_cnt = 0;static int alarm_cnt = 0;if(alarm_ok)P1OUT = 0x02; / P1.1 output Toggle alarm_cnt+;if(alarm_cnt=4000) alarm_ok = 0;second_cnt+;if(second_cnt=2000)time_1s_ok = 1;second_cnt = 0;P1OUT = 0x0

17、1; /* main()函数*/void main(void)int position = 0;int value = 0;int i;unsigned char tmp;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; while(1)if(time_1s

18、_ok) /1s 到time_1s_ok = 0;/ point_on = point_on; /秒闪烁标志if(+time0>=60) /秒加,以下为时间调整time0 = 0;/ if(!play_on) ;/ 时间到,播放音乐if(+time1>=60)time1 = 0;if(+time2>=24) time2 = 0;if(+return_time >= 20) && (clock_state != 6 ) clock_state = 6;if(clock_state = 6) time_to_disbuffer(time);/matchif(

19、 (alarm_set0 = time0) && (alarm_set1 = time1) && (alarm_set2 = time2) )alarm_ok = 1;/if(key_stime_ok)key_Event(); /检测按键事件if (key_Flag = 1) / 检测key_val里是否有键值可以读取 key_Flag = 0; / 恢复键盘按键标识 switch(key_val)case key_set_time:/set timeclock_state = 6;time_1_alarm_2 = 1;/亮led4P5OUT |= 0x02;b

20、reak;case key_set_alarm:/set alarmclock_state = 6;time_1_alarm_2 = 2;/灭led4P5OUT &= (0x02);break;case key_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;i<3;i+)time_seti = 0;time_to_disbuffer(time_set);if(clock_state = 6

21、)for(i=0;i<3;i+)timei = time_seti;time_to_disbuffer(time);else /time_1_alarm_2 = 2return_time = 0;/响应if(+clock_state>=7) clock_state = 0;if(clock_state = 0)for(i=0;i<3;i+)alarm_seti = 0;time_to_disbuffer(alarm_set);if(clock_state = 6)/for(i=0;i<3;i+)/timei = alarm_seti;time_to_disbuffer(time);break;case key_change_value:if(time_1_alarm_2 = 1)return_time = 0;/响应if(clock_state!=6)if(clock_state%2) time_setcloc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论