1、华东师范大学计算机科学技术系上机实践报告华东师范大学计算机科学技术系上机实践报告实验目的利用MSP430勺基本结构和外围模块来设计一个较为完整的作品实验设备实验原理通过K1K4个按键,LED3LED两个LED,外接蜂鸣器,这次实验设计了一个带校时和闹钟的时钟系统。 和MSP430来实现整个系统。这个软件一上电就开始从 00: 00: 00记时,可以通过键操作set_alarm ,和set_time ,当time到达和alarm 中的预设值相同时,蜂鸣器响 2s后停止(time还是在不断累加)。1.硬件部分:1)上的DVSS2端口 99接蜂鸣器的GND并插上开(图2)P 1.1作为蜂鸣器的信号来
2、控制其发声。K1K4四个按键和LED3(P1.0),LED4(P5.1)都是开发板上已经连接好的。因为实验板上没有提供蜂 鸣器,所以外接了一个蜂鸣器。参考实验原理图(图 发板上提供的一个 VCC来为蜂鸣器提供电源。然后再用a图1AVSS DVSSI AVCCPI j火/ 火- 亮)O使用WDT勺普通定时器功能,为时钟和蜂鸣器来提供时钟信号。因为时钟需要的频率为 低频率下无法出声。则在 WDT勺中断函数中有如下处理:设置 WDTCTL = WDT_MDLY_0_即 2KHZ 然后设置 static second_cnt = 0 ,当它到达 2000, 局变量time_1s_ok,当主程序读到ti
3、me_1s_ok这个标志,就对时间进行更新(在数码管上增加1HZ,蜂鸣器在即1s,再修改全1s ) O当alarm_ok = 1 (即闹钟设定的时间和当前时间相等时)就按照 2KHZ勺频率来让蜂鸣器发声,并通过alarm cnt = 4000 来控制蜂鸣器只响 2s。#p ragma vector = WDT_VECTOR _interru ptstaticstaticifvoid WDT_lnterrupt( void )int second_cnt = 0; int alarm_cnt = 0;(alarm_ok)P1OUT A= 0x02; alarm_cnt+;if (alarm_cn
4、t=4000) alarm_ok = 0;/ P1.1 out put Togglesecond_cnt+;time_1s_ok = 1; second_cnt = 0; P1OUT A= 0x01;读取键值部分就参照例程 KB12,通过延时来消除抖动。进行实验,了解有中断和轮询两种方式来读取 键值。I* key_Event(),检测键盘是否有键按下,如果有获取键值*I void key_Event( void )unsigned char tmp;P1OUT &= 0x01;tmp = P1IN;II设置P1OU输出值II获取p1INif (key_Pressed =0x00)&(tmp &
5、 0xf0) 0xf0)IIkey_ Pressed = 1; IIdelay(); IIcheck_Key(); II是否有键按下如果有按键按下,设置key_Pressed标识 消除抖动调用check_Key(),获取键值else if (key_Pressed =1)&(tmp & 0xf0) = 0xf0)IIIIIIkey_ Pressed = 0; key_Flag = 1;是否按键已经释放清除key_Pressed标识 设置key_Flag标识在数码管显示部分也参照例程,一个led_Display(),因为while循环的速度很快,所以通过在自己的main函数中只需要修改led_B
6、uf的内容,再在while循环中的末尾加led_Dis play() 可以实现动态刷新。I* LED 显示,该函数可以放到定时器中断中*Ivoid led_Display() unsigned tmp ;tm p = 0x01;P 3OUT = NUM_LEDled_Bufled_Ctrl;P 4OUT |= 0x02;P 4OUT &= 0XFD;P 3OUT = (t mp vvled_Ctrl);P 4OUT |= 0x01;P4OUT &= 0XFE;led_Ctrl= (led_Ctrl +1) % LED_IN_USE;IIIIIIIIIIIIII设置显示值打开数据锁存器关闭数据锁
7、存设置那只LED显示打开控制锁存关闭控制锁存设置下一个要显示的LED四、实验内容在MSP430的资源和外接蜂鸣器的基础上,编写一个带校时和闹钟的时钟系统软件。主要的流程的伪代码是while (1)修改time中数据,并修改Ied8中的数据 判断如果time中的值和alarm中的值数据一样,set alarm_ok 标志位key_Event(); / 读取键值switch (key_value) /处理键值的子模块 在程序中增加一个return_time的变量,设置目的是在设置time或者alarm过程中,如果20s没有按 键事件发生,则返回显示时间状态。状态转换图如下图:配置好硬件环境,外接上
8、蜂鸣器。 设计软件,上机调试运行。1.因为这个实验实际是综合以前的 LED数码管,Keyboard,WDT勺部分,遇到的问题不是特别多,在开始在调试的时候发现无论怎样修改程序,在实验板上跑出的结果都是一样的(不是我修改 的程序的正确结果)。因为以前碰到过类似情况,是通过 P roject clean 清除以前生成的Object代码,再重新生成就可以了。但是这次没有效果。经过很长时间的查错才发现是在项目 的设置里面,选择的是 Simulator,而不是Flash Online Debug 。所以程序一直没有下载到目标板上,目标板上跑的是以前固化在上面的程序。2.在最初Key_board读取键值时
9、没有参考例程采用消除抖动,就自己直接写的一个读取键值。尽管 以前原理课上也讲过需要消除抖动,但是自己没有一个直观印象。通过实验发现得到的结果一 直不对,问题就是出在按下一次键会读出几次键值。这种硬件部分的问题只有通过真正的实践 才会了解,否则光看看原理脱离硬件,自己推测的结果往往是不正确的。然后结合硬件和原理, 了解读键值可以通过中断和轮询两种方法来进行。在这次写的程序里面直接采用例程的 voidkey_Event( void ),通过轮询来读取键值。实际操作时可以对其中通过 delay来消抖进行优化,使用一个Timer来控制Press. Release 之类的状态转换。=/#defineMS
10、P430F449_H 0#include#ifndefLED_IN_USE#include././led/led.c#endif#ifndefKEY_BOARD#includekeyboard12.c#endif#definekey_set_time 1#definekey_set_alarm 2#definekey_change_state 3#definekey_change_value 10unsignedchar time_1_alarm_2;unsignedchar time3,time_set3,alarm_set3;unsignedchar dis_buff6;unsignedc
11、har time_1s_ok,alarm_ok;unsignedchar clock_state = 6,return_time=0;void setWDT( int mode)unsigned int tmp;if (mode=1) /定时器模式WDTCTL = WDT_MDLY_0_5; / 1000ms 中断间隔 IE1 |= WDTIE;P1DIR |= 0x01;P1DIR |= 0x02;P5DIR |= 0x02; _EINT(); else if (mode=0)/使能WDT中断/ P1.0 out put mode / P1.1 out put mode / P5.1 out
12、 put mode/开中断/看门狗模式WDTCTL = WDT_ARST_250; /设置看门狗时间间隔为 ms/在系统加电后,默认子系统时钟频率是 MII延迟/P5.1 out put mode/light LED4/延迟,执行一次tmp-至少要用个指令for (tmp=0x7fff;tmp0;tmp-); P1DIR |= 0x01;P1OUT |= 0x01;for (tmp=0x7fff;tmp0;tmp-);voidtime_to_disbuffer( unsigned char *time) / 时钟显示送显示缓冲区函数unsigned char i,j=0; for(i=0;iv
13、3;i+)led_Buf(5-(j+) = timei%10; led_Buf(5-(j+) = timei/10;/*函数说明:* WDT 中断函数*/#p ragma vector = WDT_VECTOR _interru ptvoid WDT_Interrupt( void )staticstatic if (alarm_ok)int second_cnt = 0; int alarm_cnt = 0;P1OUT A= 0x02; alarm_cnt+;if (alarm_cnt=4000) alarm_ok = 0; - -/ P1.1 out put Togglesecond_cn
14、t+;if (second_cnt=2000)time_1s_ok = 1; second_cnt = 0; P1OUT A= 0x01;/* main()函数*/alarm_ok = 0;time1 = 0;if (+time2=24) time2 = 0;ifif(+return_time = 20) & (clock_state != 6 ) clock_state = 6; (clock_state = 6) time_to_disbuffer(time);/matchif ( (alarm_set0 = time0) & (alarm_set1 = time1) & (alarm_s
15、et2 = time2) alarm_ok = 1;/if(key_stime_ok)-/检测按键事件/检测key_val里是否有键值可以读取key_Event();if (key_Flag = 1)-key_Flag = 0;switch (key_val)/恢复键盘按键标识 casecasekey_set_time:/set time clock_state = 6; time_1_alarm_2 = 1;/ 亮 led4P 50UT |= 0x02;break;key_set_alarm:/set alarm clock_state = 6; time_1_alarm_2 = 2;/ 灭
16、 led4P 5OUT &=(0x02);break;for (i=0;i3;i+)time_seti = 0;time_to_disbuffer(time_set);for (i=0;i3;i+) timei = time_seti; time_to_disbuffer(time); elsefor (i=0;i=60) time_set0 -=60;if (time_set1=60) time_set1 -=60;if (time_set2=24) time_set2 -=10;time_to_disbuffer(time_set);/end if/end case/响应else /tim
17、e_1_alarm_2 = 2 return_time = 0;if (clock_state!=6) if (clock_state%2) alarm_setclock_state/2 +=10; elseif (alarm_setclock_state/2%10)=9) alarm_setclock_state/2 -=9;else alarm_setclock_state/2 +=1; /end ifif (alarm_set0=60) alarm_set0 -=60;if (alarm_set1=60) alarm_set1 -=60;if (alarm_set2=24) alarm_set2 -=10;time_to_disbuffer(alarm_set);/end if default :break; /end switch /end if/使用LED数据 /end ifled_Dis play(); /end while
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1