《单片机中断技术实验报告.pdf》由会员分享,可在线阅读,更多相关《单片机中断技术实验报告.pdf(23页珍藏版)》请在三一文库上搜索。
1、1 / 23 实验名称:中断技术、基本时钟和定时功能 a.信号源的峰峰值为3.20V; b.周期为 1.000ms; c.频率为 1.000kHz. 2经测量, Vcc=3.64V,正常 4. 测试上电复位系统的ACLK 、和 SMCLK时钟频率 编程输出单片机上电复位后的ACLK 、 和 SMCLK时钟, 用示波器测量其频率,并记录下来 . 思考:上电复位后,CPU工作的时钟信号 MCLK频率值是多少? 答:经分析 本程序需要置引脚P1.0、P1.4 分别输出ACLK 、SMCLK ; 需要确认外部晶振连上; 具体程序见附录程序 5 测试 程序 . 测得 f(ACLK=32.79kHz,f(
2、SMCLK=1.044MHz. 思考题 上电复位后,通过观察寄存器,发现BCSCTL2 寄存器上 SELM位为 00,SELS 位为则 0,说明 MCLK与 SMCLK均由 DCO振荡器控制,所以MCLK的频率与SMCLK相同,也为 1.044MHz.6zNcZrhD4JSixE2yXPq5 5. 掌握基本时钟模块的编程控制 参看附录 A实验板原理图,用跳线将 JP8 中的插针信号接到晶振 32.768Khz 侧,使晶振 与单片机的 P2.6 和 P2.7 相连 .编程控制基本时钟模块,设置 ACLK 分别为下面时钟频 3 / 23 率,并通过 P1.0 输出 ACLK ,用示波器观察: 1)
3、 ACLK=4096Hz ; 思考:可否编程在引脚 P2.0 上输出 ACLK ? 为什么? 答: a. 1)中,应使单片机接外部晶振,并使ACLK的输出为8 分频;具体程序见附录程序 5 之 1)6zNcZrhD4J6ewMyirQFL b. 2)中,应通过BCSCTL3 寄存器选择时钟源VLOCLK ,并使其输出为4 分频,具体程序 见附录 程序 5 之 2)6zNcZrhD4JkavU42VRUs 思考题 不能在引脚 P2.0 上输出 ACLK ,因为,各引脚的特殊功能是由单片机结构所决定的,P2.0 引 脚不具有输出辅助时钟的功能.6zNcZrhD4Jy6v3ALoS89 6. DCO
4、出厂校验值的频率检测 1)利用出厂校验值,编程使 DCO 分别为 1MHz、8MHz、12MHz、16MHz,通过 P1.46zNcZrhD4JM2ub6vSTnP 输出,用示波器测量实际值. 答:经分析知 P1.4 输出的是SMCLK ; 1MHz、8MHz、12MHz、 16MHz 的情况类似,此处仅以1MHz 为例,具体程序见附 录程序 66zNcZrhD4J0YujCfmUCw 测得真实值分别为1.002MHz、7.752MHz、12.08MHz、15.94MHz. 7. 利用输出的时钟信号做中断源,实现定时功能 将任务 3 中 P1.0 输出的 3KHz ACLK 时钟信号,作为 P
5、1.5 的中断申请信号,用导线将 P1.5 与 P1.0相连即可,在中断子程中设置一个计数变量,计数中断子程被执行的次数, 中断子程每被执行 3000 次表示一秒时间到.利用该定时功能,将 8 个发光二级管设计 成一个秒表,显示秒值,每秒改变一次 8 个发光二级管的显示. 答:根据分析可知 a.需要在实验5 之 2)的基础上进行编程; b.须用跳线板将P2的引脚与LED灯相连; c.具体程序见附录程序 7 思考:如果要每隔 10 秒蜂鸣器响一声,如何在任务 5 的基础上编程实现? 答:将 P1.7 与蜂鸣器相连,增加一个延时函数以及每10 秒操作一次P1.7 上电位;具体程 序见附录 程序 7
6、 之思考题6zNcZrhD4JeUts8ZQVRd 三、实验选做任务 1.中断响应的理解 6) 查看 io430G2553.h 文件末尾处有关中断向量偏址的符号定义. 2)为便于了解程序执行流程,可在中断子程入口处设置一断点,然后连续运行 程序 采用事件标志处理中断 4 / 23 阅读 程序 L4_intA.c 和 L4_intB.c 按键抖动处理 程序 L4_Key.C见后页, 其功能是用中断方式相应与 P1.2 连接的按键,计数按键的次 6zNcZrhD4Jlzq7IGf02E 数,并将所计的次数用 8 个发光二极管显示出来.运行该程序,并操作按键,观察实际 操作的次数与显示值之间的关系.
7、编程改进L4_Key.C程序,用软件方式去除按键抖动 的影响 . 答: 根据分析,需要在响应了第一次下降沿后,加入一定的延时,躲过其它电压毛刺的产生 时间 .具体程序见附录程序 46zNcZrhD4JzvpgeqJ1hk 通过实验观察可以发现,改进之前,二进制显示的数值明显大于实际按键数,而改进 之后,两者数值大致相等. 4. DCO出厂校验值的频率检测 2) / 延时函数 unsigned int j 。 for (j=0。j。 void Blink( /LED 闪 P2OUT &=BIT3 。 delay(。 P2OUT |= BIT3。 delay(。 void Buzz( /蜂鸣响 u
8、nsigned int i 。 for (i=0。i P2OUT &=BIT4 。 delay(。 P2OUT|= BIT4。 delay(。 。 void main ( void WDTCTL = WDTPW + WDTHOLD。 / 关闭看门狗 / 设置引脚 P2.4、P2.3 输出, P2.3 连接 LED ,P2.4 连接蜂鸣器 P2SEL &=(BIT3+BIT4 。 P2SEL2 &=(BIT3+BIT4 。 P2OUT|=(BIT3+BIT4 。 P2DIR|=(BIT3+BIT4 。 / 设置端口 P1.5 允许中断 P1SEL &= BIT5 。 P1SEL2 &= BIT5
9、 。 P1OUT |=BIT5。 P1REN |=BIT5 。 P1DIR &=BIT5 。 P1IES |= BIT5 。 6 / 23 P1IFG &=BIT5 。 P1IE |= BIT5。 _EINT( 。 /总中断允许 for (。 / 主循环 Blink(。 。 #pragma vector=PORT1_VECTOR _interrupt void port_ISR( Buzz( 。 P1IFG &=BIT5 。 2.必做第 2 题 #include “io430.h“ #include “in430.h“ void delay( / 延时函数 unsigned int j 。 f
10、or (j=0。j。 void L1Blink( /L1 闪 3 次 unsigned int i 。 for (i=0。i P2OUT &=BIT1 。 delay(。 P2OUT|= BIT1。 delay(。 。 void L7Blink( /L7 闪 P2OUT &=BIT3 。 delay(。 P2OUT |= BIT3。 delay(。 void Buzz( /蜂鸣响 P2OUT &=BIT4 。 delay(。 P2OUT|= BIT4。 delay(。 void main ( void WDTCTL = WDTPW + WDTHOLD。 / 关闭看门狗 / 设置引脚 P2.1、
11、P2.3 、P2.4 输出, P2.1、 P2.3 分别连接 L1和 L7,P2.4 连接蜂鸣器 6zNcZrhD4JHbmVN777sL P2SEL &=(BIT1+BIT3+BIT4。 7 / 23 P2SEL2 &=(BIT1+BIT3+BIT4。 P2OUT|=(BIT1+BIT3+BIT4 。 P2DIR|=(BIT1+BIT3+BIT4 。 / 设置端口 P1.4、P1.5 允许中断 P1SEL &= (BIT4+BIT5 。 P1SEL2 &= (BIT4+BIT5 。 P1OUT |=(BIT4+BIT5 。 P1REN |=(BIT4+BIT5 。 P1DIR &=(BIT4
12、+BIT5 。 P1IES |= (BIT4+BIT5 。 P1IFG &=(BIT4+BIT5 。 P1IE |= (BIT4+BIT5 。 _EINT( 。 /总中断允许 for (。 / 主循环 L7Blink(。 。 #pragma vector=PORT1_VECTOR _interrupt void port_ISR( if (P1IFG&BIT4!=0 Buzz(。 P1IFG &=BIT4 。 。 if (P1IFG&BIT5!=0 L1Blink(。 P1IFG&=BIT5 。 2.思考题 #include “io430.h“ #include “in430.h“ void
13、delay( / 延时函数 unsigned int j 。 for (j=0。j。 void L1Blink( /L1 闪 3 次 unsigned int i 。 for (i=0。i P2OUT &=BIT1 。 delay(。 P2OUT|= BIT1。 delay(。 。 void L7Blink( /L7 闪 8 / 23 P2OUT &=BIT3 。 delay(。 P2OUT |= BIT3。 delay(。 void Buzz( /蜂鸣响 P2OUT &=BIT4 。 delay(。 P2OUT|= BIT4。 delay(。 void main ( void WDTCTL
14、= WDTPW + WDTHOLD。 / 关闭看门狗 / 设置引脚 P2.1、P2.3 、P2.4 输出, P2.1、 P2.3 分别连接 L1和 L7,P2.4 连接蜂鸣器 6zNcZrhD4JV7l4jRB8Hs P2SEL &=(BIT1+BIT3+BIT4。 P2SEL2 &=(BIT1+BIT3+BIT4。 P2OUT|=(BIT1+BIT3+BIT4 。 P2DIR|=(BIT1+BIT3+BIT4 。 / 设置端口 P2.2、P2.5 允许中断 P2SEL &= (BIT2+BIT5 。 P2SEL2 &= (BIT2+BIT5 。 P2OUT |=(BIT2+BIT5 。 P2
15、REN |=(BIT2+BIT5 。 P2DIR &=(BIT2+BIT5 。 P2IES |= (BIT2+BIT5 。 P2IFG &=(BIT2+BIT5 。 P2IE |= (BIT2+BIT5 。 _EINT( 。 /总中断允许 for (。 / 主循环 L7Blink(。 。 #pragma vector=PORT2_VECTOR _interrupt void port_ISR( if (P2IFG&BIT2!=0 Buzz(。 P2IFG &=BIT2 。 。 if (P2IFG&BIT5!=0 L1Blink(。 P2IFG&=BIT5 。 4. 测试上电复位系统的ACLK
16、、和 SMCLK时钟频率 6zNcZrhD4J83lcPA59W9 9 / 23 #include “io430.h“ int main( void / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD 。 / 设置 P2.6、P2.7 连接外部晶振 P2SEL|=(BIT6+BIT7 。 P2SEL2&=(BIT6+BIT7 。 P2DIR&=BIT6 。 P2DIR|=BIT7。 / 设置 P1.0、P1.4 输出 ACLK 、SMCLK P1SEL|=BIT0 。 P1SEL2&=BIT0 。 P1DIR|=BIT0。 P1SEL|=BIT4 。 P1SEL2&=BIT4 。
17、 P1DIR|=BIT4。 while(1。 5. 掌握基本时钟模块的编程控制 1)ACLK=4096Hz 。 / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD 。 / 设置 P2.6、P2.7 连接外部晶振 P2SEL|=(BIT6+BIT7 。 P2SEL2&=(BIT6+BIT7 。 P2DIR&=BIT6 。 P2DIR|=BIT7。 / 设置 P1.0 输出 ACLK P1SEL|=BIT0 。 P1SEL2&=BIT0 。 P1DIR|=BIT0。 BCSCTL3&=(LFXT1S0+LFXT1S1。/ 选择外部晶振 BCSCTL1|=(DIVA0+DIVA1 。/
18、 选择 8 分频 while(1。 2)ACLK=3KHz ; / 关闭看门狗 10 / 23 WDTCTL = WDTPW + WDTHOLD 。 / 设置 P1.0 输出 ACLK P1SEL|=BIT0 。 P1SEL2&=BIT0 。 P1DIR|=BIT0。 BCSCTL3&=LFXT1S0。/ 选择时钟源VLOCLK BCSCTL3|=LFXT1S1。 BCSCTL1&=DIVA0 。/ 选择 4 分频 BCSCTL1|=DIVA1 。 while(1。 第 6 题必做 之 DCO出厂校验值的频率检测 #include “io430.h“ int main( void / 关闭看门
19、狗 WDTCTL = WDTPW + WDTHOLD 。 P1SEL|=BIT4 。/ 设置 P1.4 输出 SMCLK P1SEL2&=BIT4 。 P1DIR|=BIT4。 BCSCTL2&=SELS。/ 选择 DCO时钟源 BCSCTL1=CALBC1_1MHZ。 /其他情况改变1MHz 就可以了 DCOCTL=CALDCO_1MHZ。 while(1。 必做第 7 题之利用输出的时钟信号做中断源,实现定时功能6zNcZrhD4JmZkklkzaaP 1) #include “io430.h“ #include “in430.h“ unsigned char time=0 。 unsig
20、ned int i=0 。 int main( void / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD 。 / 设置端口P1.0 输出 3KHzACLK时钟信号 P1SEL|=BIT0 。 P1SEL2&=BIT0 。 P1DIR|=BIT0。 BCSCTL3&=LFXT1S0。 BCSCTL3|=LFXT1S1。 BCSCTL1&=DIVA0 。 BCSCTL1|=DIVA1 。 / 设置 P2.0P2.7为输出状态 11 / 23 P2SEL&=0 。 P2SEL2&=0 。 P2DIR|=0Xff。 P2OUT|=0Xff。 / 设置端口P1.5 允许中断 P1SEL
21、&=BIT5 。 P1SEL2&=BIT5 。 P1REN|=BIT5。 P1OUT&=BIT5 。 P1DIR&=BIT5 。 P1IES&=BIT5 。 P1IFG&=BIT5 。 P1IE|=BIT5。 _EINT( 。 while(1 if (i=3000 time+=1。 i=0。 P2OUT=time。 /LED 灯显示输出秒表的值 #pragma vector=PORT1_VECTOR _interrupt void port_ISR( i+。 P1IFG&=(BIT5 。 /清中断标志 2)必做 7 之思考题 #include “io430.h“ #include “in430
22、.h“ unsigned char time=0 。 unsigned int i=0 。 void delay(。 int main( void / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD 。 / 设置端口P1.0 输出 3KHzACLK时钟信号 P1SEL|=BIT0 。 P1SEL2&=BIT0 。 P1DIR|=BIT0。 BCSCTL3&=LFXT1S0。 BCSCTL3|=LFXT1S1。 BCSCTL1&=DIVA0 。 BCSCTL1|=DIVA1 。 12 / 23 / 设置 P2.0P2.7为输出状态 P2SEL&=0 。 P2SEL2&=0 。 P2
23、DIR|=0Xff。 P2OUT|=0Xff。 / 设置 P1.7 为输出状态 P1SEL&=BIT7 。 P1SEL2&=BIT7 。 P1OUT|=BIT7。 P1DIR|=BIT7。 / 设置端口P1.5 允许中断 P1SEL&=BIT5 。 P1SEL2&=BIT5 。 P1REN|=BIT5。 P1OUT&=BIT5 。 P1DIR&=BIT5 。 P1IES&=BIT5 。 P1IFG&=BIT5 。 P1IE|=BIT5。 _EINT( 。 while(1 if (i=3000 time+=1。 if(time%10=0 P1OUT&=BIT7 。 delay(。 P1OUT|=
24、BIT7。 i=0。 P2OUT=time。 /LED 灯显示输出秒表的值 void delay(/ 延时函数 unsigned int j 。 for (j=0。j。 #pragma vector=PORT1_VECTOR _interrupt void port_ISR( i+。 P1IFG&=(BIT5 。 /清中断标志 二、选做任务程序 2.采用事件标志处理中断 #include “io430.h“ #include “in430.h“ 13 / 23 int flag=0。 void delay( / 延时函数 unsigned int j 。 for (j=0。j。 void L1
25、Blink( /L1 闪 3 次 unsigned int i 。 for (i=0。i P2OUT &=BIT1 。 delay(。 P2OUT|= BIT1。 delay(。 。 void L7Blink( /L7 闪 P2OUT &=BIT3 。 delay(。 P2OUT |= BIT3。 delay(。 void Buzz( /蜂鸣响 P2OUT &=BIT4 。 delay(。 P2OUT|= BIT4。 delay(。 void main ( void WDTCTL = WDTPW + WDTHOLD。 / 关闭看门狗 / 设置引脚 P2.1、P2.3 、P2.4 输出, P2.
26、1、 P2.3 分别连接 L1和 L7,P2.4 连接蜂鸣器 6zNcZrhD4JAVktR43bpw P2SEL &=(BIT1+BIT3+BIT4。 P2SEL2 &=(BIT1+BIT3+BIT4。 P2OUT|=(BIT1+BIT3+BIT4 。 P2DIR|=(BIT1+BIT3+BIT4 。 / 设置端口 P1.4、P1.5 允许中断 P1SEL &= (BIT4+BIT5 。 P1SEL2 &= (BIT4+BIT5 。 P1OUT |=(BIT4+BIT5 。 P1REN |=(BIT4+BIT5 。 P1DIR &=(BIT4+BIT5 。 P1IES |= (BIT4+BI
27、T5 。 P1IFG &=(BIT4+BIT5 。 P1IE |= (BIT4+BIT5 。 _EINT( 。 /总中断允许 14 / 23 for (。 / 主循环 L7Blink(。 if (flag=1 Buzz( 。 flag=0。 if (flag=2 L1Blink( 。 flag=0。 。 #pragma vector=PORT1_VECTOR _interrupt void port_ISR( if (P1IFG&BIT4!=0 flag=1。 P1IFG &=BIT4 。 。 if (P1IFG&BIT5!=0 flag=2。 P1IFG&=BIT5 。 3.(选做 按键抖动
28、处理 #include “io430.h“ #include “in430.h“ unsigned int number=0 。 /记录响应按键次数 void delay( / 延时函数 unsigned int j 。 for (j=0。 j。 int main( void WDTCTL = WDTPW + WDTHOLD。 /关闭看门狗 _disable_interrupt( 。 /_DINT(。 禁止总中断 P2SEL=0 。 / 置 P2 为基本 I/O 功能 P2SEL2=0 。 / P2OUT=0xFF 。 / 置 P2 输出的初值 P2DIR=0xFF 。 /置 P2 为输出方向
29、 P1SEL &= BIT2 。 P1SEL2 &= BIT2 。 P1OUT |=BIT2。 P1REN |=BIT2 。 15 / 23 P1DIR &=BIT2 。 P1IES |= BIT2 。 P1IFG &=BIT2 。 P1IE |= BIT2 。 _enable_interrupt( 。 /_EINT(。 总中断运行 while(1 。 #pragma vector=PORT1_VECTOR _interrupt void port_int(void if( (P1IFG&BIT2!=0 delay(。 / 增加延时函数,避开毛刺 if ( (P1IFG&BIT2!=0 num
30、ber+。 P2OUT=number。 P1IFG &=BIT2 。 选做第 4 题之 DCO出厂校验值的频率检测 1)MCLK=复位频率 /8 约 100KHz。 将 P2.0 与 L1 相连,程序如下: #include “io430.h“ void LED(。 void delay(。 int main( void / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD 。 / 设置 P2.0 为输出状态 P2SEL&=BIT0 。 P2SEL2&=BIT0 。 P2OUT|=BIT0。 P2DIR|=BIT0。 / 复位 8 分频 BCSCTL2|=(DIVM0+DIVM1
31、。 while(1 LED( 。 void LED( /LED 灯延时亮灭 P2OUT&=BIT0 。 delay(。 P2OUT|=BIT0。 16 / 23 delay(。 void delay( /延时函数 unsigned int i。 for (i=0。i。 2)MCLK=DCO=16MHz ; #include “io430.h“ void LED(。 void delay(。 int main( void / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD 。 /P2.0 为输出状态 P2SEL&=BIT0 。 P2SEL2&=BIT0 。 P2OUT|=BIT0。
32、 P2DIR|=BIT0。 / 设置 MCLK时钟源为DCO振荡器 BCSCTL2&=(SELM0+SELM1。 /DCO 振荡器频率设置为16MHz BCSCTL1=CALBC1_16MHZ。 DCOCTL=CALDCO_16MHZ。 while(1 LED( 。 void LED( /LED 灯延时亮灭 P2OUT&=BIT0 。 delay(。 P2OUT|=BIT0。 delay(。 void delay( /延时函数 unsigned int i。 for (i=0。i。 选作 5 之改用 4 个数码管显示秒值,重新完成必做任务 76zNcZrhD4JORjBnOwcEd 将 P2.
33、0P2.7依次与 Sa Sh相连 .P1.7 与 BUZZ相连, P1.1P1.4与 S1S4相连 6zNcZrhD4J2MiJTy0dTT #include “io430.h“ #include “in430.h“ void delay(。 17 / 23 unsigned char time=0 。 unsigned int i=0 。 const char LEDtab10=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F 。 6zNcZrhD4JgIiSpiue7A unsigned char a=0,b=0,c=0,d=0。 unsi
34、gned char flag=0。 int main( void / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD 。 / 设置端口P1.0 输出 3KHzACLK时钟信号 P1SEL|=BIT0 。 P1SEL2&BIT0 。 P1DIR|=BIT0。 BCSCTL3&=LFXT1S0。 BCSCTL3|=LFXT1S1。 BCSCTL1&=DIVA0 。 BCSCTL1|=DIVA1 。 / 设置 P2.0P2.7为输出状态 P2SEL=0 。 P2SEL2=0 。 P2DIR=0XFF 。 P2OUT=0XFF 。 / 设置 P1.1P1.4、 P1.7 为输出状态; P
35、1SEL&=(BIT1+BIT2+BIT3+BIT4+BIT7。 P1SEL2&=(BIT1+BIT2+BIT3+BIT4+BIT7。 P1DIR|=BIT1+BIT2+BIT3+BIT4+BIT7 。 P1OUT|=BIT7。 P1OUT&=(BIT1+BIT2+BIT3+BIT4 。 / 设置端口P1.5 允许中断 P1SEL&=BIT5 。 P1SEL2&=BIT5 。 P1REN|=BIT5。 P1OUT&=BIT5 。 P1DIR&=BIT5 。 P1IES&=BIT5 。 P1IFG&=BIT5 。 P1IE|=BIT5。 _EINT( 。 while(1 if (i3000 ti
36、me+=1。 i=0。 time=time%10000 。 18 / 23 d=time/1000 。 c=(time%1000/100。 b=(time%100/10。 a=time%10。 if (a=0 P1OUT&=BIT7 。 delay(。 P1OUT|=BIT7。/ 蜂鸣器响6zNcZrhD4JuEh0U1Yfmh void delay( /延时函数 unsigned int j 。 for (j=0。j。 #pragma vector=PORT1_VECTOR _interrupt void port_ISR( i+。 / 显示输出数码管 if (flag=0 P2OUT=LE
37、Dtaba。 P1OUT&=(BIT1+BIT2+BIT3+BIT4 。 P1OUT|=BIT1。 flag=1。6zNcZrhD4JIAg9qLsgBX else if (flag=1 P2OUT=LEDtabb。 P1OUT&=(BIT1+BIT2+BIT3+BIT4 。 P1OUT|=BIT2。 flag=2。6zNcZrhD4JWwghWvVhPE else if (flag=2 P2OUT=LEDtabc。 P1OUT&=(BIT1+BIT2+BIT3+BIT4 。 P1OUT|=BIT3。 flag=3。6zNcZrhD4Jasfpsfpi4k else if (flag=3 P2OUT=LEDtabd。 P1OUT&=(BIT1+BIT2+BIT3+BIT4 。 P1OUT|=BIT4。 flag=0。6zNcZrhD4JooeyYZTjj1 P1IFG&=(BIT5 。 /清中断标志 三、课本程序 【 L4_int.c】 19 / 23 20 / 23 21 / 23 22 / 23 申明: 所有资料为本人收集整理,仅限个人学习使用,勿做商业用 途。 申明: 所有资料为本人收集整理,仅限个人学习使用,勿做商业用 途。 23 / 23
链接地址:https://www.31doc.com/p-4512965.html