单片机复习题答案.docx
《单片机复习题答案.docx》由会员分享,可在线阅读,更多相关《单片机复习题答案.docx(23页珍藏版)》请在冰点文库上搜索。
单片机复习题答案
复习题
考试时间:
90分钟
试题1:
小灯闪烁
要求利用LauncnPad上的LED小灯(P1.0P1.6),通过循环延时程序控制小灯闪烁,要求修改内部DCO系统时钟,控制小灯闪烁的速度,要求至少有四种明显变化的速度。
要求画出硬件接线图。
主程序:
#include
voidGPIO_init();
voidBCSplus_init(void);
voidP1_IODect();
voidP13_Onclick();
voidmain()
{
WDTCTL=WDTPW+WDTHOLD;
GPIO_init();
_EINT();
_enable_interrupts();
while
(1)
{
P1OUT^=BIT0;
P1OUT^=BIT6;
__delay_cycles(1000000);
}
}
voidGPIO_init()
{
P1DIR|=BIT0+BIT6;
P1OUT|=BIT0;
P1OUT&=~BIT6;
P1IFG&=BIT0;
P1REN|=BIT3;
P1OUT|=BIT3;
P1DIR&=~BIT3;
P1IES|=BIT3;
P1IE|=BIT3;
}
voidP1_IODect()
{
unsignedcharPush_Key=0;
Push_Key=P1IFG&(~P1DIR);
__delay_cycles(10000);
if((P1IN&Push_Key)==0)
{
switch(Push_Key)
{
caseBIT0:
break;
caseBIT1:
break;
caseBIT2:
break;
caseBIT3:
P13_Onclick();break;
default:
break;
}
}
}
#pragmavector=PORT1_VECTOR
__interruptvoidP1_ISR(void)
{
_DINT();
P1_IODect();
P1IFG&=0X00;
_EINT();
}
voidP13_Onclick()
{
staticunsignedintFreq=0;
if(Freq>3)
{
Freq=0;
}
switch(Freq)
{
case0:
BCSCTL1=CALBC1_1MHZ;DCOCTL=CALDCO_1MHZ;break;
case1:
BCSCTL1=CALBC1_8MHZ;DCOCTL=CALDCO_8MHZ;break;
case2:
BCSCTL1=CALBC1_12MHZ;DCOCTL=CALDCO_12MHZ;break;
case3:
BCSCTL1=CALBC1_16MHZ;DCOCTL=CALDCO_16MHZ;break;
default:
break;
}
Freq++;
}
试题2:
LCD显示学号
在提供的段式LCD驱动程序基础上,编写主程序显示学号。
要求画出硬件接线图。
主程序:
#include
#include
#include
#include
main()
{
WDTCTL=WDTPW+WDTHOLD;
TCA6416A_Init();
HT1621_init();
while
(1)
{
LCD_DisplayDigit(1,10);
LCD_DisplayDigit(4,9);
LCD_DisplayDigit(8,8);
LCD_DisplayDigit(4,7);
LCD_DisplayDigit(1,1);
LCD_DisplayDigit(1,2);
LCD_DisplayDigit(0,3);
LCD_DisplayDigit(3,4);
HT1621_Reflash(LCD_Buffer);
}
}
显示为本人学号
试题3:
流水灯
在提供的TCA6416驱动程序基础上,要求首先实现8个外扩小灯的循环显示即流水灯功能,循环显示方式为:
(要求画出硬件接线图)
●○○○○○○○○●○○○○○○○○●○○○○○○○○●○○○○○○○○●○○○○○○○○●○○○○○○○○●○○○○○○○○●●○○○○○○○
加入TCA6416A.c
voidLEDFlash(void)
{
unsignedcharout0_7[2]={0};
unsignedcharFlag1=0x7F;
unsignedcharFlag2=0xFE;
unsignedinti;
for(i=0;i<8;i++)
{
out0_7[0]=Out_CMD0;
out0_7[1]=Flag1;
Flag1=(Flag1>>1)|0x80;
TCA6416_Tx_Frame(out0_7,2);//将更新后的数据包,写入芯片寄存器
__delay_cycles(16000000);
}
for(i=0;i<8;i++)
{
out0_7[0]=Out_CMD0;
out0_7[1]=Flag2;
Flag2=(Flag2<<1)|0x01;
TCA6416_Tx_Frame(out0_7,2);//将更新后的数据包,写入芯片寄存器
__delay_cycles(16000000);
}
}
主程序:
#include
#include
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
TCA6416A_Init();
BCSCTL1=CALBC1_12MHZ;
DCOCTL=CALDCO_12MHZ;
while
(1)
{
LEDFlash();
}
}
试题4:
按键外部中断
要求利用LaunchPad板,P1.3外接按键,控制LED小灯(P1.6)状态,通过外部中断实现。
要求画出硬件接线图。
主程序:
(非常规方法)
#include"msp430g2553.h"
voidP13_Onclick();
voidP1_IODect();
voidGPIO_init();
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
GPIO_init();
_EINT();
TACTL=TASSEL_2+ID_0+MC_1+TACLR+TAIE+~TAIFG;
TACCTL1=OUTMOD_7;
TACCR0=500;
_BIS_SR(LPM0_bits+GIE);
LPM3;
}
voidGPIO_init()
{
P1DIR|=BIT6;
P1SEL|=BIT6;
P1REN|=BIT3;
P1OUT|=BIT3;
P1DIR&=~BIT3;
P1IES|=BIT3;
P1IE|=BIT3;
}
#pragmavector=PORT1_VECTOR
__interruptvoidPORT1_ISR(void)
{
P1_IODect();
P1IFG=0;
}
voidP1_IODect()
{
unsignedintkey=0;
key=P1IFG&(~P1DIR);
__delay_cycles(10000);
if((P1IN&key)==0)
{
switch(key)
{
//caseBIT0:
P10_Onclick();break;
caseBIT3:
P13_Onclick();break;
default:
break;
}
}
}
voidP13_Onclick()
{
staticunsignedintFreq=0;
if(Freq>=3)
{
Freq=0;
}
elseFreq++;
switch(Freq)
{
case0:
TACCR1=100;break;
case1:
TACCR1=0;break;
case2:
TACCR1=100;break;
case3:
TACCR1=0;break;
default:
break;
}
}
试题5:
定时器
利用定时器定时0.5S功能,让小灯亮0.5s,暗0.5s方式闪烁。
要求采用定时器中断功能实现。
主程序:
#include
voidBCSplus_init(void);
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
BCSplus_init();
P1SEL=0X00;
P1DIR|=0X01;
P1OUT|=0X01;
while
(1)
{
P1OUT^=0X01;
_delay_cycles(500000);
}
}
voidBCSplus_init(void)
{
BCSCTL2=SELM_0+DIVM_0+DIVS_0;
if(CALBC1_1MHZ!
=0xFF){
DCOCTL=0x00;
BCSCTL1=CALBC1_1MHZ;/*SetDCOto1MHz*/
DCOCTL=CALDCO_1MHZ;
}
BCSCTL1|=XT2OFF+DIVA_0;
}
试题6:
串口控制小灯亮灭
要求通过串口连接实验箱和计算机,编制程序,从PC机发送字符A到单片机,单片机接收后关闭LED小灯。
发送字符B到单片机,单片机接收后点亮LED小灯。
主程序:
#include"msp430g2553.h"
voidUART_RX(void);
unsignedchartemp;
voidmain(void)
{
//CSL_init();//ActivateGrace-generatedconfiguration
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=BIT0;
P1SEL=BIT1+BIT2;
P1SEL2=BIT1+BIT2;
if(CALBC1_1MHZ!
=0xFF){
DCOCTL=0x00;
BCSCTL1=CALBC1_1MHZ;/*SetDCOto1MHz*/
DCOCTL=CALDCO_1MHZ;
}
UCA0CTL1|=UCSWRST;
UCA0CTL1=UCSSEL_2+UCSWRST;
UCA0MCTL=UCBRF_0+UCBRS_1;
UCA0BR0=104;
UCA0CTL1&=~UCSWRST;
IFG2&=~(UCA0RXIFG);
IE2|=UCA0RXIE;
__bis_SR_register(GIE);
LPM0;
}
#pragmavector=USCIAB0RX_VECTOR
__interruptvoidUSCI0RX_ISR_HOOK(void)
{
UART_RX();
}
voidUART_RX(void)
{
temp=UCA0RXBUF;
if(temp=='B')
P1OUT|=BIT0;
Elseif(temp=='A')
P1OUT&=~BIT0;
while(!
(IFG2&UCA0TXIFG));
UCA0TXBUF=temp;
}
题7:
串口通信
要求通过串口连接实验箱和计算机,编制程序,从PC机发送字符到单片机,单片机在LCD上显示接收到的字符。
#include
#include
#include
#include
voidUART_RX(void);
unsignedchartemp;
voidmain(void)
{
//CSL_init();//ActivateGrace-generatedconfiguration
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=BIT0;
P1SEL=BIT1+BIT2;
P1SEL2=BIT1+BIT2;
if(CALBC1_1MHZ!
=0xFF){
DCOCTL=0x00;
BCSCTL1=CALBC1_1MHZ;/*SetDCOto1MHz*/
DCOCTL=CALDCO_1MHZ;
}
UCA0CTL1|=UCSWRST;
UCA0CTL1=UCSSEL_2+UCSWRST;
UCA0MCTL=UCBRF_0+UCBRS_1;
UCA0BR0=104;
UCA0CTL1&=~UCSWRST;
IFG2&=~(UCA0RXIFG);
IE2|=UCA0RXIE;
__bis_SR_register(GIE);
LPM0;
}
#pragmavector=USCIAB0RX_VECTOR
__interruptvoidUSCI0RX_ISR_HOOK(void)
{
UART_RX();
}
voidUART_RX(void)
{
temp=UCA0RXBUF;
TCA6416A_Init();
HT1621_init();
LCD_DisplayDigit(temp-48,6);
HT1621_Reflash(LCD_Buffer);
while(!
(IFG2&UCA0TXIFG));
UCA0TXBUF=temp;
}
r
试题8:
定时器
使用单片机的内部定时器模块,制作电子钟并通过液晶显示时间信息。
电子钟能正常运行时在LCD液晶上显示”XX:
XX:
XX”(时分秒)
主程序:
#include
#include
#include
#include
inti,j=0,a1,a2,a3;
voidjs();
voidGPIO_init();
main()
{
WDTCTL=WDTPW+WDTHOLD;
TCA6416A_Init();
HT1621_init();
GPIO_init();
js();
}
voidjs(void)
{
TCA6416A_Init();
HT1621_init();
_DINT();
while
(1)
{
i++;
if(i%2)
{
LCD_DisplaySeg(99);
LCD_DisplaySeg(83);
}
if(i%2==0)
{
LCD_ClearSeg(83);
LCD_ClearSeg(99);
}
a1=i/3600;
a2=(i-a1*3600)/60;
a3=i-a1*3600-a2*60;
LCD_DisplayDigit(a1/10%6,1);
LCD_DisplayDigit(a1%10,2);
LCD_DisplayDigit(a2/10%6,3);
LCD_DisplayDigit(a2%10,4);
LCD_DisplayDigit(a3/10%6,5);
LCD_DisplayDigit(a3%10,6);
__delay_cycles(1000000);
HT1621_Reflash(LCD_Buffer);
}
}
voidGPIO_init()
{
P1REN|=BIT3;
P1OUT|=BIT3;
P1DIR&=~BIT3;
P1IES|=BIT3;
P1IE|=BIT3;
}
试题9:
温度测量显示
要求MSP430G2553单片机ADC,内部温度传感器进行测量,并把温度结果通过LCD显示。
要求画出硬件接线图。
主程序:
#include
#include
#include
#include
#include
#include
voidADC10_init(void);
voidBCSplus_init(void);
longIntDegc;
unsignedintValue;
intmain(intargc,char*argv[])
{
//WDTplus_init();
WDTCTL=WDTPW+WDTHOLD;
TCA6416A_Init();
HT1621_init();
BCSplus_init();
ADC10_init();
while
(1)
{
ADC10CTL0|=ENC+ADC10SC;
//while(ADC10DTCL1&BIT0);
Value=ADC10MEM;
IntDegc=((Value-673)*423)/1024;
LCD_DisplayDigit(IntDegc/100,1);
LCD_DisplayDigit(IntDegc/10%10,2);
LCD_DisplayDigit(IntDegc%10,3);
LCD_DisplaySeg(24);
LCD_DisplaySeg(51);
LCD_DisplaySeg(55);
LCD_DisplaySeg(54);
LCD_DisplaySeg(50);
LCD_DisplaySeg(63);
LCD_DisplaySeg(57);
LCD_DisplaySeg(56);
LCD_DisplaySeg(59);
HT1621_Reflash(LCD_Buffer);
}
//return(0);
}
试题10:
信号周期检测,并通过串口显示。
要求利用定时器的输入捕捉功能,检测输入信号周期,并通过串口发送给PC显示。
#include"msp430g2553.h"
unsignedchartemp;
unsignedcharstring[]="Pleaseinputcontrolednumber:
";
voidputchar(unsignedcharc);
voidputstr(unsignedchar*s);
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//StopWDT
if(CALBC1_1MHZ==0xFF)//Ifcalibrationconstanterased
{
while
(1);//donotload,trapCPU!
!
}
DCOCTL=0;//SelectlowestDCOxandMODxsettings
BCSCTL1=CALBC1_1MHZ;//SetDCO
DCOCTL=CALDCO_1MHZ;
P1DIR|=BIT6;
P1DIR|=BIT2;//P1.2UART_TX
P1DIR&=~BIT1;//P1.2UART_RX
P1SEL|=BIT1+BIT2;//selectP1.1andP1.2asUARTport
P1SEL2|=BIT1+BIT2;
UCA0CTL1|=UCSWRST;
UCA0CTL1=UCSSEL_2+UCSWRST;
UCA0MCTL=UCBRF_0+UCBRS_1;
UCA0BR0=104;
UCA0CTL1&=~UCSWRST;
IE2|=UCA0RXIE;
_EINT();
putstr(string);
LPM0;
//__bis_SR_register(LPM0_bits+GIE);//EnterLPM0,interruptsenabled
}
#pragmavector=USCIAB0RX_VECTOR
__interruptvoidUSCIA0_ISR(void)
{
while(!
(IFG2&UCA0TXIFG));//USCI_A0TXbufferready?
UCA0TXBUF=UCA0RXBUF;
temp=UCA0RXBUF;
if(temp=='A')
{
P1OUT|=BIT6;
}
else
{
P1OUT&=~BIT6;
}
}
voidputchar(unsignedcharc)
{
while(!
(IFG2&UCA0TXIFG));
UCA0TXBUF=c;
}
voidputstr(unsignedchar*s)
{
IE2&=~UCA0RXIE;
while((*s)!
=0)
{
putchar(*s);
s++;
}
putchar('\n');
IE2|=UCA0RXIE;
}
TACTL=TASSEL_2+MC_2+TAIE+TACLR;TACTL=TASSEL_2+MC_2+TAIE+TACLR;
试题11:
PWM控制小灯亮度
要求利用LaunchPad开发板上P1.3按键,P1.6TA输出口接LED(用跳线帽连接),编写一段代码,通过按键改变PWM占空比,从而改变LED亮度。
要求至少实现四级亮度变化。
#include
voidGPIO_init();
voidBCSplus_init(void);
voidP1_IODect();
voidP13_Onclick();
voidmain()
{
WDTCTL=WDTPW+WDTHOLD;
GPIO_init();
_EINT();
_enable_interrupts();
while
(1)
{