清华大学计算机硬件技术基础实验报告(4)

2019-02-16 13:28

F(SMCLK)= 1.033MHZ,退出中断LED灯闪烁后F(ACLK)=0,F(SMCLK)=0。

分析:程序顺着流程执行,先是LED闪烁,然后蜂鸣器响,接着进入循环,然后进入低功耗模式LPM4,此时PC指针停止不动,程序停止执行。若此时按下K2键发出中断,则程序会立刻停止低功耗模式,将当前状态储存入堆栈中,然后跳转执行中断子程,蜂鸣器响,退出低功耗模式,然后程序返回断点,返回到主函数中执行Blink()后再次进入低功耗模式。 (2) 如果程序中没有 LPM4_EXIT 语句,运行的结果会有什么不同?请分析。

现象:如果程序中没有LPM4_EXIT,则不同之处在于按下K2发出中断信号后只有蜂鸣器鸣叫然后进入低功耗模式,而LED4不会闪烁。

分析:程序在主函数中进入低功耗模式后停止执行,若此时按下K2键发出中断,则程序会立刻停止低功耗模式,将当前状态储存入堆栈中,然后跳转执行中断子程,蜂鸣器响,与1不同的是,中断子程中没有退出LPM4语句,因此程序在执行完中断后立刻返回中断之前的低功耗状态,而不会跳转返回到主函数中执行Blink(),因此LED灯不会闪烁。 (3) (选做) 将 LPM4 改为LPM0,LPM4_EXIT 改为LPM0_EXIT,重新完成任务1。 现象:程序开始运行时,P2.3控制的LED4先闪烁,然后蜂鸣器鸣叫,接着进入低功耗模式,实验板无现象产生,若此时按下K2键向P1.1发出中断信号后蜂鸣器开始鸣叫,接着LED4又开始闪烁,然后进入低功耗模式,实验板无现象产生。

进入低功耗LPM0前F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,进入后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,响应中断后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,退出中断后刚开始F(ACLK)= 32.89KHZ,F(SMCLK)= 1.033MHZ,退出中断LED灯闪烁后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ。

分析:程序顺着流程执行,先是LED闪烁,然后蜂鸣器响,接着进入循环,然后进入低功耗模式LPM4,此时PC指针停止不动,程序停止执行。若此时按下K2键发出中断,则程序会立刻停止低功耗模式,将当前状态储存入堆栈中,然后跳转执行中断子程,蜂鸣器响,退出低功耗模式,然后程序返回断点,返回到主函数中执行Blink()后再次进入低功耗模式。 原因分析:在低功耗LPM4模式下,CPU、MCLK、SMCLK、ACLK均被禁止,因此进入低功耗LPM4模式后P1.0和P1.4均不输出信号;而在低功耗LPM0模式下,CPU、MCLK被禁止,而SMCLK和ACLK均在活动,因此进入低功耗模式前后P1.0和P1.4输出的信号不变。虽然表面实验现象和LPM4一样,但是用示波器测得的引脚输出信号不一样。 6. 利用输出的时钟信号做中断源,实现定时功能

将任务 3 中P1.0 输出的3KHz ACLK 时钟信号,作为P1.5 的中断申请信号,用导线将 P1.5 与P1.0 相连即可,在中断子程中设置一个计数变量,计数中断子程被执行的次数, 中断子程每被执行3000 次表示一秒时间到。利用该定时功能,将8 个发光二级管设计 成一个秒表,显示秒值,每秒改变一次8 个发光二级管的显示。

实现方法:将P2.0~P2.7与LED1~LED8连接起来,通过设置基本时钟控制寄存器将ACLK的时钟源选为12KHz的VLOCK,然后再设置ACLK为4分频,这样就可以使P1.0输出3KHz的ACLK信号。将P1.5与P1.0再连接起来,将P1.5设置为允许中断,在中断程序中加入计数因子,每隔3000次计数则可以视为1s,这时令8个LED灯变化一次。即可实现要求功能。具体代码如下:

#include \#include %unsigned int i=0,c=0; int main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //关闭中断允许 P1IE &=~BIT5; //设置端口P2.0~P2.7为输出 P2SEL=0; P2SEL2=0; P2OUT=0xff; P2DIR=0xff; //设置端口P1.5允许中断 P1SEL &=~BIT5; P1SEL2 &=~BIT5; P1REN |=BIT5; P1OUT |=BIT5; P1DIR &=~BIT5; P1IES |=BIT5; P1IFG &=~BIT5; P1IE |=BIT5; _EINT(); //P1.0输出时钟3KHzACLK P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0; BCSCTL1|=DIVA_2; //设置ACLK时钟源为VLOCLK,并为4分频 BCSCTL3|=LFXT1S_2; while(1); } #pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) { i++; //计时因子自增 if(i==3000) //1s改变发光二极管状态一次 { c++; P2OUT=~c; i=0; } } P1IFG&=~(BIT5); //清中断标志 (选做) 如果要每隔10 秒蜂鸣器响一声,如何在任务6 的基础上编程实现?

实现方法:只需将P1.7与蜂鸣器相连,然后在中断程序在加入一个计时因子来控制蜂鸣器即可,具体代码如下: #include \#include %unsigned int i=0,c=0,k=0; void delay() //延时函数 { unsigned int d; for(d=0;d<0xffff;d++); } void buzz() //蜂鸣器响一声 { P1OUT&=~BIT7; delay(); P1OUT|=BIT7; } int main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //关闭中断允许 P1IE &=~BIT5; //设置P1.7为输出 P1SEL&=~BIT7; P1SEL2&=~BIT7; P1OUT|=BIT7; P1DIR|=BIT7; //设置端口P2.0~P2.7为输出 P2SEL=0; P2SEL2=0; P2OUT=0xff; P2DIR=0xff; //设置端口P1.5允许中断 P1SEL &=~BIT5; P1SEL2 &=~BIT5; P1REN |=BIT5; P1OUT |=BIT5; P1DIR &=~BIT5; P1IES |=BIT5; P1IFG &=~BIT5; P1IE |=BIT5; _EINT(); //P1.0输出时钟3KHzACLK P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0; BCSCTL1|=DIVA_2; //设置ACLK时钟源为VLOCLK,并为4分频 BCSCTL3|=LFXT1S_2; while(1); } #pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) { i++; //计时因子自增 k++; //计时因子自增 if(i==3000) //1s改变发光二极管状态一次 { c++; P2OUT=~c; i=0; } if(k==30000) //10s蜂鸣器响一声 { buzz(); k=0; } P1IFG&=~(BIT5); //清中断标志 } 7.(选做)改用4 个数码管显示秒值,重新完成任务6

实现方法:将P2.0~P2.7与Sa~Sh相连来控制数码管,将P1.4、P1.1、P1.2、P1.3与S1、S2、S3、S4相连来实现串行显示,其余P1.0与P1.5和任务六一样相连接。将计数因子代表的秒表值转化为分钟和秒输出到数码管上。具体代码如下: #include \#include \void delay1() { unsigned int q; for(q=0;q<0xff;q++); } unsigned int i=0,c=0,a1,a2,a3,a4; unsigned char LED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //LED灯 int main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //关闭中断允许 P1IE &=~BIT5; P1SEL&=~(BIT1+BIT2+BIT3+BIT4); //设置P1.1~P1.4为输出 P1SEL2&=~(BIT1+BIT2+BIT3+BIT4); P1DIR|=BIT1+BIT2+BIT3+BIT4; P1OUT&=~(BIT1+BIT2+BIT3+BIT4); //设置端口P2.0~P2.7为输出 P2SEL=0; P2SEL2=0; P2OUT=0xff; P2DIR=0xff; //设置端口P1.5允许中断 P1SEL &=~BIT5; P1SEL2 &=~BIT5; P1REN |=BIT5; P1OUT |=BIT5; P1DIR &=~BIT5; P1IES |=BIT5; P1IFG &=~BIT5; P1IE |=BIT5; _EINT(); //P1.0输出时钟3KHzACLK P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0; BCSCTL1|=DIVA_2; //设置ACLK时钟源为VLOCLK,并为4分频 BCSCTL3|=LFXT1S_2; while(1) { a1=c/600; a2=(c-600*a1)/60; a3=(c-600*a1-60*a2)/10; a4=c-600*a1-60*a2-10*a3; P2OUT=LED[a4]; //控制第一个数码管显示的数字 P1OUT=0x10; delay1(); P2OUT=LED[a3]; //控制第二个数码管显示的数字 P1OUT=0x02; delay1(); P2OUT=LED[a2]; //控制第三个数码管显示的数字 P1OUT=0x04; delay1(); P2OUT=LED[a1]; //控制第四个数码管显示的数字 P1OUT=0x08; delay1(); } } #pragma vector=PORT1_VECTOR


清华大学计算机硬件技术基础实验报告(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:岭南师范学院专插本电子商务专业课真题(电子商务概论和市场营销

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: