单片机上机操作考试题部分答案.docx
《单片机上机操作考试题部分答案.docx》由会员分享,可在线阅读,更多相关《单片机上机操作考试题部分答案.docx(31页珍藏版)》请在冰豆网上搜索。
单片机上机操作考试题部分答案
1.使得8个发光二极管循环点亮,采用定时器方式0使得每个发光二极管点亮的时间为。
#include<>
#include<>
#defineucharunsignedchar
ucharT_count=0;
成下面电路所示的功能,K1,K2对应两个开关按键。
P1口对应发光二极管的状态
K1=0,K2=0
○
○
○
○
○
○
○
○
K1=0,K2=1
●
●
●
●
○
○
○
○
K1=1,K2=0
●
●
○
○
●
●
○
○
K1=1,K2=1
●
●
●
●
●
●
●
●
#include<>
#defineuintunsignedint
#defineucharunsignedchar
sbitk1=P3^2;
sbitk2=P3^3;
一个数码管上循环显示“H”“E”“L”“L”“O”,循环的时间为1s。
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0xf6,0xf9,0xb8,0xb8,0xbf};
ucharT_count=0;
uchari=1;
voidt0Proc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
if(++T_count==10)
{
P0=tab[i];
i=(i+1)%5;
T_count=0;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
P0=tab[0];6个数码管上分别显示自己学号的后六位数字。
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={};一个简易30s的倒计时秒表,秒表的显示通过8个发光二极管显示出来。
#include<>
#defineucharunsignedchar
voiddelay1s()
{
uchari;
for(i=0;i<10;i++)
{
TH1=0x3c;
TL1=0xb0;
TR1=1;用外中断0来控制,去实现下列功能。
其中K1为按键,P1口对应8个发光二极管的状态
无按键按下(循环)
●
●
○
○
●
●
○
○
●
●
●
●
○
○
●
●
有按键按下
●
●
●
●
○
○
○
○
#include<>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetab[]={0xcc,0x30};
sbitk1=P3^2;
采用定时器方式1使得8个发光二极管按如下方式点亮,循环的时间为2s
○
○
○
○
●
●
●
●
●
●
●
●
○
○
○
○
●
●
○
○
●
●
○
○
●
●
●
●
●
●
●
●
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0x0f,0xf0,0xcc,0x00};
ucharT_count=0;
uchari=1;
voidt0Proc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
if(++T_count==20)
{
P0=tab[i];
i=(i+1)%4;
T_count=0;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
P0=tab[0];一个数码管上循环显示“0”“1”“5”3个数字,循环的时间为1s。
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0xbf,0x86,0xed};
ucharT_count=0;
uchari=1;
voidintoProc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
if(++T_count==10)
{
P0=tab[i];
i=(i+1)%3;
T_count=0;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
P0=tab[0];4个数码管上稳定显示出“A”“C”“E”“P”四个字符。
#include<>
#defineucharunsignedchar
#defineuintunsignedint
voiddelay(uintx)
{
uchari;
while(x--)
{
for(i=0;i<100;i++);
}
}
voidmain()
{
while
(1)
{
P0=0xf7;一个20s的简易秒表,当按键K1按下时,秒表暂停计数,K2按下时,开始计数。
#include<>
#defineuintunsignedint
#defineucharunsignedchar
uchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbitk1=P3^2;
sbitk2=P3^3;
ucharT_count=0;
uchari=0;
voiddelay(intx)
{
uchari;
while(x--)
{
for(i=0;i<100;i++);
}
}
voidt0Proc()interrupt1
{
TH0=0x3c;用外中断1来控制,当无按键按下时8个发光二极管循环点亮,循环点亮的时间为1s,有按键按下时,8个发光二极管全部熄灭。
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
sbitk1=P3^2;
ucharcodetab[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
ucharT_count=0;
uchari=1;
完成下面电路所示的功能,K1,K2对应两个开关按键。
P1口对应发光二极管的状态
K1=0,K2=0
●
●
●
●
●
●
●
●
K1=0,K2=1
●
●
●
●
○
○
○
○
K1=1,K2=0
○
○
○
○
●
●
○
○
K1=1,K2=1
○
●
○
●
○
●
○
●
#include<>
#defineuintunsignedint
#defineucharunsignedchar
sbitk1=P3^2;
sbitk2=P3^3;
成下面电路的功能,P1口对应发光二极管的状态,状态1显示的时间为1s,状态2显示的时间为2s,状态3显示的时间为3s,如此循环
状态1
●
○
●
状态2
○
●
●
状态3
●
●
○
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0x05,0x06,0x03};
ucharT_count=0;
ucharState=0;
uchari=1;
voidt0Proc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
switch(State)
{
case0:
if(++T_count==10)
{
P1=~tab[i];
i=(i+1)%3;
T_count=0;
State=1;
}
break;
case1:
if(++T_count==20)
{
P1=~tab[i];
i=(i+1)%3;
T_count=0;
State=2;
}
break;
case2:
if(++T_count==30)
{
P1=~tab[i];
i=(i+1)%3;
i=1;
T_count=0;
State=0;
}
break;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
P1=~tab[0];
while
(1);
}
18.彩灯系统,实现8个发光二极管从左到右点亮,每个发光二极管点亮的时间为2s,然后从右到左亮,每个发光二极管点亮的时间为.
#include<>
#include<>
#defineucharunsignedchar
ucharcodetab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
ucharcodetab1[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
ucharState=0;
ucharT_count=0;
uchari=1;
voidt0Proc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
switch(State)
{
case0:
if(++T_count==20)
{
P2=tab[i];
i=(i+1)%8;
if(i==7)
{
State=1;
}
T_count=0;
}
break;
case1:
if(++T_count==15)
{
i=(i+1)%8;
P2=tab1[i];
if(i==7)
{
State=0;
i=1;
}
T_count=0;
}
break;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
P2=tab[0];
while
(1);
}
19.在4个数码管上显示出当天的日期。
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0x06,0x5b,0x06,0x6f};
voiddelay(intx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
voidmain()
{
P0=tab[0];
P2=tab[1];
P3=tab[2];
P1=tab[3];
delay(500);
}
20.完成下面电路的功能,P1口对应发光二极管的状态,状态1显示的时间为3s,状态2显示的时间为1s,状态3显示的时间为,状态4显示的时间为,如此循环
状态1
○
○
●
●
状态2
○
●
●
●
状态3
●
●
●
●
状态4
○
○
○
○
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0x0c,0x0e,0x0f,0x00};
ucharT_count=0;
ucharState=0;
uchari=1;
voidt0Proc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
switch(State)
{
case0:
if(++T_count==30)
{
P1=~tab[i];
i=(i+1)%4;
T_count=0;
State=1;
}
break;
case1:
if(++T_count==10)
{
P1=~tab[i];
i=(i+1)%4;
T_count=0;
State=2;
}
break;
case2:
if(++T_count==5)
{
P1=~tab[i];
i=(i+1)%4;
T_count=0;
State=3;
}
break;
case3:
if(++T_count==1)
{
P1=~tab[i];
i=(i+1)%4;
T_count=0;
State=0;
}
break;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
P1=~tab[0];
while
(1);
}
23.数码管数字显示控制程序设计。
控制要求:
用按键K1和K2分别控制数码管显示数字0~9的顺序,当按下K1键时按从0到9的顺序显示,当按下K2时按从9到0的顺序显示。
时间间隔均为1秒。
硬件电路如图所示。
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodetab2[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
ucharT_count=0;
sbitk1=P1^0;
sbitk2=P1^1;
uchari=0;
voidt0Proc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
if(++T_count==10)
{
T_count=0;
i=(i+1)%10;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
P0=~0x3f;
while
(1)
{
if(k1==0&&k2==1)
{
P0=~tab1[i];
}elseif(k1==1&&k2==0)
{
P0=~tab2[i];
}
}
}
24.89C51与PC通过串口通信,单片机采用方式3串行通信,晶振都采用12MHz,波特率为1200Baud。
要求:
当单片机收到PC发来的数据“S”后,将30H-3FH的16个字节发送给乙机,当单片机收到“P”H时就发40H-5FH的32个字节数据。
#include<>
#include<>
char*startPoint;
char*endPoint;
voidsendData()
{
if(startPoint<=endPoint)
{
SBUF=*startPoint;
++startPoint;
}
}
voidstartSend(char*start,char*end)
{
startPoint=start;
endPoint=end;
sendData();
}
voidserialPorc()interrupt4
{
if(TI)
{
TI=0;
sendData();
}
else
{
RI=0;
if(0x53==SBUF)
{
startSend(0x30,0x3f);
}
elseif(0x50==SBUF)
{
startSend(0x40,0x5f);
}
}
}
voidmain()
{
TMOD=0x20;
TH1=0xe6;
TL1=0xe6;
TR1=1;
SCON=0xd0;
EA=1;
ES=1;
while
(1);
}
25.交通控制系统,如下图所示,是交叉路口,要求:
绿灯亮9秒后,黄灯闪3秒,后红灯亮9秒,两个数码管分别显视各种灯所剩余时间。
#include<>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
ucharcodetab1[]={0x4f,0x5b,0x06,0x3f};
sbitRED_A=P0^0;
sbitYELLOW_A=P0^1;
sbitGREEN_A=P0^2;
sbitRED_B=P0^3;
sbitYELLOW_B=P0^4;
sbitGREEN_B=P0^5;
ucharOperation_Type=1;//操作类型变量
ucharT_count=0;
uchari=0;
voidt0Proc()interrupt1
{
TH0=0x3c;
TL0=0xb0;
switch(Operation_Type)
{
case1:
//红灯亮
RED_A=0;
YELLOW_A=1;
GREEN_A=1;
RED_B=0;
YELLOW_B=1;
GREEN_B=1;
if(++T_count==90)
{
T_count=0;
Operation_Type=2;
i=0;
}
if(T_count%10==0)
{
P3=~tab[i];
P1=~tab[i];
i=(i+1)%10;
}
break;
case2:
//黄灯闪
RED_A=1;
YELLOW_A=~YELLOW_A;
GREEN_A=1;
RED_B=1;
YELLOW_B=~YELLOW_B;
GREEN_B=1;
if(++T_count==30)
{
T_count=0;
Operation_Type=3;
i=0;
}
if(T_count%10==0)
{
P3=~tab1[i];
P1=~tab1[i];
i=(i+1)%3;
}
break;
case3:
//绿灯亮
RED_A=1;
YELLOW_A=1;
GREEN_A=0;
RED_B=1;
YELLOW_B=1;
GREEN_B=0;
if(++T_count==90)
{
T_count=0;
Operation_Type=1;
i=0;
}
if(T_count%10==0)
{
P3=~tab[i];
P1=~tab[i];
i=(i+1)%10;
}
break;
}
}
voidmain()
{
TMOD=1;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
P1=~tab[0];
P3=~tab[0];
while
(1);
}
26用外部中断1实现加计数功能,并将计数值输出到数码管上显示。
#include<>
#defineucharunsignedchar
#defineuintunsignedint
//0~9的段码
ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//计数值分解后各个待显示的数位
ucharDSY_Buffer[]={0,0,0};
ucharCount=0;
sbitClear_Key=P3^6;
//数码管上显示计数值
voidShow_Count_ON_DSY()
{
DSY_Buffer[2]=Count/100;//获取3个数
DSY_Buffer[1]=Count%100/10;
DSY_Buffer[0]=Count%10;
if(DSY_Buffer[2]==0)//高位为0时不显示
{
DSY_Buffer[2]=0x0a;
if(DSY_Buffer[1]==0)//高位为0,若第二位为0同样不显示
{
DSY_Buffer[1]=0x0a;
}
}
P0=DSY_CODE[DSY_Buffer[0]];
P1=DSY_CODE[DSY_Buffer[1]];
P2=DSY_CODE[DSY_Buffer[2]];
}
//主程序
voidmain()
{
P0=0x00;
P1=0x00;
P2=0x00;
EA=1;
EX1=1;
IT1=1;//下降沿触发
while
(1)
{
if(Clear_Key==0)
{
Count=0;//清0
}
Show_Count_ON_DSY();
}
}
//INT1中断函数
voidEX_INT1()interrup