科学计算器设计报告(51单片机)

合集下载

单片机计算器报告

单片机计算器报告

基于51单片机实验报告(计算器)一.计算器模块1.功能介绍利用8051 单片机硬件资源和常用外围电路如LCD1602,七段数码管,时钟(DS1302)温度传感器(18B20)等实现一个能做简单四则运算,并具有时钟显示,温度显示附加功能的计算器。

2.设计方案利用STC89C52为内核的单片机,PC机。

四则运算利用4*4矩阵键盘实现从0—9和运算符号的输入,并将操作过程和结果显示在LCD1602上。

时钟显示和温度显示,可以利用DS1302产生年份,月份,日期,星期,时,分,秒的数据,并将数据送往LCD1602显示,同样可以利用单片机开发板上面集成的DS18B20温度传感器来测试周围环境的温度,将获取的温度通过在LCD1602来显示。

系统设计框图3.具体实现代码计算器四则运算部分主要分为键盘扫描的键值读取,判断运算符号实现乘除优先级计算,LCD1602显示。

键盘扫描常用的有行扫描法,线反转法,此处我们用行扫描法,可以更明了读取键值。

unsigned char temp;key = null;//第一行按键P3 = 0xfe;temp = P3;temp = temp & 0xf0;if (temp != 0xf0){delay(10); //延时软件去抖动temp = P3;temp = temp & 0xf0;if (temp != 0xf0) //确认有键按下{temp = P3;switch (temp){case 0xee:key = 'D'; //读键值break;case 0xde:key = 0;break;case 0xbe:key = '=';break;case 0x7e:key = '/';break;}flag++;}}读完按键值之后我们需要读取运算的数字与运算符号,通过判断键值为数字则通过nun=nun*10+key,计算出数字,判断键值为运算符号则读出数字和键值。

基于51单片机的计算器设计实验报告(DOC)

基于51单片机的计算器设计实验报告(DOC)

基于51单片机的计算器设计实验报告班级:__12电子2_姓名:___风间__学号:___2015年1月6日一、实验目的1.初步尝试运用单片机进行系统设计;2.掌握矩阵键盘的中断扫描显示;3.掌握液晶或数码管的动态显示;4.掌握数据的存储和掉电保护。

二、实验设备及器材Keil c、 proteus、及单片机开发板。

三、实验内容基本要求:1完成标准型计算器的基本功能2.4*4矩阵键盘(0~9、+、-、*、/、=、%)进行数据的输入及加、减、乘、除基本运算,运用1602液晶或数码管进行显示3. 要求开机显示学号四、设计思路根据计算器的功能要求,选择AT89C51为主控机,通过扩展必要的外围接口电路,实现对计算器的设计。

外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块AT89C51单片机构成。

计算器电路包括四个模块:选用LCD作为显示部分,矩阵键盘作为输入部分,运算模块,单片机控制部分。

模块图如图所示:计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。

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

(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,需要16个按键。

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

线路原理框图如图所示。

五、基于proteus的硬件原理图六、软件流程图七、程序代码#include<reg51.h> //头文件#define unit unsigned int#define uchar unsigned charvoid xuehao(void);sbit SPK=P1^0;sbit lcden=P2^3;sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char i,j,temp,num,num_1;long a,b,c; //a,第一个数 b,第二个数 c,得数float a_c,b_c;uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0,};uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};void delay(uchar z) // 延迟函数{uchar y;for(z;z>0;z--)for(y=0;y<110;y++);}void check() // 判断忙或空闲{do{P0=0xFF;rs=0;rw=1;lcden=0; //禁止读写delay(1); //等待,液晶显示器处理数据lcden=1; //允许读写}while(busy==1); //判断是否为空闲,1为忙,0为空闲}void write_com(uchar com) // 写指令函数{P0=com;rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(uchar date) // 写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}void init() //1602初始化函数{num=-1;lcden=1;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x80);write_com(0x01);num_1=0;i=0;j=0;a=0; //第一个参与运算的数b=0; //第二个参与运算的数c=0;flag=0;fuhao=0;SPK=0; //蜂鸣器打开delay(1000); //延时SPK=1; //蜂鸣器关闭}void keyscan() // 键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20);if(P3!=0xfe){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break;case 0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2) //如果按下的是'7','8'或'9 {if(j!=0){write_com(0x01);j=0;}if(flag==0) //没有按过符号键{a=a*10+table[num];}else //如果按过符号键{b=b*10+table[num];}}else //如果按下的是'/'{flag=1;fuhao=4; //4表示除号已按}i=table1[num];write_date(0x30+i);}P3=0xfd;if(P3!=0xfd){delay(5);if(P3!=0xfd){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=4;break;case 0xd0:num=5;break;case 0xb0:num=6;break;case 0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6&&num!=7) //如果按下的是'4','5'或'6' {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}else{flag=1;fuhao=3; //3表示乘号已按}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=8;break;case 0xd0:num=9;break;case 0xb0:num=10;break;case 0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10) //如果按下的是'1','2'或'3' {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}else if(num==11){flag=1;fuhao=2; //2表示减号已按}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=12;break;case 0xd0:num=13;break;case 0xb0:num=14;break;case 0x70:num=15;break;}}while(P3!=0xf7);switch(num){case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;} //按下的是"清零"break;case 13:{ //按下的是"0"if(flag==0) //没有按过符号键{a=a*10;write_date(0x30);P1=0;}else if(flag==1) //如果按过符号键{b=b*10;write_date(0x30);}}break;case 14:{j=1;if(fuhao==1){write_com(0x80+0x4f); //按下等于键,光标前进至第二行最后一个显示处write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格c=a+b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==2){write_com(0x80+0x4f);write_com(0x04);if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==3){write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==4){write_com(0x80+0x4f);write_com(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;i++;if(i==3)write_date(0x2e);}if(a/b<=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;} break;}}}void xuehao() //开机显示学号{write_com(0x80); //从第一行第一位开始write_date('1');write_date('2');write_date('0');write_date('0');write_date('4');write_date('0');write_date('1');write_date('2');write_date('1');write_date('7');}void main() //主函数{init();xuehao();while(1){keyscan();}}八、运行结果图开机显示学号:加法运算:乘法运算:九、扩展功能在基本的功能上加了蜂鸣器电路,使按键的时候能发出声音。

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计基于51单片机的简易计算器设计一、引言随着微电子技术和嵌入式技术的发展,越来越多的智能化设备被应用于日常生活中。

其中,基于51单片机的简易计算器设计具有广泛的应用价值。

本文将介绍如何使用51单片机设计一个简易计算器,实现加减乘除的基本运算功能。

二、设计方案1.硬件组成:本设计采用51单片机作为主控芯片,与键盘、显示器等外围设备相连。

键盘用于输入数字和运算符,显示器则用于显示运算结果。

2.软件设计:软件部分包括主程序和子程序。

主程序负责初始化硬件、读取键盘输入和显示运算结果。

子程序包括加减乘除的运算子程序,可根据输入的运算符和操作数进行相应的运算。

3.算法实现:在加减乘除的运算子程序中,采用基本的数学运算方法实现。

对于加法,直接将两个操作数相加;对于减法,将两个操作数相减;对于乘法,采用循环相乘的方法;对于除法,采用循环相除的方法。

三、实验结果在实验中,我们成功地使用51单片机设计了一个简易计算器,实现了加减乘除的基本运算功能。

在测试过程中,我们输入了不同的数字和运算符,得到了正确的运算结果。

同时,我们也测试了计算器的稳定性,发现其在连续运算时表现良好,没有出现明显的误差或故障。

四、结论基于51单片机的简易计算器设计具有简单易行、实用性强等优点。

通过实验测试,我们验证了其可行性和稳定性。

此外,该设计还可以根据需要进行扩展和优化,例如增加更多的运算功能、优化算法等。

未来,我们可以进一步研究如何提高计算器的运算速度和精度,以及如何将其应用于更多的实际应用场景中。

五、改进意见与展望1.增加更多的运算功能:例如实现括号、开方、指数等高级运算,满足更复杂的数学计算需求。

2.优化算法:针对现有的加减乘除运算算法进行优化,提高运算速度和精度。

例如采用更高效的除法算法,减少运算时间。

3.增加存储功能:在计算器中加入存储单元,使得用户可以在多个步骤之间进行数据传递和保存。

4.增强人机交互界面:优化显示器的显示效果,增加用户输入的便捷性,提高用户体验。

c51单片机设计计算器 设计总结

c51单片机设计计算器 设计总结

c51单片机设计计算器设计总结C51单片机设计计算器是一个复杂的项目,它涉及了微控制器编程、硬件接口、输入/输出等多个方面。

下面是对此项目的总结:1. 功能需求分析:在开始设计计算器之前,首先要明确需要实现的功能。

对于这个项目,基本的计算器功能如加、减、乘、除是必须的,同时考虑到扩展性,也可以加入一些高级功能如平方、立方等。

2. 硬件选择:C51单片机是一种常用的微控制器,其优点包括低功耗、高性能以及丰富的外设接口。

此外,还需要选择合适的显示模块(如LCD)和输入设备(如键盘)。

3. 软件设计:软件设计主要涉及到单片机的编程。

需要编写程序以实现计算器的各种功能。

这包括但不限于输入处理、运算逻辑、结果显示等部分。

4. 调试与测试:在完成硬件和软件的设计后,需要进行大量的测试以确保计算器的功能正常。

这包括基本的四则运算测试,以及一些复杂的测试用例,如溢出测试、边界条件测试等。

5. 性能优化:虽然基本的计算器功能可以运行,但性能和效率方面可能还有优化的空间。

例如,可以通过改进算法或者优化代码来提高计算速度。

6. 扩展性考虑:在设计时,应考虑到未来可能的扩展需求。

例如,可以预留一些接口或者引脚以便未来添加更多功能。

7. 文档与维护:完成项目后,应编写详细的文档以方便后续的维护和修改。

这包括硬件连接图、软件代码注释、测试报告等。

8. 安全与可靠性:对于任何电子设备,安全性和可靠性都是非常重要的。

在设计时,应考虑到各种可能的异常情况,并采取相应的预防措施。

通过这个项目,我们可以更深入地理解单片机的工作原理,以及如何在实际项目中应用这些知识。

同时,这个项目也提高了我们的硬件接口能力、编程技巧以及问题解决能力。

51单片机简易计算器设计报告

51单片机简易计算器设计报告

51单片机简易计算器设计报告
本文将介绍51单片机简易计算器的设计报告。

该计算器通过
16位的LCD显示屏实现了基本计算功能,包括加、减、乘、除、取反、开方等。

1. 硬件设计
该计算器的核心部件是STC89C52单片机。

STC89C52是一种
高性能、低功耗的8位单片机,拥有8KB的Flash程序存储器和128字节的内部RAM,可提供多种功能和通讯接口。

通过
I/O口与LCD模块通讯,实现输出功能。

该计算器使用16位的LCD显示屏,显示范围为-99.99~99.99,共有6个数字位。

显示屏使用了ST7920控制器,可通过串行、并行等多种方式控制。

2. 软件设计
该计算器的软件设计主要包括三部分:键盘扫描,计算功能和LCD显示。

键盘扫描:该计算器采用4x5矩阵键盘,通过程序对键盘进行扫描,实现对不同按键的检测。

计算功能:该计算器可以实现基本的四则运算、取反、开方等功能。

对于四则运算,通过栈来实现计算,将运算符压入栈中,然后将操作数从栈中取出进行计算。

LCD显示:该计算器使用16位的LCD显示屏,通过程序控制数据和命令的传输,将计算结果显示在LCD屏幕上。

3. 总结
通过对51单片机简易计算器的设计报告,可以看出该计算器实现了基本的计算功能,通过硬件设计和软件设计相结合,将计算器的功能实现得十分完整。

该计算器的设计初步掌握了51单片机的应用,有助于后续项目的开展。

基于51单片机的计算器设计实验报告

基于51单片机的计算器设计实验报告
基于
实验报告
班级:
12电子2
姓名:
风间
学号:
2015年1月6日
一、
1.初步尝试运用单片机进行系统设计;
2.掌握矩阵键盘的中断扫描显示;
3.掌握液晶或数码管的动态显示;
4.掌握数据的存储和掉电保护。
二、
Keil c、proteus、及单片机开发板。
三、
基本要求:
1完成标准型计算器的基本功能
2.4*4矩阵键盘(0~9、+、-、*、/、=、%进行数据的输入及加、减、乘、除 基本运算,运用1602液晶或数码管进行显示
FDET^VD
PCLVA11
PH 5V**7
WTJM^
■ 口j
PQ卅Q+
prw肚旺
RBT
PDVAA<
PD7MD7
R.1W
PEMi口
rtsti
Ml
K
iP7伽ii
f13
P7<w'ftn
PHAU

PW
P3fyp-aJi
・H IfOCIJi i
P1Z
pa^nrrn
P1J
333!llf~1
P3mTEJ
F 1 f
void delay(uchar z) // {
uchar y;
for(z;z>0;z--)
for(y=0;y<110;y++); }
延迟函数
void check()
{
do{
P0=0xFF;
rs=0;
rw=1;
lcde n=0;
//判断忙或空闲
//禁止读写
delay(1);
lcde n=1;

51单片机数码管计算器课设报告(DOC)

51单片机数码管计算器课设报告(DOC)

课程名称:微机原理课程设计题目:51单片机共阴极数码管计算器课程设计报告近几年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面的知识是不够的,还应根据具体硬件结合,加以完善。

本设计是基于51系列的单片机进行的十进制计算器系统设计可以完成计算器的键盘输入进行加、减、乘、除的简单四则运算并在4位数码管上相应的显示结果。

硬件方面从功能考虑首先选择内部存储资源丰富的STC89C52单片机输入采用4×4矩阵键盘。

显示采用4位7段共阴极数码管动态显示。

软件方面从分析计算器功能、流程图设计再到程序的编写进行系统设计。

编程语言方面选用C语言进行编写,并选用全球编译效率最高的KEIL公司的μVision2软件,采用C语言进行编程并用Proteus仿真。

通过最后的调试和测试,本计算器可以实现简单的四位数的加减乘除功能。

关键词:单片机,计算器,共阴极数码管,矩阵键盘一、设计任务要求 (4)1.1 设计任务 (4)1.2 设计的目的 (4)1.3 设计要求 (4)二、方案总体设计 (5)2.1 系统模块图 (5)2.2 总体方案工作原理 (5)三、硬件设计 (6)3.1 整个单片机的接口电路 (6)3.2 单片机STC89C52说明 (6)3.3 引脚说明 (7)3.4 计算器系统现状 (8)3.5 最小系统原理图 (9)3.6 显示电路 (11)3.7 按键输入电路 (13)四、软件设计 (15)五、系统仿真与调试 (16)5.1 采用KEIL 开发的89c52单片机应用程序步骤 (16)5.2 硬件电路图的接法操作 (16)5.3 单片机系统Proteus设计与仿真过程 (16)5.4 STC-ISP程序烧录软件 (17)5.5 实物图 (18)5.6 仿真图 (19)5.7 计算展示 (19)六、设计总结 (22)七、参考文献 (23)一、设计任务要求1.1 设计任务满足计算器的基本要求,可以基本的运算(加减乘除),数据归零,利用51系列单片机设计符合功能的计算器,并用LED 码管显示数据,4*4的矩阵键盘实现数据输入。

51单片机简易计算器设计报告(一)

51单片机简易计算器设计报告(一)

51单片机简易计算器设计报告(一)背景介绍在数字化时代,计算器作为一种简单易用的工具,越来越得到人们的关注和热爱。

而基于51单片机的简易计算器,不仅可以成为一种学习电子技术的手段,还具有满足简单计算需求的实用性。

设计思路本计算器采用键盘输入和数码管输出的电路设计,为用户提供加、减、乘、除、小数点、退位以及等于等功能。

1.键盘输入采用矩阵键盘的方式,将所有按键按行列排列,并利用51单片机中断方式来读取键值。

2.计算处理通过编写相应的程序代码,计算出用户输入的两个数值及操作符的结果,并将结果存储在数据缓存器中,最后将其输出至数码管。

3.数码管显示根据计算结果的数据类型,将其经过相应的转换处理后,通过数码管将结果输出至用户。

设计技术1.软件编写软件编写方面,采用汇编语言进行编写,代码总长度为2.2KB 左右。

其中,以中断方式读取键值、实现数值存储与判断、计算处理、数码管的结果输出等作为关键点进行编写。

2.硬件搭建硬件搭建方面,需要按照电路图进行搭建,并将51单片机与相关周边电路进行连接。

根据设计思路,将键盘、数码管、电源、指示灯等设备按照需求进行连接。

可改进之处虽然 51单片机的简易计算器的搭建能够满足基本计算需求,但其在以下几方面还有可改进之处:•添加计算科学函数,如三角函数、对数函数等。

•改进操作方式,使其更加符合人体工程学原理。

•添加储存器,使用户能够将计算结果进行存储和调用。

总结通过本次对基于51单片机的简易计算器的设计与实现,我们深入了解了电子技术的基本概念和硬件搭建原理,并了解到了简单嵌入式系统的工作原理。

虽然该计算器在功能和效率方面还有待改进,但对于初学者来说,其对于电子技术的学习和实验还是很有价值和意义的。

•编写的汇编代码过于繁琐,可考虑使用高级语言编写以提高效率和易读性。

•在电路搭建时需注意布线的合理性,尽量避免出现干扰和信号损失的问题。

综上所述,基于51单片机的简易计算器的设计和实现虽存在一些不足,但还是很有价值的。

单片机设计报告-基于51单片机的简易计算器设计

单片机设计报告-基于51单片机的简易计算器设计
2)微型单片化
现在常规的单片机普遍都是将中央处理器(CPU)、随机存取数据存储(RAM)、只读程序存储器(ROM)、并行和串行通信接口,中断系统、定时电路、时钟电路集成在一块单一的芯片上,增强型的单片机集成了如A/D转换器、PMW(脉宽调制电路)、WDT(看门狗)、有些单片机将LCD(液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就越强大。甚至单片机厂商还可以根据用户的要求量身定做,制造出具有自己特色的单片机芯片。
图2-2 MCS-51系列单片机引脚及总线结构
(a)管脚图;(b)引脚功能分类
MCS-51系列单片机的40个引脚中有2个专用于主电源的引脚,2个外接晶体的引脚,4个控制或与其他电源复用的引脚,以及32条输入输出I/O引脚。
2
MCS-51系列单片机的中断系统属于8位单片机中功能较强的1种中断系统,它可以提供5个中断源,每个中断源有两个优先级别可供选择,可实现两级中断服务程序嵌套。此外,所有中断均可有软件设定为允许中断或禁止中断,也就是说,用户可以用关中断指令(或复位)来屏蔽所有的中断请求,也可以中断指令使CPU接受中断请求。MCS-51单片机的中断系统结构示意图如图2-3所示。
MCS-51单片机内带有两个16位定时/计数器T0和T1,两者均可作为定时器或计数器使用。
2.5
MCS-51系列单片机芯片均为40个引脚,HMOS工艺制造的芯片采用双列直插(DIP)方式封装,其引脚示意及功能分类如图2-2所示。CMOS工艺制造的低功耗芯片也有采用方形封装的,但为44个引脚,其中4个引脚是不使用的。
2.3 程序存储器(ROM)
计算机的工作是按照事先编制好的程序命令一条条循序执行的,程序存储器就是用来存放这些已编好的程序和表格常数,它由只读存储器ROM或EPROM组成。计算机为了有序的工作设置了一个专用寄存器——程序计数器PC,用以存放将要执行的指令系统。每取出指令的1个字节后,其内容自行加1,指向下一字节地址,依次使计算机从程序存储器取指令执行,完成某种程序操作。由于MCS-51单片机的程序计数器为16位,因此,可寻址的地址空间为64KB。与此相对应得程序存储器编址从0000H开始,最大可至FFFFH。

51单片机计算器设计报告

51单片机计算器设计报告

目录一设计概述------------------------------------------3 二硬件电路图---------------------------------------3 三软件流程图---------------------------------------4 四结论------------------------------------------------11 五参考文献-------------------------------------------13一、1.1设计概述计算器通过编译,能实现简单的四位数加减及两位数的乘除,输入的数通过键盘给出,要求显示要操作的数,并显示结果,编译十进制跟十六进制之间转换的程序,实现十进制转十六进制,显示结果。

1.2功能说明简单的运算功能:当通过输入键盘数字时,能够在显示器上显示输出的数值,并且通过想实现的简单运算功能,实现计算器的加、减、乘、除,并将结果显示出来。

进制转换的功能:通过输入的十进制数,经过计算器的功能将其转换为十六进制数,并将结果显示出来。

二、硬件电路图主要程序流程说明:主程序首先进行初始化,设定一些变量及其意义,扫描键盘,当输入有0~9数字时,通过键盘的扫描程序,将数值赋给second并在显示器上来,当输入的是加减符号的时候,通过键盘的扫面程序,赋予OP相应值,并跳到运算部分,通过判断preop的值,执行相应的运算部分,将OP的值赋给preop并把second的值赋给first。

再一次通过输入0~9的数字,再一次经过键盘的扫描程序,输出second的值,最后通过输入键盘上的等号,右键盘扫描得出相应的OP,跳到运算部分,根据程序的流程,将第一个数的跟第二个数进行简单的加、减、乘、除运算,并将结果通过显示器输出。

同理,当需要进行进制之间的转换时,输入相应的数字,通过键盘的扫描不显示在显示器上,再通过控制,进制转换开关,如果进制转换开关置0 按下,就实现了进制之间的相互转换。

基于51单片机的计算器总结报告

基于51单片机的计算器总结报告

科技制作基于51单片机的计算器设计姓名李伟专业电子信息工程导师张旭完成时间2015 年5 月27日摘要 ........................................................... 21 绪论 ......................................................... 31.1 课题背景 ............................................... 31.2 设计目的 ............................................... 42 总体方案设计 ................................................. 42.1 简易计算器设计基本原理 ................................. 42.2 MCS-51系列单片机简介................................... 42.3 单片机发展现状 .......................................... 72.4 计算器系统现状 ......................................... 82.5 简易计算器系统简介 ...................................... 83 硬件设计 ..................................................... 83.1 电源模块 ............................................... 83.2 主控制器模块 ........................................... 94 硬件实现及单元电路设计 ....................................... 94.1 主控制模块 ............................................. 94.2 单片机的时钟电路与复位电路设计 ....................... 104.3 单片机管脚说明 ....................................... 104.4 键盘电路设计 ......................................... 123.5 液晶显示电路设计 ..................................... 124 系统软件设计方案 ........................................... 134.1 主程序流图 ........................................... 134.2 运算程序设计 ......................................... 145 系统的安装与调试 ........................................... 165.1 安装步骤 .............................................. 16结论 ........................................... 错误!未定义书签。

基于51单片机简易计算器课程设计报告

基于51单片机简易计算器课程设计报告

基于51单片机简易计算器课程设计报告引言:计算器是现代社会中常见的电子设备之一,它能够帮助人们进行各种数学运算,提高计算效率。

本文将介绍基于51单片机的简易计算器的设计过程及实现方法。

一、设计目标本次设计的目标是实现一个简易计算器,能够进行基本的加减乘除运算,并能够显示计算结果。

通过该设计,旨在加深学生对51单片机的理解,培养其实际操作能力。

二、硬件设计1. 电源模块:采用稳压电源模块,提供稳定的电压给单片机及其他电路模块。

2. 单片机模块:采用51单片机,作为计算器的核心控制模块,负责接收按键输入、进行运算和显示结果。

3. 按键模块:设计合适的按键电路,用于输入数字和操作符。

4. 显示模块:采用数码管或液晶显示屏,显示计算结果。

5. 连接线:将各个模块连接起来,确保信号的传输畅通。

三、软件设计1. 初始化:设置单片机的工作模式、端口方向和初始状态。

2. 按键扫描:通过轮询的方式检测按键是否被按下,若有按键按下则进行相应的处理。

3. 输入处理:根据按键的顺序和操作符的位置进行输入的处理,将输入的数字和操作符分别存储在相应的变量中。

4. 运算处理:根据输入的操作符进行相应的运算,得出计算结果。

5. 结果显示:将计算结果通过数码管或液晶显示屏进行显示。

6. 清零处理:在计算结果显示完毕后,对相关的变量进行清零处理,以便进行下一次的计算。

四、功能实现1. 加法运算:通过按下"+"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。

2. 减法运算:通过按下"-"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。

3. 乘法运算:通过按下"*"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。

51单片机计算器程序设计报告

51单片机计算器程序设计报告

北京航空航天大学课程设计报告课题名称:51单片机的计算器设计课程:单片机技术及应用专业:应用电子应用电子技术教研室2010年10月25日一、课题任务及要求要求:1、掌握数码管移位动态扫描显示的编程方法2、掌握矩阵扫描的编程方法3、掌握数据在内部运算的编程方法任务:1、实现最大6位正整数加、减、乘、除2、具备清零、等于功能3、16个按键功能依次为:数字0、数字1、数字2、数字3、数字4、数字5、数字6、数字7、数字8、数字9、清零、等于、加、减、乘、除二、硬件设计1.原理图2.原理分析该设计通过89C51芯片控制6个一位数码管显示,并实时检测按键按下情况来实现计算器功能,16个按键有10个为数字按键其他6个分别为加、减、乘、除、复位、等于电路接上电源后数码管显示个位显示数字0 ,芯片对按键进行实时扫描,通过矩阵键盘进行计算,特别注意的是,当结果为负数时,数码管显现EORR。

(一)、硬件部分1、数码管为一位共阴数码管,共6个;故在段码输出口外加NPN型三极管作驱动2、51芯片P1口接键盘端(矩阵按键)、P3口接段码、P2口的P2_0—P2_5接位码3、按键为四乘四矩阵,共16个键(二)、软件部分1、数码管移位显示的实现是通过标志位wei2的数值变化控制dispiay函数显示位来实现的2、程序的重要算法是通过类型为unsigned int 的数temp和数组str[]实现整体加减乘除、各位显示的只要弄懂这一算法,此程序就可轻易掌握3.PCB图略。

4.元件清单及造价预算按键 20个单价 0.2 元总计 4元万用板 2块单价 4 元总计 8元一位共阴数码管 6个单价 2 元总计 2元三极管 7个单价 0.2 元总计 1.4元1K电阻 20个单价 0.01 元总计 2毛排插及排线 5对单价 1元总计 5元电容 3个单价 0.2元总计 6毛晶振 1个单价 1元总计 1元8051芯片 1 个单价 6元总计 6元费用总计 26.2元5.实物照片三、程序设计头程序str[6]=str[5]=str[4]=str[3]=str[2]=str[1]=10;str1[6]=str1[5]=str1[4]=str1[3]=str1[2]=str[1];#include<reg51.h> //51单片机基本定义头文件#include<intrins.h> //循环位移头文件#define uchar unsigned char //宏定义#define uint unsigned intsbit P1_4=P1^4; //IO端口定义(矩阵扫描后4位端口)sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;uchar i,num,s; //全局变量定义uchar wei,wei2,ss,ss1,ss2,str1[]={0,0,0,0,0,0,0};long temp,temp1,str[]={10,10,10,10,10,10,10};uchar code dutable[]={ //段位编码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar code wetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};void init(); //函数声明void panduan();void display();void delay(uint z);void shaomiao();void main() //主函数{init(); //调用变量初始化函数while(1) //大循环{shaomiao(); //调用矩阵扫描加处理函数display(); //调用显示函数}}void init() //变量初始化函数{ss2=0;wei2=1;temp1=0;ss=0;ss1=0;temp=0;wei=0;num=0;}void delay(uint z)//延时函数(单位ms){uchar i;uint j;for(j=z;j>0;j--)for(i=114;i>0;i--);}void shaomiao() //扫描加处理函数{for(i=0,s=0xfe;i<4;i++) //低四位端口依次赋值1 {P1=s; //对P1口赋值panduan(); //调用判断处理函数s=_crol_(s,1); //s循环位左移s=s|0xf0; //进行位或运算} (使高4位复原)}void panduan(){uchar n;if(P1_4==0||P1_5==0||P1_6==0||P1_7==0){delay(10);P1=s|0xf0;if(P1_4==0||P1_5==0||P1_6==0||P1_7==0){if(P1_4==0){ n=1;num=i*4+n-1;}else if(P1_5==0){ n=2;num=i*4+n-1;}else if(P1_6==0){ n=3;num=i*4+n-1;}else if(P1_7==0){ n=4;num=i*4+n-1;}if(num<10&&wei!=7){wei++;if(ss1==1){temp=0;str[6]=str[5]=str[4]=str[3]=str[2]=str[1]=10;str1[6]=str1[5]=str1[4]=str1[3]=str1[2]=str1[1]=0;ss1=0;}str[wei]=num;if(str[1]!=10) temp=str[1];if(str[2]!=10) temp=str[1]*10+str[2];if(str[3]!=10) temp=str[1]*100+str[2]*10+str[3];if(str[4]!=10) temp=str[1]*1000+str[2]*100+str[3]*10+str[4];if(str[5]!=10) temp=str[1]*10000+str[2]*1000+str[3]*100+str[4]*10+str[5]; if(str[6]!=10)temp=str[1]*100000+str[2]*10000+str[3]*1000+str[4]*100+str[5]*10+str[6];}if(num>=10){wei=0;if(num==10){temp=0;1[1]=0;wei=0;temp1=0;ss=0;wei2=1;}if(ss1==0&&num==11||(ss1==0&&ss2!=0&&num>11&&num<16)){if(num==11)ss2=0;switch(ss){case 0: break;case 1: temp=temp+temp1;break;case 2: temp=temp1-temp;break;case 3: temp=temp*temp1;break;case 4: temp=temp1/temp;break;}if(temp>999999)temp=0;ss1=1;}if(num==12){temp1=temp;ss=1;ss1=1;ss2=1;}if(num==13){temp1=temp;ss=2;ss1=1;ss2=1;}if(num==14){temp1=temp;ss=3;ss1=1;ss2=1;}if(num==15){temp1=temp;ss=4;ss1=1;ss2=1;}}}str1[6]=temp/100000;str1[5]=temp%100000/10000;str1[4]=temp%10000/1000;str1[3]=temp%1000/100;str1[2]=temp%100/10;str1[1]=temp%10/1;if(str1[1]!=0)wei2=1;if(str1[2]!=0)wei2=2;if(str1[3]!=0)wei2=3;if(str1[4]!=0)wei2=4;if(str1[5]!=0)wei2=5;if(str1[6]!=0)wei2=6;}while(P1_4==0||P1_5==0||P1_6==0||P1_7==0); }void display(){char i1;for(i1=1;i1<wei2+1;i1++){if(num==0&&ss==4||temp<0){P2=wetable[0];P3=dutable[14];}else{P2=wetable[i1-1];P3=dutable[str1[i1]];delay(10);P3=0xff;}}}四、调试结果1、硬件调试a. 把电路板焊好后,先通过检查电路板表面检查是否有漏焊、错焊、接触不良等b. 编写检测程序逐个点亮数码管,检查数码显示部分是否有硬件问题c.编写检测程序检测矩阵扫描是否有硬件问题2、程序调试重点就是这个部分,很多程序就是在调试过程中慢慢完善,先前所完成的程序部分只能算一个基本框架,当然,这一切是建立在硬件没用问题的基础上程序在进行调试时,可以像硬件一样使用分模块调试,这样可以最迅捷的找出问题所在,不受其他模块的影响我们在硬件调试时,一开始时51芯片不工作,经过反复检查后发现原来51芯片的31脚(/EA/VPP)必须接入高电平才能使单片机在读取程序时优先访问内部程序存储器,否则只访问外部程序存储器,而我们的程序是在内部的,故芯片不工作,我们随即在31脚外接VCC和限流电阻,在解决了这个后,硬件OK了。

基于51单片机的计算器课程设计实验报告

基于51单片机的计算器课程设计实验报告

项目一:简单计算器1。

实验题目:用51单片机实现简单的计算器功能2。

实验截图:1).实验运行前截图:2).实验运行后截图:3.实验代码:#include<reg52。

h〉#include〈intrins.h〉#include〈math.h>#include<defined。

H>#include〈LCD1602.h>unsigned char table1[16]; //1602第一行显示字符unsigned char table2[16]; //1602第二行显示字符unsig ned char code table_error[] = ”error”;/*键扫描函数*/unsigned char keyscan() //扫描键盘函数{unsigned char key_l,key_h,addres,num;P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;if(addres!=0xff){Delayms(1);if(addres!=0xff){P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;switch(addres){case 0xee:num='1’;break;case 0xde:num=’2';break;case 0xbe:num=’3’;break;case 0xed:num='4';break;case 0xdd:num='5’;break;case 0xbd:num=’6';break;case 0xeb:num=’7’;break;case 0xdb:num='8’;break;case 0xbb:num='9’;break;case 0xd7:num='0’;break;//按键0case 0xe7:num=’C';break;//按键*case 0xb7:num=’=';break;//按键#case 0x7e:num='/’;break;//按键Acase 0x7d:num=’*’;break;//按键Bcase 0x7b:num='—’;break;//按键Ccase 0x77:num='+';break;//按键D}while(addres!=0xff){P0=0x0f;key_l=P0;P0=0xf0;key_h=P0;addres=key_l | key_h;}return num;}}return 0;}void clear_lcd(void)//清屏{unsigned char j;for(j=0;j〈16;j++){table1[j]=’\0’;table2[j]='\0';}}void main(){unsigned char i=0,j;unsigned char key;unsigned char flag_operator = 0;//加减乘除标志位unsigned char flag_equ = 0;//等于标志位unsigned char flag_key = 0;//运算位标志bit flag_MaxValue = 0;bit flag_minus = 0;//负数long int value = 0; //最终运算结果unsigned long int value_H =0; //第一个数据unsigned long int value_L = 0;//第二个数据unsigned long int temp[]={1, 10, 100,1000,10000,100000,1000000,10000000,100000000};Initialize_LCD();while(1){key=keyscan();if(key != 0){if(key == ’C')//清除键C按下{clear_lcd();i=0;flag_operator = 0; flag_equ = 0; value = 0; value_H =0; value_L = 0; flag_key = 0; flag_minus=0;}else{for(j=0; j<i; j++){table1[15—i+j] = table1[15—i+j+1];}table1[15] = key;//table1[i] = key;i++;}if(key == '='){for(j=0; j〈16; j++)//确定运算符位置{if(table1[j] == ’=’){flag_equ = j;flag_key++;break;}if( table1[j]== ’+' || table1[j] == ’—' || table1[j] == ’*' ||table1[j] == '/'){flag_operator = j;flag_key++;}}for(j=16—i; j〈flag_operator; j++) //第一个数据处理{//value_H = value_H + (table1[j]-48) * ( pow(10 ,(flag_operator—j-1)));value_H = value_H + (table1[j]—48) * temp[flag_operator—j—1];}for(j=flag_operator+1; j〈15; j++) //第二个数据处理{//value_L = value_L + (table1[j]-48) * pow( 10 , (flag_equ—j—1));value_L = value_L + (table1[j]—48) * temp[flag_equ—j—1];}if(table1[flag_operator] == '+'){value = value_H + value_L;}else if(table1[flag_operator]== ’-'){value = value_H — value_L;}else if(table1[flag_operator] == '*'){value = value_H * value_L;}else if(table1[flag_operator]== ’/’){value = value_H / value_L;}if(value == 0)table2[15] = (value + 48);else if(value<0){value = abs(value);flag_minus = 1;}else if(value〉2000000000){flag_MaxValue = 1;//break;}j=15;while(value!=0){table2[j] = (value%10 + 48);value = value/10;j—-;}if(flag_minus) //负数{table2[j] = ’—’;}}if(flag_key 〉2 || table1[0] == '0' || flag_MaxValue==1 ){ShowString(5,1,table_error);while(keyscan() != 'C’);clear_lcd();i=0;flag_operator = 0; flag_equ = 0; value = 0; value_H =0; value_L = 0; flag_key = 0; flag_minus=0;}}ShowString(0,0,table1);ShowString(0,1,table2);}}。

51单片机计算器课程设计

51单片机计算器课程设计

51单片机计算器课程设计1. 前言51单片机凭借其简单易用、功能强大、可靠性高等诸多特点,成为了广大电子爱好者及相关从业人员的首选芯片类型。

在本次课程设计中,我们将利用51单片机的优势,设计一个简单的计算器。

通过该计算器的实现,旨在提高学生对51单片机的掌握程度,并且让他们能够更加深入地理解单片机的中断、定时器、按键等重要功能模块的理解。

2. 计算器设计需求分析在现实生活中,计算器的实现方案有很多,例如典型的哈工大计算器,其实现原理基于双栈式逆波兰表达式求值等。

而在51单片机的实现方案中,为了简化设计难度,我们采用了两次按键计算器。

即用户需要通过按数字键,来输入计算器要计算的操作数,在输入完所有的操作数后,再按下其他的计算符键,计算器通过读取已经输入的操作数,并根据按下的计算符键,来执行计算器指定的计算操作。

3. 设计思路在上面的需求分析中,我们设计了一个基于两次按键进行计算的计算器。

如果直接采用传统数字键和计算符键按下即时执行的计算器交互方式,由于涉及到用户输入顺序的问题,将会使程序开发难度大大增加。

因此,我们可以利用中断机制,在用户按下数字键和计算符键时,分别将其存储到数组中。

等到用户完成所有操作数的输入后,再由程序根据存储在数组中的操作数,按照计算符键的指令,进行计算操作。

4. 硬件设计计算器硬件设计采用与按键通用的IO口输入输出方式。

在本例中,我们设置计算器的数字键和计算符键均为IO口输入。

鉴于本次设计旨在简化流程,我们将设计与单片机外接数码管连接的部分留给读者自行研究。

在本次课程设计中,我们将不涉及数字键和计算符键信号的去抖动处理。

5. 软件设计通过对计算器设计的需求分析、设计思路以及硬件设计的分析后,我们来设计计算器的软件部分。

5.1 端口初始化根据本次课程设计的需求,我们采用两个IO口输入来实现计算器的数字键和计算符键,因此需要对IO口进行初始化。

```void PortInit(){P1=0xff;/数字键P1.0—P1.7设定为输出P1=0xff;/计算符键P2.0—P2.7设定为输出}```5.2 按键检测监测按键是否按下需要使用到中断机制,在本次课程设计中采用P1口的0~7位和P3口的0~3位硬件中断。

基于51单片机简易计算器课程设计报告(一)

基于51单片机简易计算器课程设计报告(一)

基于51单片机简易计算器课程设计报告(一)基于51单片机简易计算器课程设计报告1. 介绍在本次课程设计中,我设计了一个基于51单片机的简易计算器。

本报告将会详细介绍该计算器的设计思路、功能实现以及课程设计中遇到的问题与解决方法。

2. 设计思路功能需求•支持基本的加、减、乘、除运算•具备数字输入与显示功能•具备清零和等于功能•具备连续计算功能硬件设计本计算器的硬件设计主要包括51单片机、LCD显示模块以及按键输入模块。

其中,51单片机负责控制计算器的逻辑,LCD显示模块用于显示计算结果和用户输入,按键输入模块用于接收用户的输入。

软件设计计算器的软件设计主要分为以下几个部分: - 初始化:初始化51单片机、LCD模块以及按键模块。

- 按键扫描:通过扫描按键模块,获取用户的输入。

- 数字输入与显示:根据用户输入,将数字显示在LCD上。

- 运算逻辑:根据用户输入的运算符和数字,执行相应的计算操作,并将结果显示在LCD上。

3. 功能实现初始化在初始化阶段,我们需要初始化51单片机的GPIO口、LCD模块以及按键模块。

具体的初始化代码如下:// 初始化51单片机的GPIO口// 初始化LCD模块// 初始化按键模块按键扫描为了获取用户的输入,我们需要通过按键模块进行扫描。

具体的按键扫描代码如下:// 扫描按键模块// 如果检测到按键按下,则进行相应的处理数字输入与显示当用户按下数字键时,我们将获取到的数字输入缓存起来,并将其显示在LCD上。

具体的数字输入与显示代码如下:// 获取按键输入的数字// 将数字添加到输入缓存// 将输入缓存显示在LCD上运算逻辑当用户按下运算符键时,我们需要根据输入的数字和运算符执行相应的计算操作,并将结果显示在LCD上。

具体的运算逻辑代码如下:// 获取运算符输入// 根据运算符和输入的数字执行相应的计算操作// 将计算结果显示在LCD上清零和等于功能为了提升用户体验,我们还可以添加清零和等于功能。

基于C51单片机计算器实训报告

基于C51单片机计算器实训报告

目录一、设计的意义二、设计的流程三、设计的原理四、设计的模块五、元器件清单六、成品的制作七、设计的总结一、设计的意义计算器是日常工作和学习生活中的常用工具,人们利用它代替了许多复杂计算,包括加减乘除和其他运算。

尤其是小型计算器,它携带方便,在生活中用起来方便快捷,成为了财政、学习、生意上都青睐的必需品。

它的需求广泛,在计算器的发展上存在很大的空间和市场意义。

单片机在我国的各行各业得到了广泛使用,单片机的出现是计算机制造技术高速发展的产物。

如今,它已经广泛应用到我们生活中的各个领域,如:电子、科技、通信、汽车、工业等。

一般只需几块钱,有着经济廉价的优势,用单片机可以很方便的实现计算器的设计。

本设计是以单片机为基础设计出简单的一次式计算器。

二、设计的流程本设计的计算器硬件电路采用三部分电路模块构成,第一部分是键盘模块,采用4*4矩阵键盘作为输入电路;第二部分是LCD1602液晶显示模块;第三部分是以89C52单片机作为控制核心。

软件程序主要由三部分组成:主程序、按键扫描程序和LCD1602显示程序。

下图为硬件模块框图:下图为设计流程图:三、设计的原理硬件电路原理图:四、设计的模块1、电源模块:电源的设计采用了自锁开关控制电源正极的接通与断开,当P1接上+5V直流电源时;若S1没有按下,此时S1的1与5端口接通,+5V电流不流通到电路,电路不工作;当S1按下后,3与5端口接通,此时+5V电流流通到电路是电路工作。

2、89C52单片机模块:此模块式是本设计的控制核心模块,常称为单片机最小系统;单片机最小系统由三部分组成:STC89C52芯片部分、复位部分(由按键开关、极性电容、10K电阻组成)、晶振部分(由12M石英晶振、两个30PF的瓷片电容组成)。

主要起程序的输入与控制、程序的复位、时间频率控制的作用。

3、4*4矩阵键盘模块:键盘可分为两类:编码键盘和非编码键盘。

编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。

基于51单片机实验报告(计算器)

基于51单片机实验报告(计算器)

基于51单片机实验报告(计算器)一.计算器模块1.功能介绍利用8051 单片机硬件资源和常用外围电路如LCD1602,七段数码管,时钟(DS1302)温度传感器(18B20)等实现一个能做简单四则运算,并具有时钟显示,温度显示附加功能的计算器。

2.设计方案利用STC89C52为内核的单片机,PC机。

四则运算利用4*4矩阵键盘实现从0—9和运算符号的输入,并将操作过程和结果显示在LCD1602上。

时钟显示和温度显示,可以利用DS1302产生年份,月份,日期,星期,时,分,秒的数据,并将数据送往LCD1602显示,同样可以利用单片机开发板上面集成的DS18B20温度传感器来测试周围环境的温度,将获取的温度通过在LCD1602来显示。

系统设计框图3.具体实现代码计算器四则运算部分主要分为键盘扫描的键值读取,判断运算符号实现乘除优先级计算,LCD1602显示。

键盘扫描常用的有行扫描法,线反转法,此处我们用行扫描法,可以更明了读取键值。

unsigned char temp;key = null;//第一行按键P3 = 0xfe;temp = P3;temp = temp & 0xf0;if (temp != 0xf0){delay(10); //延时软件去抖动temp = P3;temp = temp & 0xf0;if (temp != 0xf0) //确认有键按下{temp = P3;switch (temp){case 0xee:key = 'D'; //读键值break;case 0xde:key = 0;break;case 0xbe:key = '=';break;case 0x7e:key = '/';break;}flag++;}}读完按键值之后我们需要读取运算的数字与运算符号,通过判断键值为数字则通过nun=nun*10+key,计算出数字,判断键值为运算符号则读出数字和键值。

单片机计算器报告

单片机计算器报告

单片机课程调查题目:计算器系统设计学号:姓名:杨艳班级:应用1301一、需求分析本次调查的任务就是要以51系列单片机为核心实现一个简易计算器,它的结构非常简单,外部主要由键盘和一个LCD1602A液晶显示屏,一块STC89C52RC单片机构成,通过软件编程要求能完成四则运算并能实现循环显示。

本次实验的目的包括了解并熟练掌握proteus仿真软件的使用;掌握C语言,学会用它们进行单片机编程;学会使用Keil C编译工具进行编程和编译,并掌握proteus和Keil C 联调以实现在proteus上的软硬件仿真。

二、正规划分1、数码显示电路,LCD1602A的引脚详细介绍见下图:采用LCD1602A来显示,要求能显示两行。

它的D—7D引脚分别接到单片机的P0.0~P0.7引脚;RS、R/W、E管脚分别接到单片机的P2.4、P2.0、P2.3 。

具体连接见后面的电路图。

2、4*4键盘扫描电路用STC89C52RC的P3口中的P3.0,P3.1,P3.2和P3.3四根线作为按键的行输入线,用P3.4,P3.5,P3.6和P3.7作为按键的列输出线。

通过按次依次给P3口的高四位的每根线输出一个低电平列信号,每当一根列线输出后,将信号锁住,然后读取行线,看有没有哪一根出现低电平。

如果有,则说明有按键按下了,依据P3口是哪一根行线出现低电平和列线出现低电平,可以判别是第几行和第几列的按键按下了,如果读取行线没有出现低电平,则表示对应的列没有按键按下,那么换另一列输出低电平,在读取行信号,判别新的一列有没有键按下。

依此办法轮流使每一列依次输出低电平,判别每一列是否有键按下,直到把所有的按键判别完。

3、单片机微控制电路微控制电路就是以STC89C52RC为核心的控制核心,主要注意晶振电路的接法和RST法。

4、整体电路图见下图分析可知共分为七个模块:键盘扫描部分,定义各个位置上的键值部分,延迟部分,存贮部分,液晶显示部分,运算部分,动态显示部分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计报告(多功能计算器)班级:姓名:学号:指导老师:一、内容摘要利用89c51作为主控器设计一个四则运算的计算器。

首先通过在图书馆和网上查找有关设计计算器的资料,大概了解设计计算器需要哪几个模块,熟悉Keil 和Proteus 两个软件的用法,以及它们的联调,完成计算器的程序设计和仿真,然后就是进实验室进行计算器电路板的焊接,最后就是将程序下载到单片机芯片中,系统联调,直到得出结果。

二、设计内容及要求用单片机设计计算器,要求可以进行加、减、乘、除运算。

三、系统方案设计,画出系统框图四、画出完整的电路图,并说明电路的工作原理51系列单片机4*4键盘8位LED 显示6264 RAM 扩展复位电路晶振电路等系统原理框图电路图说明:(1)键盘的列扫描接单片机P2口的低4位,行扫描接单片机P1口的低4位;(2)数码管的段选通过单片机的P0口接74LS244来驱动,数码管的位选接单片机的P2口;(3)发光二极管电路用来说明电路是否上电;(4)晶振电路为单片机提供时钟频率;(5)复位电路为单片机提供复位信号。

计算器的功能实现:(1)此计算器适应于不大于八位整数的四则混合运算,若单个数大于八位或者结果大于八位(溢出)则显示“Chu cuo”。

(2)如果在还没有按数字之前按了一个符号键或者等号则显示“Chu cuo”。

(3)若接连按了几个运算符键,实际上进行的运算是最后一次按的运算键。

(4)可以显示负数、小数。

(5)此计算器不可实现连乘、连加、连减、连除。

四、软件仿真,根据系统硬件图编写系统程序并调试#include <reg52.h>#include <intrins.h>//循环左右移要用该头文件(-cror-(),-crol-())#define uchar unsigned char#define ulong unsigned longuchar array[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};uchar array1[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};uchar a;ulong num1=0,num2=0;sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit F1=PSW^1;//定义一个标志位,F0在头文件里已定义void displayljy(void);//声明"显示"子函数void inkeylove(void);//声明"判断按下的是什么键"子函数void iskeyyou(void);//声明"判断是否有键按下"子函数void bian1(void);//声明"将uchar型变量转化为ulong型变量"子函数void bian2(void);//声明"将ulong型变量转化为uchar型变量"子函数void jia(void);//声明"加运算"子函数void jian(void);//声明"减运算"子函数void cheng(void);//声明"乘运算"子函数void chu(void);//声明"除运算"子函数void error(void);//声明"出错显示"子函数void main(){uchar r7=0x00,i;while(1){displayljy();inkeylove();if(a!=0xff)//如果有键输入,继续往下执行,否则从新开始{if(a==0x0f) //如果输入的是"清除"键,将显示器清屏,同时清存放运算符号的单元 {r7=0x00;for(i=0;i<8;i++){array[i]=0x10;array1[i]=0x10;}}else if(a==0x0e)//如果输入的是"=",继续往下执行,否则从新开始{if(r7==0x0d)//如果r7中存放的是"+",则执行加运算{bian1();jia();bian2();}else if(r7==0x0c)//如果r7中存放的是"-",则执行减运算{bian1();jian();}else if(r7==0x0b)//如果r7中存放的是"*",则执行乘运算{bian1();cheng();bian2();}else if(r7==0x0a)//如果r7中存放的是"÷",则执行除运算{bian1();chu();}elseerror();//如果r7没有存进运算符,则转出错处理}else{if(r7!=0x00)//如果已按过运算键,往下执行,否则转else{if(a>0x09&&a<0x0e)//如果还按下运算键,则后按的取代前面按的r7=a;else if(array1[0]==0x10)//判断是不是输入加数(减数...)的第一个数 {for(i=0;i<8;i++)//是的话,将被加数(被减数...)存入array1中 array1[i]=array[i];for(i=0;i<8;i++)array[i]=0x10;for(i=7;i>0;i--)//array中存入加数(减数...)array[i]=array[i-1];array[0]=a;}else //不是输入加数(减数...)的第一个数{if(array[7]!=0x10)//如果加数(减数...)已是八位整数,则转出错处理 error();else{for(i=7;i>0;i--)//否则将加数左移array[i]=array[i-1];array[0]=a;}}}else//之前还没有运算键按下{if(a>0x09)//有运算键按下{if(array[0]==0x10)//但是在运算键按下之前没有输入被加数,则转出错error();elser7=a;//否则将运算键输入r7中保存}else if(array[7]!=0x10)//如果被加数已是八位整数,则转出错error();else //否则将被加数左移{for(i=7;i>0;i--)array[i]=array[i-1];array[0]=a;}}}}}}void bian1(void)//"将uchar型变量转化为ulong型变量"子函数{uchar i;for(i=7;i>0;i--){if(array[i]==0x10)array[i]=0x00;if(array1[i]==0x10)array1[i]=0x00;}num1=(ulong)array1[7]*10000000;num1+=(ulong)array1[6]*1000000;num1+=(ulong)array1[5]*100000;num1+=(ulong)array1[4]*10000;num1+=(ulong)array1[3]*1000;num1+=(ulong)array1[2]*100;num1+=(ulong)array1[1]*10;num1+=(ulong)array1[0];num2=(ulong)array[7]*10000000;num2+=(ulong)array[6]*1000000;num2+=(ulong)array[5]*100000;num2+=(ulong)array[4]*10000;num2+=(ulong)array[3]*1000;num2+=(ulong)array[2]*100;num2+=(ulong)array[1]*10;num2+=(ulong)array[0];}void bian2(void)//声明"将ulong型变量转化为uchar型变量"子函数{uchar i=7,F0=1;if(num1>99999999)error();else{array[7]=(uchar)(num1/10000000);array[6]=(uchar)(num1%10000000/1000000);array[5]=(uchar)(num1%1000000/100000);array[4]=(uchar)(num1%100000/10000);array[3]=(uchar)(num1%10000/1000);array[2]=(uchar)(num1%1000/100);array[1]=(uchar)(num1%100/10);array[0]=(uchar)(num1%10); while(i>0&&F0){if(array[i]==0x00){array[i]=0x10;i--;}elseF0=0;}}}void jia(void)//"加运算"子函数{num1+=num2;}void jian(void)//"减运算"子函数{uchar i;if(num1>num2){num1-=num2;bian2();}else if(num1==num2){for(i=1;i<8;i++)array[i]=0x10;array[0]=0x00;}else{num1=num2-num1;bian2();if(array[7]!=0x10)error();elsearray[7]=0x11;}}void cheng(void)////声明"乘运算"子函数{num1*=num2;}void chu(void)//"除运算"子函数{uchar i,j=0x00,k;double num3;num3=(double)(num1)/(double)(num2); num1=(ulong)(num3);num3-=num1;if(num3==0||num1>9999999)bian2();else{bian2();while(array[7]==0x10){j++;for(i=7;i>0;i--)array[i]=array[i-1];array[0]=0x10;}array[j]+=0x12;k=j-1;while(k>0){num3*=10;num2=(ulong)(num3);num3-=num2;array[k]=(uchar)(num2);k--;}array[0]=(uchar)(num3*10);while(array[0]==0x00){for(i=0;i<7;i++)array[i]=array[i+1];array[7]=0x10;}}}void error(void)//"出错显示"子函数(出错显示"Chu cuo.") {array[7]=0x0c;array[6]=0x1d;array[5]=0x1f;array[4]=0x10;array[3]=0x10;array[2]=0x1c;array[1]=0x1f;array[0]=0x1e;}void displayljy(void)//"显示"子函数{uchar array3[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00,0x40,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x58,0x74,0xdc,0x1c};uchar *p=array,count=0x80,i,time;F0=1;while(F0){i=*(p+7);P2=count;P0=array3[i];for(time=0xff;time>0x00;time--);p--;count=_cror_(count,1);if(count==0x80)F0=0;}}void iskeyyou(void)//"判断是否有键按下"子函数{P2=0x00;P1|=0x0f;a=P1;a|=0xf0;}void inkeylove(void)//"判断按下的是什么键"子函数{uchar b=0xfe,c=0x00,d;uchar array4[16]={0x07,0x08,0x04,0x05,0x01,0x02,0x0f,0x00, 0x09,0x0a,0x06,0x0b,0x03,0x0c,0x0e,0x0d}; F1=0;iskeyyou();if(a!=0xff){displayljy();displayljy();iskeyyou();if(a!=0xff){F0=1;while(F0){P2=b;P1|=0x0f;if(P10==0){a=0x00;F1=1;}else if(P11==0){a=0x02;F1=1;}else if(P12==0){a=0x04;F1=1;}else if(P13==0){a=0x06;F1=1;}else{a=c;a%=4;if(a==0x01){a=0x07;c+=a;}elsec++;b=_crol_(b,1);if(b&0x10==0){F0=0;a=0xff;}}while(F1){a+=c;a=array4[a];d=a;while(a!=0xff){displayljy();iskeyyou();}a=d;F1=0;F0=0;}}}}}五、系统联调在我将计算器的电路板焊接好以后,我将程序下载到单片机芯片上面,再接上电源测试发现键盘上面只有几个按键有显示,开始我就怀疑是自己的焊接键盘的线时,出现了虚焊或者是焊错了的错误,我就写了一个程序让数码管上面显示“4321”这四个数字,下载进去后,发现没有错误,这就证明我的数码管那一块没有出现错误,由此推论,最有可能出现错误的就是键盘,由于自己当时并不清楚键盘的行列线,所以没有自己测量了,我去问老师,老师就说“实验室的键盘可能也有点问题”,于是他就给我们拿了几个他自己借来的键盘,然后手把手的教我们怎么测试行列线,我也很快就测出了其对应的行列线,但是一接上电源测试,还是有一行不能显示,最后在老师的提点下,是发现P1.0口始终接了高电平,从而导致无法显示,在老师的帮助下,最终我做出了结果。

相关文档
最新文档