0课程论文题目:计算器学生姓名:任磊学生学号:1008030227系别:电气信息工程学院专业:电子信息工程年级:10级任课教师:张水锋电气信息工程学院制2012年12月成绩1目录摘要…………………………………………………………………………2课程任务与要求……………………………………………………………2方案论证……………………………………………………………………2计算器工作流程图…………………………………………………………4单元电路:…………………………………………………………………5单片机芯片…………………………………………………………………5Lcd602………………………………………………………………………6矩阵盘………………………………………………………………………8晶振电路……………………………………………………………………8复位电路……………………………………………………………………9与门电路……………………………………………………………………9总图:………………………………………………………………………10心得体会……………………………………………………………………10参考文献……………………………………………………………………11附录…………………………………………………………………………112计算器的设计学生:任磊指导教师:张水锋电气信息工程学院电子信息工程摘要通过学习《基于Proteus的51系列单片机设计与仿真》之后,知道了Proteus能够对51系列的单片机控制的系统进行方正处理。本次设计是结合大学学习的单片机课程与Proteus课程进行电子产品的设计。通过设计更好的理解计算器的工作原理,了解单片机的用法与开发,熟练掌握Proteus软件的使用。关键字:单片机Proteus一课程任务与要求本次课程的任务就是要以51系列单片机为核心实现一个简易的计算器,它的结构非常简单,外部主要由4*4矩阵键盘,复位电路和一个液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。要求:通过Proteus软件来实现设计的仿真,提高自己的编程水平,增加设计兴趣。通过做自己喜欢的设计,提高自学能力。为以后毕业走上工作岗位打下坚实的基础。二方案论证经分析,计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机电路。具体如下:2.1数码管显示电路数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。功耗小,显示单一。2.2LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD。32.34*4键盘扫描电路(中断式,扫描式,反转式)扫描电路常采用3种方法读取键值。一种是中断式,外两种是扫描法和反转法。中断式:在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个按件被按下。扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。若列值中有一位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。反转法:先将所有行扫描线输出低电平,读列值。若列值有一位是低,则表明有键按下,读列值;然后所有列扫描线输出低电平,再读行值。根据读到的值组合就可以查出按下的按键。综合以上所述采用中断式更加快捷方便,易于操作,适合我这样的新手完成。2.4单片机微控制电路微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。三计算器工作流程图0图3.1NY本次功能键?状态清零清零键读取键码有键输入?初始化参数初始化LCD显示开始输入数值数字键功能键计算结果等待符号输入结果送显示缓冲等待数值输入结果送显示缓冲结果送显示缓冲LCD显示1四单元电路:4.1单片机控制芯片图4.1AT89C516RD+:该电路的核心控制元件是AT89C516RD+。工作电压在3.3-5.5v之间。最高时钟频率0-80hz,存储器字节64k。P0口(32-39引脚)。既可作为输入输出端口,又可作为地址数据复用总线使用。当P0口作为输入输出口时,他是一个八位准双向口。上电复位后处于开漏模式,P0口内部无上拉电阻所以P0口必须接10-4.7k上拉电阻,当作为地址/数据复用总线时。无需上拉电阻。EA(31脚)正五伏电源外接晶振或外部振荡器引脚:XTAL1(19脚)当采用芯片内部时钟信号时,接外部时接外部12M晶振的一个引脚。当采用外部时钟信号时,此脚应接地。XTAL2(18脚)当采用芯片内部时钟信号时,接外部时接外部12M晶振的一个引脚。当采用外部时钟信号时,此脚应接地。控制选通或电源复用引脚:2RST(9脚):复位信号输入,vcc掉电时此脚可接上备用电源,在低功耗条件下保持内部RAM中数据ALE(30脚):ALE即允许地址锁存信号输出,当单片机访问外部存储器时该引脚的输出信号用于锁存P0口的低8位地址。其输出的频率为时钟振荡频率的1/6,。PSEN(29脚):访问外部程序存储器选通信号,低电平有效,用于外部存储器的读操作。4.2LCD1602显示电路图4.23LCD1602主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm4引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说符号引脚说明编号符号引脚3明如表编号说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。D0-d7口接STC89C516RD+P0-P7进行数据传输。1、3口分别接Vcc和Vdd。4-6口分别接单片机rsrwe口。44.3矩阵盘电路图4.3每个按键有他的行值和列值,当按下按键后根据电平高低的变换,检测出是哪个按键,跟据按键在程序中的所赋予的含义进行加减乘除,完成操作。4.4晶振电路图4.4每个单片机系统里都有晶振,全程是叫晶体震荡器,在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。是单片机最小系统的重要组成部分。54.5复位电路图4.5这个子模块是单片机的最小系统中的一部分,当程序出现乱码等情况时,按下复位程序重新开始运行,使计算继续进行。4.6与门电路图4.6这个模块是本次设计的亮点利用三个与门矩阵盘的四列引线转换成一条与单片机相连极大的提高了单片机端口的利用率,为以后为计算机附加更多新的功能提供了有利条件。五总图:6图5.1七实验改进与心得体会很明显我的计算器处理数据及显示存在太大的局限性,我觉得主要还是我对程序中的运算模块理解不深,这点仍需大大加强。这个实验给我的感觉,硬件的处理比软件的设计要难很多。只要有一点不细心就会有产生错误,只要软件能行,仿真的硬件就能完美运行。可惜,我就败在LCD1602,刚开始怎么都调不好最后实在没办法,自己又重新查了资料。最终证实我之前的实验就是LCD的资料有错误。没知识真可怕!我在磕磕碰碰中,固执的认为LCD资料是正确的,经过改正反而使我对LCD初始化,LCD字符显示,3种不同的矩阵键盘扫描的方法,及软件上的巧妙技巧有了更好的了解。我在这次实验上,感觉收获了很多.更增加了我对单片机设计的兴趣,为以后设计具有更多功能的计算器打下了坚实的基础。了解了自己还有很多东西要学。增强自己的动手能力。参考文献【1】谭浩强著《C语言程序设计》第三版【2】康光华陈大钦张琳主编《电子技术基础模拟部分》第五版【3】康光华陈大钦张琳主编《电子技术基础数字部分》第五版【4】周荣富曾技主编《电子线路CAD》【5】《单片机原理与接口技术》清华版7【6】《零基础学单片机C语言》【7】《黑色MSC51》【8】《物联网技术与应用》【9】《基于Protues的51系列单片机设计与仿真》陈忠平附录:#includereg51.h#defineCLEARSCREENLCD_write_command(0x01)#defineuintunsignedint#defineucharunsignedchar/**************定义接口************************/#defineLCDIOP0#defineKEYBOARDP1//保留sbitLCD1602_RS=P2^0;sbitLCD1602_RW=P2^1;sbitLCD1602_EN=P2^2;/************************************************/codeucharmayuan[16]={'0','1','2','3','4','5','6','7','8','9','0','/','*','-','+','='};//不错,这个比较明了unsignedcharcodekeycode[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};//键盘编码值()inti,j,k=1,s;//8intt,t1,t2,a[];//voiddelay(uchar);//延时/**************定义函数************************/voidLCD_init(void);//初始化函数voiddelay_nms(unsignedintn);//延时函数voidLCD_write_command(unsignedcharcommand);//写入指令函数voidLCD_write_dat(unsignedchardat);//写入数据函数voiddelay_10ms();initial();ucharkeyscan();//键盘扫描函数calc(uchar);//计算函数ucharnum,temp,key,keynum;voidmain()//主函数{LCD_init();delay_nms(100);while(1){initial();//有中断KEYBOARD=0xf0;//键盘的列值全置高电平}}9/**********************************开中断***************************************/initial(){EA=1;//总开关EX0=1;//中断方式0开启IT0=0;}/*******************************************************************************//*********************************中断函数*****