基于单片机的计算器文档格式.docx
- 文档编号:14067006
- 上传时间:2022-10-17
- 格式:DOCX
- 页数:19
- 大小:198.15KB
基于单片机的计算器文档格式.docx
《基于单片机的计算器文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的计算器文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
每个的端口包含一个8位的数据锁存和一个输入缓冲器。
输出时,数据可以锁存;
输入时,数据可以缓冲。
作为一般的I/O口使用时,在指令的控制下,可以有三种基本的方式:
输入输出和读—修改—写。
在AT89C51用作输入端时,将首先向引脚写“1”而使部MOS管截止以便引脚处于悬浮状态,从而可获得高阻抗输入。
3.驱动电路部分是用三极管和电阻来实现。
AT89C51的P0口用于数码管的段选,由NPN管和限流电阻来驱动;
P2口用于数码管的位选,由PNP管来驱动。
所用数码管为4个共阳LED,段选端为低电平有效,位选端为高电平有效。
4.显示是用4个共阳的LED来完成。
采用动态循环显示方式,全部数码管共用一套段选驱动电路,各位数码管的同段引脚短接后再接到对应段选的驱动线上。
显示时通过位选信号采用扫描的方法逐位地循环点亮各位数码管。
动态显示虽然在任一时刻只有一位数码管点亮,但是由于人眼具有的视觉残留效应,看起来与全部数码管持续点亮的效果完全一样。
五、调试流程
1.测试电源
调节直流电压源输出+5V电压,并用万用表检测无误后接入电路板。
2.LED测试
编写LED调试程序如下:
#include"
reg51.h"
intrins.h"
unsignedcharcode
showcode[]={0xB7,/*0*/0xA0,/*1*/0xD3,/*2*/0xF1,/*3*/0xE4,/*4*/0x75,/*5*/0x77,/*6*/0xA1,/*7*/0xF7/*8*/,0xF5/*9*/};
voidmain()//单步调试
{
P0=0xB7;
//显示0
P2=0xfe;
P2=0xfd;
P2=0xfb;
P2=0xf7;
P0=0xf7;
//显示8
}
进行单步运行,LED逐位显示,显示结果正常。
3.整体调试
将主程序通过仿真器下载到电路板,检测键盘与LED的功能是否正常。
4.功能优化
根据硬件显示的结果进行程序优化,调节LED的亮度与显示的稳定性,以与提高键盘读取数据的正确性和灵敏度。
六、遇到的问题与解决方法
1.问题:
上电后四个LED中第四位无法显示
解决方法:
先用万用表的二极管档进行LED电路测试,发现该为LED的位选信号线虚接。
重新焊接后显示正常。
2.问题:
发现四位LED均显示8,改变输入码字后显示不变
用万用表直接测试仿真器的P0口(码字输出端口),发现电平正常,但是接入电路后就显示错误。
在老师的指导下,知道由于仿真器的部结构与AT89C51的差异性和P0的特殊性,需要将外加电源接入仿真器的VCC端进行供电。
进行修改后,LED能够根据输入码字的变化正常显示。
3.问题:
LED的显示亮度不稳定,位数较长时显示不清晰(比较闪)
修改LED显示程序,将原先的8位LED显示程序改为4位,并适当缩短每位显示的延迟时间后,显示的亮度稳定。
七、元器件清单
元器件名称
元器件型号
元器件数量
单片机
AT89C51
1
按键
点触式
16
LED
共阳
4
三极管
NPN
8
PNP
电阻
4.7k
12
330
9.1k
470
10k
2k
电容
33p
2
晶振
12M
二极管
发光二极管
八、原理图与实物照片
原理图:
实物照片:
九、软件层次结构框图和流程图
十、简易计算器软件包设计规格书
1.修订记录
时间
作者
描述
2010-4-30
马辰阳
v0.1
2010-5-14
俞淑婷
v0.2
2010-6-4
马辰阳、俞淑婷
v0.3
2.文档说明
本文档是基于AT89C51的简易计算器软件包的设计指导性文件,软件包的开发与维护均应在本文档的规定下进行。
3.项目说明
本项目基于AT89C51,软件包为源码的若干集合,并按照一定目录结构排列。
4.开发环境
KeiluVision
5.目录结构
-\calculator
|-.calculator.h
|-\function
|-main.c
|-delay.c
|-key_show.c
|-scan_show.c
|-key_sweep.c
|-store_as_single.c
|-save_data.c
|-calculate.c
|-processing.c
|-\include
|-reg51.h
|-intrins.h
|-calculator.h
十一、源代码(附注释)
/*******************function:
简易计算器主函数********************/
#include"
Mcro.h"
//包含宏头文件
calculator.h"
//包含计算机头文件
voidmain()
{
uintj,k;
while
(1)
processing(j,k);
//循环执行处理子程序
/**************************functionend***********************/
/*******************function:
宏定义头文件***********************/
//-----数据类型定义--------//
#defineucharunsignedchar
#defineuintunsignedint
//------显示位数定义-------//
#defineshow_0(position[3]==0)&
&
(position[2]==0)&
(position[1]==0)
(position[0]==0)//当个十百千位全为0时显示0
#defineshow_1(position[3]==0)&
(position[2]==0)&
//当十百千位全为0时显示*
#defineshow_2(position[3]==0)&
(position[2]==0)
//当百千位全为0时显示**
#defineshow_3(position[3]==0)
//当千位全为0时显示***
//=========全局变量定义=====//
/*显示器缓冲区段码*/
ucharcodeshowcode[]=
{0xB7,/*0*/0xA0,/*1*/0xD3,/*2*/0xF1,/*3*/0xE4,/*4*/0x75,/*5*/0x77,
/*6*/0xA1,/*7*/0xF7/*8*/,0xF5/*9*/};
/*P10到P13的键驱动码*/
ucharcodesweep_code[4]={0xf7/*第一列*/,0xfb/*第二列*/,0xfd/*第三列*/,0xfe/*第四列*/};
/*运算符标志负号标志键盘译码数第几操作数标志*/
uintoperator_signal,minus=0,key_decode,flag=0;
/*操作数存储区*/
uintdatamydata[2][4]={{0,0,0,0},{0,0,0,0}};
//函数申明
delay.c"
//延时1ms子程序
key_show.c"
//键码显示子程序
key_sweep.c"
//键盘扫描子程序
store_as_single.c"
//位数分离存储子程序
save_data.c"
//存储数据子程序
calculate.c"
//执行计算功能的子程序
processing.c"
//处理联合子程序
/**********************function:
数码管显示子程序***************/
scan_show.c"
voidkey_show(uintposition[],ucharfirst)
P2=first;
if(minus==0)//minus==0表示显示的数据是正数
{
if(show_0)//显示0
{P0=0xb7;
}//0xb7是0的段码
elseif(show_1)//显示*
{P0=showcode[position[0]];
elseif(show_2)//显示**
{scan_show(position,2);
}//调用数码管显示数据子程序
elseif(show_3)//显示***
{scan_show(position,3);
else//显示****
{scan_show(position,4);
}
}
else//否则minus==1表示显示的数据是负数
if(show_0)//显示0
P0=showcode[position[0]];
delay(3);
P2=_crol_(P2,1);
//P2口循环左移1位
P0=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 计算器