计算器单片机课程设计报告

上传人:仙*** 文档编号:33889653 上传时间:2021-10-19 格式:DOC 页数:14 大小:286.52KB
收藏 版权申诉 举报 下载
计算器单片机课程设计报告_第1页
第1页 / 共14页
计算器单片机课程设计报告_第2页
第2页 / 共14页
计算器单片机课程设计报告_第3页
第3页 / 共14页
资源描述:

《计算器单片机课程设计报告》由会员分享,可在线阅读,更多相关《计算器单片机课程设计报告(14页珍藏版)》请在装配图网上搜索。

1、前言当今时代,是一个新技术层出不穷的时代。在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。 2方案论证与设计根据功能和指标要求,本系统选用MCS 5

2、1 单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计考虑如下:由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。另外键盘包括数字键(09)、符号键(+、-、)、清除键和等号键,故只需要16 个按键即可。系统模块图:2.1 输入模块:键盘扫描计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为

3、列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为44个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图2 所示:一般有16 个键组成,在单片机中正好可以用一个P 口实现16 个按键功能,这种形式在单片机系统中也最常用。由图 3 矩阵键盘内部电路图可以知道,当无按键闭合时,P10P13 与P14P17 之间开路。当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14P17 为输入状态,从行线P10P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭

4、合。第二步,行线轮流输出低电平,从列线P14P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。2.2 运算模块:单片机控制AT89C51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存

5、器(SFR)。35单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。2.3 显示模块:LED 显示发光二极管LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效器件。LED 具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中

6、获得了广泛的应用。24通常的数码显示器是由7 段条形的LED 组成(如图4 所示),点亮适当的字段,就可显示出不同的数字。我们采用8 段数码管,其中位于显示器右下角的LED 作小数点用。LED 显示器有两种不同的形式:共阴极和共阳极。本次设计采用共阴极接法(如图5所示)。3、硬件原理 3.1 硬件连接 图3-1所示是简易计算器电路原理图。P3口用于键盘输入,接4X4键值与键盘对应表如图表所示,P0口和P2口用于显示,P2口用于显示数位值高位,P0用于显示数位值的低位。 键值 0 1 2 3 4 5 6 7 8 9 + - x / = ON/C 功能 0 1 2 3 4 5 6 7 8 9 +

7、- x / = 清零4、软件设计在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。功能流程图如下:程序流程图程序:#includeat89x52.h /头文件/-

8、预定义模块-/*预定义数组*/字形码 0 1 2 3 4 5 6 7const unsigned char KEY_NUMBER=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07/ 8 9 + - * / = CE,0x7f,0x6f,0xF0,0xC0,0xF6,0xD2,0x89,0xB9;/扫描键码 0 1 2 3 4 5 6 7const unsigned char KEY_VALUE=0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed/ 8 9 A B C D E F,0x7b,0xbb,0xdb,0xeb,0x77,0xb7

9、,0xd7,0xe7;/数码管各显示位: 0位 1位 2位 3位 4位const unsigned char DISPLAY_BIT5=0xFE,0xFD,0xFB,0xF7,0xEF;/十进制转换权值const int bcd_right5=1,10,100,1000,10000;unsigned char buffer_number5; /输入数据缓冲区unsigned char buffer_dis5; /计算结果显示缓冲区unsigned long int buffer_opera5; /输入数据十进制转换缓冲区/*预定义变量*/unsigned char const NULL=0xF

10、F;unsigned char opera=0x00; /输入数据转换指针unsigned char count=0x00; /键盘输入指针unsigned char enter_number=0x01; /输入数据显示和计算结果显示开关unsigned char ptr_i=0x00; /运算结果转换指针unsigned char buffer_control; /控制键缓冲区unsigned char key_bcd; /按键的十进制值unsigned char scan_key; /当前扫描到的键值unsigned char temp_c; /临时变量unsigned char ptr_

11、c; /十进制转化指针unsigned char account; /四则运算标志unsigned long int result=0x00; /当前计算结果unsigned long int rlt; /前一个输入的数的十进制值unsigned long int sec_rlt; /后一个输入的数的十进制值unsigned long int c_n; /当前转换的运算结果/*名称: 初始化运行环境功能: 初始化各寄存器与端口状态参数: 无返回值:无*/void DeviceInit(void)TL0=0xBF; /置定时器中断时间为20msTH0=0x63;TMOD=0x01; /设定定时器

12、/计数器0工作方式为1IE=0x82; /允许全局中断,允许定时器/计数器0溢出中断TR0=0x01; /启动定时器/计数器0/*名称: 延时模块功能: 延时参数: unsigned char i返回值:无*/void Delay(unsigned char i)int j;while(i-)!=0) for(j=0;j=0x6f;j+);/*名称: 清除模块功能: 清除当前已经输入的数据通过输入缓冲区中的数乘以它们各自对应的权值再求和参数: 参数为1时,清除输入数据缓冲区参数为2时,清除十进制转化缓冲区返回值:无*/void Clear(unsigned char clr_pid)temp_

13、c=0x00;for(temp_c;temp_c=4;temp_c+)if(clr_pid=1) /参数为1时,输入数据缓冲区全部置0count=0x00; /按键次数置0buffer_numbertemp_c=0x00;if(clr_pid=2) /参数为2时,输入数据缓冲区全部置0opera=0x00; /输入数的个数置0buffer_operatemp_c=0x00;/*名称: 数据处理模块功能: 将输入的数据转化为10进制数通过输入缓冲区中的数乘以它们各自对应的权值再求和参数: 无返回值:无*/void BcdConvert(void)temp_c=0x00;ptr_c=opera-1

14、;if(opera !=0)while(temp_c=result) result=rlt-result;else /如果被减数比减数小buffer_control=0xC0;result=(rlt-result-0x01);break;case 0x02: /乘法result*=rlt;break;case 0x03: /除法result=rlt/result;break;Convert(); /调用计算结果处理函数Clear(2); /清除计算结果/*名称: 控制键处理模块功能: 对各个控制键进行对应的操作参数: 无返回值:无*/void Control(void)Clear(1); /清

15、除显示缓冲区/*等号处理*/if(buffer_control=0x89) Calculate(); /调用计算函数/*清除键处理*/else if(buffer_control=0xB9)Clear(1); /清除已输入的数Clear(2); /清除当前也转化的值ptr_i=0x00; /清除显示指针result=rlt=0x00; /清除元算结果/*运算符号处理*/elseBcdConvert(); /将先前输入的数转化为10进制数rlt=result; /保存转化的结果result=0x00; /清除上一次转化的结果,准备下一次转化switch(buffer_control)case 0

16、xF0: /加法account=0x00;break;case 0xC0: /减法account=0x01;break;case 0xF6: /乘法account=0x02; /乘法运算标志break;case 0xD2: /除法account=0x03; /除法运算标志break;default:break;/*名称: 按键判断模块功能: 判断是否有键被按下参数: 无返回值:有键按下则返回1没有键按下则返回0*/unsigned char KeyDown(void)temp_c=0x00;P2=0xf0;temp_c=P2;if(temp_c!=0xf0)return 1; /有键按下返回1

17、elsereturn 0; /没有键按下返回0/*名称: 按键处理函模块功能: 获取当前按键参数: 无返回值:返回当前按键的字形码如果没有键按下,返回NULL*/unsigned char KeyPress (void)if(KeyDown()=1) /判断是否有键按下Delay(30); /延时消抖/*扫描当前被按下的键值*/P2=0xF0; /扫描低4位scan_key=P2; /记录扫描结果P2=0x0F; /扫描高四位temp_c=P2; /记录扫描结果scan_key=temp_c; /两结果相异或得键值/*当有键被按下时关闭显示*/do P1=0xFF; /如果有键按下,关闭显示w

18、hile(KeyDown()=1); /等待按键释放,如果有键按下,则不显示任何数Delay(30); /延时消抖/*当有键按下后开始扫描所按下的键*/for(key_bcd=0;key_bcd=15;key_bcd+) /查找键值对应的字符码 if(KEY_VALUEkey_bcd=scan_key) /如果找到对应的键值ptr_i=0x00; /清除运算结果显示指针,开始显示输入的数据/*判断是数字键还是控制键*/if(key_bcd=0x09) /小于10的键为数字键enter_number=0x01; /设置输入数据显示标志if(count=0x04) /如果缓冲区未满buffer_n

19、umbercount=KEY_NUMBERkey_bcd; /当前键送缓冲区buffer_operaopera=key_bcd; /保存当前按键的十进制值opera+; /指针自加count+;else /如果缓冲区溢出count=0x00;Clear(1); /清楚缓冲区buffer_number0=KEY_NUMBERkey_bcd; /缓冲区初始位存入当前键的字符码buffer_operaopera=key_bcd; /保存当前按键的十进制值opera+;count+;return KEY_NUMBERkey_bcd; /返回对应的数字字符值else /大于9的键为控制键buffer_c

20、ontrol=KEY_NUMBERkey_bcd; /控制键送控制缓冲区Control(); /调用控制键处理函数elsereturn NULL; /如果没有键按下,返回NULL/*名称: 数码管显示模块功能: 在数码管上显示输入的数据和计算后的结果参数: 无返回值:无*/void Display(void)unsigned char m=0; /显示字符指针unsigned char n=0; /显示位指针;while(KeyPress()=NULL) /当有键被按下时开始显示/*显示当前输入的数据*/if(enter_number=0x01) /显示输入中的数据 if(m!=count)

21、/字符指针在界线内if(n=count-1) /显示位未越界P1=DISPLAY_BITn; /设置显示位P0=buffer_numberm; /在数码管上显示字符Delay(0x02); /延时消抖n+;m+;else /显示位越界n=0;else /字符指针越界m=0;/*显示运算后的结果*/else /显示运算的结果 if(m!=ptr_i) /字符指针在界线内if(n=ptr_i-1) /显示位未越界P1=DISPLAY_BITptr_i-n-1; /设置显示位P0=KEY_NUMBERbuffer_dism; /在数码管上显示字符Delay(0x02); /延时消抖n+;m+;els

22、e /显示位越界n=0;else /字符指针越界 m=0;Clear(1);/*显示运算操作符*/P1=0xDF; /打开运算符号显示位P0=buffer_control; /显示当前运算符号Delay(0x02);/*名称: 主函数功能: 应用程序入口参数: 无返回值:无*/void main()DeviceInit(); /调用系统初始化函数while(1);/*名称: 定时器中断模块功能: 调用键盘监视模块获取键盘输入调用显示模块来显示输入与输出参数: 无返回值:无*/void timer0_over(void) interrupt 1TL0=0xBF; /中断间隔为20msTH0=0x63;KeyPress(); /调用键盘扫描程序Display(); /调用显示函数5. 总结通过该计算器的设计我深入学习数码管扫描和键盘控制,提高对了51系列单片机的实际应用能力。同时也掌握应用程序控制51系列单片机进行简单的数学运算。提高了对51系列单片机的编程能力。这门课是最能理论联系实际的课,我们的目的是做出东西,为了这我们需要学关于这方面的各种知识,从被动性的接受知识变成了主动性的寻找知识。这种模式才是学习的最好方式。在此制作过程中我们经历挫折,经历困惑,但有目标在前,我们不能也不想放弃,只有在克服困难后才会有成功的希望。14

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