c51的简易计算器(已通过实测)初学者参考_第1页
c51的简易计算器(已通过实测)初学者参考_第2页
c51的简易计算器(已通过实测)初学者参考_第3页
c51的简易计算器(已通过实测)初学者参考_第4页
c51的简易计算器(已通过实测)初学者参考_第5页
已阅读5页,还剩12页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1实验报告设计课题基于单片机的简易计算器指导老师班级学号姓名一设计内容和目的2本次实验的任务就是要以51系列单片机为核心实现一个简易计算器计算器,它的结构非常简单,外部主要由44矩阵键盘和一个液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。目的做自己喜欢的实验,提高自学能力。二方案论证经分析,计算器电路包括三个部分显示电路、44键扫描电路、单片机微控制电路。具体如下1)LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD2)44键盘扫描电路中断式,扫描式,反转式用户设计行列键盘接口,一般常采用3种方法读取键值。一种是中断式,外两种是扫描法和反转法。中断式在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个案件被按下。本实验采用中断式实现用户键盘接口。扫描法对键盘上的某一行送低电平,其他行为高电平,然后读取列值。若列值中有一位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。反转法先将所有行扫描线输出低电平,读列值。若列值有一位是低,则表明有键按下,读列值;然后所有列扫描线输出低电平,再读行值。根据读到的值组合就可以查表1得到的键码。这个就仁者见仁智者见智了,不过如果熟悉了扫描式,建议果断升级自己的硬件(很简单加个74LS08与门),故采用节省CPU的中断式扫描电路。)单片机微控制电路微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。3三硬件电路的设计21硬件设计电路框图51系列单片机系统44键盘LCD显示晶振电路复位电路线路原理框图22硬件设计电路的元件清单器件名称数量AT89C511按键1774LS08110K电阻9电容22UF1LCD16021晶振12MHZ1电容30PF25K电位器123硬件设计电路图4将44的键盘直接接在P1口上,用P0口作为LCD的显示输出,P32口的INT0作为外部中断位。XTAL218XTAL119ALE301PSN29RST9P0/AD0391/18P02/AD2373/36P04/AD4355/54P06/AD637/72P27/A1528P20/A8211/9P2/A0233/14P24/A2255/1366/47P1012P12334P14556P16778P30/RXD101/TP32/IN012/IT13P34/014P37/RD176/W65/T15U180C51X1CRYSTALC12PC22PC32PR11K5VD71463D5124D31029D1807E6RW5S4VS1D2VE3LCD1LM016LRV1K5V5V234567891RP1RESPACK85V123U2A74LS08456U2B74LS089108U2C74LS0824硬件设计的补充说明四软件设计程序及描述5本程序组成可分为3个模块矩阵键盘模块,LCD显示模块,和运算模块(源程序见底页)6开始初始化参数初始化LCD显示有键输入读取键码LCD显示数字键清零键功能键状态清零输入数值数值送显示缓冲YN等待数值输入结果送显示缓冲根据上次功能键和输入的数据计算结果本次功能键等待数值输入结果送显示缓冲等待数值输入结果送显示缓冲7五硬软件的调试及方法我个人遇到的主要问题出现在LCD1602上,要不是我自己买了块新的LCD恐怕我的结论,就只能在软件仿真实现了。硬件上在不加芯片调试时,LCD1602只显示一排全黑,一般说明该元件是好的。(但也不一定,我那时就一直认为我的元件没坏);给15,16管脚分别接上5V和0V,测试背光是否完好;给VEE接上电位器,检查对比度是否可调;一般LCD易出现的现象,我再做实验的时候遇到过以下几种情况状态1上电之后,1602的第一行全黑,即16个5X7黑块产生原因液晶根本就没有进行初始化操作,需要检查连线或者程序。运气不好的情况下就是整块LCD是坏的。状态2屏上显示两排灰格产生原因程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,建议按照标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)补充也有可能是对比度太大,建议优先调整对比度电阻状态3显示乱码这是我在实验室组合版上做的,原因是接线问题状态3正确显示8六实验结果与性能达标我的计算器只能准确进行得数为09的四则运算。1加法计算D71463D5124D31029D1807E6RW5S4VS1D2VE3LCD1LM016L2减法计算D71463D5124D31029D1807E6RW5S4VS1D2VE3LCD1LM016L3乘法计算D714613D51241D31029D1807E6RW5S4VS1D2VE3LCD1LM016L4除法计算D714613D51241D31029D1807E6RW5S4VS1D2VE3LCD1LM016L5字符显示A0A76A54A321D714613D51241D31029D1807E6RW5S4VS1D2VE3LCD2LM016L实物与仿真不一致。这就是传说中的BUG了。我不明白。9七实验改进与心得体会很明显我的计算器处理数据及显示存在太大的局限性,我觉得主要还是我对程序中的运算模块理解不深,这点仍需大大加强。这个实验给我的感觉,硬件和软件上都不是很难。我的焊工也不马虎,即使难看了点,但只要软件能行,就能完美运行。可惜,我就败在LCD1602,从学校拿了两块,幸好最后实在没办法,自己买了一块。最终证实我之前的实验就是LCD的损坏。没知识真可怕,我不懂真正排查LCD的好坏。不过也因祸得福,我在磕磕碰碰中,固执的认为LCD是好的,反而使我对LCD初始化,LCD字符显示,3种不同的矩阵键盘扫描的方法,及软件上的巧妙技巧有了更好的了解。我在这次实验上,感觉收获的更多下面是源代码INCLUDEDEFINECLEARSCREENLCD_WRITE_COMMAND0X0110DEFINEUINTUNSIGNEDINTDEFINEUCHARUNSIGNEDCHAR/定义接口/DEFINELCDIOP0DEFINEKEYBOARDP1/保留SBITLCD1602_RSP20SBITLCD1602_RWP21SBITLCD1602_ENP22/CODEUCHARMAYUAN160,1,2,3,4,5,6,7,8,9,0,/,/不错,这个比较明了UNSIGNEDCHARCODEKEYCODE0X11,0X21,0X41,0X81,0X12,0X22,0X42,0X82,0X14,0X24,0X44,0X84,0X18,0X28,0X48,0X88/键盘编码值INTI,J,K1,S/INTT,T1,T2,A/VOIDDELAYUCHAR/延时/定义函数/VOIDLCD_INITVOID/初始化函数VOIDDELAY_NMSUNSIGNEDINTN/延时函数VOIDLCD_WRITE_COMMANDUNSIGNEDCHARCOMMAND/写入指令函数VOIDLCD_WRITE_DATUNSIGNEDCHARDAT/写入数据函数VOIDDELAY_10MSINITIALUCHARKEYSCAN/键盘扫描函数CALCUCHAR/计算函数UCHARNUM,TEMP,KEY,KEYNUMVOIDMAIN/主函数LCD_INITDELAY_NMS100WHILE1INITIAL/有中断KEYBOARD0XF0/键盘的列值全置高电平/开中断/INITIALEA1/总开关EX01/中断方式0开启11IT00/中断函数/VOIDINTER0INTERRUPT0UNSIGNEDCHARNDELAY_10MS/延时IFINT00/没键按下EX00/关中断NKEYSCANCALCNEX01/开中断KEYBOARD0XF0/键盘的列值全置高电平/CALCUCHARNIFN9WHILET9ST10TT/10AKSKIFT1ILCD_WRITE_COMMAND0X00LCD_WRITE_DATAI48/键盘扫描函数/UCHARKEYSCAN/键盘扫描KEYBOARD0XF0/键盘的列值全置高电平DELAY_10MS/延时IFKEYBOARD0XF0/有键按下13TEMPKEYBOARD/保存键盘此刻的键植DELAY_10MS/延时IFKEYBOARDTEMP/再次确认键盘是否被按下UCHARIKEYBOARD0X0F/键盘的行值全置高电平DELAY_10MS/10MS时间延时KEYNUMTEMP|KEYBOARD/保存键盘的行值WHILEKEYBOARD0X0F/松手检测FORI0I0IFORJ0JUNSIGNEDCHARTABLE10X03,0X07,0X0F,0X1F,0X1F,0X1F,0X1F,0X1F,0X18,0X1E,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X07,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X10,0X18,0X1C,0X1E,0X1E,0X1E,0X1E,0X1E,0X0F,0X07,0X03,0X01,0X00,0X00,0X00,0X00,0X1F,0X1F,0X1F,0X1F,0X1F,0X0F,0X07,0X01,0X1F,0X1F,0X1F,0X1F,0X1F,0X1C,0X18,0X00,0X1C,0X18,0X10,0X00,0X00,0X00,0X00,0X00/心图案15UNSIGNEDCHARTABLE0X10,0X06,0X09,0X08,0X08,0X09,0X06,0X00/字符DEFINECLEARSCREENLCD_WRITE_COMMAND0X01/定义接口/DEFINELCDIOP0SBITLCD1602_RSP20SBITLCD1602_RWP21SBITLCD1602_ENP22/定义函数/VOIDLCD_WRITE_COMMANDUNSIGNEDCHARCOMMAND/写入指令函数VOIDLCD_WRITE_DATUNSIGNEDCHARDAT/写入数据函数VOIDLCD_SET_XYUNSIGNEDCHARX,UNSIGNEDCHARY/设置显示位置函数VOIDLCD_DSP_CHARUNSIGNEDX,UNSIGNEDCHARY,UNSIGNEDCHARDAT/显示一个字符函数VOIDLCD_DSP_STRINGUNSIGNEDCHARX,UNSIGNEDCHARY,UNSIGNEDCHARS/显示字符串函数VOIDLCD_INITVOID/初始化函数VOIDDELAY_NMSUNSIGNEDINTN/延时函数/初始化函数/VOIDLCD_INITVOIDCLEARSCREEN/CLEARSCREENLCD_WRITE_COMMAND0X38/SET8BITDATATRANSMISSIONMODELCD_WRITE_COMMAND0X0C/OPENDISPLAYENABLELCDDISPLAYLCD_WRITE_COMMAND0X80/SETLCDFIRSTDISPLAYADDRESSCLEARSCREEN/CLEARSCREEN/写指令函数/VOIDLCD_WRITE_COMMANDUNSIGNEDCHARCOMMANDLCDIOCOMMANDLCD1602_RS0LCD1602_RW0LCD1602_EN0LCD1602_EN1DELAY_NMS10/写数据函数/VOIDLCD_WRITE_DATUNSIGNEDCHARDATLCDIODATLCD1602_RS116LCD1602_RW0LCD1602_EN0DELAY_NMS1LCD1602_EN1/设置显示位置/VOIDLCD_SET_XYUNSIGNEDCHARX,UNSIGNEDCHARYUNSIGNEDCHARADDRESSIFY1ADDRESS0X80XELSEADDRESS0XC0XLCD_WRITE_COMMANDADDRESS/显示一个字符/VOIDLCD_DSP_CHARUNSIGNEDX,UNSIGNEDCHARY,UNSIGNEDCHARDATLCD_SET_XYX,YLCD_WRITE_DATDAT/显示字符串函数/VOIDLCD_DSP_STRINGUNSIGNEDCHARX,UNSIGNEDCHARY,UNSIGNEDCHARSLCD_SET_XYX,YWHILESLCD_WRITE_DATSS/延时/VOIDDELAY_NMSUNSIGNEDINTNUNSIGNEDINTI0,J0FORINI0IFORJ0J10J/主函数/17VOIDMAINVOIDUNSIGNEDCHARI,J,K,TMPLCD_INITDELAY_NMS100TMP0X40/设置CGRAM地址的格式字K0FORJ0J8JFORI0I8ILCD_WRITE_COMMANDTMPI/设置自定义字符的CGRAM地址

温馨提示

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

评论

0/150

提交评论