您好,欢迎访问三七文档
实验名称:定时器、串行通信技术(实验7、实验9)姓名:学号:实验目的1.了解MSP430定时器A工作原理,掌握MSP430定时器A的控制方法;2.了解异步串行通信原理;3.掌握MSP430异步串行通信模块及其编程方法。实验基本任务实验7定时器:1.定时器A的定时功能学习采用定时器A的增计数方式(UpMode),每秒产生一次CCR0的TACCR0CCIFG中断,计数秒值,将计数值通过8个发光二极管显示出来,并控制蜂鸣器每5秒发出一警报声。具体方法接线:将P1.0~P1.7与LED1~LED7连接起来,P2.0与蜂鸣器连接起来,采用32.768KHz的外部晶振作为ACLK的时钟源,P2.6、P2.7分别连接XIN、XOUT(与外部晶振连接而不能作为基本输入输出)。选择增计数方式,每隔一秒改变一次发光二极管状态,每隔五秒发出一声警报。程序代码如下:#includeio430.h#includein430.hunsignedintcount=0,s=0;voiddelay()//延时函数{unsignedinti;for(i=0;i0xffff;i++);}voidbuzz()//蜂鸣器响一声{P2OUT&=~BIT0;delay();P2OUT|=BIT0;delay();}intmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗_DINT();P1SEL=0;//设置P1.0~P1.7为基本输出连接L1-L7P1SEL2=0;P1OUT=0XFF;P1DIR=0XFF;//启用外部晶振,P2.6、P2.7分别连接XIN、XOUTP2SEL|=BIT6+BIT7;P2SEL2&=~(BIT6+BIT7);P2DIR&=~BIT6;P2DIR|=BIT7;P2SEL&=~BIT0;//设置P2.0为输出连接BUZZP2SEL&=~BIT0;P2OUT|=BIT0;P2DIR|=BIT0;//采用ACLK时钟源,清零计数器,选择增计数方式TA0CTL|=TACLR+TASSEL_1+MC_1;TA0CCR0=5000;TA0CCTL0|=CCIE;//打开中断允许_EINT();while(1){if(count==257)//设置LED灯显示count=1;P1OUT=~count;if(s==5)//控制蜂鸣器鸣叫{buzz();s=0;}}}#pragmavector=TIMER0_A0_VECTOR__interruptvoidtime()//中断程序{count++;s++;}优化方法接线:采用外部晶振作为时钟源时,端口P2.6~P2.7只能设置为外部晶振引脚,不能设置为基本输入输出,这样在整体控制LED灯时不便于布线以及端口之间的连接,十分不方便。因此可以考虑采用SMCLK为时钟信号,并设置SMCLK的时钟源为12KHz的VLOCLK,这时只许再设置一下TAR0CR0的计数值使中断恰好为一秒即可,将P2.0~P2.7与LED1~LED7连接起来,P1.7与蜂鸣器连接起来,XIN与P2.6_0连接,XOUT与P2.7_0连接,大大方便布线。优化程序代码如下:#includeio430.h#includein430.hunsignedintcount=0,s=0;voiddelay()//延时函数{unsignedinti;for(i=0;i0xffff;i++);}voidbuzz()//蜂鸣器响一声{P1OUT&=~BIT7;delay();P1OUT|=BIT7;delay();}intmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗_DINT();P2SEL=0;//设置P2.0~P2.7端口为基本输出与L1-L7连接P2SEL2=0;P2OUT=0XFF;P2DIR=0XFF;P1SEL&=~BIT7;//设置P1.7端口为基本输出与蜂鸣器连接P1SEL2&=~BIT7;P1OUT|=BIT7;P1DIR|=BIT7;BCSCTL3|=LFXT1S_2;//设置SMCLK为12KHz的VLOCLK//采用SMCLK时钟源,清零计数器,选择增计数方式TA0CTL|=TACLR+TASSEL_1+MC_1;TA0CCR0=11999;TA0CCTL0|=CCIE;//打开中断允许_EINT();while(1){if(count==257)//设置LED灯显示count=1;P2OUT=~count;if(s==5)//控制蜂鸣器鸣叫{buzz();s=0;}}}#pragmavector=TIMER0_A0_VECTOR__interruptvoidtime()//中断程序{count++;s++;}实验思考和研究:思考:本次实验采用定时器的计时、实验3中任务1延时方式的计时、实验6中任务6外中断方式的计时,这三种方法CPU在执行流程上有什么不同?答:这三种方法采用了不同的原理来实现一秒的定时,因此CPU在执行流程上也会不同。实验3中的任务的延时方式是让CPU执行无用的计算来获得1S计时,不够精确而且在计时的同时CPU不能执行其他操作;实验6中的任务6是让CPU接收一个端口发出的1.5KHz的ACLK信号,每获得一个低电平就执行一次中断,计数加一,因此可以获得较为准确的1S;采用定时器的计时是使用单片机的定时器中的TAxCCR0来记录时钟信号产生的个数,根据时钟信号的周期来确定1S所需记录个数,因此较为精确,CPU只需每秒执行一次中断响应即可。2.PWM波形输出采用定时器的比较输出功能,编程在P1.2上输出频率为264Hz、占空比为50%的方波。(占空比:指高电平占一个周期中的比例)。可用示波器测量该波形。具体方法:选择ACLK为时钟信号,选择频率为32.768KHz的外部晶振为时钟源。设置P1.2为TA0输出,设置TA0CCR0、TA0CCR1的值来改变脉冲的频率和占空比(TA0CCR0=(1/264)/(1/32768)-1=123,TA0CCR1=(1/264)/(1/32768)*(1-0.5)=62)。程序代码如下:#includeio430.h#includein430.hintmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P2SEL|=BIT6+BIT7;//启用外部晶振P2.6与P2.7要与XIN、XOUT连接P2SEL2&=~(BIT6+BIT7);P2DIR&=~BIT6;P2DIR|=BIT7;P1SEL|=BIT2;//设置P1.2输出方波接示波器信号端P2SEL2&=~BIT2;P1DIR|=BIT2;TA0CTL=TACLR+TASSEL_1+MC_1;//采用ACLK时钟源,清零计数器,选择增计数方式TA0CCR0=123;//设置计数频率、占空比和计数模式TA0CCR1=62;TA0CCTL1|=OUTMOD_2;while(1){};}(选做)如果在P1.2上分别输出264Hz、297Hz、330Hz、352Hz、396Hz、440Hz、495Hz、538Hz的方波信号,并用这个方波信号去控制蜂鸣器,将听到1、2、3、4、5、6、7、!一个8度的音乐声。发声原理可参看课外选做趣味实验(见后)的说明。注意:PWM波形的输出与中断无关。具体方法:选择ACLK为时钟信号,选择频率为32.768KHz的外部晶振为时钟源。设置P1.2为TA0输出连接BUZZ,设置TA0CCR0、TA0CCR1的值来改变脉冲的频率和占空比。经实验对比,占空比为百分之八十蜂鸣器发声效果最好。程序如下:#includeio430.h#includein430.hvoidbuzz(inti)//控制P1.2输出不同频率的方波{unsignedintm;if(i==1)m=123;//264Hzelseif(i==2)m=109;//297Hzelseif(i==3)m=98;//330Hzelseif(i==4)m=92;//352Hzelseif(i==5)m=82;//396Hzelseif(i==6)m=73;//440Hzelseif(i==7)m=65;//495Hzelseif(i==8)m=61;//528HzTA0CCR0=m;//设置计数频率、占空比和计数模式TA0CCR1=(m+1)/5;TA0CCTL1|=OUTMOD_2;}intmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P2SEL|=BIT6+BIT7;//启用外部晶振P2.6与P2.7要与XIN、XOUT连接P2SEL2&=~(BIT6+BIT7);P2DIR&=~BIT6;P2DIR|=BIT7;P1SEL|=BIT2;//设置P1.2输出方波连接BUZZP2SEL2&=~BIT2;P1DIR|=BIT2;TA0CTL=TACLR+TASSEL_1+MC_1;//采用ACLK时钟源,清零计数器,选择增计数方式buzz(1);//设置P1.2输出的音调1(可根据需要改1.2...8)while(1){}}3.(选做)定时器A的定时功能应用将实验3中的电子表设计,改用定时器来完成1秒的定时。编程提示:主循环中控制数码管的显示,显示的时间值由定时中断提供。具体方法:将Sa~Sh与Q0~Q7连接起来,将P1.0~P1.7与S1~BUZZ连接起来,用S1~S4来控制显示的数码管,用DS输入数据、DHCP输入脉冲,STCP输入终止脉冲,利用串并转换芯片来控制数码管。选择SMCLK作为时钟信号,并设置12KHz的VLOCLK作为时钟源,设置TA0CCR0的数值使得一秒钟产生一次中断来计时(TA0CCR0=1/(1/12000)-1=11999),计时结束后清零各端口,并控制蜂鸣器响一声。程序如下:#includeio430.h#includein430.hunsignedintc=0,s=0,a1,a2,a3,a4;unsignedcharLED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//LED灯unsignedcharBIT[8]={BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7};//数字位voiddelay()//延时函数1{unsignedinti;for(i=0;i0xffff;i++);}voidbuzz()//蜂鸣器响一声{P1OUT&=~BIT7;delay();P1OUT|=BIT7;delay();}voidlight(charled)//点LED函数(串行){unsignedinti;for(i=0;i8;i++){if((led&BIT[7-i])==0)P1OUT&=~BIT4;//输出信号elseP1OUT|=BIT4;P1OUT|=BIT5;//SHCP发出脉冲P1OUT&=~BIT5;}P1OUT|=BIT6;//STCP脉冲P1OUT&=~BIT6;}intmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗_DINT();P1SEL=0;//设置P1.0~P1.7为基本输出P1SEL2=0;P1OUT=0xff;P1DIR=0xff;BCSCTL3|=LFXT1S_2;//设置SMCLK为12KHz的VLOCLKTA0CTL|=TACLR+TASSEL_1+MC_1;//采用SMCLK时钟源,清零计数器,选择增计数方式TA0CCR0=11999;TA0CCTL0|=CCIE;//打开中断允许_EINT();while(1){light(LED[a4]);P1OUT|=BIT0;//置第一位数码管为输出P1OUT&=~(BIT1+BIT2+BIT3);light(LED[a3]);P1OUT|=BIT1;//置第二位数码管为输出P1OUT&=~(BIT0+BIT2+BIT3);light(LED[a2]);P1OUT|=BIT2;//置第三位数
本文标题:计硬基础实验报告4
链接地址:https://www.777doc.com/doc-6863402 .html