单片机课设矩阵键盘控制七段数码管闪烁
- 格式:doc
- 大小:1.17 MB
- 文档页数:14
电气工程学院《单片机原理及其应用》第x次课外设计报告
组号:No. xxx
组长:xxxxxxxxxxxxxxxxxx
组员:xxxxxxxxxxxxxxxxxx
组员:xxxxxxxxxxxxxxxxxx
设计时间:xxxxxxxxxxxxxxxxxx
评定成绩:
评定教师:
设计内容:
利用单片机、1个按钮、4*4矩阵键盘和1位共阳数码管,实现显示闪烁控制功能。
要求:按下数字键,将按下键对应位置值(0~F)显示在数码管上;按下按钮,显示以0.5秒间隔闪烁;再次按下按钮,显示闪烁停止。
摘要:
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便
与结构的最佳选择。
单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
从二十世纪九十年代开始,单片机技术就已经发展起来,随着时代的进步与科技的发展,目前该技术的实践应用日渐成熟,单片机被广泛应用于各个领域。
现如今,人们越来越重视单片机在智能电子技术方面的开发和应用,单片机的发展进入到新的时期,无论是自动测量还是智能仪表的实践,都能看到单片机技术的身影。
电子信息技术与单片机技术相融合,有效提高了单片机应用效果。
作为计算机技术中的一个分支,为智能化电子设备的开发和应用提供了新的出路,实现了智能化电子设备的创新与发展。
单片机也被称为单片微控器,属于一种集成式电路芯片。
在单片机中主要包含CPU、只读存储器ROM和随机存储器RAM等,多样化数据采集与控制系统能够让单片机完成各项复杂的运算,无论是对运算符号进行控制,还是对系统下达运算指令都能通过单片机完成。
由此可见,单片机凭借着强大的数据处理技术和计算功能可以在智能电子设备中充分应用。
简单地说,单片机就是一块芯片,这块芯片组成了一个系统,通过集成电路技术的应用,将数据运算与处理能力集成到芯片中,实现对数据的高速化处理。
关键字:单片机;实时时钟;AT89C51
目录
(一)任务分析 (2)
(二)方案设计 (2)
1、硬件设计 (3)
2.、软件设计 (4)
(三)调试方案 (5)
1、调试过程 (5)
2、运行效果 (5)
(四)设计总结 (8)
(五)参考文献,附录 (9)
1、参考文献 (9)
2、附录 (9)
(一)任务分析:
对题目做较详细的要求分析,按模块化原则进行功能分解
利用单片机、1个按钮、4*4矩阵键盘和1位共阳数码管,实现显示闪烁控制功能。
要求:按下数字键,将按下键对应位置值(0~F)显示在数码管上;按下按钮,显示以0.5秒间隔闪烁;再次按下按钮,显示闪烁停止。
题目要求用4*4矩阵式键盘进行扫描检测按下了什么键;再通过一个按钮来控制显示的数是否闪烁;最后用一位共阳极数码管将结果显示出来。
数字输入模块:这里采用矩阵式键盘的中断方式扫描,设为外中断1。
闪烁控制模块:再设置外中断0来控制数码管显示数字是否闪烁。
数字显示模块:最后通过一位共阳极数码管将数字显示出来。
(二)方案设计:
图2.1:系统总框图
图2.2:原理图
器件选择:
AT89C52芯片:1片排阻RX8(470Ω):1个
电阻(470Ω):3个74LS21四输入与门:1个
共阳极数码管:1个按钮:18个
1MHZ晶振:1个电解电容(1μF):1个
电容(30μF):2个电源:3个
P1口作输入口:P1^0~P1^3为列,P1^4~P1^7为行,组成4*4矩阵键盘
P3口作输入口:P3^2和P3^3分别为中断0和中断1
P0口作输出口:P0^0~P0^7将段码输出给数码管显示
利用两个电容与晶振构成一个稳定的自激振荡器,XTAL1引脚为输入端,XTAL2引脚为输出端。
图2.3:软件流程图
(三)调试方案:
首先根据题意用Proteus画出仿真图,再用keil软件编写源程序代码,保存运行后将代码编译成一个hex文件,然后将proteus和keil联调,点击工具菜单栏中的“debug”,选择“start/stop VSM Debugging”开始调试。
1、调试过程:
在将keil文件与Proteus仿真联调时,由于对软件联调不熟悉,不知道如何将两者结合在一起进行调试,后来通过查阅课本并结合老师讲的联调方法,去下载了VDM51.dll文件,将其分别复制到proteus安装文件下的MODELS目录下,以及keil 安装文件下的C51\BIN目录下,再分别对keil和proteus进行设置完成联调的初步准备。
随后编写程序编译无误后生成Hex文件,在Proteus仿真软件中加入Hex文件后,点击运行按钮,观测实验现象。
刚运行时数码管不显示任何数字,当点击矩阵键盘上的0~F,数码管显示对应数字,再点击BLINK按钮,数码管上的数字开始以0.5S间隔闪烁,然后点击矩阵键盘上的0~F中不同按键,数码管变成对应数字以0.5S闪烁,再次点击BLINK 按钮,数码管数字停止闪烁,再次点击BLINK按钮,数码管又开始以0.5S闪烁,实验现象符合预期效果,调试完成。
2、运行效果:
图3.1 仿真硬件图
图3.2:点击运行时数码管无显示
图3.3:点击矩阵键盘“F”,数码管显示“F”
图3.4:点击“BLINK”,数码管显示数字开始闪烁
图3.5:闪烁时点击矩阵键盘“A”,数码管显示“A”并闪烁
图3.6:再次点击“BLINK”,数码管显示数字停止闪烁
proteus仿真并不是实际的情况,速度无法和单片机相比,一般只是用proteus检验程序是否符合预期,但是精确的测试还是要在单片机上完成。
而且proteus仿真无法模拟实际中会出现的特殊情况,现实中的很多误差都会造成运行效果和仿真结果有出入。
(四)设计总结:
通过本次实验,我们用Proteus仿真实现了用一个4*4矩阵键盘,一个按钮,实现了按下数字键,将按下键对应位置值(0~F)显示在数码管上;按下按钮,显示以0.5秒间隔闪烁;再次按下按钮,显示闪烁停止。
在本次试验中,通过综合运用本专业所学课程的理论基础,使我们对AT89C51单片机的功能有了更深层次的了解,了解了单片机的基本结构,提高了计算能力,绘制仿真图的能力,我们深刻意识到,想要完全掌握AT89C51单片机还有很长的路要走,还有很高的山要翻,但我们绝不会因此而退却,当攀过一座又一座山峰,我们就会成为最高的山峰。
在本次实验中,我们也遇到了些许问题,程序出错,硬件仿真不能实现预期结果以及更优方案选择等等。
比如在实验中我们调出了矩阵键盘显示功能后在考虑如何实现闪烁时,就考虑了很多语句,最后选择用if`~else语句。
又比如我们做
完后又想到可不可以再优化一下:按键检测中开始我们是令列为高电平,然后循环扫描行而检测出是什么按键;经过改良后,我们先令列为高电平检测行是否为低电平从而确定行的位置,在令行为高电平检测列是否为低电平从而确定列位置,两个位置在通过“keyval=h*4+l”确定键值。
同时经过本次实验,我们对以前学习的数模电,C语言课程有了全面的复习,对这学期的课程也有了更深层次的了解,独立思考的能力也有所提高,在今后的学习中,我们考虑的不仅仅局限于实现功能,还要考虑到各个方面,给出最优方案。
(五)参考文献,附录:
1、参考文献:
[1]张毅刚等.单片机原理及应用——C51编程+Proteus仿真(第二版).北京:高等教育出版社,2016.
2、附录:
程序代码:
#include <reg51.h>
#define uchar unsigned char
uchar
dis[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6 ,0xa1,0x86,0x8e}; //共阳极数码管字符0~F对应的段码
unsigned int time;
bit blink; //定义闪烁标志
uchar keyval; //存储键值
bit keyflag; //定义显示标志
sbit L1=P1^0;
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;
sbit H1=P1^4;
sbit H2=P1^5;
sbit H3=P1^6;
sbit H4=P1^7;
void delay(time) //延时函数
{
unsigned int j;
for(j=0;j<time;j++)
{}
}
void main() //主函数
{
IT0=1; //外部中断0 为边沿触发IT1=1; //外部中断1 为边沿触发EX0=1; //允许外部中断0中断
EX1=1; //允许外部中断1中断
EA=1; //总中断允许
keyflag=0;
blink=0;
while(1) //等待中断
{
P1=0xf0;
if(keyflag)
{
if(blink) //以0.5S闪烁
{
P0=dis[keyval];
delay(500000);
P0=0xff;
delay(500000);
}
else P0=dis[keyval]; //直接显示
}
}
}
void int0() interrupt 0 using 0 //外中断0的中断函数{
EX0=0;
blink=~blink;
EX0=1;
}
void int1() interrupt 2 using 1 //外中断1的中断函数{
uchar h,l;
EX1=0;
keyflag=1;
P1=0xf0;
if(H1==0) h=0; //确定行值
if(H2==0) h=1;
if(H3==0) h=2;
if(H4==0) h=3;
P1=0x0f;
if(L1==0) l=0; //确定列值if(L2==0) l=1;
if(L3==0) l=2;
if(L4==0) l=3;
keyval=h*4+l; //确定键值
EX1=1;
}。