单片机计算器2.docx
- 文档编号:10147100
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:25
- 大小:239.33KB
单片机计算器2.docx
《单片机计算器2.docx》由会员分享,可在线阅读,更多相关《单片机计算器2.docx(25页珍藏版)》请在冰豆网上搜索。
单片机计算器2
单片机原理及应用
课程设计报告
课题:
计算器
指导老师:
班级:
学号:
姓名:
设计时间:
2008.9.17~10.10
目录
第一章摘要…………..……………………………………………………..2
第二章设计原理及思路…………………………………………………...4
2.1实验器材………………………………………………………………4
2.2实验思路………………………………………………………………4
2.3实验程序………………………………………………………………5
2.3.1主程序…………………………………………………………5
2.3.2按键程序….……………………………………………………6
2.3.3显示程序…………………………………………………….8
2.3.4计算程序……………………………………….…………..9
第三章器件介绍………………………………….……………………10
.3.1AT89C51简介……………………………….………………………10
3.28155简介…………………………………………………………11
3.3LED显示器简介………………………………………………………13
第四章实验电路图………………………………………………………11
4.1总电路图………………………………………………………….15
4.2AT89C51单片机原理图……………………………………………….15
4.38155原理图……………………………………………………….16
4.4数码管电路图……………………………………………………….16
4.5晶振电路图……………………………………………………..…..17
4.6复位电路图……………………………………………………..…..17
心得与体会……………………………………………………………….17
附录……………………………………………………………………….18
第一章摘要
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机内部也用和电脑功能类似的模块,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可。
用它来做一些控制电器一类不是很复杂的工作足矣了。
我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!
......它主要是作为控制部分的核心部件。
它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。
单片机是靠程序的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。
一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!
但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!
只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
由于单片机对成本是敏感的,所以目前占统治地位的软件还是最低级汇编语言,它是除了二进制机器码以上最低级的语言了,既然这么低级为什么还要用呢?
很多高级的语言已经达到了可视化编程的水平为什么不用呢?
原因很简单,就是单片机没有家用计算机那样的CPU,也没有像硬盘那样的海量存储设备。
一个可视化高级语言编写的小程序里面即使只有一个按钮,也会达到几十K的尺寸!
对于家用PC的硬盘来讲没什么,可是对于单片机来讲是不能接受的。
单片机在硬件资源方面的利用率必须很高才行,所以汇编虽然原始却还是在大量使用。
一样的道理,如果把巨型计算机上的操作系统和应用软件拿到家用PC上来运行,家用PC的也是承受不了的。
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。
不过,这种电脑,通常是指个人计算机,简称PC机。
它由主机、键盘、显示器等组成。
还有一类计算机,大多数人却不怎么熟悉。
这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。
顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。
因为它体积小,通常都藏在被控机械的“肚子”里。
它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。
现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。
现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。
究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
第二章设计原理及思路
2.1实验器材
AT89C51、8155H、八位一体数码管7SEG-MPX4-CC.驱动74LS240四片、电阻电感若干。
2.2实验思路
以单片机的P1口为输入口,再由P0口经8155扩展输出口,在74LS240芯片的驱动下,由数码管显示出数据。
该过程的顺利进行,是依靠在单片机内部编写的控制程序来实现的。
在此实验设计中,主程序是由3个小程序组成,分别是显示程序、计算程序和键盘扫描程序。
程序开始运行时,进入最初状态。
数码管显示为0。
当有键按下时,系统通过一个延迟程序检测是否真的有键按下,如若的确有键按下,则开始运行键盘扫描程序,通过对键盘行列高低电平的检测,判断出是哪个键按下,然后通过单片机控制,在数码管上显示出该输入的数。
在其间根据需要,分别调用显示程序和计算程序。
下图为AT89C51单片机的引脚图:
图1AT89C51的引脚图
2.3实验程序
2.3.1主程序
#include
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharsymbol=0;
longxx,yy;
longflag;
inttemp=0;
longchange();/*将数组转换为数*/
voidmain()
{
ucharb,i;
while
(1)
{
display();//调用显示程序//
P1=0xf0;
if((P1&0xf0)!
=0xf0);//判断是否有按键//
{
delay10ms();
if((P1&0xf0)!
=0xf0)
{
b=gotkey();
if(b>=0&&b<=9)
{
if(temp!
=0)
{
del();
temp=0;
}
for(i=8;i>0;i--)
huantab[i]=huantab[i-1];
huantab[0]=b;
}
else
if(b==0xff)
{
del();
xx=0;
yy=0;
}
elseif(b=='=')
{
yy=change();
flag=compute(xx,yy,symbol);
huantab[0]=flag%10;;
huantab[1]=flag%100/10;
huantab[2]=flag%1000/100;
huantab[3]=flag%10000/1000;
huantab[4]=flag%100000/10000;
symbol=0;
}
else{
symbol=b;
temp=b;
xx=change();
}
while(P1&0xf0!
=0xf0);
}
}
}
}
longchange()
{
uintresult;
result=huantab[0]+huantab[1]*10+huantab[2]*100+huantab[3]*1000+huantab[4]*10000;
returnresult;
}
2.3.2按键程序
#include
#defineucharunsignedchar
voiddelay10ms(void)
{
uchari,j;
for(i=20;i>0;i--)
for(j=250;j>0;j--);
}
ucharkeyscan(void)//读键值程序//
{
ucharsccode,recode,keytemp=0;
P1=0xf0;
sccode=0xfe;
while(sccode!
=0xef)
{
P1=sccode;
if((P1&0xf0)!
=0xf0)
{
recode=P1&0xf0|0x0f;
keytemp|=(~sccode)+(~recode);
}
else
sccode=(sccode<<1)|0x01;
}
return(keytemp);
}
uchargotkey()//读键值//
{
ucharkey1,key;
key=keyscan();
switch(key)
{
case0x11:
key1=7;
break;
case0x21:
key1=8;
break;
case0x41:
key1=9;
break;
case0x81:
key1='/';
break;
case0x12:
key1=4;
break;
case0x22:
key1=5;
break;
case0x42:
key1=6;
break;
case0x82:
key1='*';
break;
case0x14:
key1=1;
break;
case0x24:
key1=2;
break;
case0x44:
key1=3;
break;
case0x84:
key1='-';
break;
case0x18:
key1=0xff;
break;
case0x28:
key1=0;
break;
case0x48:
key1='=';
break;
case0x88:
key1='+';
break;
}
return(key1);
}
2.3.3显示程序
/*显示程序,P2做LED的片选*/
#include
#include
#defineCON8155XBYTE[0x0100]
#definePA8155XBYTE[0x0101]
#definePB8155XBYTE[0x0102]
#defineucharunsignedchar
#defineuintunsignedint
ucharhuantab[]={0,0,0,0,0,0,0,0,};//显示的缓冲区//
ucharcodekeytab[10]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
voiddel()
{
uinta;
for(a=0;a<9;a++)
{
huantab[a]=0;
}
}
voiddisplay()//显示程序//
{
uchari,j,k,n;
ucharw,r;
CON8155=0x03;
n=0x7f;
for(i=0;i<8;i++)
{
PA8155=0x00;/*不加显示有重叠cathode为0X00,anthode为0XFF*/
if(i!
=0&&huantab[i]==0)
{
for(r=i;r<8;r++)
w+=huantab[r];
if(w==0)break;
elsePA8155=keytab[huantab[i]];
}
elsePA8155=keytab[huantab[i]];
PB8155=n;
for(j=10;j>0;j--)
for(k=50;k>0;k--);
n=(n>>1)|0x80;
w=0;
}
}
2.3.4计算程序
longcompute(longa1,longb1,charc)
{
longresult;
switch(c)
{
case'+':
result=a1+b1;
break;
case'-':
result=a1-b1;
break;
case'*':
result=a1*b1;
break;
case'/':
result=a1/b1;
break;
}
returnresult;
}
标题:
小键盘的输入函数
版本:
1.0
Target:
89S51
函数描述:
chargotkey(void)
从4ⅹ4小键盘输入数据,返回0 15
小键盘的连接方式:
1P10-----7----8----9----'/'
||||
2P11-----4----5----6----'*'
||||
3P12-----1----2----3----'-'
||||
4P13---0xff---0---'='---'+'
||||
5P14----||||
||||
6P15----------||
||
7P16---------------|
|
8P17--------------------
图2键盘指示图
第三章器件介绍
3.1AT89C51简介
AT89C51引脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3.28155简介
8155各引脚功能说明如下:
RST:
复位信号输入端,高电平有效。
复位后,3个I/O口均为输入方式。
AD0~AD7:
三态的地址/数据总线。
与单片机的低8位地址/数据总线(P0口)相连。
单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。
:
读选通信号,控制对8155的读操作,低电平有效。
:
写选通信号,控制对8155的写操作,低电平有效。
:
片选信号线,低电平有效。
IO/
:
8155的RAM存储器或I/O口选择线。
当IO/
=0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);当IO/
=1时,选择8155的I/O口,AD0~AD7上的地址为8155I/O口的地址。
ALE:
地址锁存信号。
8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及
,IO/
的状态都锁存到8155内部锁存器。
因此,P0口输出的低8位地址信号不需外接锁存器。
PA0~PA7:
8位通用I/O口,其输入、输出的流向可由程序控制。
PB0~PB7:
8位通用I/O口,功能同A口。
PC0~PC5:
有两个作用,既可作为通用的I/O口,也可作为PA口和PB口的控制信号线,这些可通过程序控制。
TIMERIN:
定时/计数器脉冲输入端。
TIMEROUT:
定时/计数器输出端。
VCC:
+5V电源。
2、8155的地址编码及工作方式
在单片机应用系统中,8155是按外部数据存储器统一编址的,为16位地址,其高8位由片选线
提供,
=0,选中该片。
当
=0,IO/
=0时,选中8155片内RAM,这时8155只能作片外RAM使用,其RAM的低8位编址为00H~FFH;当
=0,IO/
=1时,选中8155的I/O口,其端口地址的低8位由AD7~AD0确定,如表6-6所示。
这时,A、B、C口的口地址低8位分别为01H、02H、03H(设地址无关位为0)。
表6-68155芯片的I/O口地址
AD7~AD0
选择I/O口
A7
A6
A5
A4
A3
A2
A1
A0
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
0
0
0
0
1
1
0
0
1
1
0
0
0
1
0
1
0
1
命令/状态寄存器
A口
B口
C口
定时器低8位
定时器高6位及方式
8155的A口、B口可工作于基本I/O方式或选通I/O方式。
C口可工作于基本I/O方式,也可作为A口、B口在选通工作方式时的状态控制信号线。
当C口作为状态控制信号时,其每位线的作用如下:
PC0:
AINTR(A口中断请求线)
PC1:
ABF(A口缓冲器满信号)PC2:
(A口选通信号)
PC3:
BINTR(B口中断请求线)PC4:
BBF(B口缓冲器满信号)
PC5:
(B口选通信号)
8155的I/O工作方式选择是通过对8155内部命令寄存器设定控制字实现的。
命令寄存器只能写入,不能读出,命令寄存器的格式如图6-16所示。
在ALT1~ALT4的不同方式下,A口、B口及C口的各位工作方式如下:
ALT1:
A口,B口为基本输入/输出,C口为输入方式。
ALT2:
A口,B口为基本输入/输出,C口为输出方式。
ALT3:
A口为选通输入/输出,B口为基本输入/输出。
PC0为AINTR,PC1为ABF,PC2为
,PC3~PC5为输出。
ALT4:
A口、B口为选通输入/输出。
PC0为AINTR,PC1为ABF,PC2为
,PC3为BINTR,PC4为BBF,PC5为
。
3.3LED显示器简介
数码管有共阴共阳之分,本系统采用8段共阴型LED,其原理图如下图所示,每位数码管内部有8个发光二极管,公共端由8个发光二极管的阴极并接而成,正常显示时公共端接低电平(GND),各发光二极管是否点亮取决于a-dp各引脚上是否是高电平。
LED数码管的外形结构如图a,外部有10个引脚,其中3,8脚为公共端也称位选端,其余8个引脚称为段选端,当要使某一位数码管显示某一数字((0-9中的一个)必须在这个数码管的段选端加上与数字显示数字对应的8位段选码(也称字形码),在位选端加上低电平即可。
由于系统要显示的内容比较简单,显示量不多,所以选用数码管既方便又经济。
LED有共阴极和共阳极两种。
如图b、c所示。
二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。
一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。
当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。
为了保护各段LED不被损坏,需外加限流电阻。
a.符号和引脚b.共阴极c.共阳极
图3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 计算器