虚拟仪器基于单片机的简易计算器设计_第1页
虚拟仪器基于单片机的简易计算器设计_第2页
虚拟仪器基于单片机的简易计算器设计_第3页
虚拟仪器基于单片机的简易计算器设计_第4页
虚拟仪器基于单片机的简易计算器设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

虚拟仪器课程设计报告作品名称:基于51单片机的简易计算器设计学校:南阳师范学院成员简介:设计任务:本次实验是要以51系列单片机为核心实现一个简易计算器,它的结构简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块STC90C51单片机构成,通过软件编程可实现简单加、减、乘、除、清除结果。实现对计算器的设计,具体设计如下:1、采用6位显示,最大显示值为“999999”,设计16个按键的矩阵键盘,按键包括‘0~9’、‘+’、‘-’、‘*’、‘/’、‘=’、‘C’。2、加减法做四字节运算;乘法做双字节运算;除法被除数为四字节,除数为两字节。3、当运算结果超出显示范围时,显示ERROR!。4、上述运算输入值均为整数,当结果带有小数时,可以采用四舍五入方式处理,也可以带小数显示。方案论证:经分析,计算器电路包括三个部分:显示电路、、4*4键扫描电路、单片机微控制电路。具体如下:1)LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.2)4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用3种方法读取键值。一种是中断式,外两种是扫描法和反转法。

扫描法:

对键盘上的某一行送低电平,其他行及列全为高电平,然后读取列值,检查各列线点评的变化,如果某列线电平为低电平,就列交叉点处的按键被按下,采用延时去抖动。

⒊)

单片机微控制电路

微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。程序流程图:程序代码:#include"reg51.h" //此文件中定义了单片机的一些特殊功能寄存器typedefunsignedintu16; //对数据类型进行声明定义typedefunsignedcharu8;//矩阵键盘定义#defineGPIO_KEYP1u8KeyValue; //用来存放读取到的键值//LED灯定义sbitLED=P3^6;//74LS138定义sbitCS2=P2^6;sbitCS1=P2^7;intNumber1=0;//计算的第一个数字intNumber2=0;//计算的第二个数字intResult=0;//结果u8calculationflag=0;//计算标志位0表示未按加减1表示加2表示减u8resultflag=0;//结算标志位0表示未按确认1表示按了确认unsignedcharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段显示口数据/********************************************************************************函数名:Timer0Init*函数功能 :定时器0初始化*输入:无*输出:无*******************************************************************************/voidTimer0Init(){ TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=(65535-1000)/256; //给定时器赋初值,定时1ms TL0=(65535-1000)%256; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=0;//关闭定时器}/********************************************************************************函数名:delay*函数功能 :延时函数,i=1时,大约延时10us*******************************************************************************/voiddelay(u16i){ while(i--);}/********************************************************************************函数名:KeyDown*函数功能 :检测有按键按下并读取键值*******************************************************************************/voidKeyDown(void){chara=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()*函数功能 :数码管显示*输入:无*输出:无*******************************************************************************/voidSegDisplay(){//显示计算的数if(resultflag==0){//显示第一个数if(calculationflag==0) {CS2=0;CS1=0; P0=table[Number1/1000]; delay(10); P0=0x00;CS2=0;CS1=1; P0=table[Number1%1000/100]; delay(10); P0=0x00;CS2=1;CS1=0; P0=table[Number1%100/10]; delay(10); P0=0x00;CS2=1;CS1=1; P0=table[Number1%10]; delay(10); P0=0x00; }//显示第二个数 elseif(calculationflag>=1) {CS2=0;CS1=0; P0=table[Number2/1000]; delay(10); P0=0x00;CS2=0;CS1=1; P0=table[Number2%1000/100]; delay(10); P0=0x00;CS2=1;CS1=0; P0=table[Number2%100/10]; delay(10); P0=0x00;CS2=1;CS1=1; P0=table[Number2%10]; delay(10); P0=0x00; }}//显示计算结果elseif(resultflag==1){if(Result>=0) {CS2=0;CS1=0; P0=table[Result/1000]; 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; } elseif(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*函数功能 :主函数*输入:无*输出 :无*******************************************************************************/voidmain(){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;//按键值是1~16这里让按键值=17是为了防止明明没按按键却一直进入这个判断KeyValue=17;} //输入数字if(KeyValue>=1&&KeyValue<=10){resultflag=0;if(calculationflag==0){Number1=Number1*10+(KeyValue-1);}elseif(calculationflag>=1){Number2=Number2*10+(KeyValue-1);}//按键值是1~16这里让按键值=17是为了防止明明没按按键却一直进入这个判断KeyValue=17;} //加号if(KeyValue==13){ //计算一次结果后直接再按加号 if(resultflag==1) Number1=Result; resultflag=0;calculationflag=1;//按键值是1~16这里让按键值=17是为了防止明明没按按键却一直进入这个判断KeyValue=17;} //减号if(KeyValue==14){ //计算一次结果后直接再按减号 if(resultflag==1) Number1=Result; resultflag=0;calculationflag=2;//按键值是1~16这里让按键值=17是为了防止明明没按按键却一直进入这个判断KeyValue=17;} //结算if(KeyValue==16){resultflag=1; if(calculationflag==1)Result=Number1+Number2; elseif(calculationflag==2) Result=Number1-Number2; if(Result>=9999) { TR0=1; Result=Result%10000; } elseif(Result<=-999) { TR0=1; Result

温馨提示

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

评论

0/150

提交评论