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

上传人:痛*** 文档编号:98103239 上传时间:2022-05-28 格式:DOC 页数:18 大小:727KB
收藏 版权申诉 举报 下载
c51的简易计算器已通过实测初学者参考_第1页
第1页 / 共18页
c51的简易计算器已通过实测初学者参考_第2页
第2页 / 共18页
c51的简易计算器已通过实测初学者参考_第3页
第3页 / 共18页
资源描述:

《c51的简易计算器已通过实测初学者参考》由会员分享,可在线阅读,更多相关《c51的简易计算器已通过实测初学者参考(18页珍藏版)》请在装配图网上搜索。

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

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

3、有一位是低,则表 明有键按下, 读列值;然后所有列扫描线输出低电平,再读行值。根据读到的值组合就可 以查表 1 得到的 键码。这个就仁者见仁智者见智了,不过如果熟悉了扫描式,建议果断升级自己的硬件(很简单加个74LS08与门),故采用节省 CPU勺中断式扫描电路。3. )单片机微控制电路微控制电路就是以AT89C5伪核心的控制核心,主要注意晶振电路的接法和复位电路的接法。二硬件电路的设计2. 1硬件设计电路框图线路原理框图2. 2硬件设计电路的元件清单器件名称数量AT89C511按键1774LS08110K电阻9电容22uF1LCD16021晶振12MHz1电容30pF25K电位器12. 3硬

4、件设计电路图将4*4的键盘直接接在P1 口上,用P0 口作为LCD的显示输出,P3.2 口的INTO作为外部中断位。LCD1_ C2 I C122pX1+5VTHCRYSTAL22pi|R1U1V5XTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6RSTP0.7/AD7P2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/INTU-P1.3P3.3/INT1P1

5、 4P3 4/T0P1.5P3.5/T1P1 6P3 6/WP1.7P3.7/RD1918929303134567880C51LM016LRP139235621222324nU2:BU2:10131416U2:C1511V274LS0874LS084#2. 4硬件设计的补充说明#LCD显示模块,四 软件设计程序及描述 本程序组成可分为 3 个模块:矩阵键盘模块, 和运算模块(源程序见底页)5五硬软件的调试及方法我个人遇到的主要问题出现在LCD1602上,要不是我自己买了块新的LCD恐怕我的结论,就只能在软件仿真实现了。硬件上:在不加芯片调试时, LCD1602只显示一排全黑,一般说明该元件是好

6、的。(但也不一定,我那时就一直认为我的元件没坏);给15, 16管脚分别接上+5v和Ov,测试背光是否完好;给 VEE接上电位器,检查对比度是否可调;一般LCD易出现的现象,我再做实验的时候遇到过以下几种情况:状态1上电之后,1602的第一行全黑,即16个5x7黑块产生原因:液晶根本就没有进行初始化操作,需要检查连线或者程序。运气不好的情况下就是整块LCD是坏的。状态2屏上显示两排灰格产生原因:程序中对液晶初始化不正常, 应是部分初始化指令没有正常接收, 建议按照 标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)-补充:也有可能是对比度太大,建议优先调整对比度电阻状态3 显示乱码

7、这是我在实验室组合版上做的,原因是接线问题 状态3正确显示六实验结果与性能达标我的计算器只能准确进行得数为 09的四则运算1.加法计算LCD1L M016L5*4=VV sWe DDDDDDDD1 2 3. 5 6旷911234LM016LSDE S w0 1 2 3 4 5 6 7V V V R R E DDDDDDDD十计7卅弁则LCD12.减法计算9#3.乘法计算LCD1L M 016LEtvDDVssv计【jRWe DDDDDDDD4.除法计算LCD1LM016L999/333=3S D ES D ES w0 1 2 3 4 5 6 7V V VR R E DDDDDDDD5.字符显示

8、LCD2L M016LLCD TESTnib实物与仿真不一致。这就是传说中的DDDDDDDD1 3 2 1 0 9 8 7;|BUG 了。我不明白。DDVEmSRMrE#七 实验改进与心得体会很明显我的计算器处理数据及显示存在太大的局限性,我觉得主要还是我对程 序中的运算模块理解不深,这点仍需大大加强。这个实验给我的感觉,硬件和软件上都不是很难。我的焊工也不马虎,即使难看了点,但只要软件能行,就能完美运行。可惜,我就败在LCD1602从学校拿了两块,幸好最后实在没办法,自己买了一块。最终证实我之前的实验就是LCD的损坏。没知识真可怕,我不懂真正排查 LCD 的好坏。不过也因祸得福,我在磕磕碰碰

9、中,固执的 认为LCD是好的,反而使我对 LCD初始化,LCD字符显示,3种不同的矩阵键盘扫描的 方法,及软件上的巧妙技巧有了更好的了解。我在这次实验上,感觉收获的更多.下面是源代码:#include#define CLEARSCREEN LCD_write_command(0x01)10#define uint unsigned int #define uchar unsigned char*定义接口 *11#define LCDIO P0#define KEYBOARD P1/ 保留sbit LCD1602_RS=P2P;sbit LCD1602_RW=P2A1;sbit LCD1602_

10、EN=P2A2;*code uchar mayuan16=0,1,2,3,4,5,6,7,8,9,0,/,*,-,+,=;/ 不错,这 个比较明了unsigned char 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(unsi

11、gned int n);/ 延时函数void LCD_write_command(unsigned char command);/ 写入指令函数void LCD_write_dat(unsigned 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;/键盘

12、的列值全置高电平 *开中#*initial()EA=1;/总开关EX0=1;中断方式0开启IT0=0;/*中断函数12*void inter0() interrupt 0 unsigned char n; delay_10ms();/ 延时 if(INT0=0)/ 没键按下 EXO=O;关中断n=keyscan(); calc(n);EX0=1;开中断KEYBOARD=OxfO;/键盘的列值全置高电平 /* */calc(uchar n)if(n10)/ 键值小于 10t1=t1*10+n;LCD_write_command(0x00);/ 写命令语句LCD_write_dat(mayuann

13、);/ 写数据函数elseif(n=10)LCD_init();t1=0;t2=0,t=0;k=1; elseif(n15)t2=t1;t1=0;j=n;LCD_write_command(0x00);LCD_write_dat(mayuann); elseLCD_write_command(0x00);LCD_write_dat(mayuann);switch(j)case 11:t=t2/t1;break;case 12:t=t2*t1;break;case 13:t=t2-t1; break; case 14:t=t2+t1;break;if(t9) while(t9)s=t%10;t=

14、t/10;ak=s;k+;if(t=1;i-) LCD_write_command(0x00);LCD_write_dat(ai+48);*键盘扫描函数*/uchar keyscan()/ 键盘扫描KEYBOARD=OxfO;/键盘的列值全置高电平delay_10ms();/ 延时if(KEYBOARD!=OxfO)有键按下temp=KEYBOARD;保存键盘此刻的键植delay_10ms();/ 延时if(KEYBOARD=temp)再次确认键盘是否被按下uchar i;KEYBOARD=OxOf;/键盘的行值全置高电平 delay_10ms();/10MS 时间延时 key num=tem

15、p | KEYBOARD;/ 保存键盘的行值 while(KEYBOARD!=OxOf); 松手检测 for(i=0;i0;i-)for (j=0;j10;j+);void delay_10ms()/10MS 延时 unsigned char i,j;for(i=0;i10;i+) for(j=0;j120;j+);/*写指令函数 *void LCD_write_command(unsigned char command) LCDIO=command;LCD1602_RS=0; LCD1602_RW=0;LCD1602_EN=0;LCD1602_EN=1; delay_nms(10);/*写数

16、据函数 *15#void LCD_write_dat(unsigned char dat)LCDIO=dat;LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;delay_nms(1);LCD1602_EN=1;/*初始化函数 *#void LCD_init(void)CLEARSCREEN;/clear screenLCD_write_command(0x38);/set 8 bit data transmission mode LCD_write_command(0x0c);/open display (enable lcd display) LCD_write

17、_command(0x80);/set lcd first display address CLEARSCREEN;/clear screen*为了方便初学者学习 LCD,特留下字符显示代码,电路图与本实验一致。已通过 实物测试,绝对没问题。#include unsigned char table1=0x03,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,0

18、x1E,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;/ 心 图 案unsigned char table=0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00; 字符C#defineCLEARSCREEN LCD_write_command(0x01)/* 定义接口 *

19、/#defineLCDIOP0sbit LCD1602_RS=P2P;sbit LCD1602_RW=P2A1;sbit LCD1602_EN=P2A2;/* 定义函数 */void LCD_write_command(unsigned char command);/ 写入指令函数void LCD_write_dat(unsigned char dat);/ 写入数据函数void LCD_set_xy( unsigned char x, unsigned char y );/ 设置显示位置函数void LCD_dsp_char( unsigned x,unsigned char y,unsig

20、ned 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);/ 延时函数*初始化函数 *16void LCD_init(void)CLEARSCREEN;/clear screenLCD_write_command(0x38);/set 8 bit data transmission mode LCD_write_command(0

21、x0c);/open display (enable lcd display) LCD_write_command(0x80);/set lcd first display address CLEARSCREEN;/clear screen*写指令函数 *#void LCD_write_command(unsigned char command) LCDIO=command; LCD1602_RS=0;LCD1602_RW=0;LCD1602_EN=0;LCD1602_EN=1; delay_nms(10);/*/*写数据函数 *void LCD_write_dat(unsigned char

22、 dat)LCDIO=dat;LCD1602_RS=1;LCD1602_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_command(address);/*/*显示一个字符 */void LCD_dsp_char( unsigned x,unsigned char y,

23、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(unsigned int n) unsigned int i=0,j=0; for (i=n;i0;i-) for (j=0;j10;j+);/*/*主函数 */void main(voi

24、d)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 写入自定义字符表的数据 k+;delay_nms(2);tmp=tmp+8;LCD_dsp_string(1,1,LCD TEST );/ 在第一行第一列显示 LCD TEST LCD_dsp_string(1,2,SUCCESSFUL );/ 在 第 二 行 第 一 列 显 示 SUCCESSFULfor (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);/*/18

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!