基于单片机的计算器设计(DOC)
基于单片机实现的简易计算器课程设计(word格式)

徐州师范大学物电学院课程设计报告课程名称:单片机课程设计题目:简易计算器专业班级:07电科学生姓名:刘俊学生学号:07223010日期:2010.6.27指导教师:游春霞摘要 (2)Abstract (2)概述 (2)二、设计方案简述 (4)2.1、功能介绍 (4)2.1.1、基本功能 (4)2.1.2、扩展功能 (4)2.2、总体设计方案 (4)2.2.1、总体设计思路 (4)2.2.2、方案论证与比较 (4)2.2.3、系统组成 (8)三、详细设计 (9)3.1、设计目标和实现方法 (9)3.2、设计 (9)3.2.1、输入模块:键盘扫描 (10)3.2.2、运算模块:单片机控制 (10)3.2.2、显示模块:LCD1602显示 (10)3.3、硬件电路设计 (11)3.3.1、硬件连接 (11)3.4、软件设计 (12)3.5、仿真和调试 (12)3.5.1、 KEIL uVision调试 (13)3.5.2、 Proteus 对于本设计的仿真 (14)3.6、元件的介绍 (15)3.6.1、 MCS-51单片机组成 (15)3.6.2、 MCS-51单片机引脚功能 (16)3.6.3、复位和复位电路 (18)3.6.4、 LCD1602显示器 (18)四、设计结果及分析 (23)4.1、功能和操作 (23)4.2、硬件调试 (23)4.3、技术要点 (23)五、总结 (24)六、参考资料附录主要程序代码本设计采用单片机作为控制芯片,用C语言对其进行编程实现,输入由4*4矩阵式键盘控制,输出采用人性化的LCD1602型液晶实现。
在未进行计算时,它显示一段话,ON/O切换进入计算模式。
对于计算这个部分我采用的是矩阵键盘,10个数字键,一个等于号键,四个符号键,一个清零键,计算最高达到小数点后三位。
由于C语言库函数繁多,所以我采用调用C语言库函数来解决多种运算类型,这样编程更简单,运行起来也更可靠。
基于单片机的计算器结构设计

基于单片机的计算器结构设计一、引言计算器是一种用来进行各种基本数学运算的电子设备,用于简化和加速数学计算过程。
基于单片机的计算器是一种利用单片机进行计算操作的计算器设计方案,具有更高的计算速度和更丰富的功能。
本文将介绍基于单片机的计算器结构设计方案,包括计算器的硬件设计和软件设计。
二、硬件设计1.单片机选择为了保证计算的速度和性能,我们选择了性能较高且容易获取的8051单片机作为计算器的核心控制芯片。
8051单片机具有强大的计算能力和丰富的周边资源,可以满足计算器的需求。
2.输入和输出设备计算器的输入设备采用矩阵键盘,通过键盘输入数字、运算符和功能键等。
输出设备采用液晶显示屏,用于显示输入的数字、运算结果和其他信息。
3.时钟和定时器为了实现计算器的正常运行,需要引入时钟和定时器来进行计时和计数。
其中,时钟用于控制单片机的运行频率,定时器用于产生一个固定的时间间隔来进行计时。
4.存储器计算器需要存储用户输入的数字和进行运算的结果等信息。
因此,需要引入存储器来进行数据的存储和读取。
其中,内部存储器用于存储程序代码和运算过程中的临时数据,外部存储器用于存储用户自定义的函数和变量等。
5.电源管理计算器需要一个稳定可靠的电源供电。
可以采用电池或者插电源的方式来为计算器提供电源,并通过电源管理电路来保证电源的稳定和可靠。
三、软件设计1.系统初始化计算器在开机时需要进行初始化操作,包括初始化存储器、设置时钟和定时器、设置输入输出设备等。
2.数字输入用户通过键盘输入数字,计算器将数字存储到相应的变量中,用于进行后续的运算。
3.运算操作计算器支持加、减、乘、除等基本运算操作,并可以进行括号内的优先计算。
计算器通过解析用户输入的运算表达式,并利用算法对其进行计算,并将结果存储到相应的变量中。
4.结果显示计算器将计算结果显示在液晶显示屏上,用户可以通过屏幕来查看运算结果。
5.错误处理在计算过程中,可能会出现一些错误,如除数为零等。
电子设计-基于STC89C52RC单片机的简易计算器设计.docx

电子设计实验名称:基于STC89C52RC单片机的简易计算器设计姓名:学号:指导老师:一、可行性研究■-二、方案述.....2.1、功能介■■■..3 (4)、设可彳亍性分析:1.2.1经济可行性由于只是实验性质的编程,所以在设计和开发都不需要过多的经费,但是系 统投入运行以后,硕件维护和损耗所造成的耗费是必须的,但是数目也不会很大。
基本功能 .......... 扩展功能 ..........2.2、总体设计方案…… 总体设计思路•- 方案论证与比较系统组成 ........... 三、详细设计 .............1. 各个模块设计…… 输入模块: 运算模块: 显示模块: 阀件电设计 2.键盘扫描•….单片机控制…LCD 1602 显硬件连接121213 14 153.元件的介绍 ........ STC89C52单片机组成 复位和复位电路…•…LCD 1602 显示5 ■5 •6器•……4.PCB 设计以及结果显示五、总结 ...... ....... 附录主要程序代码 .............19 222425所以经过初步分析,经济上基本上是可行的1.2.2技术可行性在技术方面,因为都学习了C语言,硕件课程设计等课程,对于开发语言C语言也有一定的掌控能力,应该能够完成相应的任务。
1.2.3运行可行性该成果简单易操作,非常容易使用。
1.2.4法律可行性由于我们需要完成的功能相对简单,没有太多涉及到很专业方面的内容,更没有计划将系统利用到商业用途,所以不存在侵权或者版权纠纷方面的问题。
125结论该系统的软硬件都比较容易理解和实现,所以,具有实现一计算器的可行性。
二、设计方案简述2.1功能概述系统基本功能:(1)由于设计的计算器要进行四则运算,为了得到较好的显示效果,经综合分析后,最后采用LCD显示数据和结果。
(2)采用键盘输入方式,键盘包括数字键(0〜9)、符号键(+、-、X、清除键(onV )和等号键(=),故只需要16个按键即口J,设计中采用集成的计算 键盘。
本科毕业设计-基于单片机的计算器设计

学生毕业设计(论文)报告设计(论文)题目:基于单片机的计算器设计毕业设计(论文)任务书一、课题名称:基于单片机的计算器设计二、主要技术指标(或基本要求): 1.LCD:Vcc+5V 电源。
2. 串口号:1~16,波特率600~256000bit/s,大于115200bit/s时需要硬件支持。
3.AT89C51低耗的8位单片机,内含8kb。
三、主要工作内容:1.内容:设计一个简易计算器;2.要求:(1)能实时现清零及加减乘除所有功能,并将结果显示出来;(2)查阅相关资料,提出设计要求及方案;(3)以单片机AT89C51为核心,设计硬件及软件程序;(4)流程图编写,计算器进行仿真调试;四、主要参考文献[1] 李朝青.单片机学习辅导测验及解答讲义.北京:北京航空航天大学出[2] 龚茂发,等.单片机人机接口时列集. 北京:北京航空航天大学出版社出版,2003[3]李众,张素琴,单片机技术与项目训练清华大学出版社[4]周润景 , 张丽娜 , 丁丽 .基于PROUTEUS的电路及单片机设计与仿真 .北京航空天大学出版社[5]陈宝江,张幽瞳. MCS单片机应用系统实用指南机械工业出版社[6]张迎辉,赵润林,贡雪梅.单片机实训教程北京大学出版社学生(签名)20 年月日指导教师(签名)20 年月日教研室主任(签名)20 年月日二级学院领导(签名)20 年月日毕业设计(论文)开题报告基于AT89C51的简易计算器设计目录摘要Abstract第1章前言 (1)第2章计算器的简单简介 (2)2.1 设计目的 (2)2.2 设计任务 (2)2.3 MCS-51系列单片机简介 (4)2.4 单片机的选择目的 (5)2.5矩阵按键 (6)2.6 计算器设计总体思想 (8)第3章硬件设计 (10)3.1 硬件系统设计 (10)3.2 键盘接口电路 (10)3.3 LED显示模块 (10)3.4 运算模块 (11)第4章软件设计 (11)4.1 程序语言的选择 (12)4.2 主程序流程图 (12)4.3 算术运算程序流程图 (12)4.4 键扫流程图 (13)第5章仿真调试 (15)5.1 C51单片机软件开发系统Keil (15)5.2 系统工作原理图 (17)第6章结束语 (19)参考文献答谢辞摘要随着社会的不断发展,我们的物质生活和娱乐方式都越来越离不开电子产品。
基于单片机的计算器设计(完整版)

图3-1所示为简易计算器的电路原理图。
P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表----所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。
图3-1 简易计算器电路原理图键值与功能对应表键值0 1 2 3 4 5 6 7 8 9 + - ×/ = ON/C 功能0 1 2 3 4 5 6 7 8 9 + - ×÷= 清零表3-13.2 计算器的软件设计#include<reg51.h> //头文件#define uint unsigned int //#define uchar unsigned charsbit 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; //com指令付给P0口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() //初始化{num=-1;lcden=1; //使能信号为高电平write_com(0x38); //8位,2行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; //flag表示是否有符号键按下,fuhao=0; // fuhao表征按下的是哪个符号}void keyscan() // 键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20); 延迟20msif(P3!=0xfe){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){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){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){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)//如果按过符号键{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;c=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;}}}main(){init();while(1){keyscan();}}第4章仿真和调试下面用KEIL uVision与porteus仿真软件实现简易计算器的仿真与调试。
基于单片机的简易计算器设计

基于单片机的简易计算器设计引言:计算器是一种广泛应用的电子设备,可以进行各种数学计算。
基于单片机的计算器是一种使用单片机作为核心处理器的计算器。
本文将介绍如何设计一个基于单片机的简易计算器。
一、设计思路:1.硬件设计:选择适合的单片机,LCD显示屏,按键开关和电源电路,将它们连接在一起组成计算器的硬件。
2.软件设计:使用单片机的编程语言编写程序,实现计算器功能,如加法、减法、乘法、除法等运算,以及清零、退格、等号等功能。
二、硬件设计:选择单片机:在设计单片机计算器时,我们可以选择MCU,如STC89C52、ATmega32等。
这些单片机性能稳定,功能强大,适合用于计算器的设计。
LCD显示屏:选择合适尺寸和接口的LCD显示屏,用于显示计算结果和输入的数字。
按键开关:选择合适的按键开关,用于接收用户的按键输入,如数字、运算符等。
电源电路:设计适合的电源电路,为计算器提供稳定的电源。
三、软件设计:1.初始化功能:启动计算器时,进行相关初始化操作,如清屏、设置计算器状态等。
2.数字输入功能:通过按键输入,将数字输入到计算器中,同时刷新LCD显示屏上的内容。
3.运算功能:根据用户输入的数字和运算符,进行相应的运算操作,如加法、减法、乘法、除法等。
4.清零功能:按下清零按钮时,将计算器的状态重置为初始状态。
5.退格功能:当用户输入错误时,可以通过按下退格按钮,删除最后一个输入的数字或运算符。
6.等号功能:用户按下等号按钮时,计算器将完成运算,并将结果显示在LCD屏上。
7.错误处理功能:当用户输入错误时,计算器应该给出合适的错误提示。
四、程序实现:1.确定单片机的引脚分配,将LCD显示屏、按键开关和单片机的引脚连接起来。
2.使用单片机的编程语言编写程序,实现计算器的功能。
3.根据运算符和数字的不同,确定相应的运算方法,并在LCD显示屏上显示结果。
4.使用条件语句和循环结构,实现计算器的控制逻辑。
5.通过编程实现按键响应功能,当用户按下相应按键时,执行相应的操作。
基于单片机的数字计算器的设计

基于单片机的数字计算器的设计基于单片机的数字计算器设计是一个相对复杂的项目,涉及到硬件和软件的协同工作。
以下是一个基本的设计流程和要点:
1. 明确设计需求:
•确定计算器的功能:例如,基础的四则运算、括号处理、小数点处理等。
确定输入方式:例如,使用按钮、旋钮等输入数值和运算符。
确定显示方式:例如,使用LED显示屏或LCD显示屏。
选择单片机:
•根据项目需求选择合适的单片机型号。
例如,常用的有51系列、STM32系列等。
单片机需要具备足够的I/O口来连接显示屏、按键等外设。
硬件设计:•设计电路板,将单片机、显示屏、按键等外设连接起来。
考虑电源供电,可能需要一个电源管理模块。
软件设计:
•编写程序,使单片机能够根据用户的输入执行相应的运算并显示结果。
可以使用C语言或汇编语言进行编程。
测试与调试:
•在完成硬件和软件的设计后,进行测试,确保计算器能够正常工作。
根据测试结果进行必要的调整和优化。
优化与改进:
•根据用户反馈或实际使用情况,对计算器进行优化和改进。
可以增加更多功能,如内存操作、复杂运算等。
文档编写:
•编写设计文档,记录设计过程、使用的主要技术、遇到的问题及解决方法等。
产品化:
* 如果项目满足商业化需求,可以进行产品化,如生产计算器成品或将其集成到其他设备中。
在设计过程中,可能会遇到各种问题,需要具备一定的电子技术和编程能力来解决。
如果你是初学者,建议先从简单的项目开始练习,逐步提高自己的技能。
基于单片机计算器的毕业设计题目

毕业设计题目:基于单片机的计算器1. 概述基于单片机的计算器作为毕业设计题目,既有一定的挑战性,又能够很好地帮助学生巩固所学的知识。
在这篇文章中,我将从单片机的基本原理、计算器的功能需求、实现方法等方面进行全面评估,并给出我个人的观点和理解。
2. 单片机的基本原理在设计基于单片机的计算器之前,首先需要了解单片机的基本原理。
单片机是一种集成了中央处理器、存储器和输入/输出功能的微型计算机,它通常应用于嵌入式系统中。
常见的单片机包括51系列、AVR 系列和STM32系列等。
了解单片机的基本原理对于设计计算器的硬件电路和软件程序至关重要。
3. 计算器的功能需求设计计算器需要明确其功能需求,包括基本的加减乘除运算、小数运算、括号运算、科学计数法、存储与检索数据等功能。
还需要考虑界面设计、按键输入与显示输出、程序的稳定性和速度等方面的要求。
在实现这些功能时,需要充分考虑单片机资源的限制和运算速度的优化。
4. 实现方法基于单片机的计算器可以采用硬件电路和软件程序相结合的方式来实现。
硬件电路部分需要设计键盘输入、显示屏输出、运算功能等模块,而软件程序部分需要编写运算逻辑、界面控制、数据存储等功能。
在实现过程中,需要考虑硬件和软件之间的协作与优化,以保证计算器的稳定性和性能。
5. 个人观点和理解基于单片机的计算器是一项很有挑战性的毕业设计题目,既考验学生对单片机原理和计算器功能的掌握,又锻炼了他们的工程实践能力。
通过这个项目,学生可以深入了解单片机的应用,提高软硬件协同设计的能力,培养解决实际问题的能力。
我个人认为,这样的设计项目对于培养学生的创新意识和团队协作精神也有着积极的意义。
6. 总结与展望在本文中,我综合了单片机的基本原理、计算器的功能需求、实现方法以及个人观点和理解,以帮助读者全面、深刻地理解基于单片机的计算器这一毕业设计题目。
希望本文能够对读者有所启发,同时也期待未来能够看到更多基于单片机的创新设计作品问世。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业:电子信息工程1111班指导老师:姓名:学号:摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算机在人们的日常生活中是比较常见的电子产品之一。
可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计是用AT89S51单片机、LCD显示器、控制按键为元件来设计的计算器。
利用此设计熟悉单片机微控制器及C语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。
掌握Microsoft Visual C++ 6.0应用程序开发环境,常用的LCD显示器的使用方法和一般键盘的使用方法。
关键字:AT89C51 LCD 控制按键第一章简介1.1 课题简介当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。
计算器作为一种快速通用的计算工具方便了用户的使用。
计算器可谓是我们最亲密的电子伙伴之一。
本设计着重在于分析计算器软件和开发过程中的环节和步骤,并从实践经验出发对计算器设计做了详细的分析和研究。
单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。
在工业生产中。
单片微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
本系统就是充分利用了8051芯片的I/O引脚。
系统以采用MCS-51系列单片机Intel8051为中心器件来设计计算器控制器,实现了能根据实际输入值显示并存储的功能,计算程序则是参照教材。
至于位数和功能,如果有需要可以通过设计扩充原系统来实现。
1.2 设计目的通过本次课题设计,应用《单片机应用基础》、《计算机应用基础》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。
通过本次设计的训练,可以使我在基本思路和基本方法上对基于MCS-51单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。
第二章硬件系统设计硬件系统是指构成微机系统的实体和装置,通常由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。
单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外加各种扩展接口电路、外部设备、被控对象等硬件和软件,才能构成一个单片机应用系统。
本设计选用以AT89S51单片机为主控单元。
显示部分:采用LCD静态显示。
按键部分,采用4*4键盘。
2.1 键盘接口电路计算机输入数字和其他功能按键时要用到很多按键,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这样的方式,而是采用矩阵键盘的方式。
矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的数量就为4*4个。
这样行列式键盘结构能有效的提高单片机系统中I/O口的利用率。
计算器的键盘布局如图3.2所示:一般有16个键组成,在单片机中正好有一个P端口实现16个按键功能,这种形式在单片机系统中最常用。
图3.2 矩阵键盘内部电路2.2 LCD显示模块本设计采用LCD液晶显示器来显示输出数据。
LCD的特性有:1、+5V电压,对比可调度;2、内含复位电路;3、提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;4、有80字节显示数据存储器DDRAM;5、内建有160个5X7点阵的字型的字符发生器CGROM;6、8个可由用户自定义的5X7的字符发生器CGRAM。
本设计通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应的数据。
其接口电路如图3.3所示。
图3.3 LCD接口电路LCD的引脚说明如表3.1所示:表3.1 LCD的引脚说明第三章软件设计3.1 汇编语言和C语言的特点及选择本设计是硬件电路和软件编程相结合的设计方案,选择合适的编程语言是一个重要的环节。
在单片机的应用系统程序设计时,常用的是汇编语言和C语言。
机硬件,程序可读性和可移植性比较差。
而C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。
由于现在单片机的发展已经达到了很高的水平,内部的各种资源相当的丰富,CPU的处理速度非常的快。
用C语言来控制单片机无疑是一个理想的选择。
所以在本设计中采用C语言编写软件程序。
主程序的设计详见附录三。
3.2 键扫程序设计键扫程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。
3.3 算术运算程序设计算术运算程序的过程为:先判断输入的运算符是+、-、*、/ 中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。
3.4 显示程序设计显示程序的过程为:显示开始时,先进行LCD的初始化,判断是否显示汉字或ACSII码或图形,若不显示,则返回,若显示的是汉字或ACSII码,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址,若显示的是图形,则先进行相应功能的设置,再送行地址和列地址,然后送数据,最后判断是否显示完,显示完则返回,没有显示完则继续送行地址和列地址。
第四章系统调试与存在的问题4.1 硬件调试常见故障:1、逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。
这类错误包括错线、开路、短路等。
2、元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、集成电路安装方向错误等。
3、可靠性差:因其可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
4、电源故障:若样机由电源故障,则加电后很容易造成器件损坏。
电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。
调试方法:包括多级调试和联机调试。
在调试过程中要针对可能出现的故障认真分析,直至检查出原因并排除。
本次硬件调试过程中,对所出现的问题进行了认真的分析和改正,最后能够很好的达到设计要求的效果。
4.2 软件调试软件调试一般分为以下四个阶段:1、编写程序并查错;2、在C语言的编译系统中编译源程序3、对程序进行编译连接,并及时发现程序中存在的错误;4、改正错误。
在本次调试中出现的问题有:1、在程序中有的函数名未定义;2、在抄录程序时,少录入一些字符,如:“;”、“{”、“-”等符号,而出现错误;3、有一些函数名录入时少写一个字母或顺序颠倒;4、没有注意函数名的调用及定义;5、芯片引脚定义出错而导致没有实验现象。
在软件调试过程中,对出现的错误进行了认真的分析和修改,多次调试成功后,能够很好的达到既定的设计效果。
总结我的题目是简易计算器的设计,对于我们这些实践中的新手来说,这是一次考验。
怎样才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。
这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
不仅巩固了以前所学过的知识,而且学到了很多在书本上没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
同时在设计的过程中发现了自己的不足之处,例如对以前所学过的知识理解得不够深刻,掌握得不够牢固,对C语言掌握得不够好等。
在这里也真诚地对所有关心我、帮助我、鼓励我的老师、同学、朋友道声:“谢谢!”附录附录一:计算器硬件连线图附录二:源程序Main.c/*-----------------------------------------------名称:液晶显示计算器,时间,温度编写:guoqing日期:2013.10内容:计算器模块:整数之间运算,没有小数所有除法得出的结果不正确,有负号运算,不能作连续运算时间模块,温度模块------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>#include"display.h"#include"delay.h"#include"keyboard.h"#include"ds18b20.h"#include"1302.h"bit ReadTempFlag;//定义读温度标志bit ReadTimeFlag;//定义读时间标志bit ReadcomFlag;//定义读计算器标志unsigned int TempData[8]; //存储显示时间值的全局变量void Init_Timer0(void);//定时器初始化/*------------------------------------------------主程序------------------------------------------------*/void KeyScan1(void);static int fun = 3 ;sbit KEY=P3^3;sbit KEY1=P3^4;sbit KEY2=P3^5;sbit KEY3=P3^6;sbit KEY4=P3^7;void main (void){int temp1;float temperature;char displaytemp[12];//定义显示温度区域临时存储数组char displaytime[8];//计算器模块数据unsigned char num,i,j=0,sign;unsigned char temp[7],temp2[3]; //最大输入8个bit firstflag;int a=0,b=0,c=0;unsigned char s;LCD_Init(); //初始化液晶DelayMs(20); //延时有助于稳定LCD_Clear(); //清屏Init_Timer0();Init_DS18B20();Ds1302_Init();//UART_Init();Lcd_User_Chr(); //写入自定义字符while (1) //主循环{KeyScan1();if(fun == 5)fun = 1 ;if(fun ==1){LCD_Write_String(1,0,"welcome to you");LCD_Write_String(5,1,"*^o^*");// LCD_Clear();}//读入温度if(fun==2){LCD_Write_Char(14,1,0x01);//写入温度右上角点LCD_Write_Char(15,1,'C'); //写入字符CReadTempFlag=1;if(ReadTempFlag==1){ReadTempFlag=0;temp1=ReadTemperature();temperature=(float)temp1*0.0625;sprintf(displaytemp,"Temp is %5.3f",temperature);//打印温度值LCD_Write_String(2,0,"hello world");LCD_Write_String(0,1,displaytemp);//显示第二行}}//读入时间if(fun==3){if(!KEY1) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY1) //再次确认按键是否按下,没有按下则退出{while(!KEY1);//如果确认按下按键等待按键释放,没有释放则一直等待{time_buf1[4]++; //正常时间小时加1if( time_buf1[4]==24) time_buf1[4]=0;Ds1302_Write_Time();LCD_Clear();}}}if(!KEY2) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY2) //再次确认按键是否按下,没有按下则退出{while(!KEY2);//如果确认按下按键等待按键释放,没有释放则一直等待{time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4]=23;Ds1302_Write_Time(); //正常时间小时减1LCD_Clear();}}}if(!KEY3) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY3) //再次确认按键是否按下,没有按下则退出{while(!KEY3);//如果确认按下按键等待按键释放,没有释放则一直等待{time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;Ds1302_Write_Time();break;//分加1LCD_Clear();}}}if(!KEY4) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY4) //再次确认按键是否按下,没有按下则退出{while(!KEY4);//如果确认按下按键等待按键释放,没有释放则一直等待{time_buf1[5]--;if(time_buf1[5]==60)time_buf1[5]=0;Ds1302_Write_Time();break;//减1LCD_Clear();}}}ReadTimeFlag=1;if(ReadTimeFlag==1){ReadTimeFlag==0;Ds1302_Read_Time();TempData[0]=time_buf1[4]/10;TempData[1]=time_buf1[4]%10;TempData[2]='-'; //加入"-"TempData[3]= time_buf1[5]/10;TempData[4]=time_buf1[5]%10;TempData[5]='-'; //加入"-"TempData[6]= time_buf1[6]/10;TempData[7]=time_buf1[6]%10;displaytime[0]= TempData[0]+'0' ; //将数字转换成字符displaytime[1]= TempData[1]+'0' ;displaytime[3]= TempData[3]+'0' ;displaytime[4]= TempData[4]+'0' ;displaytime[6]= TempData[6]+'0' ;displaytime[7]= TempData[7]+'0' ;LCD_Write_Char(3,0,TempData[0]);LCD_Write_Char(3,1,displaytime[0]);//打印到屏幕LCD_Write_Char(4,1,displaytime[1]);LCD_Write_Char(5,1,TempData[2]);LCD_Write_Char(6,1,displaytime[3]);LCD_Write_Char(7,1,displaytime[4]);LCD_Write_Char(8,1,TempData[5]);LCD_Write_Char(9,1,displaytime[6]);LCD_Write_Char(10,1,displaytime[7]);LCD_Write_String(0,0,"now time is");}}if(fun==4){LCD_Write_String(1,0,"Input:");LCD_Write_String(0,1,"Output:");num=KeyPro(); //扫描键盘if(num!=0xff) //如果扫描是按键有效值则进行处理{if(('+'==num) || ('-'==num) || ('x'==num)|| ('/'==num) || ('='==num))//输入数字最大值8,输入符号表示输入结束{// i=0; //计数器复位if('+'==num)LCD_Write_Char(i+7,0,num);if('-'==num)LCD_Write_Char(i+7,0,num);if('x'==num)LCD_Write_Char(i+7,0,num);if('/'==num)LCD_Write_Char(i+7,0,num);if('='==num)LCD_Write_Char(i+7,0,num);i++;j=0;if(firstflag==0) //如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给b{sscanf(temp2,"%d",&a);//从一个字符串输入到变量firstflag=1;c=a;}else{sscanf(temp2,"%d",&b);}for(s=0;s<3;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果temp2[s]=0;for(s=0;s<12;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果temp[s]=0;///////////////////////if(num!='=') //判断当前符号位并做相应处理sign=num; //如果不是等号记下标志位else{firstflag=0; //检测到输入=号,判断上次读入的符合switch(sign){case '+':a=c+b;break;case '-':a=c-b;break;case 'x':a=c*b;break;case '/':a=c/b;break;default:break;}sprintf(temp2,"%d",a); //打印十进制到临时缓冲区LCD_Write_String(7,1,temp2);LCD_Write_String(0,1,"Output:");sign=0;a=b=0; //用完后所有数据清零for(s=0;s<12;s++)temp[s]=0;}}else if(i<9){temp[i]=num+'0';temp2[j]=num+'0';LCD_Write_String(1,0,"Input:");LCD_Write_Char(i+7,0,temp[i]);i++; //输入数值累加j++;}}}}}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{static unsigned int num,num1,num2;TH0=(65536-2000)/256; //重新赋值2msTL0=(65536-2000)%256;num++;num1++;num2++;if(num==200) //{num=0;ReadTempFlag=1; //读标志位置1}if(num1==300){num1=0;ReadTimeFlag=1;}if(num2==100){num2=0;ReadcomFlag=1;}}void KeyScan1(void){if(!KEY) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY) //再次确认按键是否按下,没有按下则退出{while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待{fun++ ;LCD_Clear();}}}}。