收藏 分享(赏)

c51的简易计算器(已通过实测)初学者参考.doc

上传人:精品资料 文档编号:8453436 上传时间:2019-06-28 格式:DOC 页数:17 大小:357KB
下载 相关 举报
c51的简易计算器(已通过实测)初学者参考.doc_第1页
第1页 / 共17页
c51的简易计算器(已通过实测)初学者参考.doc_第2页
第2页 / 共17页
c51的简易计算器(已通过实测)初学者参考.doc_第3页
第3页 / 共17页
c51的简易计算器(已通过实测)初学者参考.doc_第4页
第4页 / 共17页
c51的简易计算器(已通过实测)初学者参考.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、1实验报告设 计 课 题 :基于单片机的简易计算器指 导 老 师 : 班 级 : 学 号 : 姓 名 : 一 设计内容和目的2本次实验的任务就是要以 51 系列单片机为核心实现一个简易计算器计算器,它的结构非常简单,外部主要由 4*4 矩阵键盘和一个液晶显示屏构成,内部由一块 AT89C51 单片机构成,通过软件编程可实现简单加减乘除。目的:做自己喜欢的实验,提高自学能力。二 方案论证经分析,计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。具体如下:1) LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合

2、LCD本身的时序图来完善初始化程序。又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.2) 4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用3 种方法读取键值。一种是中断式,外两种是扫描法和反转法。中断式:在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个案件被按下。本实验采用中断式实现用户键盘接口。扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。若列值中有一位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。反转法:先将所有行扫描线输出低电平,读列值。若列值有一位是低,则

3、表明有键按下,读列值;然后所有列扫描线输出低电平,再读行值。根据读到的值组合就可以查表1 得到的键码。这个就仁者见仁智者见智了,不过如果熟悉了扫描式,建议果断升级自己的硬件(很简单加个74LS08与门),故采用节省CPU的中断式扫描电路。) 单片机微控制电路微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。3三 硬件电路的设计21 硬件设计电路框图51 系列单片机系统4*4 键盘LCD 显示晶振电路复位电路线路原理框图22 硬件设计电路的元件清单器件名称 数量AT89C51 1按键 1774LS08 110K 电阻 9电容 22uF 1LCD1602 1晶

4、振 12MHz 1电容 30pF 25K 电位器 123 硬件设计电路图4将 4*4 的键盘直接接在 P1 口上,用 P0 口作为 LCD 的显示输出,P3.2 口的 INT0 作为外部中断位。XTAL218XTAL119ALE301PSN29RST9P0./AD039.1/18P0.2/AD237.3/36P0.4/AD435.5/54P0.6/AD63.7/72P2.7/A1528P2.0/A821.1/9P2./A023.3/14P2.4/A225.5/136.6/47P1.01.2P1.23.34P1.45.56P1.67.78P3.0/RXD10.1/TP3.2/IN012./IT1

5、3P3.4/014P3.7/RD17.6/W6.5/T15U180C51X1CRYSTALC12pC22pC32pR11k+5VD71463D5124D31029D1807E6RW5S4VS1D2VE3LCD1LM016LRV1k+5V+5V 234567891RP1RESPACK-8+5V123U2:A74LS08 456U2:B74LS089108U2:C74LS082 4 硬件设计的补充说明四 软件设计程序及描述5本程序组成可分为 3 个模块:矩阵键盘模块,LCD 显示模块,和运算模块(源程序见底页)6开始初始化参数初始化 LCD 显示有键输入? 读取键码LCD 显示数字键 清零键 功能

6、键状态清零输入数值数值送显示缓冲YN等待数值输入结果送显示缓冲根据上次功能键和输入的数据计算结果本次功能键?等待数值输入结果送显示缓冲等待数值输入结果送显示缓冲7五 硬软件的调试及方法我个人遇到的主要问题出现在 LCD1602 上,要不是我自己买了块新的 LCD 恐怕我的结论,就只能在软件仿真实现了。硬件上:在不加芯片调试时,LCD1602 只显示一排全黑,一般说明该元件是好的。 (但也不一定,我那时就一直认为我的元件没坏) ;给 15,16 管脚分别接上+5v 和 0v,测试背光是否完好;给 VEE 接上电位器,检查对比度是否可调;一般 LCD 易出现的现象,我再做实验的时候遇到过以下几种情

7、况:状态 1 上电之后,1602 的第一行全黑,即 16 个 5x7 黑块产生原因:液晶根本就没有进行初始化操作,需要检查连线或者程序。运气不好的情况下就是整块 LCD 是坏的。状态 2 屏上显示两排灰格 产生原因:程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,建议按照标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)-补充:也有可能是对比度太大,建议优先调整对比度电阻 状态 3 显示乱码 这是我在实验室组合版上做的,原因是接线问题状态 3 正确显示 8六 实验结果与性能达标我的计算器只能准确进行得数为 09 的四则运算。1.加法计算D71463D5124D31029D

8、1807E6RW5S4VS1D2VE3LCD1LM016L2.减法计算D71463D5124D31029D1807E6RW5S4VS1D2VE3LCD1LM016L3.乘法计算D714613D51241D31029D1807E6RW5S4VS1D2VE3LCD1LM016L4.除法计算D714613D51241D31029D1807E6RW5S4VS1D2VE3LCD1LM016L5.字符显示A0A76A54A321D714613D51241D31029D1807E6RW5S4 VS1D2VE3LCD2LM016L实物与仿真不一致。这就是传说中的 BUG 了。我不明白。9七 实验改进与心得体会

9、很明显我的计算器处理数据及显示存在太大的局限性,我觉得主要还是我对程序中的运算模块理解不深,这点仍需大大加强。这个实验给我的感觉,硬件和软件上都不是很难。我的焊工也不马虎,即使难看了点,但只要软件能行,就能完美运行。可惜,我就败在 LCD1602,从学校拿了两块,幸好最后实在没办法,自己买了一块。最终证实我之前的实验就是 LCD 的损坏。没知识真可怕,我不懂真正排查 LCD 的好坏。不过也因祸得福,我在磕磕碰碰中,固执的认为 LCD 是好的,反而使我对 LCD 初始化,LCD 字符显示, 3 种不同的矩阵键盘扫描的方法,及软件上的巧妙技巧有了更好的了解。我在这次实验上,感觉收获的更多. 下面是

10、源代码:#include#define CLEARSCREEN LCD_write_command(0x01) 10#define uint unsigned int #define uchar unsigned char/*定义接口*/ #define LCDIO P0#define KEYBOARD P1/保留sbit LCD1602_RS=P20; sbit LCD1602_RW=P21; sbit LCD1602_EN=P22; /*/code uchar mayuan16=0,1,2,3,4,5,6,7,8,9,0,/,*,-,+,=;/不错,这个比较明了unsigned char

11、code keycode=0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88;/键盘编码值()int i,j,k=1,s;/int t,t1,t2,a;/void delay(uchar);/延时/*定义函数*/void LCD_init(void);/初始化函数void delay_nms(unsigned int n);/延时函数void LCD_write_command(unsigned char command);/写入指令函数void LCD_write_dat(unsign

12、ed char dat);/写入数据函数void delay_10ms();initial();uchar keyscan();/键盘扫描函数calc(uchar);/计算函数uchar num,temp,key,keynum;void main()/主函数LCD_init();delay_nms(100);while(1)initial();/有中断KEYBOARD =0xf0;/键盘的列值全置高电平/*开中断*/initial()EA=1;/总开关EX0=1;/中断方式 0 开启11IT0=0;/*/*中断函数*/void inter0() interrupt 0unsigned char

13、 n;delay_10ms();/延时if(INT0=0)/没键按下EX0=0;/关中断n=keyscan();calc(n);EX0=1;/开中断KEYBOARD=0xf0;/键盘的列值全置高电平/*/calc(uchar n)if(n9)while(t9)s=t%10;t=t/10;ak=s;k+;if(t=1;i-)LCD_write_command(0x00);LCD_write_dat(ai+48);/*键盘扫描函数*/uchar keyscan()/键盘扫描KEYBOARD=0xf0;/键盘的列值全置高电平delay_10ms();/延时if(KEYBOARD!=0xf0)/有键按

14、下13temp=KEYBOARD;/保存键盘此刻的键植delay_10ms();/延时if(KEYBOARD=temp)/再次确认键盘是否被按下uchar i;KEYBOARD=0x0f;/键盘的行值全置高电平delay_10ms();/10MS 时间延时keynum=temp | KEYBOARD;/保存键盘的行值while(KEYBOARD!=0x0f);/松手检测for(i=0;i0;i-)for (j=0;junsigned char table1=0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,0x18,0x1E,0x1f,0x1f,0x1f,0x1f

15、,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;/心图案15unsigned char table=0x10,0x06,0x09,0x08,0x0

16、8,0x09,0x06,0x00;/字符 #define CLEARSCREEN LCD_write_command(0x01) /*定义接口*/ #define LCDIO P0sbit LCD1602_RS=P20; sbit LCD1602_RW=P21; sbit LCD1602_EN=P22; /*定义函数*/void LCD_write_command(unsigned char command);/写入指令函数void LCD_write_dat(unsigned char dat);/写入数据函数void LCD_set_xy( unsigned char x, unsigne

17、d char y );/设置显示位置函数void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);/显示一个字符函数void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);/显示字符串函数void LCD_init(void);/初始化函数void delay_nms(unsigned int n);/延时函数/*/ /*初始化函数*/void LCD_init(void)CLEARSCREEN;/clear screenLCD_write

18、_command(0x38);/set 8 bit data transmission modeLCD_write_command(0x0c);/open display (enable lcd display)LCD_write_command(0x80);/set lcd first display addressCLEARSCREEN;/clear screen/*/ /*写指令函数*/ void LCD_write_command(unsigned char command)LCDIO=command;LCD1602_RS=0; LCD1602_RW=0;LCD1602_EN=0;LC

19、D1602_EN=1;delay_nms(10);/*/*写数据函数 */void LCD_write_dat(unsigned char dat)LCDIO=dat;LCD1602_RS=1;16LCD1602_RW=0;LCD1602_EN=0;delay_nms(1);LCD1602_EN=1;/*/ /*设置显示位置*/void LCD_set_xy( unsigned char x, unsigned char y )unsigned char address;if (y = 1)address = 0x80 + x;elseaddress =0xc0+ x;LCD_write_co

20、mmand(address);/*/ /*显示一个字符 */void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)LCD_set_xy( x, y );LCD_write_dat(dat);/*/ /*显示字符串函数*/void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s)LCD_set_xy( X, Y );while (*s) LCD_write_dat(*s); s +;/*/ /* 延时*/void delay_nms(unsig

21、ned int n) unsigned int i=0,j=0;for (i=n;i0;i-)for (j=0;j10;j+); /*/ /*主函数*/17void main(void)unsigned char i,j,k,tmp;LCD_init();delay_nms(100);tmp=0x40;/设置 CGRAM 地址的格式字k=0;for(j=0;j8;j+)for(i=0;i8;i+)LCD_write_command(tmp+i); / 设置自定义字符的 CGRAM 地址 delay_nms(2);LCD_write_dat(table1k); / 向 CGRAM 写入自定义字符

22、表的数据k+;delay_nms(2);tmp=tmp+8;LCD_dsp_string(1,1,“LCD TEST “);/在第一行第一列显示“LCD TEST“LCD_dsp_string(1,2,“SUCCESSFUL “);/在第二行第一列显示“SUCCESSFUL“for (i=0;i4;i+)LCD_dsp_char( 12+i,1,i);/在第一行第 12 列位置显示心图案的上半部delay_nms(1);for (i=4;i8;i+)LCD_dsp_char( 12+i-4,2,i);/在第二行第 12 列位置显示心图案的下半部delay_nms(1);while (1);/*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报