单片机上机试题

  • 格式:doc
  • 大小:100.00 KB
  • 文档页数:13

1

《单片机应用技术》上机试题

题目一:

用外中断0控制P1口8位LED循环点亮,即按下一次按键,点亮一个灯,再按下按键左移一位点亮,如此循环。设计并仿真出结果。

题目二:

自行设计出一组数据,并让P2口的8位LED按照设计的这组数据顺序进行花样点亮,间隔0.2秒,仿真出结果。

题目三:

自行设计一个按键上具有三个功能,即第一次按下按键时,第一个灯点亮;第二次按下按键,第二个灯点亮;第三次按下按键,第三个灯点亮;第四次按下按键,又是第一个灯点亮,如此循环,仿真出结果。

题目四:

用P2口作输出口,接一位LED数码管,编写程序,使数码管循环显示0~9这十个数,并用定时器T0实现数码管显示间隔0.5秒,设计并仿真出结果。

题目五:

用P2口作输出口,接一个8位的数码管排,采用动态显示的方法,编写程序,是这个数码管排同时显示0~7这八个数,设计并仿真出结果。

题目六:

用单片机U1通过串行口TXD端将一段流水灯控制码以串行口工

2

作方式一发送至单片机U2的RXD,U2再利用该段控制码流水点亮其P1口上的8位LED。设计并编写程序,其中发送程序已知,根据发送程序编写出接收程序,仿真出结果。

数据发送程序:

#include //包含单片机寄存器的头文件

Unsigned char code

Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

//流水灯控制码,该数组被定义为全局变量

/*****************************************************

函数功能:向PC发送一个字节数据

***************************************************/

void Send(unsigned char dat)

{

SBUF=dat;

while(TI==0)

;

TI=0;

}

/**************************************************************

函数功能:延时约150ms

**************************************************************/

void delay(void)

{

unsigned char m,n;

for(m=0;m<200;m++)

for(n=0;n<250;n++)

;

}

/*****************************************************

函数功能:主函数

***************************************************/

void main(void)

{

unsigned char i;

TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2

SCON=0x40; //SCON=0100 0000B,串口工作方式1

PCON=0x00; //PCON=0000 0000B,波特率9600

TH1=0xfd; //根据规定给定时器T1赋初值

TL1=0xfd; //根据规定给定时器T1赋初值

TR1=1; //启动定时器T1

3

while(1)

{

for(i=0;i<8;i++) //模拟检测数据

{

Send(Tab[i]); //发送数据i

delay(); //每150ms发送一次检测数据

}

}

}

题目7

数码管显示4*4键盘矩阵按键,编程实现数码管显示按键的键值0~F。采用AT89S51单片机最小系统,P3口外接矩阵式键盘接口电路,P1口外接共阴型七段数码管,如图所示。电路中共有16个按键,按4×4的矩阵式排列,键号依次为0~F。单片机的P3.0~P3.3为输出口,连接4条列线;P3.4~P3.7为输入口,连接4条行线。将下列程序补充完整,并仿真出结果。

XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C5123456781RP1RESPACK-70123456789BCDEFAX1CRYSTALC222pC322pR11kC110uF

4

#include

#define uchar unsigned char

#define uint unsigned int

uchar key;

unsigned char code

disp_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

unsigned char code key_code[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,

0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77 };

void delayms(uint ms)

{

uchar t;

while(ms--)

{

for(t = 0; t < 120; t++);

}

}

uchar keyscan() //键盘扫描程序

{

uchar scan1,scan2,keycode,j;

P3=0xf0;

scan1=P3;

if((scan1&0xf0)!=0xf0) //判键是否按下

{

delayms(30); //延时30ms

scan1=P3;

(?)

void keydown() //判断是否有键按下

{

P3=0x0f;

if((P3&0x0f)!=0x0f)

{

keyscan();

P0=disp_code[key]; //在数码管上显示键值

}

}

main()

{

P0 = 0xbf;

P3 = 0xff;

while(1)

{

5

keydown();

}

}

题目8

采用AT89S51单片机,利用定时/计数器T0通过P1.1引脚输出周期为25Hz的方波。同时进行测量,信号从P3.5引脚输入,P0、 P2口做输出口,接一个8位LED数码管,编写程序,测出从P3.5引脚输入的方波信号的频率并显示出来。补充下列程序并仿真出结果。

#include

#include #define uchar unsigned char

6

uchar

display_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

//定义数组存放显示数据的编码

uchar display_data[8]={0,0,0,0,0,0,0,0}; //定义数组存放显示数据的各位

uchar c1,b1;

sbit P1_1=P1^1;

void delay(void) //延时

{

uchar i;

for(i=500;i>0;i--);

}

void display() //显示程序

{

uchar i,k;

k=0x01;

for(i=0;i<8;i++)

{

P2=0;

P0=display_code[display_data[i]];

P2=k;

k=k<<1;

delay();

}

P2=0;

}

void convert() //转换程序

( ?)

void timer1(void) interrupt 3 //定时器1中断服务程序

{

c1++;

}

void timer0(void) interrupt 1 //定时器0中断服务程序

{

TH0=0xb1; //装入时间常数

TL0=0xe0;

P1_1=!P1_1; //P1.1取反,从P1.1引脚输出25Hz的方波信号,通过导线连接

//到P3.5引脚输入,以方便调试程序。若使用其它信号源,则去掉即可。

if (b1==49)

{

convert();

c1=0; //将计数值清零