教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

单片机按键与显示实验报告

来源:网络收集 时间:2026-08-30
导读: 单片机原理及应用 随堂实验报告 学院 计算机与电子信息学院 专业 电子信息工程 班级 电信11 -1班 姓名 温石坚 学号 11034030132 指导教师 左 敬 龙 实验报告评分:_______ 一、 实验原理及电路 实验原理:在电路图中,单片机AT89C51的P1口接有一按键矩阵,P0

单片机原理及应用

随堂实验报告

学院 计算机与电子信息学院 专业 电子信息工程 班级 电信11 -1班 姓名 温石坚 学号 11034030132 指导教师 左 敬 龙

实验报告评分:_______

一、 实验原理及电路

实验原理:在电路图中,单片机AT89C51的P1口接有一按键矩阵,P0和P2口接15个灯,P3口接一个led数码显示管。刚开始时,电路处于扫描按键是否被按下的状态。当有某个按键被按下时,在键盘扫描函数的作用下,会有一小段消抖动的时间。当确定没抖动情况下,程序就会查找出是哪个按键被按下了。之后就会执行按键功能函数。

以下是按键扫描函数(包括消抖动程序)和按键功能函数: 按键扫描函数 按键功能函数 uchar rdkey() uchar i;

{ void k(uchar n) uchar scan1,scan2,keycode,j; {P3=tab[n]; P1=0x0f; if(n>=8) scan1=P1; {

if((scan1&0x0f)!=0x0f) for(i=0;i<=8;i++)

{ {P2=led[i]; P0=0x00; delayms(30); delayms(100); scan1=P1; }} if((scan1&0x0f)!=0x0f) else{

{ for(i=0;i<=n;i++) P1=0xf0; {

scan2=P1; P0=led[i];P2=0xff;delayms(100); keycode=scan1|scan2; } for(j=0;j<=15;j++) } { } if(keycode= = key_code[j]) {

key=j;

return(key); } } } }

else P1=0xff; return (16);}

按键扫描函数是通过首先检查行(给P1赋值为0x0f,再将P1赋给变量scan1,用0x0f与scan1相与,可检查出第几行的按键被按下),再检查列的方法(将P1赋值为0xf0,再将P1赋给scan2,此时被按下键的那一列的值会变为0),然后再将两次检查的数按位或,最后将按位或后的那个数与组合键编码对比组合键编码,找出被按下的按键数,返回按键值。

按键功能函数是当第n号按键按下时,连接在P3的显示器显示n,同时连接在P0,P2上的灯会从第0个开始,逐一亮到第n个。由于用到两个I/O口,所以当按键号数大于8时,程序应该将P0口赋值为0x00(共阳极)。

实验电路图如下(此时被按下的按键是六号按键,即第7个按键):

二、 实验程序框图

三、 功能说明

此实验实现的功能是当第n号按键被按下时,连接在P3的显示器显示n,同时连接在P0,P2上的灯会从第0个开始,逐一亮到第n个。实现了矩阵按键与显示的功能。

四、 实验代码

#include<reg51.h>

#define uchar unsigned char #define uint unsigned int uchar key;

unsigned char code

key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; uchar

tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

uchar led[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; void delayms(uint ms) {

uchar t; while(ms--) {

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

uchar i;

void k(uchar n) {

P3=tab[n]; if(n>=8) {

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

P0=led[i];P2=0xff;delayms(100);} for(i=0;i<n-7;i++) {

P2=led[i]; P0=0x00; delayms(100); } } else {

for(i=0;i<=n;i++) {

P0=led[i];P2=0xff;delayms(100); } } }

uchar rdkey()

{ uchar scan1,scan2,keycode,j;

P1=0x0f; scan1=P1; if((scan1&0x0f)!=0x0f) {

delayms(30); scan1=P1; if((scan1&0x0f)!=0x0f) {

P1=0xf0; scan2=P1; keycode=scan1|scan2; for(j=0;j<=15;j++) {

if(keycode== key_code[j]) {

key=j; return(key); } } } }

else P1=0xff; return (16); }

void main() {

while(1) {

P1=0x0f;

if((P1&0x0f)!=0x0f) {

rdkey(); switch(key) {

case 0: k(0); break;

case 1: k(1); break; case 2: k(2); break; case 3: k(3); break; case 4: k(4); break; case 5: k(5); break; case 6: k(6); break; case 7: k(7); break; case 8: k(8); break; case 9: k(9); break; case 10: k(10); break; case 11: k(11); break; case 12: k(12); break; case 13: k(13); break; case 14: k(14); break; case 15: k(15);

break; } } }}

五、 实验过程

这个实验做得比较急,因为当我做这个实验时,我的上一个实验串行口实验刚刚做完上传,而做完这个实验的第二天就要检查了。所以这次实验做得比较简单。

做这个实验,自己的程序出现的问题也不少。由于在实验中用到了两个I/O口,当显示i(i>8)时,本来预期的功能是第一个I/O口的8个灯会逐一亮,之后一直亮,此时第二个I/O口中的前(i-8)个灯会逐一亮。但是自己做的的却不是这样,自己做的实现的是当亮的个数大于8的时候,前面8个会暗下去,并不是全亮。当自己将代码改为以下时,问题就解决了:

if(n>=8) {

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

P0=led[i];P2=0xff;delayms(100);} for(i=0;i<n-7;i++) {

P2=led[i]; P0=0x00; delayms(100); } }

当亮的灯个数大于8时,亮到第九个时,将接在P0口的灯状态设为亮,大于8的部分会逐一亮。

六、 实验小结

这是我们单片机实验中的最后一个实验,想想,自己在做实验的过程遇到过许多不同的问题,有简单的,有难的,可是自己没有放弃过,遇到了问题会自主的去寻求解决问题的方法,我觉得这个是自己在做这些实验中最大的收获。每次当自己的仿真成功时,都有种自豪的感觉,这种感觉很美妙,自己也很享受。

当然,自己要做的并不只有这些,自己要做的还有很多很多,自己得不停的进取。

…… 此处隐藏:1237字,全部文档内容请下载后查看。喜欢就下载吧 ……
单片机按键与显示实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/135473.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)