实验6 实验名称基本时钟和低功耗模式Word文档格式.docx

上传人:b****4 文档编号:17340993 上传时间:2022-12-01 格式:DOCX 页数:14 大小:34.99KB
下载 相关 举报
实验6 实验名称基本时钟和低功耗模式Word文档格式.docx_第1页
第1页 / 共14页
实验6 实验名称基本时钟和低功耗模式Word文档格式.docx_第2页
第2页 / 共14页
实验6 实验名称基本时钟和低功耗模式Word文档格式.docx_第3页
第3页 / 共14页
实验6 实验名称基本时钟和低功耗模式Word文档格式.docx_第4页
第4页 / 共14页
实验6 实验名称基本时钟和低功耗模式Word文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

实验6 实验名称基本时钟和低功耗模式Word文档格式.docx

《实验6 实验名称基本时钟和低功耗模式Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验6 实验名称基本时钟和低功耗模式Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

实验6 实验名称基本时钟和低功耗模式Word文档格式.docx

图6-1图6-2

接到32.768KH晶振侧时,测得结果为32.77kHz,接到P2.6/P2.7侧,测得结果为890kHz。

2)在debug下如图6-3,通过View/Register更改SystemClock模块控制寄存器值,分别置DIVA1、DIVA0=01、11;

DIVS1、DIVS0=10、11;

置LFXT1S0、LFXT1S0=00、10,记录示波器测量得到的ACLK(P1.0输出)和SMCLK(P1.4输出)的频率值,填写在表6-1、6-2、6-3中,掌握时钟模块各控制寄存器相关位的作用。

图6-3通过View/Register更改SystemClock模块控制寄存器值

表6-1DIVAxx与ACLK关系

DIVA1

DIVA0

ACLK频率值

作用

1

16.39kHz

ACLK二分频

4.0963kHz

ACLK八分频

表6-2DIVSxx与SMCLK关系

DIVS1

DIVS0

SMCLK频率值

26.6kHz

SMCLK四分频

133.0kHz

SMCLK八分频

表6-3LFXT1Sxx与ACLK关系

LFXT1S1

LFXT1S0

时钟来源

32.77kHz

外部晶振

11.762kHz

VLOCLK

3)分析上电复位后,CPU工作的时钟信号MCLK频率值是多少?

根据上电复位后寄存器的值,可以发现上电复位后MCLK频率值实际上是与SMCLK频率值相等的(时钟源均为DCO,且均为一分频),而上电复位后测得的SMCLK时钟频率为1.04MHz,故上电复位后MCLK频率值为1.04MHz。

4)(提高)置RSEL3~RSEL0=1111;

DCO2~DCO0=111;

记录当前SMCLK的频率值。

这是基本时钟模块提供的最高频率值。

SMLCK的值为20.1MHz。

3.掌握基本时钟模块的编程控制

参看附录A实验板原理图,如图6-1用跳线将JP8中的插针信号接到晶振32.768Khz侧。

编程控制基本时钟模块,设置ACLK分别为下面时钟频率,并通过P1.0输出ACLK,用示波器观察:

1)ACLK=16.384Hz;

(外部晶振二分频,约为32768Hz/2)

ACLK的频率为32.77kHz。

程序见程序清单中的程序3.1.c。

2)ACLK=VLOCLK/8;

(内部VLOCLK八分频,约为12KHz/8)

ACLK的频率为1.4243kHz。

程序见程序清单中的程序3.2.c。

可否通过对时钟模块编程在引脚P2.4上输出ACLK?

为什么?

不可以,因为引脚P2.4在硬件层面上并未与ACLK的输出引脚相连,所以无论如何对时钟模块进行编程都无法做到在引脚P2.4上输出ACLK。

4.DCO出厂校验值的频率检测

1)利用出厂校验值,编程使DCO分别为1MHz、16MHz,通过P1.4输出,并用示波器测量实际值。

答:

1MHz的实际值为960kHz,16MHz的实际值为15.9MHz。

程序见程序清单中的程序4.1.c。

2)(提高)在实验1例程test_2553.c基础上,分别编程使主系统时钟工作在

(1)MCLK=复位频率/8约100KHz;

(2)MCLK=DCO=16MHz;

两种不同MCLK频率下,观察灯的亮灭速度有何不同,掌握主系统时钟的变化对程序执行速度的影响。

答:

在MCLK=复位频率/8时,灯的亮灭速度较慢,在MCLK=DCO=16MHz时,灯的亮灭速度较快。

可见主系统时钟频率越高,程序执行的速度越快。

程序见程序清单中的程序4.2.c。

5.低功耗模式学习

程序L6_LPM.c见下,用跳线将P2.3与L4短接,将P2.4用长杜邦线与buzz短接,P1.1与K2短接,用示波器分别观察P1.0、P1.4输出的ACLK和SMCLK,了解低功耗模式的进入和退出。

1)运行程序,观察现象,并记录进入低功耗前、进入低功耗后、响应中断后、退出中断后的时钟、发光二极管和蜂鸣器状态,并做分析。

进入低功耗前:

LED灯闪亮五次,随后蜂鸣器鸣响三次,ACLK=32.77kHz,SMCLK=1.09MHz。

进入低功耗后:

LED灯不亮,蜂鸣器不响,ACLK与SMCLK均无信号。

响应中断后:

LED灯不亮,蜂鸣器鸣响三次,ACLK=32.81kHz,SMCLK=1MHz。

退出中断后:

发生以上现象的原因是在程序执行至LPM4前,程序正常执行,时钟有信号;

程序执行至LPM4后,单片机进入了LPM4,CPU、MCLK、SMCLK、DCO均禁止,故程序不再向下执行,时钟无信号;

中断发生之后单片机被唤醒,恢复活动模式,中断子程开始执行,时钟有信号;

在退出中断之后单片机又回到了LPM4,故程序不再向下执行,时钟无信号。

2)如果中断程序中有LPM4_EXIT语句,运行的结果会有什么不同?

请分析。

在退出中断之后,LED闪亮五次,蜂鸣器不响,ACLK=32.77kHz,SMCLK=1.06MHz,随后LED灯不亮,蜂鸣器不响,ACLK与SMCLK均无信号。

因为中断子程中关闭了低功耗模式,所以中断子程结束之后单片机依旧为活动模式,所以程序继续向下执行,时钟有信号。

不过由于之后程序经过循环体的循环又执行了LPM4;

语句,故单片机又回到了LPM4,故程序不再向下进行,时钟无信号。

6.(提高)利用输出的时钟信号做中断源,实现定时功能

将任务3中P1.0输出的ACLK=VLOCLK/8时钟信号,作为P1.7的中断申请信号,用导线将P1.7与P1.0相连即可,在中断函数中设置一个计数变量,计数中断函数被执行的次数,如果ACLK的频率值为1.5KHz(实验时,以实测的为准),那么中断函数每被执行1500次表示一秒时间到。

利用该定时功能,将8个发光二级管设计成一个秒表,显示秒值,每秒改变一次8个发光二级管的显示。

程序见程序清单中的程序6.1.c。

如果要每隔5秒蜂鸣器响一声,如何在任务6的基础上编程实现?

程序见程序清单中的程序6.2.c。

程序清单:

程序2.c

#include"

io430.h"

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

//P1.0输出时钟ACLK,P1.4输出时钟SMCLK

P1SEL|=BIT0+BIT4;

P1SEL2&

=~(BIT0+BIT4);

P1DIR|=BIT0+BIT4;

while

(1);

}

程序3.1.c

unsignedinti;

while((IFG1&

OFIFG)!

=0)

{

IFG1&

=~OFIFG;

for(i=0;

i<

=0xffff;

i++);

};

BCSCTL3|=LFXT1S_0;

BCSCTL1|=DIVA_1;

程序3.2.c

BCSCTL3|=LFXT1S_2;

BCSCTL1|=DIVA_3;

程序4.1.c

//

(1)使DCO为1MHz

if(CALBC1_1MHZ!

=0xff)

BCSCTL1=CALBC1_1MHZ;

DCOCTL=CALDCO_1MHZ;

}

//

(2)使DCO为16MHz

/*

if(CALBC1_16MHZ!

BCSCTL1=CALBC1_16MHZ;

DCOCTL=CALDCO_16MHZ;

*/

程序4.2.c

intmain(void)

{unsignedintj;

//定义延时变量

//关闭看门狗

//

(1)MCLK=复位频率/8

BCSCTL2|=DIVM_3;

//

(2)MCLK=DCO=16MHz

*/

P2SEL&

=~(BIT2+BIT5);

//设置引脚P2.2和P2.5为基本输入输出功能

P2SEL2&

P2OUT|=BIT2+BIT5;

//设置引脚P2.2和P2.5输出的初值为1

P2DIR|=BIT2+BIT5;

//设置端口P2.2和P2.5为输出方向

for(;

;

)//主循环

{P2OUT^=(BIT2+BIT5);

//将P2.2和P2.5的值取反后输出

for(i=0;

0xffff;

//延时

程序L6_LPM.c

in430.h"

voiddelay(unsignedinti)//延时函数

{unsignedintk;

//定义局部变量

for(k=0;

k<

i;

k++);

voidBlink()//LED闪

{unsignedinti;

5;

i++)

{P2OUT&

=~BIT3;

delay(0xe000);

P2OUT|=BIT3;

voidBuzz()//蜂鸣响

3;

=~BIT4;

delay(0xf800);

P2OUT|=BIT4;

{WDTCTL=WDTPW+WDTHOLD;

//设置端口P2.3输出,控制LED,P2.4输出,控制蜂鸣器

=~(BIT3+BIT4);

P2SEL2&

P2OUT|=BIT3+BIT4;

P2DIR|=BIT3+BIT4;

//设置端口P1.1允许中断

P1SEL&

=~BIT1;

P1REN|=BIT1;

P1OUT|=BIT1;

P1DIR&

P1IES|=BIT1;

P1IFG&

P1IE|=BIT1;

_EINT();

Blink();

Buzz();

)//主循环

{

LPM4;

//

}

#pragmavector=PORT1_VECTOR

__interruptvoidport_ISR()

{Buzz();

P1IFG&

=~(BIT1);

//清中断标志

//LPM4_EXIT;

程序6.1.c

//P1.0输出时钟ACLK

P1SEL|=BIT0;

=~BIT0;

P1DIR|=BIT0;

//设置输入输出

P1SEL&

=~BIT7;

P1SEL2&

P1DIR&

P1DIR|=BIT1;

P2SEL=0x00;

P2SEL2=0x00;

P2DIR=0xff;

//设置时钟

//设置中断

P1IES|=BIT7;

P1IE|=BIT7;

LPM0;

unsignedintcount=0;

unsignedcharnum=0;

#pragmavector=PORT1_VECTOR//置P1中断向量

__interruptvoidLED()

count++;

if(count==1424)//1424根据之前的实测值确定

num++;

P2OUT=~num;

count=0;

程序6.2.c

unsignedinti,count=0;

unsignedcharnum=0,buzz=0;

if(count==1424)//1424根据之前的实测值确定

buzz++;

if(buzz==5)

P1OUT&

=3000;

buzz=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1