单片机20道复习题参考答案doc.docx
《单片机20道复习题参考答案doc.docx》由会员分享,可在线阅读,更多相关《单片机20道复习题参考答案doc.docx(28页珍藏版)》请在冰点文库上搜索。
单片机20道复习题参考答案doc
1.用P0口驱动LED灯,要求循环左移,从右向左每次两个LED灯亮,程序重复
执行。
【一个排线。
排1(PO-LED)]
#include
DelaylOms(SO);
(
^include
LED=LED«2;
unsignedchara,b;
voidDelaylOms(unsignedintc);
if(P0==OxCO)
for(;c>O;c-)
main()
{
{
{
LED=0x03;
for(b=38;b>0;b-)
unsignedcharLED;
(
LED=0x03;
)
for(a=130;a>0;a~);
while
(1)
}
)
{
}
}
P0=LED;
voidDelaylOm$(unsignedintc)
}
2.用P0口驱动LED灯做左右跑马灯程序,先向左侧跑马,每次左移2位,初始时是2位LED灯亮,以后每次2个灯亮。
待4次过后,再向右侧跑马,每次右移1位,初始时是1位LED灯亮,以后每次1个灯亮,执行8次。
程序重
复执行。
【一个排线。
排1(PO-LED)】
存include
LED=LED«2;P0=LED;}
(
ftinclude
unsignedchara,b;
voidDelaylOms(unsignedintc);〃延时
Delayl0ms(50);
for(;c>0;c・・)
10ms
LED=0x80;P0=LED;
(
main。
for(i=0;i<7;i++)
for(b=38;b>0;b-)
(
(Delayl0ms(50);
(
unsignedcharLED;
LED=LED»l;P0=LED;}
for(a=130;a>0;a~);
unsignedchari;
//Oxfe=llll1110
}
LED=0x03;
Delayl0ms(50);
}
while
(1)
/
LED=OxO3;PO=LED;
}
\
P0=LED;
}
for(i=0;i<3;i*+)
}
{Delayl0ms(50);
voidDelaylOms(unsignedintc)
3.用按键选择LED灯做左右移动实验,3个按钮,K1对应P1.0,K2对应P1.1,K3对应Pl.2,K1按下让LED灯左移1位循环,K2按下让LED灯右移1位循环,K3按下,8个灯全亮。
【两个排线。
排1(PO-LED)排2(P1-独立按键)】
I
voidDelaylOms(unsignedintc);
unsignedcharKey_Scan();
if(K2==0)
elseif(keyNum==2)
keyValue=2;
ledValue=0x01;
for(a=130;a>0;a-);
DelaylOms(l);
GPIO_LED=ledValue;
if(K3==0)
voidDelaylOms(unsignedintc)
unsignedchara,b;
keyValue=3;
4.单个静态数码管流动显示HELLO-LACo【一个排线。
排1(PO-・JP3(右上角))】
unsignedchara,b;
for(;c>0;c・・)
(
for(b=38;b>0;b-)
(
for(a=130;a>0;a-);
#lnclude
WdefineGPIO_DIGPO
voidDelaylOms(unsignedintc);
unsignedcharcode
DIG_CODE[10)={0x76,0x79,0x38,0x38,0x3f,0x4
0,0x38,0x77,0x39};
voidmain(void)
(
unsignedchari=0;
while(l)
GPIO_DIG=~DIG_CODE[i];
i++;
if(i==10)
{
i=0;
}
Delayl0ms(50);
}
}
voidDelayl0m$(unsignedintc)
5.8位动态数码管显示BAD-FOODo【两个排线。
排1(P0-LED)排2(P1-J16)
ttinclude
#defineGPIO_DIGP0
^defineGPIO.PLACEPl
unsignedcharcodeDIG_PLACE[8]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedcharcodeDIG_CODE[8]
{0x7c,0x77,0x5e,0x40,0x7L0x3f,0x3f,0x5e};
unsignedcharDisplayData(8);
voidDigDisplayO;
voidmain(void)
(
unsignedchari;
for(i=0;i<8;i++)
(
DisplayData(i)=DIG_CODE(i];
}
while(l)
(
DigDisplayO;
}
}
voidDigDisplay()
unsignedchari;
unsignedintj;
for(i=0;i<8;i++)
(
GPIO_PLACE=DIG_PLACE[i]
GPIO_DIG=DisplayData[i];
j=10;
whlle(j-);
GPIO_DIG=0x00;
}
}
6.矩阵键盘,按键移位,按键8次,显示“8765ABCD”。
voidDigDisplayO
(
unsignedchari;
unsignedintj;
for(i=0;i<8;i++)
(
switch(i)
{
case(O):
LSA=O;LSB=O;LSC=O;break;
case(l):
LSA=l;LSB=O;LSC=O;break;
case
(2):
LSA=0;LSB=l;LSC=0;break;
case(3):
LSA=l;LSB=l;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=l;break;
case(5):
LSA=l;LSB=0;LSC=l;break;
case(6):
LSA=0;LSB=l;LSC=l;break;
case(7):
LSA=l;LSB=l;LSC=l;break;
}
GPIO_DIG=DisplayData[i];
j=10;
while(j-);
GPIO_DIG=OxOO;
}
}
voidKeyDown(void)
(
unsignedinta=0;
GPIO_KEY=OxOf;
if(GPIO_KEY!
=OxOf)
(
DelaylOms(l);
a=0;
if(GPIO_KEY!
=OxOf)
{
KeyState=l;
GPIO_KEY=OXOF;
#include
^defineGPIO_DIGPO
WdefineGPIO_KEYPl
sbitLSA=P2A2;
sbitLSB=P2A3;
SbitLSC=P2A4;
unsignedcharcodeDIG_CODE[17]=(
0x5e,0x39,0x7c,0x00,0x77,0x6d,0x7d,0x00,0x07,0x
7f};
unsignedcharKeyValue;
unsignedcharKeyState;
unsignedcharDlsplayData[8];
voidDelaylOms(unsignedintc);
voidKeyDownf);
voidDigDisplay();
voidmain(void)
{
KeyState=O;
while(l)
{
KeyDown();
if(KeyState==l)
(
DisplayData[7]=DisplayData[6);
Di$playData(6)=Di$playData(5);
DisplayData[5]=DisplayData(4);
DisplayData[4]=DisplayData[3];
DisplayData[3]=DisplayData[2];
DisplayData[2]=DisplayData[l);
DisplayData[l]=DisplayData(O);
DisplayData[Oj=DIG_CODE[KeyValue];
KeyState=O;
)
DigDisplay();
switch(GPIO_KEY)
{
case(0X07):
KeyVaIue=0;break;
case(0X0b):
KevValue=4;break;
case(OXOd):
KeyValue=8;break;
ca$e(0X0e):
KeyValue=12;break;
}
GPIO_KEY=OXFO;
switch(GPIO_KEY)
(
ca$e(0X70):
KeyValue=KeyValue+3;break;
case(OXbO):
KeyValue=KeyValue+2;break;
case(OXdO):
KeyValue=KeyValue+l;break;
case(OXeO):
break;
while((a<50)&&(GPIO_KEY!
=0xf。
))
(
DelaylOms(l);
a++;
a=0;
}
}
}
voidDelaylOms(unsignedintc)
{
unsignedchara,b;
for(;c>O;c・・)
{
for(b=38;b>0;b・・)
(
for(a二130;a>0;a・・);
)
7.RS232串口发送试验,通过串口发送“好好学习天天向上”到电脑,上位机用串口调试助手一直接收“好好学习天天向上”O
TH1=OXF3;
unsignedchara,b;
8.用TO定时器(P3.4端子)做计数器中断实验,计数器端(P3.4)
来的脉冲取自端子Pl.7。
P1.7端子产生方波信号。
P0.0SHUCHU
Pulse=0;
case2:
LS138A=0;LS138B=1;LS138C=0;break;
case3:
LS138A=1;LS138B=1;LS138C=0;break;
case4:
LS138A=0;LS138B=0;LS138C=1;break;
case5:
IS138A=1;LS138B=0;LS138C=1;break;
case6:
LS138A=0;LS138B=1;LS138C=1;break;
case7:
LS138A=1;LS138B=1;LS138C=1;break;
}
delay(150);
}
}
voidmain(void)
(
PO=Oxff;
Pl=Oxff;
P2=0xff;
IT0=l;
EA=1;
EXO=1;
while(l)
(
display。
;
}
}
voidcounter(void)interrupt0
(
EXO=O;
LedNumVal++;
9.4位数码管上显示外部中断计数,用单片机通过译码器控制数码管和外部中断使用,P0口接显示,中断来自于独立按键控制,每当按下一次按键,中断里的某个作为计数的变量加lo[P3.2-按键。
P2.2、3、4-A\B\CoPO-LED]
^include
^include
sbitLS138A=P2A2;
sbitLS138B=P2A3;
sbitLS138C=P2A4;
unsignedintLedNumVal=0,LedOut[8];
unsignedcharcodeDisp_Tab[]=
{~0xC0,~0xF9广0xA4广OxBO广0x99广0x92广0x82广0xF8广0x80尸0x90,~0x88广0x83,
~0xC6广OxAl广0x86广0xbf,~0xc7广0x8c广Oxcl,~Oxff,~0xf7
voiddelay(unsignedinti)
(
charj;
for(i;i>0;i・・)
for(j=200;j>0;j・・);
display^
{unsignedchari;
LedOut(0)=Disp_Tab(LedNumVal%10000/1000];
LedOut[l)sDisp_Tab(LedNumVal%1000/100]&0x7f;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
for(i=0;i<8;i++)
{P0=LedOutfi);
switch(i)
{
case0:
LS138A=0;LS138B=0;LS138C=0;break;
case
1:
LS138A=1;LS138B=0;LS138C=0;break;
EXO=1;
voidUsartConfiguration()
{
SCON=0X50;
TMOD=0X20;
PCON二0X80;
TH1=OXF3;
TL1=OXF3;
TR1=1;
}
voidDigDisplayO
(
unsignedchari;
unsignedintj;
for(i=0;l<8;iw)
{
switch(i)
{
case(O):
LSA=O;LSB=O;LSC=O;break;
case(l):
LSA=1;LSB=O;LSC=O;break;
case
(2):
LSA=O;LSB=1;LSC=O;break;
case⑶:
LSA=1;LSB=1;LSC=O;break;
case(4):
LSA=O;LSB=O;LSC=1;break;
case(5):
LSA=1;LSB=O;LSC=1;break;
case(6):
LSA=O;LSB=1;LSC=1;break;
case(7):
10.单片机将串口接收到的数据以10进制显示在数码管上。
(用单
片机通过译码器控制数码管的位选端子。
)【P2.2、3、4.译码
器的A、B、CoPO-LED]
#include
#defineGPIO_DIGP0
sbitLSA=P2A2;
sbitLSB=P2A3;
sbitLSC=P2A4;
unsignedcharcodeDIG_CODE[17]=(
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedcharDlsplayData[8];
voidDigDisplayO;
voidUsartConfiguration();
voidmain()
(
unsignedcharreceiveData;
UsartConfiguration();
while(l)
(
if(RI==1)
(
receiveData=SBUF;
RI=0;
DisplayDatafO]=0x00;
DisplayDatafl]=DIG.CODE(receiveData/100];
DisplayData[2]=DIG_CODE[receiveData%100/10];
DisplayData[3]=DIG_CODE[receiveData%10];
DisplayData⑷=0x00;
DisplayData(5)=DIG_CODE(receiveData/100);
DisplayData⑹=DIG_CODE(receiveData%100/10];
DisplayData[7]=DIG_CODE[receiveData%10];
)
DigDisplay();
LSA=1;LSB=1;LSC=1;break;
GPIO_DIG=DisplayData[i];
j=10;
while(j-);
GPIO_DIG二0x00;
)
}
11.用单片机采集8个开关的状态,然后将采集到的结果通过发光二极管显示。
当某一开关闭合时,采集到的数据为“0”,与其对应的发光二极管亮,当某一开关断开时采集到的数据为“1”,与其对应的发光二极管不亮。
^includecase(OxBF):
^include
^defineGPIO.KEYPl
#defineGPIO_LEDP0
voidDelaylOms(unsignedintc);
unsignedcharKey_Scan();
voidmain(void)
(
unsignedcharledValue,keyNum;
ledValue=0x01;
while
(1)
(
keyNum=Key_Scan();
switch(keyNum)
(
case(OxFE):
ledValue=0x01;
break;
case(OxFD):
ledValue=0x02;
break;
case(OxFB):
ledValue=0x04;
break;
case(0xF7):
ledValue=0x08;
break;
case(OxEF):
ledValue=0x10;
break;
case(OxDF):
ledValue=0x20;
break;
ledValue=0x40;
break;
case(0x7F):
ledValue=0x80;
break;
default:
break;
}
GPIO_LED=ledValue;
}
)
unsignedcharKey_Scan()
{
unsignedcharkeyValue=0J;
if(GPIO_KEY!
=OxFF)
(
DelaylOms(l);
if(GPIO_KEY!
=OxFF)
(
keyValue=GPIO.KEY;
i=0;
while((i<50)&&(GPIO.KEY!
=OxFF))
(
DelaylOms(l);
f
}
}
}
returnkeyValue;
)
voidDelaylOm$(unsignedintc)
for(a=130;a>0;a-);
}
unsignedcharazb;
for(;c>O;c-)
(
for(b=38;b>0;b-)
12.用单片机控制八个发光二极管进行花样显示,显示规律为:
(1)八个LED依次左移点亮,
(2)八个LED依次右移点亮,然后再从⑴进行循环。
【一个排线。
排l(PO-LED)]#include
PO=LED;
Delayl0ms(50);
LED=LED»1;
LED=LED|0x80;
}
voidDelaylOms(unsignedintc);
unsignedcharLED;
voidmain()
(
unsignedchari;
〃“首先赋值LED-//
LED=0x01;
for(d=2;d>0;d-)(
13.制作一个0・9的数秒器,并将计数值在数码上显示出来。
【P0・JP3】
#include
^defineGPIO_DIGP0
voidDelayl0ms();
unsignedcharcodeDIG_CODE[10]={0x3Fr0x06z0x5B,0x4F,0x66,0x6D,0x7D,
0x07,0x7F,Ox6F};
voidmain(void)
(
unsignedchari=0;
while(l)
GPIO_DIG=~DIG_CODE[i];
for(c=200;c>0;c-)
{
for(b=10;b>0;b-)
for(a=124;a>0;a-);
}
}}
}
14.设计一个4*4的行列式键盘,当按下某一个按键时,在LED数码管
上显示该按键的键号。
【P0-JP3。
Pl・独立按键。
74HC165短接帽断
case(OXOb):
KeyValue=4;break;
15.设计一个流水花样灯。
花样灯由八个发光二极管构成,正常情况下花样灯正反向循环流水点亮,控制按钮SW按下时,花样灯中的发光二极管交替点亮,当SW断开后花样灯恢复至正常状态。
按键通
过外部中断实现。
【PO-LED。
P3.2■独立按键】
{
for(b=38;b>0;b-)
#include
voidUsartConfiguration();
voidmain()
{
UsartConfiguration();
while(l)
(
)
}
voidU$artConfiguration()
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=OXF3;
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitledl=PlA0;
ucharnum;
voidmain()
{
TMOD=0x01;
TH0=(65536・4S872)々56;
TLO二(65536・45872)%256;
EA=1;
ETO=1;
TRO=1;
while(l)
17.由串口调试助手发送“考生姓名和学号”给单片机,单片机接收到
后返回给串口调试助手。
TL1=OXF3;
ES=1;
EA=1;
TR1=1;
}
voidUsart()interrupt4
(
unsignedcharreceiveData;
receiveData=SBUF;
RI=O;
SBUF=receiveData;
whil