单片机课程设计基于51单片机的简易计算器内容摘要:

el 公司高密度非易失性存储器技术制造,与工业 80C51 产品指令和引脚完全兼容。 片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。 在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得AT89S52 在众多嵌入式控制应用系统中得到广泛应用。 图 图 11 数码管 LED 数码管实际上是由七个发光管组成 8 字形构成的,加上小数点就是 8个。 这些段分别由字母 a,b,c,d,e,f,g,dp 来表示。 当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的 2 个 8 数码管字样了。 如:显示一个 “2” 字,那么应当是 a亮 b 亮 g 亮 e亮 d亮 f不亮 c不亮 dp不亮。 LED 数码管有一般亮和超亮等不同之分,也有 寸、 1 寸等不同的尺寸。 小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为 ,电流不超过 30mA。 发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。 常用 LED 数码管显示 的数字和字符是 0、 A、 B、 C、 D、 E、 F。 各模块功能设计 键盘输入模块: 本设计中键盘分布键值如下表所示: 7 8 9 + 4 5 6 1 2 3 0 C = 247。 工作原理 图 12 本设计采用 P3 口作为矩阵键盘输入口。 开始工作后,单片机先对矩阵键盘的行进行扫描若无键按下,即先使 P3 为 11110000,然后检测外来输入,若有输入,则可使四位的 0 其中一位置 1,即完成了按键行号的输入。 列扫描原理同行扫描相同,不过 P3 初始为 00001111。 检测完行号与列号后,从而产生一个 8位二进制码,即可对键盘值进行输入 (程序实现见附录 char jianpan()段 )。 矩阵键盘的工作原理可以用以下框图简单表示: 行 扫 描列 扫 描有 键 按 下返 回 键 值 是否 本设计键值与八位码对应关系: 键值 8 二进制位码 十六进制 0 00011000 18 1 00010100 14 2 00100100 24 3 01000100 34 4 00010010 12 5 00100010 22 6 01000010 42 图 13 7 00010001 11 8 00100001 21 9 01000001 41 +/10 10000001 81 - /11 10000010 82 /12 10000100 84 247。 /13 10001000 88 =/14 01001000 48 C/15 00101000 28 矩阵键盘与单片机的电路连接如下面两幅图所示: 表 图 14 控制模块 控制模块控制着数字录入, 数字录入是进行计算的前提,它是将从矩阵键盘上输入的数值、运算符等录入单片机处理器进行处理,从而得出运算结果 (程序见附录二 KONGZHI 段)。 本设计数字录入 模块工作流程如下: 15 等 待键 值第 一 个 键 值 为运 算 符个 位 为 0 十 位 为空旧 结 果 不 参 与 运 算个 位 为 0 , 十 位为 空旧 结 果 作 为 第 一 个数 参 与 运 算 八 位 有 效 数 字开 始否是是否数 值 超 过 八 位清 零是否计 算运 算 符 为 =显 示否等 待 “ = ” 输 入结 束判 断 运 算 符等 待 运 算 符 输 入CC 或 第 九 位 数 是是否第 二 个 数 录 入否C是否图 16 计算模块 计算模块作为 计算器的 的核心模块 共有加、减、乘、除四个部 分。 其设计原理是先将键盘输入的 BCD 码数字转换为十进制数字,然后再对其进行运算。 由于由于最后需要进行输出显示,所以我们对最终结果又做了一次转换将结果转换为 BCD 码,以便在 LED 上显示。 下面以加法为例对计算模块进行原理介绍 (完整程序段见附录二 jisuan 段 )。 void jisuan(char k,char a[8],char b[8]) { char r[8]。 数组 r 用于存储计算结果的 BCD 码 long i,x,y。 i=0。 x=0。 存储第一个数 y=0。 存储第二个数 for(i=7。 i0。 i) //数值转化,将代表空格的 12 转化为数字 0,因为个位不显示空格,默认为 0,所以不转化 { while(a[i]==12)a[i]=0。 while(b[i]==12)b[i]=0。 } x=a[4]。 x=10000*x。 x=x+a[0]+a[1]*10+a[2]*100+a[3]*1000+a[5]*100000+a[6]*1000000+a[7]*10000000。 将键盘输入的第一个数转换为十进制数 y=b[4]。 y=10000*y。 y=y+b[0]+b[1]*10+b[2]*100+b[3]*1000+b[5]*100000+b[6]*1000000+b[7]*10000000。 将键盘输入的第二个数转换为十进制数 17 if(k==10)//加法运算 { x=x+y。 if(x99999999) //大于 8位,显示 “Err” { r[0]=11。 //r r[1]=11。 //r r[2]=10。 //E r[3]=12。 //空格 r[4]=12。 r[5]=12。 r[6]=12。 r[7]=12。 } else { r[0]=x%10。 r[1]=(x%100)/10。 r[2]=(x%1000)/100。 r[3]=(x%10000)/1000。 r[4]=(x%100000)/10000。 r[5]=(x%1000000)/100000。 r[6]=(x%10000000)/1000000。 r[7]=x/10000000。 //此段的功能是利用求余的方法将计算结果转换为 BCD 码 } } 从以上程序段中我们可以看出 C语言的简单与直观,再进行加法运算时只要输入“ +”,就能对 数字进行运算,若选用汇编语言,代码将变得很复杂。 18 显示模块 本设计采用了八位 LED 数码管。 可以显示 0~99999999,之间的任意整数。 由于 LED 数码管有八个,若采用静态显示,则最少需要 56根数据线与八根地址线,这对只有 40 根引脚的单片机是不可能实现的。 所以我们采用了动态扫描的显示方法。 其原理是不同时刻对不同位上的数码管进行选通,同时对其进行数码输出。 当扫描频率很高时,将不会看到数码关的闪烁。 本设计 利用 了 定时器中断来 实现间时显示。 (程序段见附录二 XIANSHI 段) 电路图: 为了 使 LED 的显示能与单片机速度能够匹配,因此在 P1口与 LED 之间加入了74HC245 锁存器。 晶振与复位模块 图 图 19 本模块的晶振为 12MHz,其为单片机工作提供时钟频率,是单片机必不可少的部件。 另外,为防止单片机由于各种原因而出现死机现象,本模块专门设计了一个独立的 RST 键,按下它可对单片机进行复位。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。