您的当前位置:首页单片机简易加法计数器.

单片机简易加法计数器.

2021-07-16 来源:飒榕旅游知识分享网


单片机原理及应》课程课程设计题 目 简易计算器的设计

院 (系) 信息工程学院 专 业 班 级 11级计算机应用技术1班 学 生 姓 名 XXXXX 学 号 XXXXXXXX 设 计 地 点 计算机应用实验室 指 导 教 师 XXXX

起止时间: 2013年 6月 3日至 2013 年 6 月 14 日1

《用

摘要

随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。

本题目是实现两位数的加减运算的简易计算器,实现键盘输入,由七段LED数码管输出;程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不十分完善,限制也较多。本设计重在设计构思,使得我们用专业知识、专业技能分析和解决问题,通过设计使得我们对所学知识彻底巩固。 课程设计目的和意义:

通过这次课程设计,进一步掌握单片机理论知识,知道AT89S52单片机的原理、编程和各种功能的应用,了解简易计算器的工作原理,初步掌握计算器的硬软件设计、编写、调试和仿真,充分提高动手能力和排除故障的能力。同时通过毕业设计加深了我们对单片机的认识和兴趣,发挥了我们的创新能力。

在本次课程设计中,充分调动了组员的积极性,彼此之间通过相互合作,共同努力,一起出色地完成了任务!

设计任务:能够实现0~9这10个1位数的加减运算,用10个按键模拟0~9数字键,用两个按键实现加减运算,运算结果用5个数码管显示出来。如:5+3=8。

关键词 : 单片机;数码管;矩阵键盘

2

目录

1.设计方案 ............................................... 4 1.1设计思路 .......................................... 4 1.2整体设计 .......................................... 4 2.电路设计原理 ........................................... 6 2.1键盘接口电路....................................... 6 2.2数码管显示原理及译码电路 ........................... 7 2.3运算模块(单片机控制) ............................. 7 3.功能程序仿真调试 ...................................... 10 3.1编程调试环境...................................... 10 3.2测试结果截图...................................... 11 4.程序设计 .............................................. 12 4.1软件程序设计...................................... 12 4.2源程序 ........................................... 14 5.总结 .................................................. 18 6.参考文献 .............................................. 19

3

1.设计方案

1.1设计思路

根据计算器的功能要求,选择AT89S52为主控机,通过扩展必要的外围接口电路,实现对计算器的设计。外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块AT89C52单片机构成。计算器电路包括四个部分:选用数码管作为显示部分,矩阵键盘作为输入部分,运算模块,单片机控制部分。

单片机 输入模块 运算模块 显示模块 图1.1 模块图

1.2整体设计

根据简易计算器的功能和指标要求,本设计系统选用MCS-51系列单片机AT89C52为主控机。通过扩展必要的外围接口电路,实现对简易计算器的设计。计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。具体设计如下:

(1)由于要设计的是简单的计算器,可以进行加减运算,为了得到较好的显示效果,采用七段数码管显示数据和结果。

(2)另外键盘包括数字键(0~9)、符号键(+、-、=)、复位键,故需要14个按键即可。

(3)执行过程:开机显示零,等待键入数值,当键入数字,通过数码管显示出来,当键入+、-运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值

4

后将显示键入的数值,按等号就会在数码管上输出运算结果。

4*4键盘51单片机系统数码管显示

图1.2 线路原理框图

开始初始化参数初始化数码管显示有键输Y入?读取键码N数字键功能键输入数输入运值算符数码管显示

图1.3系统总流程图

5

2.电路设计原理

2.1键盘接口电路

计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。 矩阵键盘的工作原理:

电路中采用4*4键盘作为输入电路模块的话,电路连线会比较简单,而且这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。但是在硬件电路设计的过程中,实验室没有提供矩阵键盘,所以我们将4*4的矩阵键盘换成了16个独立按键。采用独立按键的方式的话,会占用大量的I/O 口资源,但是在这种情况下,编程会很简单。

矩阵键盘内部电路图如图所示:

图2.1 矩阵键盘内部电路图

停止At89s52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工

6

业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得AT89S52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash AT89S52

2.2数码管显示原理及译码电路

本系统输出结果选用8个数码管显示。数码管有共阴共阳之分,本系统采用8段共阳型LED,其原理图如下图所示:

符号和引脚 共阳极

图2.2LED数码管结构

共阳数码管就是把每个LED灯的阳极接在共同接点com,而每个LED灯的阴极分别为a,b,c,d,e,f,g,dp;通过控制LED灯的亮灭来显示数字。数码管跟据接收到的字形码显示数字。

2.3运算模块(单片机控制)

单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算

7

机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。

单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机AT89S52作为计算器的主要功能部件,可以很快地实现运算功能。

图2.3 硬件电路原理图

图2.4 AT89S52单片机实物图

8

图2.5 硬件电路原理图

9

3.功能程序仿真调试

3.1编程调试环境

Keil uVision3是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。

系统功能:Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使您能在很短的时间内就能学会使用keil c51来开发您的单片机应用程序。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

10

3.2测试结果截图

图3.1 加法计算

图3.2 减法计算

11

4.程序设计

4.1软件程序设计

(1)按键部分代码 void key() {

uchar temp; P1=0xf0; temp=P1;

if(temp!=0xf0) {

delay(13); //消除按键抖动 if(temp!=0xf0) {

P1=0xfe; //按行进行按键扫描,先扫描第一行 temp=P1;

switch(temp) {

case(0xee):{i=0;c=0;};break; case(0xde):{i=1;c=0;};break; case(0xbe):{i=2;c=0;};break; case(0x7e):{i=3;c=0;};break; }

P1=0xfd; //按行进行按键扫描,扫描第二行 temp=P1;

switch(temp) {

case(0xed):{i=4;c=0;};break; case(0xdd):{i=5;c=0;};break; case(0xbd):{i=6;c=0;};break; case(0x7d):{i=7;c=0;};break; }

P1=0xfb; //按行进行按键扫描,扫描第三行 temp=P1;

switch(temp) {

case(0xeb):i=8;break; case(0xdb):i=9;break; case(0xbb):i=10;break; case(0x7b):i=11;break; }

12

P1=0xf7; //按行进行按键扫描,扫描第四行 temp=P1;

switch(temp) {

case(0xe7):i=12;break; case(0xd7):y=0;break; } } } }

(2)功能键部分代码

void display(uchar i,uchar j,uchar k) {

uchar f[2],t,e,q; if(k==10) {

e=i+j; f[0]=e/10; q=i+j;

f[1]=q%10; }

if(k==11) {

e=i-j; f[0]=e/10; q=i-j;

f[1]=q%10; }

for(t=0;t<2;t++) {

P2=tab1[t]; P0=tab2[f[t]]; delay(2); } } (3)LED数码管驱动部分代码 void display1(uchar i) {

P2=0xfe; P0=tab2[0]; delay(2); P2=0xfd; P0=tab2[i]; delay(2);

13

}

4.2源程序

#include

#define uchar unsigned char //数据类型的宏定义 #define uint unsigned int //数据类型的宏定义 uchar a,b,d,i,w,y=1; uchar c=2;

uchar tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar

tab2[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};

void delay(uchar z) {

uchar x; for(;z>0;z--)

for(x=200;x>0;x--); }

void key() {

uchar temp; P1=0xf0; temp=P1;

if(temp!=0xf0) {

delay(13); //消除按键抖动 if(temp!=0xf0) { P1=0xfe; //按行进行按键扫描,先扫描第一行 temp=P1;

switch(temp) { case(0xee):{i=0;c=0;};break; case(0xde):{i=1;c=0;};break; case(0xbe):{i=2;c=0;};break; case(0x7e):{i=3;c=0;};break; }

P1=0xfd; //按行进行按键扫描,扫描第二行 temp=P1;

14

switch(temp) { case(0xed):{i=4;c=0;};break; case(0xdd):{i=5;c=0;};break; case(0xbd):{i=6;c=0;};break; case(0x7d):{i=7;c=0;};break; }

P1=0xfb; //按行进行按键扫描,扫描第三行 temp=P1; switch(temp) { case(0xeb):i=8;break; case(0xdb):i=9;break; case(0xbb):i=10;break; case(0x7b):i=11;break; }

P1=0xf7; temp=P1; switch(temp) { case(0xe7):i=12;break; case(0xd7):y=0;break; } } } }

void display(uchar i,uchar j,uchar k) {

uchar f[2],t,e,q; if(k==10) { e=i+j; f[0]=e/10; q=i+j;

f[1]=q%10; }

if(k==11) {

e=i-j; f[0]=e/10; q=i-j;

f[1]=q%10; }

for(t=0;t<2;t++) {

//按行进行按键扫描,扫描第四行 15

P2=tab1[t]; P0=tab2[f[t]]; delay(2); } }

void display1(uchar i) {

P2=0xfe; P0=tab2[0]; delay(2); P2=0xfd; P0=tab2[i]; delay(2); }

void main(void) {

while(1) { key();

if(c==0&&w==1) { c=2; b=i; }

if(i==10||i==11) {

w=1; d=i; }

if(c==0) { a=i; c=2; }

if(i==12)

display(a,b,d);

if(i!=10&&i!=11&&i!=12) display1(i); if(y==0) { y=1; a=0; c=2; w=0;

16

b=0; d=0; i=0; } } }

17

5.总结

课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。

我的题目是简易计算器,对于我们这些实践中的新手来说,这是一次考验。怎么才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。

这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解,在此我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!

18

6.参考文献

[1]李建忠.单片机原理及应用[M]西安:西安电子科技大学出版社,2008年2月,第二版

[2]阎石.数字电子技术基础[M]高等教育出版社,2007年3月,第五版 [3]zlttaogede.LCD1602[J],2010年7月27日

19

因篇幅问题不能全部显示,请点此查看更多更全内容