南阳理工单片机题库编程题doc.docx
《南阳理工单片机题库编程题doc.docx》由会员分享,可在线阅读,更多相关《南阳理工单片机题库编程题doc.docx(15页珍藏版)》请在冰豆网上搜索。
南阳理工单片机题库编程题doc
1、设计一个2*2的行列式键盘(同在P1□)电路并编写键扫描程序。
#include
unsignedcharkey()
{
unsignedcharrow,col=0,k=-1;
P1=0xfc;
if((P1&0xfc)==0xfc)
return(k);
delay20ms();
if((P1&0xfc)==0xfc)
return(k);
for(row=0;row<2;row++)
{
P1=~(1vvrow);
k=P1&0xfc;
if(k!
=Oxfc)
{
while(k&(1«(col+2)))
col++;
k=row*2+col;
P1=0xfc;while(P1&0xfc!
=0xfc);
break;
)
)
returnk;
}
2、编写一函数to_asc,把传送给它的低半字节数据转换成ASCII码,并将其返回。
unsignedcharto_asc(chard)
{d+=0x30;
if(d>0x39)
d+=7;
returnd;
)
3、使用89C52串行口以工作方式3进行串口通信,假定波特率为9600b/s,单片机晶振频率为11.0592MHZo请编写全双工通信程序,以中断方式接受和发送数据,并对数据进行奇偶校验。
设发送的50个数据在片外数据区,地址从0x0010开始的区域,接收的数据保存0x80开始的区域,接收到'$'后表示结束。
#includeunsignedcharxdata*SendBuffer=0x0010;
unsignedcharxdata*RecvBuffer=0x0080;
unsignedchari,j;
bitSendOver,RecvOver;
voidmain()
{
TMOD=0x20;
TH1=0xfd;
TI1=0xfd;
TR1=1;
SCON=OxcO;
ES=1;
EA=1;
ACC=SendBuffer[i++];
TB8=P;
SBUF=ACC;
while
(1);
)
voidSerial()interrupt4
(
if(TI)
TI=O;
ACC=SendBuffer[i++];
TB8=P;
SBUF=ACC;
if(i==50)
SendOver=1;
)
else
{
RI=O
ACC=SBUF;
if(RB8==P)
{
RecvBuffer[j++]=ACC;
if(ACC==,$,)
RecvOver=1;
}
)
)
4、写出单片机C语言程序中语句“TMOD=Ox23;”的功能。
设置T以模式2定时,设置TO以模式3定时。
5、编写一函数查找片外RAM区域中从0x0100开始的200个单元中出现的Oxaa的次数,并将查找的结果从函数中返回。
unsignedcharfind(void)
(unsignedchardatai,d=0;
unsignedcharxdata*p;
i=200;p=0x0100;
while(i-)
if(*(p++)==0xaa)
d++;
returnd;
)
6、对89C52单片机编写程序,使串行口以方式1查询方式自收自发(接收和发送都需要查询),波特率为4800b/s.设单片机的晶振为11.0592MHZo
#include
voidmain()
(
unsignedcharc;
TMOD=0x20;
TH1=0xfa;
TLInoxfa*
TR2;
SCONH0X50"wh=e
(1)
f
wh一-e(RllH0)“Rllo;
CHSBUF*
SBUTPwh--e(Tllno)」T7P
)
7,丑牌浒咨P0口瓣任兼沛甜『p
壮一nccdeAreg5q.hv
unsignedcharcodeLESII
(Ox3foxo6ox5box4fox6uOx6dox7doxo7ox7f『0X6L0X77)
OX7COX39OX59
0X79。
OX7LOX4OOX。
。
)
unsignedchardispbuf[6];
voiddisp()
{
unsignedchari;
for(i=0;i<6;i++)
{
PO=LED[dispbuf[i]];
P1=1«i;
delay()
)
)
8、设fsoc=11.0592MHz,试编写一段程序其功能为对串行口初始化,使之工作与方式1,波特率为1200b/s;并用查询串行口状态的方法,读出接收缓冲区的数据并回送到发送缓冲区。
#include
voidmain()
{
unsignedcharc;
TMOD=2;
TH1=0xe8;
TL1=0xe8;
TR1=1;
SCON=0x50;
while
(1)
{
while(!
RI);
RI=O;
c=SBUF;
SBUF=c;
while(!
TI);
TI=O;
)
)
9、某MCS-51单片机系统使用定时器/计数器TO定时,从P1.0产生频率为1OOkHz等宽
矩形波。
假定单片机的晶振频率为12MHz,不考虑T1。
完成下列各问题:
(1)计算方波周期和T0的定时时间。
(2)计算T0在定时时间内的计算值;
(3)应该选T0以何种模式工作最恰当?
写出模式字TMOD的值;
(4)计算T0的定时初值;
(5)编写主函数和T0中断服务函数,使T0以中断方式P1.0产生方波。
(1)10ps,5ps
(2)5
(3)模式2,TMOD=OX22
(4)251
(5)C语言■程序
#include
sbitP10=0x90;
主函数
main()
(TMOD=Ox22;
TL0=251,TH0=251;
EA=1,ET0=1;
TR0=1;
while
(1);
)
TO中断服务函数:
voidint_tO(void)interrupt1
{P1_0=~P1_0;}
9・1、某MCS-51单片机系统使用定时器/计数器T1定时,产生频率为1000Hz方波声音信号,要求方波信号从P3.5引脚输出。
设fosc=6MHz,不考虑T0.完成下列各问题:
(1)计算声音信号的周期和T0的定时时间。
(2)计算T1在定时时间内的计数值;
(3)应该选T1以何种模式工作最恰当?
写出模式字TMOD的值;
(4)计算T1的定时初值;
(5)编写主函数和T1中断服务函数,使T1以中断方式P3.5引脚产生方波。
(1)1ms,500ps
(2)250
(3)模式2,TMOD=OX25
(4)6
(5)C语言程序
#include
sbitP35=P3A5;
主函数:
main()
(TMOD=Ox25;
TL1=6,TH1=6;
EA=1,ET1=1;
TR1=1;
while
(1);
)
T1中断服务函数:
voidint_t1(void)interrupt3{P35=~P35;}
10、写出单片机c语言程序中语句“TMOD=Ox92;“的功能。
设置T1以模式1定时、外部门控制运行,设置T0以模式2定时。
11、编写一密码锁开锁时的密码核对函数,函数入口参数为开锁者输入的6位十进制数(长整型),系统已经保存有10组密码passw,函数的功能是把输入的数与保存的密码逐个比较,正确时返回1,错误时返回0。
bitcheck_password(longdd)
(unsignedchari;
for(i=0;i<10;i++)
if(passw[i]==dd)
return1;
return0;
)
12、编写函数,查找code区域中从0x0030开始的100个单元中出现0x55的次数,并将查找的结果从函数中返回。
unsignedcharfind(void)
unsignedchari,dd=O;
unsignedcharcode*p;
i=100;
p=0x0030;
while(i-)
if(*(p++)==0x55)
dd++;
returndd;
)
13、设89C52单片机的晶振为11.0592MHz,串行口工作于方式3做数据收发,波特率为
4800b/So完成以下串行通信的初始化工作。
(1)写出T1以模式2定时作为波特率发生器的模式字;
(2)计算T1的计数初值;
(3)写出串行口控制寄存器的控制字;
(4)写出初始化程序段(包括定时器和串行口\
(1)TMOD=0x20
(2)Oxfa
(3)SCON=OxcO
(4)TMOD=0x20;
TH1=0xfa;
TL1=0xfa;
TR1=1;
SCON=OxcO;
14、编写一函数move—data,把程序存储器地址0x30开始的20个字节数据,传送到片内
RAM的数组array中。
unsignedchardataarray[20];
voidmove_data()
{unsignedchari;
unsignedcharcode*pp;
pp=0x30;
for(i=0;i<20;i++)
array[i]=*(pp+i);
}
14・3、编写一函数move—xdata,把程序存储器地址0x200开始的50个字节数据,传送到
片内RAM的数组array中。
unsignedcharxdataarray[50];
voidmove_xdata()
{unsignedchari;
unsignedcharcode*pp;
pp=0x200;
for(i=0;i<50;i++)
array[i]=*(pp+i);
}
15、设89C52单片机的晶振为11.0592MHz,串行口工作于方式3做数据收发,波特率为
9600b/So完成以下串行通信的初始化工作。
(1)写出T1以模式2定时作为波特率发生器的模式字;
(2)计算T1的计数初值;
(3)写出串行口控制寄存器的控制字;
(4)写出初始化程序段(包括定时器和串行口*
(1)TMOD=0x20
(2)Oxfa
(3)SCON=OxcO
(4)TMOD=0x20;
TH1=0xfa;
TL1=0xfa;
TR1=1;
SCON=0x50;
16、编写一函数movejdata,把片外数据存储器地址从0x0000开始的30个字节数据,传送到片内数据存储器地址从0x80开始的地方。
voidmove_idata(){unsignedchari;
unsignedcharidata*pi;
unsignedcharxdata*px;
pi=0x80;px=O;
for(i=0;i<30;i++)
*(pi+i]=*(px+i);
}}
17、某89C52单片机的P1口接8个发光二极管,拟用T1定时中断,控制P1口每250ms输出一次做右移流水灯显示,电路如图所示。
设晶振为6MHz,不考虑TOo完成下列各问题:
(1)P1口各位输出高电平还是低电平发光二极管亮?
(2)拟使T1定时多少ms、中断多少次使P1输出一次?
(3)拟选T1以模式几定时?
写出模式字TMOD的值;
(4)计算T1的定时初值;
(5)编写主函数和T1中断服务函数,实现流水灯功能。
(1)低电平发光二极管亮
(2)125ms;2次
(3)模式1,TMOD=OX11
(4)3036
(5)0语言程序#include
unsignedcharaa=0x80;
主函数:
main()
(TMOD=Ox21;
TL1=220,TH1=11;
EA=1,ET1=1;
TR1=1;
P1=~aa;
while
(1);
)
T1中断服务函数:
voidint_t1(void)interrupt3
{TL0=220,TH0=11;
aa«=1;
P1=~aa;
}
18、编写一函数,对无符号字符型数组用冒泡法从小到大进行排序,函数的入口参数为拟
排序的数组aa的数组的长度mo
voidsort(unsignedcharaa,unsignedcharm)
{unsignedcharl,j,n,tem;
for(i=0;ifo「(j=0;jvn;j++)
{if(aaO]>aaO+1])
{tem=aa[j];
aa[j]=aa[j+1];
aa[j+1]=tem;
}}))
19、在一个fosc为12MHz的89C52系统中接有一片ADC0809,它的地址为7FFFH,试编写ADC0809初始化程序和定时采样通道2的程序(假设采样频率为1ms/次,每次采样4个数据X
#include
#include
defineDAC0809XBYTE[0x7fff]
unsignedcharxdatabuffer[4]_at_OxaO;
voidmain()
(
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
DAC0809=2;
while
(1);
}
voidtimeO_srv()interrupt1
{
unsignedchari;
TH0=0xFC;
TL0=0x18;
for(i=0;i<4;i++)
{
DAC0809=2;
delay();
buffer[i]=DAC0809;
)
)
20、设某MCS-51单片机系统的振荡频率为12MHz,编写程序,用定时器/计数器TO以模式
1定时,中断方式在P1.0引脚产生周期为1000ps的方波。
假设没有使用T0.
(1)定时时间为1000ps/2,
计数值为1000|js/2/机器周期=500,T0初值为65036
(2)(3语言程序:
#include
sbitP10=P1A0;
主函数:
main()
{TMOD=Ox21;
TL0=12;TH0=254;
EA=1;ET0=1;
TR0=1;
while
(1);
)
TO中断服务函数:
voidint_tO(void)interrupt1
{TL0=12;TH0=254;P10=~P10;
}