单片机考试编程题Word下载.docx
《单片机考试编程题Word下载.docx》由会员分享,可在线阅读,更多相关《单片机考试编程题Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
//把一个2位数分离后分别送数码管显示,十位和个位
ge=count%10;
/*以下为延迟函数*/
voiddelay(uintxms)
uinti,j;
for(i=xms;
i>
0;
i--)//延迟时间为xms乘以50ms
for(j=110;
j>
j--);
/*以下为显示数码管的子函数*/
voiddisplay(ucharshi,ucharge)
P3=0xfe;
//打开P3.0,及打开数码管1引脚
P2=SEG[ge];
delay(20);
P3=0xfd;
//打开P3.1,及打开数码管2引脚
P2=SEG[shi];
2.基于单片机V1或V2实验系统,编写一个程序,实现以下功能:
1)首先在数码管上显示“P___”4个字符;
2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
at89x52.h>
unsignedcharcodeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//gongyang数码管0-F代码
unsignedchark;
//设置全局变量k为键盘的键值
/************************************键盘延时函数****************************/
voidkey_delay(void)//延时函数
intt;
for(t=0;
t<
500;
t++);
/************************************键盘扫描函数******************************/
voidkeyscan(void)//键盘扫描函数
unsignedchara;
P2=0xf0;
//键盘初始化
if(P2!
=0xf0)//有键按下?
key_delay();
//延时
=0xf0)//确认真的有键按下?
P2=0xfe;
//使行线P2.4为低电平,其余行为高电平
a=P2;
//a作为缓存
switch(a)//开始执行行列扫描
case0xee:
k=15;
break;
case0xde:
k=11;
case0xbe:
k=7;
case0x7e:
k=3;
default:
P2=0xfd;
//使行线P2.5为低电平,其余行为高电平
switch(a)
case0xed:
k=14;
case0xdd:
k=10;
case0xbd:
k=6;
case0x7d:
k=2;
P2=0xfb;
//使行线P2.6为低电平,其余行为高电平
{
case0xeb:
k=13;
case0xdb:
k=9;
case0xbb:
k=5;
case0x7b:
k=1;
P2=0xf7;
//使行线P2.7为低电平,其余行为高电平
case0xe7:
k=12;
case0xd7:
k=8;
case0xb7:
k=4;
case0x77:
k=0;
break;
/*********************************主函数*************************************/
voidmain(void)
{
while
(1)
keyscan();
//调用键盘扫描函数
switch(k)//查找按键对应的数码管显示代码
case0:
P0=Dig[0];
case1:
P0=Dig[1];
case2:
P0=Dig[2];
case3:
P0=Dig[3];
case4:
P0=Dig[4];
case5:
P0=Dig[5];
case6:
P0=Dig[6];
case7:
P0=Dig[7];
case8:
P0=Dig[8];
case9:
P0=Dig[9];
case10:
P0=Dig[10];
case11:
P0=Dig[11];
case12:
P0=Dig[12];
case13:
P0=Dig[13];
case14:
P0=Dig[14];
case15:
P0=Dig[15];
//退出
}
}/**********************************end***************************************/
3.利用AT89S52单片机来制作一个0~99计时器,并且通过两个共阴数码管显示计数结果,数码管显示采用静态显示方式。
#include<
AT89X52.H>
//包含AT89X52.H头文件
/*定义0~9十个数字的字型码表*/
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharCount;
//定义变量放置计数数值
voiddelay10ms(void)//定义10ms延时函数
unsignedchari,j;
for(i=20;
i--)
for(j=248;
}
voidmain(void)
Count=0;
//计数变量初始为0
For(Count=0;
Count<
10;
Count++)
P0=table[Count/10];
//显示十位数
P2=table[Count%10];
//显示个位数
delay10ms();
while
(1)//等待
4.将单片机与数码管接成图4-2所示静态显示方式,编程实现数码管每隔0.5s的0-9数字显示。
AT89X51.h>
sbita=P0^5;
sbitb=P0^6;
sbitc=P0^7;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchardispcount;
voiddelay02s(void)
{unsignedchari,j,k;
for(i=10;
i--)
for(j=200;
j--)
for(k=248;
k>
k--);
{while
(1)
{for(dispcount=0;
dispcount<
dispcount++)
a=0;
b=0;
c=0;
P1=table[dispcount];
delay02s();
}
5.单片机与数码管接成动态显示方式,编程实现数码管的0-7数字显示。
unsignedcharcodetabledu[]={0x3f,0x06,0x5b,0x4f,0x66,
unsignedcharcodetablewe[]={0x1f,0x3f,0x5f,0x7f,0x9f,
0xbf,0xdf,0xff};
8;
{P0=tablewe[dispcount];
P1=tabledu[dispcount];
6.本任务是实现0~999的加1S计数显示。
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchardispcount,bai,shi,ge;
unsignedinttemp,aa;
voiddisplay();
for(i=1;
for(j=100;
for(k=200;
voiddelay05s(void)
{unsignedchars,m,t;
for(s=2;
s>
s--)
{for(m=200;
m>
m--)
{for(t=250;
t>
t--)
{;
{temp=0;
while
(1){delay05s();
delay05s();
temp++;
display();
}}
voiddisplay()
{if(temp==999)
{temp=0;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
b=1;
P1=table[bai];
a=1;
P1=table[shi];
P1=table[ge];
7.采用数码管进行数字时钟显示时间,并通过按键调整时间。
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitkey3=P0^3;
//时调整
sbitkey2=P0^2;
//分调整
sbitkey1=P0^1;
//秒调整
sbitkey0=P0^0;
//全部清零键
ucharcodetab1[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x80};
//共阳0~9/-段码/点
ucharcodetab2[]={0x1f,0x3f,0x5f,0x7f,0x9f,0xbf,0xdf,0xff};
//0~7依次位码表
ucharsec,min,hour,count;
//定义秒,分,时,中断计数
voiddelay(uintz)//延时子函数
uintx,y;
for(x=z;
x>
x--)
for(y=110;
y>
y--);
//--------------------------------------------------------------
voidinit()//初始化T0函数
//T0-方式1-16位计时器
TH0=(65536-50000)/256;
//50MS
TL0=(65536-50000)%256;
//晶振:
12M计算
//允许T0中断
//启动T0中断
voidtimer0()interrupt1//定时器函数
count++;
//50毫秒中断一次count便加1
if(count>
=20)//中断了20次?
(20*50=1秒)
{count=0;
sec++;
}//计数清零/秒加1
if(sec==60)//满了60秒?
{sec=0;
min++;
}//秒清零/分加1
if(min==60)//满了60分钟?
{min=0;
hour++;
}//分清零/时加1
if(hour==24)//满了24小时?
{hour=0;
}//时清零
voiddisplay()//数码管显示子函数
uchars;
for(s=0;
s<
=10;
s++)//扫描//控制显示刷新和按键速度
P1=tab1[hour/10];
P0=tab2[7];
delay
(2);
//时十位
P1=tab1[hour%10];
P0=tab2[6];
//时个位
P1=tab1[11];
P0=tab2[5];
//横
P1=tab1[min/10];
P0=tab2[4];
//分十位
P1=tab1[min%10];
P0=tab2[3];
//分个位
P0=tab2[2];
P1=tab1[sec/10];
P0=tab2[1];
//秒十位
P1=tab1[sec%10];
P0=tab2[0];
//秒个位
voidkey()//按键调整子函数
if(key1==0)//秒调整
{delay(10);
if(key1==0){sec++;
if(sec==60)sec=0;
}//调到了60?
if(key2==0)//分调整
if(key2==0){min++;
if(min==60)min=0;
}//调到了60?
if(key3==0)//时调整
if(key3==0){hour++;
if(hour==24)hour=0;
}//调到了24?
if(key0==0)//全部归清零按
if(key0==0){sec=min=hour=0;
}//秒/分/时清零
voidmain()//主函数
init();
//T0初始化
while
(1)//死循环
key();
//调整函数
//显示函数
8.在8个LED数码管上,按从左到右的顺序,循环滚动显示数字“5”,每次滚动延时500ms
unsignedcharLED;
voidDelay(unsignedintmilisec)//延时1ms
unsignedinti,j;
for(i=milisec;
i--)//双重for循环实现延时1ms
for(j=110;
voidMain(void)
P0=0x6d;
//显示数字“5”
for(LED=0;
LED<
=7;
LED++)
{
P2=LED;
//选择LED,实现滚动显示
Delay(500);
//延时500ms
}
9.在8个LED上稳定地显示“01234567”
unsignedcharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,
unsignedcharcodeLED[8]={0,1,2,3,4,5,6,7};
unsignedchari=0;
P0=table[i];
//取一个数的段位码
P2=LED[i];
//点亮一个数码管
Delay
(2);
//延时2ms
i++;
//移位
if(i==8)i=0;
//重新开始
10.在8个LED上显示计算机教研室的电话号码“68752219”
unsignedcharcodeNumber[8]={6,8,7,5,2,2,1,9};
unsignedchari=0,j;
j=Number[i];
//取一个待显示的数
P0=table[j];
P2=i;
//点亮一个数码管
二.串行数据的发送和接收
1.用89C52串行口外接164串入/并出移位寄存器扩展8位并行输出口,外接165并入/串出移位寄存器扩展8位并行输入口。
8位并行输出口的每位都接一个发光二极管,要求从8位并行输入口读入开关的状态值,使闭合开关对应的发光二极管点亮。
解:
数据的输入输出通过RXD接收和发送,移位时钟通过TXD送出,74HC164用于串/并转换,74HC165用于并/串转换。
C语言程序清单:
sbitP1_0=P1^0;
sbitP1_1=P1^1;
unsignedchardata1;
SCON=0x10;
//串行口方式0,允许接收
ES=1;
//允许串行口中断
P1_0=0;
//关闭并行输出
P1_1=1;
//并行置入数据
P1_1=0;
//开始串行移位
SBUF=0;
//送入串行数据
while
(1);
//等待中断
voids_srv()interrupt4//中断服务程序
if(TI)//发送中断
{TI=0;
P1_0=1;
//打开并行输出
else//接收中断
{RI=0;
data1=SBUF;
//读取接收的数据
P1_0=0;
//关