单片机实验4报告Word文件下载.docx
《单片机实验4报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机实验4报告Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
![单片机实验4报告Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/10/cbb490aa-3e83-4dec-a8be-6a196c48b0bc/cbb490aa-3e83-4dec-a8be-6a196c48b0bc1.gif)
矩阵式键盘键值分别是0-9,最下面一排键位功能键,左右两个键分别为“清0键”“C”,和”“回车键”“”,其它键无效。
未按键不显示,每按键一次,键值在最低位显示,原键值向高位移一位。
按8个键后,再按键无效。
按清0键全显示“0”。
按“”后全部熄灭,再按键重新开始。
三、实验原理图
图3.4动态显示与矩阵式键盘实验电路原理图
动态显示共8个共阴极数码管,采用两片74LS573进行驱动,74LS573与74LS373都是8D锁存器,只是573引脚排列更易于布线。
其引脚功能为:
D1-D8为数据输入端;
Q1-Q8为数据输出端;
LE为数据输入锁存端,LE=1数据输入D锁存器,LE=0数据不能输入D锁存器,即LE下降沿锁存当前输入数据;
地址输出允许端,=0输出锁存数据,=1输出高阻。
电路中,U1输出段码abcdefgdb,控制显示的字形与小数点,U2输出位选码,控制第几个数码管显示。
单片机P14、P15分别连接到U1、U2的LE,连接U1、U2的。
四、源程序
第一项:
#include<
reg51.h>
#defineucharunsignedchar
dataucharf[8];
datauchara,b,num,y,k,g;
dataucharc=0;
table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
//共阴极数码管显示段码(0-F)
voiddelay(j)//延时函数
dataucharj;
{datauchari;
while(j--)
for(i=0;
i<
1;
i++);
}
ucharcodesled_bit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//定义点亮数码管位选码
datauchard[]={1,9,4,9,1,0,0,1};
datauchare[]={2,0,1,4,1,2,1,0};
sbitoe=P1^3;
//2个573的三态使能端
sbitdula=P1^4;
//段码573控制信号
sbitwela=P1^5;
//位码573控制信号
//延时函数
voidmain(void)
{
TMOD=0x01;
//设置定时器T0为方式1定时
TH0=(65536-500)/256;
//给T0装入初值
TL0=(65536-500)%256;
//给T0装入初值
ET0=1;
//允许T0中断
EA=1;
EX0=1;
IT0=1;
g=0;
P0=0X00;
while
(1);
//CPU开中断
voidEX0_int(void)interrupt0
{TR0=1;
y=P2;
y=~y;
if(y==1){for(g=0;
g<
8;
g++)f[g]=d[g];
}
if(y==2){for(g=0;
g++)f[g]=e[g];
voidT0_int(void)interrupt1//T0中断函数
{TH0=(65536-500)/256;
oe=1;
//关闭2个573输出,防止送数据时相互影响
k=f[g];
//每次显示disp[j]的数据
P0=table[k];
//相应显示数字段码
dula=1;
dula=0;
//锁存段码
P0=~sled_bit[g];
//选择相应数码管位选
wela=1;
wela=0;
//锁存位码
oe=0;
g++;
if(g>
=8)g=0;
//打开2个573三态门,输出段码和位码
}
第二项
reg52.h>
#defineuintunsignedint
//数码管段选、位选锁存器输出控制信号
//数码管段选锁存器控制信号
//数码管位选锁存器控制信号
ucharj=0;
ucharcodesled_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
datauchardisp[8]={16,16,16,16,16,16,16,16};
ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
voiddelay(n)//延时函数
dataucharn;
{dataucharm;
while(n--)
for(m=0;
m<
m++);
uchara,b,c,i,num;
//设置定时器T0为方式1定时
//允许T0中断
//CPU开中断
TR0=1;
//启动T0
P2=0xff;
while
(1)
{P2=0xf0;
delay(5);
P2=0xf0;
a=P2;
P2=0x0f;
b=P2;
a=a|b;
if(a!
=0xff)
{while(P2!
=0x0f);
switch(a)
{
case0xee:
num=0;
break;
case0xde:
num=1;
case0xbe:
num=2;
case0x7e:
num=3;
case0xed:
num=4;
case0xdd:
num=5;
case0xbd:
num=6;
case0x7d:
num=7;
case0xeb:
num=8;
case0xdb:
num=9;
case0xbb:
num=10;
case0x7b:
num=11;
case0xe7:
num=12;
case0xd7:
num=13;
case0xb7:
num=14;
case0x77:
num=15;
}
for(i=0;
7;
i++)disp[i]=disp[i+1];
disp[7]=num;
delay(255);
}
voidT0_int(void)interrupt1
{datauchark;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
oe=1;
//关闭2个573输出,防止在送数据时相互影响
k=disp[j];
//每次显示ar[j]的数据
P0=table[k];
//相应显示数字段码
//锁存段码
P0=sled_bit[j];
//选择相应数码管位选
//锁存位码
//打开2个573三态门,输出段码和位码
j++;
//为下一个显示做准备
if(j>
=8)j=0;
五、实验结果
给单片机上电,未按键不显示,按K1键,动态显示“19491001”;
第二项:
给单片机上电,未按键不显示,按矩阵式键盘键值从小到大依次按键,依次显示为:
0,01,012,0123,01234,012345,0123456,01234567,12345678,23456789,3456789A,456789Ab,56789AbC,6789AbCd,789AbCdE,89AbCdEF。
六、实验思考题
1、电路中为什么要用74LS573,不用74LS573,可用什么器件代替?
如果U1、U2的都直接接地,应如何编程?
答:
电路中需要2片74LS573来驱动8个共阴极数码管,所以不能用74LS573,可用74LS373代替。
如果U1、U2的都直接接地,即一直为0,74LS573总是输出锁存数据,所以应控制数据输入锁存端LE,使之在需要锁存时置1。
2、为什么要等键弹起,才进行键值分析?
因为在按键前后都有一个过渡期,在这个阶段电平忽高忽低,最好等这个时期过去再判断是否按键,同样,最好等键弹起,才进行键值分析,这样才能分析准确。
3、如果用简单按键与矩阵式键盘构成组合按键,组合按键如何编程得到键值?
采用线反转法,将行和列得到的键值相或来得到键值。
七、实验心得
通过这次实验,使我学到了不少实用的知识,更重要的是做实验的过程,思考问题的方法,这与其他的实验师通用的,真正使我受益匪浅。
在做实验之前,我没有完全将课本上的理论知识掌握透彻,但在老师的讲解中,以及实践中对这些知识的理解有了很大一步的掌握。
对单片机编程有了比较深刻的认识,希望在以后的学习以及实验中可以更加得心应手!
实验要认真分析问题,然后针对要求编写相应程序,对程序应该尽量简单化,符合要求的同时要简单有效,只有这样才能一步一步的进步,提高!