基于单片机的计算器设计毕业论文_第1页
基于单片机的计算器设计毕业论文_第2页
基于单片机的计算器设计毕业论文_第3页
基于单片机的计算器设计毕业论文_第4页
基于单片机的计算器设计毕业论文_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE29专业:电子信息工程1111班指导老师:姓名:学号:摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。计算机在人们的日常生活中是比较常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计是用AT89S51单片机、LCD显示器、控制按键为元件来设计的计算器。利用此设计熟悉单片机微控制器及C语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。掌握MicrosoftVisualC++6.0应用程序开发环境,常用的LCD显示器的使用方法和一般键盘的使用方法。关键字:AT89C51LCD控制按键第一章简介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.2LCD显示模块本设计采用LCD液晶显示器来显示输出数据。LCD的特性有:1、+5V电压,对比可调度;2、内含复位电路;3、提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;4、有80字节显示数据存储器DDRAM;5、内建有160个5X7点阵的字型的字符发生器CGROM;6、8个可由用户自定义的5X7的字符发生器CGRAM。本设计通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应的数据。其接口电路如图3.3所示。图3.3LCD接口电路LCD的引脚说明如表3.1所示:表3.1LCD的引脚说明符号引脚说明符号引脚说明VSS电源地DB4DataI/OVDD电源正极(+5V)DB5DataI/OV0液晶显示偏压输入DB6DataI/ORS数据/命令选择端(H/L)DB7DataI/OR/W读写控制信号(H/L)CS1片选IC1信号E使能信号CS2片选IC2信号DB0DataI/ORST复位端(H:正常工作,L:复位)DB1DataI/OVEE负电源输出(-10V)DB2DataI/OBLA背光源正极(+4.2)DB3DataI/OBLK背光源正极第三章软件设计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"bitReadTempFlag;//定义读温度标志bitReadTimeFlag;//定义读时间标志bitReadcomFlag;//定义读计算器标志unsignedintTempData[8];//存储显示时间值的全局变量voidInit_Timer0(void);//定时器初始化/*主程序*/voidKeyScan1(void);staticintfun=3;sbitKEY=P3^3;sbitKEY1=P3^4;sbitKEY2=P3^5;sbitKEY3=P3^6;sbitKEY4=P3^7;voidmain(void){inttemp1;floattemperature;chardisplaytemp[12];//定义显示温度区域临时存储数组chardisplaytime[8];//计算器模块数据unsignedcharnum,i,j=0,sign;unsignedchartemp[7],temp2[3];//最大输入8个bitfirstflag;inta=0,b=0,c=0;unsignedchars;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,"welcometoyou"); LCD_Write_String(5,1,"*^o^*"); //LCD_Clear(); } //读入温度if(fun==2){LCD_Write_Char(14,1,0x01);//写入温度右上角点LCD_Write_Char(15,1,'C');//写入字符C ReadTempFlag=1; if(ReadTempFlag==1) { ReadTempFlag=0; temp1=ReadTemperature(); temperature=(float)temp1*0.0625; sprintf(displaytemp,"Tempis%5.3f",temperature);//打印温度值 LCD_Write_String(2,0,"helloworld"); LCD_Write_String(0,1,displaytemp);//显示第二行 } }//读入时间if(fun==3){ if(!KEY1)//如果检测到低电平,说明按键按下 { DelayMs(10);//延时去抖,一般10-20ms if(!KEY1)//再次确认按键是否按下,没有按下则退出 { while(!KEY1);//如果确认按下按键等待按键释放,没有释放则一直等待 { time_buf1[4]++; //正常时间小时加1 if(time_buf1[4]==24)time_buf1[4]=0; Ds1302_Write_Time(); LCD_Clear(); } } } if(!KEY2)//如果检测到低电平,说明按键按下 { DelayMs(10);//延时去抖,一般10-20ms if(!KEY2)//再次确认按键是否按下,没有按下则退出 { while(!KEY2);//如果确认按下按键等待按键释放,没有释放则一直等待 { time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4]=23; Ds1302_Write_Time();//正常时间小时减1 LCD_Clear(); } } } if(!KEY3)//如果检测到低电平,说明按键按下 { DelayMs(10);//延时去抖,一般10-20ms if(!KEY3)//再次确认按键是否按下,没有按下则退出 { while(!KEY3);//如果确认按下按键等待按键释放,没有释放则一直等待 { time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0; Ds1302_Write_Time();break;//分加1 LCD_Clear(); } } } if(!KEY4)//如果检测到低电平,说明按键按下 { DelayMs(10);//延时去抖,一般10-20ms if(!KEY4)//再次确认按键是否按下,没有按下则退出 { while(!KEY4);//如果确认按下按键等待按键释放,没有释放则一直等待 { time_buf1[5]--;if(time_buf1[5]==60)time_buf1[5]=0; Ds1302_Write_Time();break;//减1 LCD_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,"nowtimeis"); }}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++; } }}}}/*定时器初始化子程序*/voidInit_Timer0(void){TMOD|=0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值//TL0=0x00;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}/*定时器中断子程序*/voidTimer0_isr(void)interrupt1{staticunsignedintnum,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; }}voidKeyScan1(void){ if(!KEY)//如果检测到低电平,说明按键按下 { DelayMs(10);//延时去抖,一般10-20ms if(!KEY)//再次确认按键是否按下,没有按下则退出 { while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待 { fun++; LCD_Clear(); } } } }基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究基于单片机系统的网络通信研究与应用基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究基于单片机的模糊控制器在工业电阻炉上的应用研究基于双单片机冲床数控系统的研究与开发基于Cygnal单片机的μC/OS-Ⅱ的研究基于单片机的一体化智能差示扫描量热仪系统研究基于TCP/IP协议的单片机与Internet互联的研究与实现变频调速液压电梯单片机控制器的研究基于单片机γ-免疫计数器自动换样功能的研究与实现基于单片机的倒立摆控制系统设计与实现单片机嵌入式以太网防盗报警系统基于51单片机的嵌入式Internet系统的设计与实现单片机监测系统在挤压机上的应用MSP430单片机在智能水表系统上的研究与应用HYPERLINK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论