1. 数字示波器的使用
1)将信号源的波形在示波器上显示出来,掌握测量周期、频率、峰峰值的方法;
2)用孔孔导线将实验板的地信号与示波器的地信号相连,测量实验板上的Vcc 电源信 号是否正常。
实测电压值为3.5295V
2. 测试上电复位系统的 ACLK、和SMCLK 时钟频率
编程输出单片机上电复位后的ACLK、和SMCLK 时钟,用示波器测量其频率,并记录下来。 1) 程序如下: #include \#include \
int main( void ) {
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
P1SEL |=BIT0; //P1.0输出ACLK P1SEL2 &=~BIT0; P1DIR |=BIT0;
P1SEL |=BIT4; //P1.4输出SMCLK P1SEL2 &=~BIT4; P1DIR |=BIT4; }
2) 测量结果:
SMCLK:频率:1.0010MHZ ACLK: 频率:32.770KHZ 3) 实验总结:
实验中遇到的问题:SMCLK在示波器上不能输出,解决方法:关闭程序烧写,将单片机电源拔出再插入,实现复位后再用示波器测量,能得到正确的值。
思考:上电复位后,CPU 工作的时钟信号MCLK 频率值是多少?
CPU时钟信号 MCLK的时钟源是DCOCLK,由SMCLK测出的值可以知道,SMCLK的时钟源也是DCOCLK,因此MCLK频率和SMCLK应该相同均为1MHZ。
3. 掌握基本时钟模块的编程控制
参看附录A 实验板原理图,用跳线将JP8 中的插针信号接到晶振32.768Khz 侧,使晶振 与单片机的P2.6 和P2.7 相连。编程控制基本时钟模块,设置ACLK 分别为下面时钟频 率,并通过P1.0 输出ACLK,用示波器观察:
? ACLK=4096Hz;(时钟源外部晶振,32768Hz/8) ? ACLK=3KHz;(时钟源VLOCLK, 12KHz/4) 1) 程序如下: ? ACLK=4096Hz #include \#include \int main( void ) {
WDTCTL = WDTPW + WDTHOLD;
P2SEL |=BIT6; //设P2.6为晶振引脚功能 P2SEL2 &=~BIT6;
P2DIR &=~BIT6; //P2.6xin输入
P2SEL |=BIT7; //设P2.7为晶振引脚功能 P2SEL2 &=~BIT7;
P2DIR |=BIT7; //P2.7xou输出 P1SEL |=BIT0; //设P1.0输出ACLK P1SEL2 &=~BIT0; P1DIR |=BIT0; unsignedinti;
do { IFG1 &=~OFIFG; //清除震荡失败标志 for(i=0;i<0xffff;i++); //延时等待时钟稳定 }
while((IFG1&OFIFG)!=0); //若震荡失败重复
BCSCTL3_bit.LFXT1S0=0; //ACLK选择外部晶振 BCSCTL3_bit.LFXT1S1=0;
BCSCTL1|=DIVA_3; //ACLK选8分频 }
? ACLK=3KHz #include \#include \void main(void) {
WDTCTL = WDTPW + WDTHOLD;
P1SEL|=BIT0; //P1.0输出ACLK P1SEL2&=~BIT0; P1DIR|=BIT0;
P2SEL|=BIT6; //设置P2.6,P2.7的晶振引脚功能 P2SEL2 &=~BIT6;
P2DIR &=~BIT6; //XIN P2SEL |=BIT7; P2SEL2 &=~BIT7;
P2DIR |=BIT7; //XOUT unsigned int i;
do{ IFG1&=~OFIFG; //清OFIFG for(i=0;i<0xffff;i++); //延时
}while((IFG1&OFIFG)!=0); //若振荡失败重复 BCSCTL3 |=LFXT1S_2; //ACLK选择VLOCLK; BCSCTL1|=DIVA_2; //ACLK选4分频 }
2) 测量结果:
SMCLK实际输出频率为4.0958KHZ,与题目中的4096HZ相符 ACLK实际输出频率为2.8637KHZ,与题目中的3HZ有一定的差距 3) 实验总结
发现ACLK的输出频率有一定的误差,而ACLK的来源是VLOCLK的四分频,所以可以推断,VLOCLK的实际值并不是理论的12KHZ,因此在第五题中中断子程要按实际值设置执行次数。 思考:可否编程在引脚P2.0 上输出ACLK?为什么? 不能,因为ACLK有固定引脚输出
4. DCO 出厂校验值的频率检测
? 利用出厂校验值,编程使DCO 分别为1MHz、8MHz、12MHz、16MHz,通过P1.4 输出,用示波器测量实际值。 1) 程序如下: #include \#include \void delay(); void main(void) {
WDTCTL = WDTPW + WDTHOLD;
P1SEL|=BIT4; //P1.4输出SMCLK P1SEL2&=~BIT4; P1DIR|=BIT4;
if(CALBC1_16MHZ !=0xff) {
BCSCTL1=CALBC1_16MHZ; //1,8,12,16MHZ DCOCTL=CALDCO_16MHZ; }
BCSCTL2 |=SELM_0; //SMCLK选择DCO时钟源 }
2) 实验结果:16MHZ实际值为16.7MHZ;12MHZ的实际值为12.08MHZ;8MHZ的实际值为7.36MHZ; 1MHZ的实际值为1.0152MHZ。 3) 实验总结:实验中会遇到每次执行的时候都是执行一个瞬时,示波器上无法得到预期的 频率,方法同样是关闭烧写,重新插好单片机,这时就能得到固定的波形,从而测出频率值 ? (选做)控制发光二级管通过延时闪亮,编程分别使主系统时钟工作在 ? MCLK=复位频率/8 约100KHz; ? MCLK=DCO=16MHz; 两种不同频率下,观察灯的亮灭速度有何不同,掌握主系统时钟的变化对程序执行速度的影响
1) 程序如下:
? MCLK=复位频率/8 约100KHz #include \#include \void delay(); void main(void) {
WDTCTL = WDTPW + WDTHOLD;
P1SEL|=BIT4; //P1.4输出SMCLK
P1SEL2&=~BIT4; P1DIR|=BIT4;
BCSCTL2 |=SELM_0+DIVM_3; //8分频,约100KHz
P1SEL &=~BIT1; P1SEL2 &=~BIT1; P1DIR |=BIT1; while(1) {
P1OUT_bit.P1=0; delay();
P1OUT_bit.P1=~P1OUT_bit.P1; delay(); } }
void delay() {
for(unsigned inti=0;i<0xffff;i++); }
? MCLK=DCO=16MHz #include \#include \void delay(); void main(void) {
WDTCTL = WDTPW + WDTHOLD;
P1SEL|=BIT4; //P1.4输出SMCLK P1SEL2&=~BIT4; P1DIR|=BIT4;
if(CALBC1_16MHZ !=0xff) {
BCSCTL1=CALBC1_16MHZ; //1,8,12,16MHZ DCOCTL=CALDCO_16MHZ; }
BCSCTL2 |=SELM_0; //SMCLK选择DCO时钟源
P1SEL &=~BIT1; P1SEL2 &=~BIT1; P1DIR |=BIT1; while(1)
{
P1OUT_bit.P1=0; delay();
P1OUT_bit.P1=~P1OUT_bit.P1; delay(); } }
void delay() {
for(unsigned inti=0;i<0xffff;i++); }
2) 实验结果:
MCLK为16MHZ的时候是频闪,速度很快,相比之下MCLK为100HZ是LED灯的亮灭有较长的时间间隔,由此可见,主系统时钟频率越高,执行速度越快。
5. 利用输出的时钟信号做中断源,实现定时功能
将任务3 中P1.0 输出的3KHz ACLK 时钟信号,作为P1.5 的中断申请信号,用导线将 P1.5 与P1.0 相连即可,在中断子程中设置一个计数变量,计数中断子程被执行的次数, 中断子程每被执行3000 次表示一秒时间到。利用该定时功能,将8 个发光二级管设计 成一个秒表,显示秒值,每秒改变一次8 个发光二级管的显示。 1) 程序如下: #include \#include %unsigned int j=0; unsigned int i=0; void main(void) {
WDTCTL = WDTPW + WDTHOLD; _DINT();
P1SEL|=BIT0; //P1.0输出ACLK P1SEL2&=~BIT0; P1DIR|=BIT0;
P1SEL &=~BIT5; //P1.5设置中断信号 P1SEL2 &=~BIT5; P1DIR &=~BIT5; P1REN |=BIT5; P1OUT |=BIT5; P1IES |=BIT5; P1IFG &=~BIT5; P1IE |=BIT5;