单片机计算器的课程设计报告
51单片机计算器课程设计
![51单片机计算器课程设计](https://img.taocdn.com/s3/m/0285df46640e52ea551810a6f524ccbff021ca4c.png)
51单片机计算器课程设计一、课程目标知识目标:1. 让学生掌握51单片机的基本原理及其在计算器中的应用。
2. 使学生理解并掌握计算器程序设计的步骤和要点,包括键盘输入、显示输出、数据处理等。
3. 帮助学生了解并掌握基本的数字逻辑运算,如加、减、乘、除等。
技能目标:1. 培养学生运用51单片机进行计算器硬件设计和程序编写的能力。
2. 培养学生运用Keil等开发工具进行51单片机程序开发的能力。
3. 培养学生通过查阅资料、团队协作解决实际问题的能力。
情感态度价值观目标:1. 激发学生对电子技术和编程的兴趣,培养其主动学习的态度。
2. 培养学生的创新意识和动手能力,使其具备解决问题的信心。
3. 培养学生良好的团队协作精神和沟通能力,提高其综合素质。
课程性质:本课程为实践性较强的课程,注重培养学生的动手能力和实际问题解决能力。
学生特点:学生具备一定的电子技术基础和编程能力,对51单片机有一定了解。
教学要求:结合学生特点,注重理论与实践相结合,以项目为导向,引导学生主动探索、实践和解决问题。
通过课程学习,使学生达到预定的知识目标和技能目标,并培养其情感态度价值观。
在教学过程中,关注学生的学习进度,及时调整教学策略,确保课程目标的实现。
将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 51单片机原理回顾:涉及51单片机的内部结构、工作原理、寄存器等基础知识。
相关教材章节:第一章《51单片机概述》2. 计算器功能设计:介绍计算器的基本功能,如数字输入、运算符选择、结果显示等。
相关教材章节:第二章《51单片机I/O口应用》3. 硬件电路设计:讲解计算器硬件电路的搭建,包括键盘电路、显示电路等。
相关教材章节:第三章《51单片机硬件设计基础》4. 程序设计:分析计算器程序设计的流程,包括程序框架、各功能模块的实现等。
相关教材章节:第四章《51单片机C语言编程》5. 软件开发工具使用:介绍Keil开发环境的使用方法,编译、下载程序到51单片机。
单片机计算器课程设计报告程序讲解
![单片机计算器课程设计报告程序讲解](https://img.taocdn.com/s3/m/50b175f50975f46527d3e13b.png)
单片机课程设计报告一、内容摘要用单片机做一个四则运算的计算器,首先查资料,了解各个电路的功能,事先须熟悉Keil和Proteus两个软件,及它们的联调,程序和仿真完成,就焊接电路板,焊接完,最后就系统联调,直到得出结果。
二、功能要求利用89c51作为主控器组成一个四则运算的计算器。
三、电路原理图电路图说明:(1)键盘的列扫描接单片机P2口的低4位,行扫描接单片机P1口的低4位;(2)数码管的段选通过单片机的P0口接74LS244来驱动,数码管的位选接单片机的P2口;(3)晶振电路为单片机提供时钟频率;(4)复位电路为单片机提供复位信号。
四、计算器功能说明(1)通过数码管来显示键盘的按键,显示被加数(减数……),加数(……),运算结果;(2)本计算器适合不大于八位整数的加、减、乘、除,要求结果也不大于八位整数,否则出错显示,显示(HELLO);(3)在还没按一个数之前就按下=,+,--,*或/,则显示错误;按下+,--,*或/后,立马按下=,显示错误;(4)若接连好了好几运算符键,实际参与运算的是最后一次按的运算键;(5)本计算器有连加,连减,连乘,连除功能,例如:2+5=7+5=12--5=7*5=35/5=7;(6)减法可以实现负数,除法可以显示小数。
五、软件仿真软件设计时,我是分一个一个模块设计的,设计顺序如下:(1)数码管显示函数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,0x38,0x3e,0x6e,0xbe};uchar *p=array,count=0xfe,i,time,time1;F0=1;while(F0){i=*p;P2=count;P0=array3[i];for(time1=0x0c;time1>0x00;time1--)for(time=0xff;time>0x00;time--);p++;count=_crol_(count,1);if(count==0xfe)F0=0;}}(2)判断是否有键按下子函数void iskeyyou(void)//"判断是否有键按下"子函数{P2=0x00;P1|=0x0f;a=P1;a|=0xf0;}(3)键扫子函数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;}}}}}(4)两个变形的子函数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;}}}(5)主函数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(array1[0]==0x10)//如果未按下第二个数之前就按下“=”,则出错显示error();else if(r7==0x0d)//如果r7中存放的是"+",则执行加运算{bian1();jia();bian2();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}else if(r7==0x0c)//如果r7中存放的是"-",则执行减运算{bian1();jian();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}else if(r7==0x0b)//如果r7中存放的是"*",则执行乘运算{bian1();cheng();bian2();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}else if(r7==0x0a)//如果r7中存放的是"÷",则执行除运算{bian1();chu();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}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;}}}}}}(6)加、减、乘、除、出错显示子函数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--;}num3*=10;num2=(ulong)(num3);array[0]=(uchar)(num2);while(array[0]==0x00){for(i=0;i<7;i++)array[i]=array[i+1];array[7]=0x10;}}}void error(void)//"出错显示"子函数(出错显示"HELLO") {array[7]=0x10;array[6]=0x10;array[5]=0x10;array[4]=0x1d;array[3]=0x0e;array[2]=0x1c;array[1]=0x1c;array[0]=0x12;}(7)全局变量定义,函数声明等#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);//声明"出错显示"子函数六、系统联调在焊接完板子后,我首先并没有把整个计算器的程序下进去,只是下了个显示的小程序,结果数码管的第四位没显示,首先我想段选肯定不会有错的,检查了程序对应的那个数和程序中位选的设置都没错,我想应该是接线中的位选错了,结果我用万用表检查电路发现也没错,这下我就纠结了,搞不清状况了,可是无意之中我按了板子,发下那个数码管显示了正确的数,但是只是一瞬间的事,我想肯定是我有个地方没焊稳,我就一个地方一个地方的按,最终定位在了单片机,单片机的底座我用的是单排母不是专门配的底座,因为用排母取下放上都比那个专门配的底座容易,我就重新认真的把底座补焊了下,结果就行了,接下来我就把计算器的程序下进去了,成功了,太开心了。
单片机课程设计计算器
![单片机课程设计计算器](https://img.taocdn.com/s3/m/48c5738b250c844769eae009581b6bd97f19bca8.png)
单片机课程设计 计算器一、课程目标知识目标:1. 学生能理解单片机的基本原理和功能,掌握计算器的设计流程。
2. 学生能运用所学知识,设计并实现一个具有基本运算功能的单片机计算器。
3. 学生了解并掌握单片机编程的基本语法和逻辑结构。
技能目标:1. 学生掌握使用单片机开发工具进行程序编写、调试和下载的方法。
2. 学生具备分析问题、设计算法和解决问题的能力,能运用单片机技术解决实际计算问题。
3. 学生能够通过小组合作,进行项目设计和实践,提高团队协作能力。
情感态度价值观目标:1. 学生培养对单片机技术及电子工程的兴趣,激发创新意识和探索精神。
2. 学生通过动手实践,体验成功解决问题的喜悦,增强自信心和自主学习能力。
3. 学生在学习过程中,树立正确的价值观,认识到科技发展对社会进步的重要性。
课程性质:本课程为实践性较强的课程,要求学生在理论学习的基础上,动手实践,完成单片机计算器的设计与制作。
学生特点:学生处于高年级阶段,已具备一定的电子技术基础和编程能力,具备独立思考和解决问题的能力。
教学要求:结合学生特点,注重理论与实践相结合,引导学生通过小组合作,完成课程任务,达到课程目标。
同时,关注学生的个性差异,提供个性化的辅导和支持。
在教学过程中,注重培养学生的创新能力、实践能力和团队协作能力,为后续学习打下坚实基础。
二、教学内容根据课程目标,教学内容分为以下三个部分:1. 理论知识学习:- 单片机原理与结构:讲解单片机的组成、工作原理及性能特点,对应教材第1章。
- 编程语言基础:介绍单片机编程的基本语法、逻辑结构和编程规范,对应教材第2章。
2. 实践技能培养:- 硬件设计与连接:学习如何选用合适的元器件,设计计算器硬件电路,对应教材第3章。
- 软件编程与调试:掌握单片机程序编写、调试和下载的方法,对应教材第4章。
3. 项目实践:- 计算器设计与实现:结合所学知识,分组进行计算器项目设计,包括硬件选型、电路设计、程序编写和调试等,对应教材第5章。
51单片机数码管计算器课设报告
![51单片机数码管计算器课设报告](https://img.taocdn.com/s3/m/9e3eeee1763231126fdb11df.png)
课程名称:微机原理课程设计题目: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单片机简易计算器课程设计报告](https://img.taocdn.com/s3/m/d72afb4bf342336c1eb91a37f111f18583d00c6a.png)
基于51单片机简易计算器课程设计报告
基于51单片机简易计算器课程设计报告
1. 研究背景
•计算器是人们日常生活和工作中常用的工具之一。
•通过设计简易计算器,可以加深学生对51单片机的理解和应用。
2. 目标和需求
•设计一个基于51单片机的简易计算器,能够进行基本的四则运算和开方运算。
•要求计算器能够显示输入和计算结果。
•要求计算器具备简单的界面和操作。
3. 设计方案
•使用51单片机作为计算器的控制核心。
•通过键盘输入数字和运算符,并显示在液晶屏上。
•根据输入的运算符,进行相应的计算,并将结果显示在液晶屏上。
4. 硬件设计
•使用51单片机作为主控芯片。
•连接液晶屏模块,用于显示输入和计算结果。
•连接键盘模块,用于输入数字和运算符。
5. 软件设计
•使用C语言进行编程。
•设计主程序,包括初始化、输入处理和计算输出等功能。
•设计函数,实现基本的四则运算和开方运算。
6. 实验结果
•成功设计并实现了基于51单片机的简易计算器。
•可以正常进行基本的四则运算和开方运算。
•输入和计算结果能够准确显示在液晶屏上。
7. 总结与展望
•通过设计这个简易计算器,学生对51单片机的理解和应用能力有了提高。
•下一步可以考虑增加更多的功能,如科学计算和数据存储等。
以上是本次基于51单片机简易计算器课程设计的报告。
通过这个实验,学生对51单片机的应用能力得到了提升,进一步增强了对计算器的理解。
在未来的课程设计中,可以进一步拓展功能,提升计算器的实用性和功能性。
单片机设计实验报告简单计算器的设计
![单片机设计实验报告简单计算器的设计](https://img.taocdn.com/s3/m/c29b47772bf90242a8956bec0975f46527d3a7a1.png)
目录1.总体方案选择 (2)1.1 实验要求: (2)1.2方案设计 (2)2.硬件原理电路图的设计及分析 (3)2.1主控模块 (3)2.1.1 STC89C52单片机主要特性 (3)2.1.2 STC89C52单片机管脚图 (4)2.1.3 STC89C52单片机的中断系统 (5)2.1.4 STC89C52单片机的定时/计数器 (5)2.2矩阵键盘模块设计: (5)2.2.1矩阵键盘原理介绍 (5)2.2.2矩阵键盘电路设计 (6)2.3 LCD液晶显示器简介 (7)2.3.1液晶模块简介 (7)2.3.2液晶显示部分与89S52的接口 (8)3系统软件设计 (10)3.1系统软件流程图 (10)3.2系统整体原理图 (11)4.系统调试 (12)4.1硬件调试 (12)4.2软件调试 (12)4.3调试结果 (13)5.心得体会131.总体方案选择1) 1.1 实验要求:2)通过小键盘实现数据的输入, 并在LED数码管上显示3)实现+、-、*、/4)在LED数码管上显示结果并有清零, 退出功能1.2方案设计本系统以STC89C52单片机为控制核心, 对系统进行初始化, 主要完成对键盘的响应、液晶显示灯功能的控制, 起到总控和协调各模块之间工作的作用。
单片机通过检测键盘读取使用者按下对用功能的按键, 然后通过单片机内部运放把运算的结果显示在液晶屏幕上。
图1-1系统结构框图本系统结构如图1-1所示, 本设计可分为以下模块: 单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。
下面对各个模块的设计方案逐一进行论证分析。
2.硬件原理电路图的设计及分析2.1主控模块STC89C52有40个引脚, 4个8位并行I/O口, 1个全双工异步串行口, 同时内含5个中断源, 2个优先级, 2个16位定时/计数器。
STC89C52的存储器系统由4K的程序存储器(掩膜ROM), 和128B的数据存储器(RAM)组成。
单片机计算器课程设计报告
![单片机计算器课程设计报告](https://img.taocdn.com/s3/m/860883ea0975f46527d3e1a1.png)
单片机课程设计课题名称:单片机简易计算器课程设计姓名:XXXX 学号:XXXXXX 年级专业班级:XXXXXXX学院:XXXX设计时间:XXXXXXX设计地点:XXXXXX指导老师:**目录一、单片机课程设计实习目的 (2)1、增进对单片机的感性认识,加深对单片机理论方面的理解; (2)2、掌握单片机的内部功能模块的应用,如定时器/计数器、中断、存贮器、I/O口等; (2)3、了解和掌握单片机应用系统的软硬件设计过程及实现方法。
(2)二、实习课题任务 (2)1、课题:简易计算器的设计 (2)2、设计基本要求: (2)利用单片机试验箱的键盘模块以及显示模块实现百位以内加减乘除。
(2)任选一种显示方式:即中文液晶显示屏、LED数码管可任选一种。
(2)3、功能实现: (2)4、设计任务 (2)5、设计思路 (2)三、系统分析 (4)四、硬件系统设计 (5)1、键盘接口电路 (5)2、数码管显示电路 (6)五、软件系统设计 (6)六、调试结果 (7)1)10以内计算器 (7)2)100以内计算器 (7)七、结论 (8)八、体会与收获 (8)九、附件(程序): (9)1、程序一:只能进行两位数与两位数格式的四则运算 (9)2、程序二:能进行百位以内的四则运算,但一位与两位数运算结果调试不对 (18)一、单片机课程设计实习目的1、增进对单片机的感性认识,加深对单片机理论方面的理解;2、掌握单片机的内部功能模块的应用,如定时器/计数器、中断、存贮器、I/O 口等;3、了解和掌握单片机应用系统的软硬件设计过程及实现方法。
二、实习课题任务1、课题:简易计算器的设计2、设计基本要求:利用单片机试验箱的键盘模块以及显示模块实现百位以内加减乘除。
任选一种显示方式:即中文液晶显示屏、LED数码管可任选一种。
3、功能实现:计算器将完成的功能有两位数以内加、减、乘、除功能,并通过LED数码管显示输入值及结果。
4、设计任务1.扩展4*4键盘,其中10个数字,5个功能键,1个清零2.使用五位数码管接口电路3.完成十进制的四则运算(加、减、乘、除);4.实现低于三位小于255数字的连续运算;5.使用keil C软件编写程序;6.最后用ptoteus仿真;7.具有较强的抗干扰能力;8.体积小、功耗低,便于嵌入其他系统。
单片机课程设计-计算器
![单片机课程设计-计算器](https://img.taocdn.com/s3/m/b8c75c7ab80d6c85ec3a87c24028915f814d8470.png)
未来发展方向
智能化:引入人工 智能技术,实现语 音识别、图像识别 等功能
便携化:设计更小、 更轻、更薄的计算 器,方便携带和使 用
网络化:实现计算 器与互联网的连接 ,实现远程控制和 数据传输
环保化:采用环保 材料和节能设计, 降低能耗和污染
感谢您的观看
汇报人:
计算器模式:支持科学计算器模式和普 通计算器模式
错误提示:当
体积小:单片机计算器体积小,便于携带和使用 功耗低:单片机计算器功耗低,可以长时间使用 功能强大:单片机计算器功能强大,可以进行各种复杂的计算 可编程:单片机计算器可编程,可以根据需要进行功能扩展和修改
显示模块
液晶显示屏:用 于显示计算结果 和操作提示
驱动电路:控制 液晶显示屏的显 示效果
接口电路:连接 液晶显示屏与单 片机
背光控制:调节 液晶显示屏的亮 度和对比度
输入模块
键盘输入:通过键盘输入数字 和运算符号
液晶显示:显示输入结果和操 作提示
电源模块:提供稳定的电源供 应
复位模块:用于系统复位和初 始化
弦等
算法设计:采 用模块化设计, 每个功能模块 对应一个算法
算法实现:使 用C语言编写算 法,实现计算
器功能
测试与调试:编 写测试程序,对 算法进行测试和 调试,确保算法 正确性和稳定性
中断服务程序
功能:处理突发事件,如按键、定时器等 结构:包括中断请求、中断响应、中断处理、中断返回等步骤 特点:速度快、实时性强、效率高 应用:广泛应用于各种单片机系统中,如计算器、遥控器等
存储模块
存储容量:根据计算器功能 需求选择合适的存储容量
存储芯片:用于存储计算器 程序和数据
存储方式:采用静态存储或 动态存储方式
基于单片机的计算器课程设计报告
![基于单片机的计算器课程设计报告](https://img.taocdn.com/s3/m/feb79335011ca300a6c390e6.png)
昆明理工大学课程设计报告设计名称:单片机计算器课程设计姓名:学号:2011118521XXX专业班级:测控技术和仪器1111院(系):信息工程设计时间:2013年6月21日设计地点:昆明理工大学德信楼目录一、题目……………………………………………………………………………二、任务和要求…………………………………………………三、课程设计及整体方框图…………………………………………………a..总体设计思路简述····················································b.硬件设计简述························································c.软件设计简述························································d.程序主流程图························································四、课程设计原理分析及相关知识概述…………………………………………五、结论……………………………………………………………………………六、体会和收获……………………………………………………………………附件:1、源程序代码(根据需要选择)……………………………………………2、整体电路原理图(根据需要选择)………………………………………2、元件表(根据需要选择)…………………………………………………3、实验操作(根据需要选择)…………………………………………………一、题目使用单片机芯片AT89C51、LCD 1602 液晶显示屏,用KEIL uVision和porteus 仿真软件实现简易计算器的仿真和调试。
单片机实训计算器报告
![单片机实训计算器报告](https://img.taocdn.com/s3/m/4853ef47a200a6c30c22590102020740be1ecdc6.png)
一、引言随着科技的飞速发展,单片机技术作为嵌入式系统的重要组成部分,已经在各个领域得到了广泛的应用。
为了提高学生对单片机技术的理解和实践能力,我们开展了单片机实训课程。
本次实训报告以设计一个简易计算器为例,详细介绍单片机在计算器中的应用及其设计过程。
二、实训目的1. 熟悉单片机的基本原理和编程方法。
2. 掌握单片机外围设备的接口技术。
3. 培养学生的实际动手能力和创新意识。
三、实训内容1. 设计要求本次实训要求设计一个基于单片机的简易计算器,能够实现以下功能:(1)加、减、乘、除四则运算;(2)结果显示在LCD1602显示屏上;(3)具有简单的错误处理功能。
2. 系统组成本计算器系统主要由以下几部分组成:(1)AT89C51单片机:作为系统的核心控制器,负责控制整个计算器的运行;(2)LCD1602显示屏:用于显示输入的数字、运算符和计算结果;(3)矩阵键盘:用于输入数字和运算符;(4)按键:用于控制计算器的开关、清零和退出等功能。
3. 硬件设计(1)AT89C51单片机:选用AT89C51单片机作为核心控制器,具有丰富的I/O端口和片内资源,可以满足计算器的需求。
(2)LCD1602显示屏:通过单片机的PORTD端口与LCD1602显示屏相连,实现数据显示功能。
(3)矩阵键盘:采用4x4矩阵键盘,将行线连接到单片机的PB0-PB3端口,列线连接到PB4-PB7端口。
(4)按键:设置三个按键,分别用于控制计算器的开关、清零和退出功能。
4. 软件设计(1)初始化:首先对单片机的I/O端口、LCD1602显示屏和矩阵键盘进行初始化。
(2)键盘扫描:通过扫描矩阵键盘,获取用户输入的数字和运算符。
(3)运算逻辑处理:根据用户输入的数字和运算符,进行相应的运算。
(4)结果显示:将计算结果显示在LCD1602显示屏上。
(5)错误处理:当输入错误或发生溢出时,显示错误信息。
四、实训过程1. 硬件电路搭建:根据设计要求,将AT89C51单片机、LCD1602显示屏、矩阵键盘和按键连接到一起,搭建计算器的硬件电路。
基于51单片机简易计算器课程设计报告
![基于51单片机简易计算器课程设计报告](https://img.taocdn.com/s3/m/1763db24974bcf84b9d528ea81c758f5f61f293b.png)
基于51单片机简易计算器课程设计报告引言:计算器是现代社会中常见的电子设备之一,它能够帮助人们进行各种数学运算,提高计算效率。
本文将介绍基于51单片机的简易计算器的设计过程及实现方法。
一、设计目标本次设计的目标是实现一个简易计算器,能够进行基本的加减乘除运算,并能够显示计算结果。
通过该设计,旨在加深学生对51单片机的理解,培养其实际操作能力。
二、硬件设计1. 电源模块:采用稳压电源模块,提供稳定的电压给单片机及其他电路模块。
2. 单片机模块:采用51单片机,作为计算器的核心控制模块,负责接收按键输入、进行运算和显示结果。
3. 按键模块:设计合适的按键电路,用于输入数字和操作符。
4. 显示模块:采用数码管或液晶显示屏,显示计算结果。
5. 连接线:将各个模块连接起来,确保信号的传输畅通。
三、软件设计1. 初始化:设置单片机的工作模式、端口方向和初始状态。
2. 按键扫描:通过轮询的方式检测按键是否被按下,若有按键按下则进行相应的处理。
3. 输入处理:根据按键的顺序和操作符的位置进行输入的处理,将输入的数字和操作符分别存储在相应的变量中。
4. 运算处理:根据输入的操作符进行相应的运算,得出计算结果。
5. 结果显示:将计算结果通过数码管或液晶显示屏进行显示。
6. 清零处理:在计算结果显示完毕后,对相关的变量进行清零处理,以便进行下一次的计算。
四、功能实现1. 加法运算:通过按下"+"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
2. 减法运算:通过按下"-"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
3. 乘法运算:通过按下"*"按键,输入第一个数字,再按下"="按键,输入第二个数字,最后按下"="按键,计算并显示结果。
基于51单片机的计算器课程设计实验报告
![基于51单片机的计算器课程设计实验报告](https://img.taocdn.com/s3/m/84e34a0e854769eae009581b6bd97f192279bf62.png)
项目一:简单计算器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);}}。
单片机计算器的课程设计报告
![单片机计算器的课程设计报告](https://img.taocdn.com/s3/m/1bc93543cc17552707220879.png)
目录按键监视电路 (5)一、设计任务和性能指标设计任务自制一个单片机最小系统,包括复位电路,采用外部小键盘输入数据,能够实现加法、乘法及一个科学计算,计算结果显示在四位一体的数码管上。
要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。
性能指标1.加法:四位加法,计算结果若超过四位则显示计算错误;2.减法:四位减法,计算结果若小于零则显示计算错误;3.乘法:个位数乘法;4.除法:整数除法;5.取对数;6.开平方;7.指数运算;8.有清零功能二.设计方案按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图所示。
主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
监测模块采用二极管和扬声器(实验室用二极管代替)组成电路。
键盘电路采用4*4矩阵键盘电路。
显示模块采用4枚共阳极数码管和74ls273锁存芯片构成等器件构成。
整个单片机的接口电路:P0用于显示输出;P1用于键扫描输入;P2用于数码管位选控制;P3用于键盘扩展(部分运算符输入);三.系统硬件设计单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。
主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。
晶振选取,晶振旁电容选取20pF。
采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。
以下为单片机最小系统硬件电路图。
单片机最小系统硬件电路键盘接口电路计算器所需按键有:数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C( 清零)’扩展键:“log”,“ln”,“x^2”“小数点”,“开方”共计25个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接~,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。
51单片机计算器课程设计
![51单片机计算器课程设计](https://img.taocdn.com/s3/m/3829a0246fdb6f1aff00bed5b9f3f90f76c64d00.png)
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位硬件中断。
单片机简易计算器课程设计报告
![单片机简易计算器课程设计报告](https://img.taocdn.com/s3/m/40f40de64693daef5ef73d71.png)
课程设计成果说明书题目:简易计算器的设计学生姓名:向得智学号:130407132学院:船舶与海洋工程学院班级:A13船舶电子电气指导教师:目录一、课程设计目的……………………………………………………………二、硬件电路设计……………………………………………………………2.1 AT89C51的功能介绍……………………………………………………………2.1.1简单概述…………………………………………………………………………2.1.2主要功能特性·……………………………………………………………………2.1.3 AT89C51的引脚介绍………………………………………………………………2.2 显示电路·………………………………………………………………………………2.2.1 LM016L的结构及功能……………………………………………………………2.2.2 LM016L的引脚功能介绍…………………………………………………………2.2.3 LM016L的电路接线图……………………………………………………………2.3振荡电路设计………………………………………………………………………2.4键盘电路设计………………………………………………………………2.5键盘扫描子程序设计…………………………………………………………………2.6总电路……………………………………………………………………………三、程序设计与说明…………………………………………………………3.1程序主流程图………………………………………………………………四、结论……………………………………………………………………………五、体会与收获……………………………………………………………………参考文献……………………………………………………………………………一.课程设计的目的单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。
基于51单片机简易计算器课程设计报告(一)
![基于51单片机简易计算器课程设计报告(一)](https://img.taocdn.com/s3/m/43e31ee2a48da0116c175f0e7cd184254a351b55.png)
基于51单片机简易计算器课程设计报告(一)基于51单片机简易计算器课程设计报告1. 介绍在本次课程设计中,我设计了一个基于51单片机的简易计算器。
本报告将会详细介绍该计算器的设计思路、功能实现以及课程设计中遇到的问题与解决方法。
2. 设计思路功能需求•支持基本的加、减、乘、除运算•具备数字输入与显示功能•具备清零和等于功能•具备连续计算功能硬件设计本计算器的硬件设计主要包括51单片机、LCD显示模块以及按键输入模块。
其中,51单片机负责控制计算器的逻辑,LCD显示模块用于显示计算结果和用户输入,按键输入模块用于接收用户的输入。
软件设计计算器的软件设计主要分为以下几个部分: - 初始化:初始化51单片机、LCD模块以及按键模块。
- 按键扫描:通过扫描按键模块,获取用户的输入。
- 数字输入与显示:根据用户输入,将数字显示在LCD上。
- 运算逻辑:根据用户输入的运算符和数字,执行相应的计算操作,并将结果显示在LCD上。
3. 功能实现初始化在初始化阶段,我们需要初始化51单片机的GPIO口、LCD模块以及按键模块。
具体的初始化代码如下:// 初始化51单片机的GPIO口// 初始化LCD模块// 初始化按键模块按键扫描为了获取用户的输入,我们需要通过按键模块进行扫描。
具体的按键扫描代码如下:// 扫描按键模块// 如果检测到按键按下,则进行相应的处理数字输入与显示当用户按下数字键时,我们将获取到的数字输入缓存起来,并将其显示在LCD上。
具体的数字输入与显示代码如下:// 获取按键输入的数字// 将数字添加到输入缓存// 将输入缓存显示在LCD上运算逻辑当用户按下运算符键时,我们需要根据输入的数字和运算符执行相应的计算操作,并将结果显示在LCD上。
具体的运算逻辑代码如下:// 获取运算符输入// 根据运算符和输入的数字执行相应的计算操作// 将计算结果显示在LCD上清零和等于功能为了提升用户体验,我们还可以添加清零和等于功能。
单片机课程设计报告-简易计算器
![单片机课程设计报告-简易计算器](https://img.taocdn.com/s3/m/1f6666f1fab069dc50220116.png)
目录一、概述 (2)二、实验内容 (2)三、硬件设计 (3)1 设计总体框图 (3)2 实际电路 (3)(1)复位电路 (4)(2)时钟电路 (5)(3)EA/VPP(31脚)的功能和接法 (6)(4)键盘输入电路 (6)(5)数码管显示电路 (7)四、软件设计 (8)1 程序内容 (8)2 C语言程序 (9)五、Protues仿真 (9)六、设计总结 (10)七、附录 (11)1 C语言程序: (11)2焊接电路板实物图 (18)3 芯片引脚图 (19)一、概述单片机课程设计是一门实践课程,要求学生具有制作调试单片机最小系统及外设的能力,能够掌握单片机内部资源的使用。
单片机课程设计内容包括硬件设计、制作及软件编写、调试,学生在熟练掌握焊接技术的基础上,能熟练使用单片机软件开发环境Keil C51编程调试,并使用STC ISP调试工具采用串口下载方式联调制作的单片机最小系统。
单片机课程设计题目包含基本部分及扩展部分,基本部分即单片机最小系统部分,扩展部分是对单片机内部资源及外部IO口的功能扩展,使制作的单片机系统具有一定的功能。
二、实验内容自制一个单片机最小系统,包括串口下载、复位电路,采用外部小键盘输入数据,能够实现加法、乘法及一个科学计算,计算结果显示在四位一体的数码管上。
三、硬件设计1 设计总体框图2实际电路在单片机系统中,复位电路是非常关键的,当程序跑飞(运行不正常)或死机(停止运行)时,就需要进行复位。
MCS-5l 系列单片机的复位引脚RST(第9 管脚)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST 持续为高电平,单片机就处于循环复位状态。
复位操作通常有两种基本形式:上电自动复位和开关复位。
上电瞬间,电容两端电压不能突变,此时电容的负极和RESET 相连,电压全部加在了电阻上,RESET 的输入为高,芯片被复位。
随之+5V 电源给电容充电,电阻上的电压逐渐减小,最后约等于0,芯片正常工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(P1==0x0f&&P3==0x7f)
{
singlp_a=1;
}
if(key<=9&&key>=0)
{
if(all_m==0)
{
if(ent_a==0)
{
uchar i;
ent_a=1;
for(i=0;i<=7;i++)
{
xx[i]=0;
}
}
else
{}
if(att==1)
{
uchar i;
1.2性能指标
1.加法:四位加法,计算结果若超过四位则显示计算错误;
2.减法:四位减法,计算结果若小于零则显示计算错误;
3.乘法:个位数乘法;
4.除法:整数除法;
5.取对数;
6.开平方;
7.指数运算;
8.有清零功能
二.设计方案
按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
uchar yy[8]={0x3f,0,0};
float a=0,b=0,c;
uchar L=1;
uchar cal_a=0,dcounter=0;
void main(void)
{
uchar singlp_a=1,n=1;
uchar key=18;
uchar all_m=0,ent_a=0,att=1;
首先将数组内的数按照对应的位关系,将其转化为一个十进制数,这样我们就得到了加速和被加数这样俩个十进制数,从而我们就可以简单的将两个数进行相加,结果就是我们所求的数值。但这个数值不能直接显示到数码管上,我们还要对其进行处理,使其变为对应进位的四个数存入数组内,以便显示。既通过对结果数值分别除以1000、100、10和对10取余,得到我们想要的四个数,送显示子程序显示。其余减、乘、除的计算方法与加法的计算方法一样,这里不再累述。
整体程序清单如下:
#include<reg52.h>
#include<intrins.h>
#include<math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void delay();
uchar Keyscan(void);
void result_a(void);
all_m=0;
key=28;
for(i=0;i<=7;i++)
{
xx[i]=0;
}
result_a();//调用求计算结果
if(L==1)
{
if(c==0)
{
xx[0]=0x3f;
}
if(c>=0.0001)
{
r=c;
s=10000*(c-r);
if(cl==0)
{
Speak_a();
cal_a=14;//求以㏑x
key=15;
}
if(cl0==0)
{
Speak_a();
cal_a=15;//开方
key=15;
}
if(cl1==0)
{
Speak_a();
cal_a=16;//求以十为底对数
key=15;
}
if(cl2==0)
{
Speak_a();
cal_a=17;//求e的x次幂
key=15;
}
if(cl3==0)
{
att=0;
xx[0]=xx[0]+0x80;
}
}
P1=0x0Байду номын сангаас;
if(P1!=0x0f)
{
Delay_1ms(2);
if(P1!=0x0f)
{
key=exchg_a[Keyscan()];
Speak_a();
}
}
}
P1=0x0f;
单片机最小系统硬件电路
3.2键盘接口电路
计算器所需按键有:
数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’
功能键:’+’,’-‘,’*’,’/’,’=’,’C(清零)’
扩展键:“log”,“ln”,“x^2”“小数点”,“开方”
共计25个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。
单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。
主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。
晶振选取11.0592MHz,晶振旁电容选取20pF。
采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。
以下为单片机最小系统硬件电路图。
uchar xx[8];
uchar xxu[8];
void Speak_a(void);
sbit spp=P3^7;//响铃
sbit cl3=P3^6;//小数点
sbit cl=P3^1;//求ln
sbit cl0=P3^2;//开方
sbit cl1=P3^3;//求log
sbit cl2=P3^4;//求e的x次幂
{
m=m/10;
}
a=m+a;
n++;
key=28;
}
}
else
{
if(att==1)
{
uchar i;
b=b*10+key;
for(i=7;i>0;i--)
{
xx[i]=xx[i-1];
}
xx[0]=vie_a[key];
key=18;
}
else
{
uchar i;
double m;
for(i=7;i>0;i--)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void delay()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
4.4主程序设计
主程序既把以上各子程序串连成一个整体,使整个程序循环运行。而在以上程序中也已经加入了个程序之间的连接点,首先进入程序后就立即进入显示子程序,而显示子程序内又调用键盘扫描子程序,若有键按下,则会跳转到移位子程序和结果计算子程序进行相应的处理。通过计算或移位后,数组内的值发生改变,显示的值也会同时发生改变。之后再进行键盘扫描,如此反复运行,就构成了程序的整体。
以下为键盘接口电路的硬件电路图
键盘接口电路
实物图:
扩展键接口电路:
3.3数码管显示电路
采用8位数码管对计算数据和结果的显示(实验时只用到了4位),这里选取共阴数码管,利用74LS244N对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。
P0口输出显示值,
P2.0~P2.7(实际操作用到P2.0-P2.3)用来作为位选端,控制哪几位数码管进行显示。
}
all_m=1;
key=18;
att=1;
n=1;
}
if(key==14)
{
uchar i;
key=18;
ent_a=0;
for(i=0;i<=7;i++)
{
xx[i]=yy[i];
}
a=0;
b=0;
c=0;
all_m=0;
L=1;
att=1;
n=1;
cal_a=0;
}
if(key==15)
{
uchar i;
输入数据要存储在一四位数组内,而我们键入的值是数据的高位,后键入的值是低位,这样我们就需要在输入低位数值时将高位数值从数组的低位移向数组的高位,这就是编写移位子程序的目的。
对于结果计算子程序,包含加、减、乘、除四种运算。以加法运算为例,各种运算各有其标志位来代表计算类型,当加法标志位add=1是,就将输入的两个数据按照加法进行计算。
{
uchar len;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
P2=Disbuf[dcounter];
len=dcounter;
P0=xx[len];
dcounter+=1;
if(dcounter==8)
{
dcounter=0;
}
}
延时程序:
void Delay_1ms(uint i)//1ms延时
要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。
以下为键盘扫描子程序的程序清单。
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};