分享
分销 收藏 举报 申诉 / 18
播放页_导航下方通栏广告

类型单片机设计实验报告简单计算器的设计.doc

  • 上传人:丰****
  • 文档编号:4312857
  • 上传时间:2024-09-05
  • 格式:DOC
  • 页数:18
  • 大小:264.70KB
  • 下载积分:8 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    单片机 设计 实验 报告 简单 计算器
    资源描述:
    目录 1.总体方案选择 2 1.1 实验要求: 2 1.2方案设计 2 2.硬件原理电路图的设计及分析 2 2.1主控模块 2 2.1.1 STC89C52单片机主要特性 3 2.1.2 STC89C52单片机管脚图 4 2.1.3 STC89C52单片机的中断系统 4 2.1.4 STC89C52单片机的定时/计数器 4 2.2矩阵键盘模块设计: 5 2.2.1矩阵键盘原理介绍 5 2.2.2矩阵键盘电路设计 5 2.3 LCD液晶显示器简介 6 2.3.1液晶模块简介 6 2.3.2液晶显示部分与89S52的接口 7 3系统软件设计 9 3.1系统软件流程图 9 3.2系统整体原理图 10 4.系统调试 11 4.1硬件调试 11 4.2软件调试 11 4.3调试结果 12 5. 心得体会 13 1.总体方案选择 1.1 实验要求: 1) 通过小键盘实现数据的输入,并在LED数码管上显示 2) 实现+、-、*、/ 3) 在LED数码管上显示结果 4) 并有清零,退出功能 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)组成。 STC89C52单片机的基本组成框图见图2-1。 图2-1 2.1.1 STC89C52单片机主要特性 1. 一个8 位的微处理器(CPU)。 2. 片内数据存储器RAM(128B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89 系列单片机最多提供1K 的RAM。 3. 片内程序存储器ROM(4KB),用以存放程序、一些原始数据和表格。 4. 四个8 位并行I/O 接口P0~P3,每个口既可以用作输入,也可以用作输出。 5. 两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。 6. 五个中断源的中断控制系统。 7. 一个全双工UART(通用异步接收发送器)的串行I/O 口,用于实现单片机之间或单机与微机之间的串行通信。 8. 片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率为12MHz。 2.1.2 STC89C52单片机管脚图 图2-2 89S52单片机管脚图 1. 时钟电路引脚XTAL1 和XTAL2: 2. 控制信号引脚RST,ALE,PSEN 和EA: 3. 输入/输出端口P0/P1/P2/P3: 2.1.3 STC89C52单片机的中断系统 STC89C52系列单片机的中断系统有5个中断源,2个优先级,可以实现二级中断服务嵌套。由片内特殊功能寄存器中的中断允许寄存器IE控制CPU是否响应中断请求;由中断优先级寄存器IP安排各中断源的优先级;同一优先级内各中断同时提出中断请求时,由内部的查询逻辑确定其响应次序。 2.1.4 STC89C52单片机的定时/计数器 在单片机应用系统中,常常会有定时控制需求,如定时输出、定时检测、定时扫描等;也经常要对外部事件进行计数。89C52单片机内集成有两个可编程的定时/计数器:T0和T1,它们既可以工作于定时模式,也可以工作于外部事件计数模式,此外,T1还可以作为串行口的波特率发生器。 2.2矩阵键盘模块设计: 2.2.1矩阵键盘原理介绍 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。 2.2.2矩阵键盘电路设计 图2-3矩阵键盘硬件连接图 首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。 判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。 2.3 LCD液晶显示器简介 液晶是一种既具有液体的流动性又具有光学特性的有机化合物,它的透明程度和呈现的颜色受外加电场的影响,利用这特点便可做成字符显示器。 液晶显示器(LCD)英文全称为Liquid Crystal Display,它一种是采用了液晶控制透光度技术来实现色彩的显示器。 显示接口用来显示系统的状态,命令或采集的电压数据。本系统显示部分用的是LCD液晶模块,采用一个16×1的字符型液晶显示模块。 2.3.1液晶模块简介 LCD1602液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码, CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可以查看参考文献(30)中的表4. CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿,LCD1602液晶模块的引脚图如图2-4所示。 图2-4 LCD1601引脚图 寄存器选择控制如表2-1。 表2-1寄存器选择控制 RS R/W 操作说明 0 0 写入指令寄存器(清除屏等) 0 1 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 1 0 写入数据寄存器(显示各字型等) 1 1 从数据寄存器读取数据 2.3.2液晶显示部分与89S52的接口 如图2-5所示。用89C51的P2口作为数据线,用P3.2、P3.1、P3.0分别作为LCD的E、R/W、RS。其中E是下降沿触发的片选信号,R/W是读写信号,RS是寄存器选择信号本模块设计要点如下:显示模块初始化:首先清屏,再设置接口数据位为8位,显示行数为1行,字型为5×7点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位。向LCD的显示缓冲区中送字符,程序中采用2个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送到LCD的显示缓冲区,程序延时2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。 图2-5 LCD1602与STC89C52的接口 3系统软件设计 3.1系统软件流程图 图3-1 软件流程图 18 3.2系统整体原理图 4.系统调试 4.1硬件调试 计算器的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。 在本计算器的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题: (1)程序调试初期液晶一直没有正常显示,总在第一行显示黑条。 解决:经调查发现液晶对比度没有调好,旋转液晶调节对比度用的电位器直到液晶显示正常。 (2)开始时程序一直不能往单片机下载。 解决:检查复位电路,时钟电路,以及单片机的供电系统,后来发现晶振没有起振,最终把晶振的起振电容换了就能够下载程序。 4.2软件调试 计算器是多功能的数字型设备,可以根据用户按下的按键记录要计算的数值。并通过单片机内部运算计算出结果并在屏幕上显示。计算器的功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下: 1.每次计算一次数值运算后,屏幕上会残留以前换算的结果,进行下一次运算的时候也没有消除。 解决:经过分析初步确认是液晶在进行下一次运算的时候没有进行清屏,在上一次运算完成后,进行新一次运算的时候单片机对液晶进行处理使其进行清屏处理,最后解决了此问题。 2.当用户按下按键的时候,单片机读取的数值跟设定的数值不对。 解决:重新检查矩阵键盘电路的连接,重新建立一个新的对应关系。 4.3调试结果 经过一系列的问题查找后系统最终能正常工作,并完成所有的功能。 以下为系统仿真图: 图4-1系统仿真图 5. 心得体会 通过这次课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。经过我长时间的设计及调试,本系统基本能实现设定的要求。通过这些我的硬件和软件开发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。我的动手能力得到了很大的提高,创新意识得到了锻炼。 在整个设计过程中,虽然忙碌劳累,但也充实快乐,老师每天都会不厌其烦的陪着我们在机房,有任何问题都会对我们倾囊相授,在这我想向陪伴我们三年的老师说声谢谢,你们辛苦了! 参考文献 [1] 彭伟.单片机C语言程序设计实训100例.电子工业出版社.2009年 [2] 吴运昌.模拟电子线路基础.广州:华南理工大学出版社,2004年 [3] 阎石.数字电子技术基础.北京:高等教育出版社,1997年 [4] 张晓丽等.数据结构与算法.北京:机械工业出版社,2002年 [5] 马忠梅等. ARM&Linux嵌入式系统教程.北京:北京航空航天大学出版社, [6] 李建忠.单片机原理及应用.西安:西安电子科技大学,2002年 [7] 韩志军等.单片机应用系统设计[M].机械工业出版社,2004 [8] 周润景等. Proteus在MCS-51&ARM7系统中的应用百例[M].电子工业出版社, [9] 马忠梅等.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2006 [10] 刘树中,孙书膺,王春平.单片机和液晶显示驱动器串行接口的实现[J].微计算机信息,2007 系统源程序 #include <reg52.h> #include"LCD1602.h" #include"math.h" //端口及函数说明---------------------------------------------------------------------------- #define Key_port P2 //按键 unsigned char key_scan(void); //键盘扫描函数 bit FlagN = 0; //是否有数字按下 ,按下后置1 bit FlagO = 0; //是否有操作符按下,按下后置1 bit FlagD = 0; //是否按下小数点,按下后置1 bit FlagNegX=0; bit FlagNegY=0; double X = 0.0,Y = 0.0,RES = 0.0; //X为第一个操作数 Y为第二个操作数 unsigned char OPER = 0; //操作符号 int Num[16]={0}; //存放结果位 //------------------------------------------------------------------------------- void delay(unsigned int i) { unsigned int x,y; for(x= 0;x<i;x++) for(y = 0;y<110;y++); } while(Num[i]==0)//判断第一个不为0的数 { i++; } k = 4-i; if(i > 3) //RES<1时 { LCDDispChar(2,2,'0'); LCDDispChar(3,2,'.'); for(l=0;l<4;l++) { LCDDispNum(4+l,2,Num[l+4]); } } else { for(j = 0;j<k;j++) //显示所有的整数部分 { LCDDispNum(2+j,2,Num[i++]); } LCDDispChar(2+j,2,'.');j++; for(l=0;l<4;l++) { LCDDispNum(2+j,2,Num[l+4]); j++; } } } //计算部分的函数 //传入参数:x-运算数1,y运算数2,oper运算符号 //返回值:运算结果 void Calculate(void) { switch (OPER) { case 11:RES = (double)X*1.0+Y;break; case 12:RES = (double)X*1.0-Y;break; case 13:RES = (double)X*1.0*Y;break; case 14:RES = (double)X*1.0/Y;break; default:break; } } //主函数 void main() { unsigned char i=0; unsigned int temp = 0; unsigned char location = 0;//当前显示指针位置 FlagN = 0; FlagO = 0; FlagD = 0; FlagNegX=0; FlagNegY=0; LCDInit(); while(FlagO) { LCDCursor(); while(FlagN) //输入X的过程中 没有按下操作符建 按下后跳出 { i = key_scan();OPER = i; //取得操作符 if((i>=0) && (i<10)) { if(FlagD) //当没有按下小数点时 { X=X*10+i; } else //按下小数点后的情况, { //储存值以便显示 Num[temp+4] = i; //更新X值以便计算 if(temp == 0) X = X + (double)i/10; if(temp == 1) X = X + (double)i/100; if(temp == 2) X = X + (double)i/1000; if(temp == 3) X = X + (double)i/10000; if(temp == 4) X = X + (double)i/100000; temp++; } LCDDispNum(location++,1,i); } else if(i == 10) //显示小数点 { LCDDispChar(location++,1,'.'); } else if(i == 12 && X==0) //按下‘-’号 { FlagN=0; FlagNegX=1; LCDDispChar(location++,1,'-'); } }//输入X if(FlagNegX) { X=0-X; } if(i == 11) //显示操作符 LCDDispChar(location++,1,'+'); else if(i == 12) LCDDispChar(location++,1,'-'); else if(i == 13) LCDDispChar(location++,1,'X'); else if (i == 14) LCDDispChar(location++,1,'/'); else LCDDispChar(location++,1,'?'); temp = 0;FlagD = 0; FlagN = 0; FlagO = 0; //所有标志位清零 while(FlagO) //没有按下=时 { i = key_scan(); if((i>=0) && (i<10)) { if(!FlagD) //当没有按下小数点时 { Y=Y*10+i; } else { Num[temp+4] = i; if(temp == 0) Y = Y + (double)i/10; if(temp == 1) Y = Y + (double)i/100; if(temp == 2) Y = Y + (double)i/1000; if(temp == 3) Y = Y + (double)i/10000; if(temp == 4) Y = Y + (double)i/100000; temp++; } LCDDispNum(location++,1,i); } else if(i == 12 && Y==0) //按下‘-’号 { FlagNegY=1; LCDDispChar(location++,1,'('); LCDDispChar(location++,1,'-'); } if(i == 10) //显示小数点 { LCDDispChar(location++,1,'.'); } } if(!FlagNegY) { Y=0-Y; LCDDispChar(location++,1,')'); } if (i == 15) LCDDispChar(location++,1,'='); } LCDNotCursor(); Calculate(); connum(RES); while(1); }
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:单片机设计实验报告简单计算器的设计.doc
    链接地址:https://www.zixin.com.cn/doc/4312857.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork