版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
虚拟仪器课程设计报告作品名称:基于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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自动化营销工具包及推广方案
- 2025云南昭通市农业科学院招聘2人考试重点试题及答案解析
- 2025云南昭通市正道中学宣传部招聘3人考试核心题库及答案解析
- 2026中国金融出版社有限公司校园招聘4人备考核心试题附答案解析
- 2025河南郑州郑东新区春华学校教育集团(商鼎校区)招聘备考核心试题附答案解析
- 2025四川爱创科技有限公司变频与控制事业部招聘生产管理等岗位4人备考核心题库及答案解析
- 一次难忘的冒险经历记事类作文5篇范文
- 企业资产管理系统搭建标准化工具集
- 2025年安宁市林业和草原局招聘编外聘用人员(70人)参考考试题库及答案解析
- 2025年哈尔滨市道里区爱建社区卫生服务中心招聘4人考试重点试题及答案解析
- 智圆行方的世界-中国传统文化概论知到课后答案智慧树章节测试答案2025年春暨南大学
- 《大中型无刷励磁发电机组主励磁机保护技术导则》
- 师德师风自查自纠工作自查报告
- 广州数控GSK 980TDc车床CNC使用手册
- 箱式变电站技术规范书
- 大学生体质健康标准与锻炼方法(吉林联盟)智慧树知到期末考试答案章节答案2024年东北师范大学
- 输变电工程施工质量验收统一表式附件1:线路工程填写示例
- 2024年中班·《壁虎和尾巴》快跑体育活动教案公开课
- 急救在身边智慧树知到期末考试答案章节答案2024年山东第一医科大学
- 《团体标准火力发电厂生产管理系统智能化功能测试技术导则》
- 临床护理技术操作常见并发症预防及处理规范
评论
0/150
提交评论