单片机20道复习题参考答案doc.docx

上传人:b****9 文档编号:25397473 上传时间:2023-06-08 格式:DOCX 页数:28 大小:232.20KB
下载 相关 举报
单片机20道复习题参考答案doc.docx_第1页
第1页 / 共28页
单片机20道复习题参考答案doc.docx_第2页
第2页 / 共28页
单片机20道复习题参考答案doc.docx_第3页
第3页 / 共28页
单片机20道复习题参考答案doc.docx_第4页
第4页 / 共28页
单片机20道复习题参考答案doc.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

单片机20道复习题参考答案doc.docx

《单片机20道复习题参考答案doc.docx》由会员分享,可在线阅读,更多相关《单片机20道复习题参考答案doc.docx(28页珍藏版)》请在冰豆网上搜索。

单片机20道复习题参考答案doc.docx

单片机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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1