单片机原理及接口技术报告.docx

上传人:b****5 文档编号:6398463 上传时间:2023-01-06 格式:DOCX 页数:29 大小:229.38KB
下载 相关 举报
单片机原理及接口技术报告.docx_第1页
第1页 / 共29页
单片机原理及接口技术报告.docx_第2页
第2页 / 共29页
单片机原理及接口技术报告.docx_第3页
第3页 / 共29页
单片机原理及接口技术报告.docx_第4页
第4页 / 共29页
单片机原理及接口技术报告.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

单片机原理及接口技术报告.docx

《单片机原理及接口技术报告.docx》由会员分享,可在线阅读,更多相关《单片机原理及接口技术报告.docx(29页珍藏版)》请在冰豆网上搜索。

单片机原理及接口技术报告.docx

单片机原理及接口技术报告

 

《单片机原理及接口技术》

课程设计报告

 

课题名称

课题23:

简单计算机的设计★★

学院

自动控制与工程学院

 

目录

一、设计的目的、任务……………………………………………3

二、设计步骤及方案……………………………………………….5

三、硬件电路设计……………………………………………………6

四、软件设计及系统流程图……………………………………....9

1、初始化程序模块…………………………………………….11

2、键盘扫描程序模块…………………………………………12

3、显示程序模块……………………………………………….15

五、调试过程及方法……………………………………………17

六、课程设计心得体会…………………………………………….18

七、参考文献………………………………………………………..19

附录…………………………………………………………………....20

 

一、设计的目的、任务

1、课程设计的目的

单片机课程设计作为独立的教学环节,是自动化及相关专业集中实践性环节系列之一,是学习完《单片机原理及其运用》课程后。

并在进行相关课程设计基础上进行的一次综合练习。

单片机课程设计过程中,学生通过查阅资料、接口设计、程序设计、安装调试等环节,完成一个基于MCS-51系列单片机,涉及多种资源应用,并具有综合功能的小应用系列设计。

使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路,电子元器件等方面的知识进一步加深认识,同时在软件编程,调试,相关仪器设备和相关软件的使用技能得到较全面的锻炼和提高。

使学生增进对单片机的感兴认识,加深对单片机理论方面的理解,加深单片机的内部功能模块的应用,如定时器/计时器、中断、片内外存储器、I/O接口、串行接口等。

使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,强化单片机应用电路的设计与分析能力。

提高学生在单片机应用方面的实践技能和科学作风;培养学生综合运用理论知识解决问题的能力。

2、基于AT89C51单片机简易计算器的设计

【摘要】单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。

本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除六位数范围内的基本四则运算,并在LCD上显示相应的结果。

设计电路采用AT89C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入。

显示采用字符LCD静态显示。

软件方面使用C语言编程,并用PROTUES仿真。

3.设计任务及要求

1)、基于MCS-51系列单片机AT89C51,设计一个简单的计算器。

2)、通过4*4的矩阵键盘输入数字及运算符;

3)、可以进行4为十进制数以内的加法运算,如果计算结果超过4位十进制数,则屏幕显示E。

4)、@可以进行加法以外的计算(乘、除、减)。

5)、其他功能。

二、设计步骤及方案

1、总体设计及方案

根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。

通过扩展必要的外围接口电路,实现对计算器的设计。

具体设计如下:

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

(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算键盘。

(3)执行过程:

开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。

(4)错误提示:

当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:

当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上显示E;当除数为0时,计算器会在LCD上显示E。

系统方案图:

2、总体硬件配置

本设计选用AT89C51单片机为主控元件。

显示部分:

采用LCD静态显示。

按键部分:

采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。

三、硬件电路设计

1、总体设计效果如图1-1所示:

图1-1

2、输入模块(键盘)接口电路

计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。

矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4×4个。

这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

4*4矩阵键盘的工作原理:

计算器的键盘布局如图2-1所示:

一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。

图2-1

4*4键盘内部电路图如图2-2所示:

图2-2

3、显示模块(LCD):

本设计采用LCD液晶显示器来显示输出数据。

通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。

接口信号说明:

RS:

数据/命令选择端(H/L)

RW:

读/写选择端(H/L)

E:

使能信号

图2-3所示:

图2-3

4、运算模块(单片机控制)

MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。

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

AT89C51如图2-4所示

图2-4

 

四、软件设计及系统流程图

运算程序流程图:

1、初始化程序模块

voidwrite_com(ucharcom)//写指令函数

{

e=0;

rs=0;

rw=0;

P0=com;//com指令付给P0口

delayms

(1);

e=1;

delayms

(1);

e=0;

}

voidwrite_data(ucharnum)//写数据函数

{

e=0;

rs=1;

rw=0;

P0=num;

delayms

(1);

e=1;

delayms

(1);

e=0;

}

voidint0()//初始化

{

delayms(15);

write_com(0x38);//功能设置命令:

8位,行DDRAM的地址

write_com(0x0c);//显示开及光标设置

write_com(0x06);//增量方式不移位

write_com(0x80);//设置访问地址

}

2、键盘扫描程序模块

voidkeyscanf()

{

uchartemp;

P1=0xfe;

temp=P1;

temp=temp&0xff;

while(temp!

=0xfe)

{

delayms(5);

temp=P1;

temp=temp&0xff;

while(temp!

=0xfe)

{

temp=P1;

switch(temp)

{

case0xee:

num=7;flag=1;break;

case0xde:

num=8;flag=1;break;

case0xbe:

num=9;flag=1;break;

case0x7e:

num=12;duvision=1;break;

default:

num=0;break;

}

while(temp!

=0xfe)

{

temp=P1;

temp=temp&0xff;

}

}

}

P1=0xfd;

temp=P1;

temp=temp&0xff;

while(temp!

=0xfd)

{

delayms(5);

temp=P1;

temp=temp&0xff;

while(temp!

=0xfd)

{

temp=P1;

switch(temp)

{

case0xed:

num=4;flag=1;break;

case0xdd:

num=5;flag=1;break;

case0xbd:

num=6;flag=1;break;

case0x7d:

num=11;mul=1;break;

default:

num=0;break;

}

while(temp!

=0xfd)

{

temp=P1;

temp=temp&0xff;

}

}

}

P1=0xfb;

temp=P1;

temp=temp&0xff;

while(temp!

=0xfb)

{

delayms(5);

temp=P1;

temp=temp&0xff;

while(temp!

=0xfb)

{

temp=P1;

switch(temp)

{

case0xeb:

num=1;flag=1;break;

case0xdb:

num=2;flag=1;break;

case0xbb:

num=3;flag=1;break;

case0x7b:

num=10;minus=1;break;

default:

num=0;break;

}

while(temp!

=0xfb)

{

temp=P1;

temp=temp&0xff;

}

}

}

P1=0xf7;

temp=P1;

temp=temp&0xff;

while(temp!

=0xf7)

{

delayms(5);

temp=P1;

temp=temp&0xff;

while(temp!

=0xf7)

{

temp=P1;

switch(temp)

{

case0xe7:

power=1;break;//复位;

case0xd7:

num=0;flag=1;break;

case0xb7:

equal_flag=1;break;//等于;

case0x77:

num=13;plus=1;break;

default:

num=0;break;

}

while(temp!

=0xf7)

{

temp=P1;

temp=temp&0xff;

}

}

}

}

3、显示程序模块

voiddisplay(ucharnum)

{

ucharworkdata;//处理显示标志位

if(flag==1)//键值信息显示

{

flag=0;

write_data(tab1[num]);

switch(count)

{

case0:

value+=tab2[num];break;

case1:

value=((value*10)+tab2[num]);break;

case2:

value=((value*10)+tab2[num]);break;

case3:

value=((value*10)+tab2[num]);break;

default:

value=0;break;

}

count++;

if(count>=4)

count=0;

}

if(plus==1)//处理加法运算

{

write_com(0x01);

write_data('+');

write_com(0x80);

plus=0;

count=0;

sum+=value;

value=0;

work_num=1;

}

if(minus==1)//处理减法运算

{

write_com(0x01);

write_data('-');

write_com(0x80);

minus=0;

count=0;

sum+=value;

value=0;

work_num=2;

}

if(mul==1)//处理乘法运算

{

write_com(0x01);

write_data('*');

write_com(0x80);

mul=0;

count=0;

sum+=value;

value=0;

work_num=3;

}

if(duvision==1)//处理除法运算

{

write_com(0x01);

write_data('/');

write_com(0x80);

duvision=0;

count=0;

sum+=value;

value=0;

work_num=4;

}

if(equal_flag==1)//求出运算结果

{

equal_flag=0;

workdata=1;

switch(work_num)

{

case1:

work_num=0;sum+=value;value=0;break;

case2:

work_num=0;sum-=value;value=0;break;

case3:

work_num=0;sum*=value;value=0;break;

case4:

work_num=0;sum/=value;value=0;break;

default:

;break;

}

}

if(workdata==1)//显示处理

{

workdata=0;

write_com(0x01);

write_com(0x80);

if(sum<0)

{

write_data('-');

sum=abs(sum);

}

if((sum<10)&&(sum>=0))

{

write_data(tab1[sum]);

}

elseif((sum<100)&&(sum>=10))

{

write_data(tab1[sum/10]);

write_data(tab1[sum%10]);

}

elseif((sum<1000)&&(sum>=100))

{

write_data(tab1[sum/100]);

write_data(tab1[sum%100/10]);

write_data(tab1[sum%100%10]);

}

elseif((sum<10000)&&(sum>=1000))

{

write_data(tab1[sum/1000]);

write_data(tab1[sum%1000/100]);

write_data(tab1[sum%1000%100/10]);

write_data(tab1[sum%1000%100%10]);

}

else

{

write_data('E');

}

}

}

五、调试过程及方法

1、初始化:

将程序添加到keil-v4中,建立之后无错误,产生HEX文件,将该文件导入到Proteus中,与电路图相符后运行,在LCD上产生初始化结果,也就是第一步程序的运行结果,如图2-5所示:

图2-5

2、进行符号运算:

在第一步基础上,在键盘上输入数字和符号键(+、-、*、÷),在LCD上显示结果。

3、系统清零:

在进行完第一步之后,如要在进行符号运算,则要清零,在键盘上按下ON/C之后,系统清零。

4、错误信息显示:

当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上显示E;当除数为0时,计算器会在LCD上显示E,如图2-6所示:

图2-6

六、课程设计心得体会

课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。

随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。

因此作为计算机专业的学生来说掌握单片机的开发技术是十分重要的。

我们的题目是基于单片机设计简易计算器,对于我们这些实践中的新手来说,这是一次考验。

这次课程设计我们学到很多很多的东西,学会了怎么在遇到问题时去解决问题。

不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从而提高自己的实际动手能力和独立思考的能力。

同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多问题,最后在指导老师的辛勤指导下,终于迎刃而解,在此我们表示感谢!

七、参考文献

[1]《例说51单片机(C语言版)》张义和、王敏男等人民邮电出版社

[2]《单片机原理与接口技术》(第3版)李朝青编著北京航空航天大学出版社

附录程序清单

1、/******************函数声明*****************/

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetab1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2b,0x2d,0x2a,0x2f,0x2d,0xd0};//通过液晶字符手册查找得来

ucharcodetab2[]={0,1,2,3,4,5,6,7,8,9};

ucharnum;//判断按键的值

ucharflag;//判断按键的标志位

ucharcount;//判断按键位数标志位

intvalue;

intsum;//求和,

ucharplus,minus,mul,duvision,equal_flag;//加,减,乘,除,等标志位

ucharwork_num;

ucharpower;

sbitrs=P2^0;

sbitrw=P2^1;

sbite=P2^2;

voiddelayms(uintcount)//延时子程序

{

uinti,j;

for(i=0;i

for(j=0;j<120;j++);

}

/******************LCD初始化**********************/

voidwrite_com(ucharcom)

{

e=0;

rs=0;

rw=0;

P0=com;

delayms

(1);

e=1;

delayms

(1);

e=0;

}

voidwrite_data(ucharnum)

{

e=0;

rs=1;

rw=0;

P0=num;

delayms

(1);

e=1;

delayms

(1);

e=0;

}

voidint0()

{

delayms(15);

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

}

/*********键盘扫描程序;以确定按键位置************/

voidkeyscanf()

{

uchartemp;

P1=0xfe;

temp=P1;

temp=temp&0xff;

while(temp!

=0xfe)

{

delayms(5);

temp=P1;

temp=temp&0xff;

while(temp!

=0xfe)

{

temp=P1;

switch(temp)

{

case0xee:

num=7;flag=1;break;

case0xde:

num=8;flag=1;break;

case0xbe:

num=9;flag=1;break;

case0x7e:

num=12;duvision=1;break;

default:

num=0;break;

}

while(temp!

=0xfe)

{

temp=P1;

temp=temp&0xff;

}

}

}

P1=0xfd;

temp=P1;

temp=temp&0xff;

while(temp!

=0xfd)

{

delayms(5);

temp=P1;

temp=temp&0xff;

while(temp!

=0xfd)

{

temp=P1;

switch(temp)

{

case0xed:

num=4;flag=1;break;

case0xdd:

num=5;flag=1;break;

case0xbd:

num=6;flag=1;break;

case0x7d:

num=11;mul=1;break;

default:

num=0;break;

}

while(temp!

=0xfd)

{

temp=P1;

temp=temp&0xff;

}

}

}

P1=0xfb;

temp=P1;

temp=temp&0xff;

while(temp!

=0xfb)

{

delayms(5);

temp=P1;

temp=temp&0xff;

while(temp!

=0xfb)

{

temp=P1;

switch(temp)

{

case0xeb:

num=1;flag=1;break;

case0xdb:

num=2;flag=1;break;

case0xbb:

num=3;flag=1;b

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1