欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    虚拟仪器基于单片机的简易计算器设计.docx

    • 资源ID:4296892       资源大小:134.58KB        全文页数:18页
    • 资源格式: DOCX        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    虚拟仪器基于单片机的简易计算器设计.docx

    虚拟仪器课程设计报告作品名称:基于51单片机的简易计算器设计学校: 南阳师范学院 一、 成员简介:二、 设计任务:本次实验是要以51系列单片机为核心实现一个简易计算器,它的结构简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块STC90C51单片机构成,通过软件编程可实现简单加、减、乘、除、清除结果。实现对计算器的设计,具体设计如下:1、采用6位显示,最大显示值为“999999”,设计16个按键的矩阵键盘,按键包括09、+、-、*、/、=、C。2、加减法做四字节运算;乘法做双字节运算;除法被除数为四字节,除数为两字节。3、当运算结果超出显示范围时,显示ERROR!。4、上述运算输入值均为整数,当结果带有小数时,可以采用四舍五入方式处理,也可以带小数显示。三、 方案论证:经分析,计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。具体如下:1)LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.2)4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用3 种方法读取键值。一种是中断式,外两种是扫描法和反转法。扫描法:对键盘上的某一行送低电平,其他行及列全为高电平,然后读取列值,检查各列线点评的变化,如果某列线电平为低电平,就列交叉点处的按键被按下,采用延时去抖动。) 单片机微控制电路微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。四、 程序流程图:五、 程序代码:#include "reg51.h" /此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; /对数据类型进行声明定义typedef unsigned char u8;/矩阵键盘定义#define GPIO_KEY P1u8 KeyValue;/用来存放读取到的键值/LED灯定义sbit LED=P36;/74LS138定义sbit CS2=P26;sbit CS1=P27;int Number1 = 0;/计算的第一个数字int Number2 = 0;/计算的第二个数字int Result = 0;/结果u8 calculationflag = 0;/计算标志位 0表示未按加减 1表示加 2表示减u8 resultflag = 0;/结算标志位 0表示未按确认 1表示按了确认unsigned char code table10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/数码管段显示口数据/* 函 数 名 : Timer0Init* 函数功能 : 定时器0初始化* 输 入 : 无* 输 出 : 无*/void Timer0Init()TMOD|=0X01;/选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0= (65535 - 1000)/256;/给定时器赋初值,定时1msTL0= (65535 - 1000)%256;ET0=1;/打开定时器0中断允许EA=1;/打开总中断TR0=0;/关闭定时器/* 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*/void delay(u16 i)while(i-);/* 函 数 名 : KeyDown* 函数功能 : 检测有按键按下并读取键值*/void KeyDown(void) char a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)/读取按键是否按下 delay(1000);/延时10ms进行消抖 if(GPIO_KEY!=0x0f)/再次检测键盘是否按下 /测试列 给四列按键接到单片机的引脚为高电平,如果哪一列检测出来是低电平,说明该列有按键按下 GPIO_KEY=0X0F; switch(GPIO_KEY) case(0X07):KeyValue=1;break; case(0X0b):KeyValue=2;break; case(0X0d): KeyValue=3;break; case(0X0e):KeyValue=4;break; /测试行 给四行按键接到单片机的引脚为高电平,如果哪一行检测出来是低电平,说明该行有按键按下 GPIO_KEY=0XF0; switch(GPIO_KEY) case(0X70):KeyValue=KeyValue;break; case(0Xb0):KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0):KeyValue=KeyValue+12;break; while(a<50)&&(GPIO_KEY!=0xf0) /检测按键松手检测 delay(1000); a+; /* 函 数 名 : SegDisplay()* 函数功能 : 数码管显示* 输 入 : 无* 输 出 : 无*/void SegDisplay() /显示计算的数 if(resultflag = 0) /显示第一个数 if(calculationflag = 0) CS2 = 0;CS1 = 0; P0=tableNumber1/1000; delay(10); P0=0x00; CS2 = 0;CS1 = 1; P0=tableNumber1%1000/100; delay(10); P0=0x00; CS2 = 1;CS1 = 0; P0=tableNumber1%100/10; delay(10); P0=0x00; CS2 = 1;CS1 = 1; P0=tableNumber1%10; delay(10); P0=0x00; /显示第二个数else if(calculationflag >= 1) CS2 = 0;CS1 = 0; P0=tableNumber2/1000; delay(10); P0=0x00; CS2 = 0;CS1 = 1; P0=tableNumber2%1000/100; delay(10); P0=0x00; CS2 = 1;CS1 = 0; P0=tableNumber2%100/10; delay(10); P0=0x00; CS2 = 1;CS1 = 1; P0=tableNumber2%10; delay(10); P0=0x00; /显示计算结果 else if(resultflag = 1) if(Result >= 0) CS2 = 0;CS1 = 0; P0=tableResult/1000; delay(10); P0=0x00; CS2 = 0;CS1 = 1; P0=tableResult%1000/100; delay(10); P0=0x00; CS2 = 1;CS1 = 0; P0=tableResult%100/10; delay(10); P0=0x00; CS2 = 1;CS1 = 1; P0=tableResult%10; delay(10); P0=0x00;else if(Result < 0) CS2 = 0;CS1 = 0; P0=0x40;/显示'-'号 delay(10); P0=0x00; CS2 = 0;CS1 = 1; P0=table(-Result)%1000/100; delay(10); P0=0x00; CS2 = 1;CS1 = 0; P0=table(-Result)%100/10; delay(10); P0=0x00; CS2 = 1;CS1 = 1; P0=table(-Result)%10; delay(10); P0=0x00; /* 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*/void main() Timer0Init(); LED = 1; P2=0Xff; while(1) KeyDown();/清空 if(KeyValue = 15) LED = 1; TR0 = 0; Number1 = 0; Number2 = 0; calculationflag = 0; Result = 0; resultflag = 0; /按键值是116 这里让按键值=17 是为了防止明明没按按键 却一直进入这个判断 KeyValue = 17; /输入数字 if(KeyValue >= 1 && KeyValue <= 10) resultflag = 0; if(calculationflag = 0) Number1 = Number1*10 + (KeyValue-1); else if(calculationflag >= 1) Number2 = Number2*10 + (KeyValue-1); /按键值是116 这里让按键值=17 是为了防止明明没按按键 却一直进入这个判断 KeyValue = 17; /加号 if(KeyValue = 13) /计算一次结果后直接再按加号 if(resultflag = 1) Number1 = Result; resultflag = 0; calculationflag = 1; /按键值是116 这里让按键值=17 是为了防止明明没按按键 却一直进入这个判断 KeyValue = 17; /减号 if(KeyValue = 14) /计算一次结果后直接再按减号 if(resultflag = 1) Number1 = Result; resultflag = 0; calculationflag = 2; /按键值是116 这里让按键值=17 是为了防止明明没按按键 却一直进入这个判断 KeyValue = 17; /结算 if(KeyValue = 16) resultflag = 1; if(calculationflag = 1) Result = Number1 + Number2; else if(calculationflag = 2) Result = Number1 - Number2; if(Result >= 9999) TR0 = 1; Result = Result%10000; else if(Result <= - 999) TR0 = 1; Result = ( - Result)%1000; Result = - Result; else LED = 1; TR0 = 0; calculationflag = 0; Number1 = 0; Number2 = 0; /按键值是116 这里让按键值=17 是为了防止明明没按按键 却一直进入这个判断 KeyValue = 17; /数码管显示 SegDisplay(); /* 函 数 名 : void Timer0() interrupt 1* 函数功能 : 定时器0中断函数* 输 入 : 无* 输 出 : 无*/void Timer0() interrupt 1static u16 i;TH0= (65535 - 1000)/256;/给定时器赋初值,定时1msTL0= (65535 - 1000)%256;i+;if(i=500) i=0; LED = LED;/end ofif(i=1000)六、 实验结果:

    注意事项

    本文(虚拟仪器基于单片机的简易计算器设计.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开