大连民族学院简易计算器学院(32页珍藏版)

利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用LED显示计算数值及结果。后找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。六、心得体会通过本次课程设计我真正的自己完成了对给定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。

1、精选优质文献——献给您 信息与通信工程学院简单计算器学院(系):信息与通信工程 专业:电子信息工程 学生姓名:丁璞杨一雄 学号: 指导老师:刘忠福 日期完成内容:大连民族大学主修-重点-专业目录 1、设计任务及性能指标 1.1 设计任务 印刷电路板(要求布局合理、线路清晰),画出程序流程图,给出单片机的使用流程和外围接口电路(键盘接口和显示接口电路)设计制作了一个利用LED显示计算值和结果的计算器。 要求用Protel画出系统的电路原理图(要求用最少的元件实现系统设计所需的功能),以及时序表(要求思路清晰,尽可能简洁,并将主程序和子程序分开,使程序更具可读性)。 1.2 性别

二、性能指标 1、加法:四位加法,如果计算结果超过四位,将显示计算错误 2、减法:四位减法,如果计算结果小于零,将显示计算错误显示 3.乘法:个位数乘法 4.除法:整数除法 5.具有清零功能,计算错误报警 2.方案总体设计是根据系统的功能需求设计的。 初步确定设计系统由四个模块组成:主控模块、显示模块、错误报警模块、按键扫描接口电路。 组成、电路系统框图如图1.1所示。 主控芯片采用51系列AT89C52单片机,采用高性能静态80C51设计,采用先进工艺制造,具有非易失性Flash程序存储器。 它是目前市场上应用最多的高性能、低功耗的8位COMS微处理器芯片。 键盘电路采用4*4矩阵键盘电路。 显示模块采用4个共阳极数码管和74位

3、ls273锁存器芯片组成及其他器件组成。 错误报警电路采用5V蜂鸣器。 本系统采用STC89C51单片机作为主控计算机。 通过扩展必要的外围接口电路,实现了计算器的设计。 显示电路 44 矩阵键盘 MCU 复位电路 晶振 图 2.1 基本结构 3. 系统硬件设计 3.1 MCU 最小系统 MCU 最小系统是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶体振荡器电路。 主控芯片采用STC89C52RC芯片,性能稳定,价格便宜,使用方便。 晶振选择11.0592MHz,晶振旁边的电容选择30pF。 采用按钮复位电路,电阻分别选择100、10K,电容选择10F。 下面是单片机最小系统硬件电路图。 图3.1 单片机最小系统 3.2 键盘连接

4、端口电路计算器所需按键为: 数字键:1、2、3、4、5、6、7、8、9、0 功能键:+、-、*、/、=、C(清除)总共16个按键,采用4*4矩阵键盘。 键盘的行和列连接到公共端子。 将四行四列的8个公共端分别连接到P1.0P1.7,这样就可以扫描P1端口了。完成矩阵键盘的扫描后,对16个按键进行编码,得到键盘的端口地址。 通过将P1口扫描结果与各个按键的地址进行比较,就可以得到哪个按键被按下,从而完成键盘的功能。下面是键盘接口电路的硬件电路图。 图 3.2 矩阵键盘内部电路 3.3 LCD 显示模块:本设计采用 LCD 液晶显示器显示输出数据,并通过 D0-D7 引脚向 LCD 写入指令字或数据,使能 LCD。

5、不同功能或显示相应数据连接到单片机最小系统时,采用并联方式。 该方法的特点是传输速度快。 并行接口的输入由p0.0-p0.7控制来传输信息。 LCD 显示器使用两片偏振材料,其间有液晶溶液。 电流通过液体会重新排列晶体,使光线无法穿过它们。 因此,每个晶体就像百叶窗一样,允许光线通过并阻挡光线。 液晶显示器具有直角显示、功耗低、体积小、零辐射等优点。 图 3.3 LCD 显示电路 3.4 错误报警电路 当计算结果有错误或输入数据有错误时,错误报警电路会发出声音报警,提醒用户有错误。这里使用一个 5V 蜂鸣器。作为报警器件,采用PNP晶体管驱动蜂鸣器,由P2.2控制。

6、线路控制,使得当出现错误且P2.2输出低电平时,蜂鸣器能够工作,完成报警任务。 编写程序时,报警电路实现的功能是:当计算正常且p2.2口输出高电平时,蜂鸣器不响应。 当计算出现错误时(例如用0作为被除数时),向p2.2输出低电平,使蜂鸣器响应,实现报警功能。下面是该电路的硬件电路图报警电路。 图3.4报警电路四系统软件设计首先初始化参数; 然后扫描键盘看是否有按键输入。 如果是,则读取关键代码; 确定键码是数字键、清除键还是功能键(“+”“-”“*””/“”=”)。 如果是数字键,则送数码管显示并保存数值。 如果是清除键,则将其清除。 如果是功能键,则判断是“=”还是算术键。 键,如果是“=”则计算最终结果送数码管显示,如果是其他功能键,

7. 不显示。 (它包含一个延迟去抖程序)。 开始初始化 清除键和功能键输入是否是数字键? 是 否 否 是 数码管不显示清除键。 数字键数码管显示计算结果。 它是算术键吗? 图 4.1 程序流程图 4.1 键盘扫描子程序设计 为了计算数据,必须先输入数据,并且需要确定按键输入的值是什么,这就需要扫描键盘来确定精确值。 按下了哪个键。 对于键盘扫描,您可以使用行扫描或列扫描。 这里采用行扫描的方式来完成键盘的扫描。 行扫描就是逐行扫描键盘,看看哪一行有按键按下,然后利用返回的按键码来判断按下的是哪个键。 例如,扫描第一行时,将P1.0设为低电平,将P1端口的其余部分设为高电平。 这样,如果第一行有一个按键被按下,P1端口的值就会从0x开​​始变化

8、fe改变为另一个值,然后用这个值来判断按下的是哪个键。 以下是键盘扫描子程序的程序列表。 void keyscan() /矩阵键盘 P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0)Delay_1ms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3; 开关(临时)情况 0xee:键=1; 中断;情况 0xde:键=2; 中断;情况 0xbe:键=3; 中断;情况 0x7e:键=15; 休息; while(temp!=0xf0) temp=P3

9.;温度=温度&0xf0; if(key=1&key=4&key=7&key=9) L1602_char(1,i,key + 48);i+;ssb=key;b+;Delay_1ms(300); if(key=13)L1602_string (1,i+,-);e=-;A=f(ss,b);b=0; P3=0XF7; 温度=P3; 温度=温度&0xf0; if(temp!=0xf0) Delay_1ms(10);temp =P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xe7: key=10; 打破;情况

10. 0xd7:密钥=0; 中断;情况 0xb7:键=11; 中断;情况 0x77:键=12; 中断; while(temp!=0xf0)temp=P3;temp=temp&0xf0; if(key=12) L1602_string (1,i+,+); e=+; A=f(ss,b); b = 0; if(key=11) L1602_string(1,i+,=); e=; A=f(ss,b); b = 0; if(key=11) /= H=f(ss,b);b=0;switch(e)case +: 结果=A+H; 中断;情况-:结果=AH;

11.break;case *: 结果=A*H; 中断;情况/:结果=A/H; 休息; 默认:结果=H; L1602_string(1,i+,=); 显示(结果);if(key=10) /清除 wcmd(0x01);wcmd(0x80);b=0;i=1;k=1; if(key=0) L1602_char(1,i,key + 48);i+;ssb=key; b+;Delay_1ms(300); 4.2 移位子程序及结果计算子程序设计输入数据应存储在一个四位数组中,我们输入的值是数据的高位,后面输入的值是低位,所以我们需要在输入时置高低位数值

12. 位值从数组的低位移至数组的高位。 这就是编写shift子程序的目的。 结果计算子程序包括加、减、乘、除四种运算。 以加法运算为例。 每个运算都有自己的标志位来表示计算类型。 当加法标志位add=1时,两个输入数据按照加法进行计算。 首先,将数组中的数字按照对应的位关系转换为十进制数,这样我们就得到了两个十进制数,即加速度和被加数,这样我们就可以简单地将这两个数相加。 结果就是我们正在寻找的值。 但这个值不能直接显示在数码管上。 我们必须对其进行处理,使其成为与进位对应的四个数字,并将它们存储到数组中进行显示。 将得到的值除以1000、100、10并取10的余数,我们得到我们想要的四个数字,并将它们发送到显示子程序进行显示。 剩下的减去

13、乘法和除法的计算方法与加法的计算方法相同,这里不再赘述。 以下是移位子程序和结果计算子程序的程序清单。 uint exp(uint m)/数字函数 uint n=1;while(m)n=n*10;-m;return n;uint f(uint g,uint d)/结果函数 uint m=0,i, j ;对于 (i=0;i10) z=z/10; n+;return n;void show(uint h) /显示数字函数 uint n,i,dat;n=length(h);for(i= n;i0;-i) dat=h/(exp(i- 1); L1602_char(2,k+,dat + 48);h=h%(exp(i-

14. 1); 4.3 从头到尾显示子程序设计,无论是输入的计算数据还是计算的结果值。 它们都存储在同一个数组dat中,这样我们在显示时只要不断调用dat中的值,就可以正确显示数据。 以下是显示子例程的程序列表。 void show(uint h) / 显示数字函数 uint n,i,dat;n=length(h);for(i=n;i0;-i) dat=h/(exp(i-1); L1602_char( 2,k+,dat + 48);h=h%(exp(i-1);4.4 主程序设计 主程序不仅将上述子程序连成一个整体,使整个程序循环运行。程序 程序之间的连接点也增加了,先进入程序后,立即进入显示子程序。

15.序列,在显示子程序中调用键盘扫描子程序。 如果按下某个键,则跳转到移位子程序和结果计算子程序进行相应处理。 经过计算或移位后,数组中的值发生变化,显示的值也会同时发生变化。 然后进行键盘扫描,反复运行,形成整个程序。 以下是主要程序列表。 void main()/主函数L1602_init();while(1)keyscan(); 总体方案清单见附件2。 5. 调试与性能分析 5.1 调试步骤 设备焊接好后,不要先将芯片插入芯片座,而是先验证板上电源是否可用,是否有短路等情况。连接 USB供电,用万用表测量芯片座对应电源与地之间的电压值,观察电压值是否正常。一切正常后,即可将芯片插入芯片座继续测试。

16、其他功能。 插上芯片后,调试各个模块,看按钮是否正常工作,数码管是否正常显示等。为相关部分编写测试程序进行测试。 各部分硬件测试正确后,下载程序进行整体调试。 一切正常后,结束调试过程。 具体调试时遇到的第一个问题是程序无法下载到单片机中。 通过对比电路板接线与原理图电路图接线,发现串口芯片与单片机的输入输出连接接反了。 重新用铜线连接后,仍然失败。 下载程序。 后来发现原因是下载串口与设计包不匹配,可以使用相应的下载线进行下载。 下载程序成功后,发现LCD显示不正确。 检查后发现一开始是没有连接的。 可能是制板时漏印了。 连接后,显示正常。 5.2 性能分析 对于计算器的性能来说,主要衡量指标在于计算的准确性。 这次

17、制作的计算器性能如下: 加法运算:四位加法运算,和值不超过9999。如果超过上限,会显示错误信息E,蜂鸣器报警。 减法运算:四位减法运算。 若结果为负,则取绝对值。 乘法运算:乘积不超过9999的乘法运算,超过上限则显示错误信息E,并有蜂鸣器报警提示。 除法运算:整数除法,计算结果为整数,若除数为零,则显示错误信息E,并蜂鸣器鸣响。 通过实际性能分析,可以得出本设计满足设计要求。 6.心得 通过本次课程设计,我真正完成了给定要求的系统的硬件设计、电路设计、电路板设计、软件设计以及成品的调试。整个过程中我学到了很多知识。 在之前的学习中我发现自己在某些方面的知识有所欠缺。 这对我之前的学习来说是一个很大的进步。

18、它是对学习科目的一种渗透和传承,让你更好地理解和学习,这对你以后的工作也有很大的好处。 实验过程中,理论与实践充分结合。 实践是检验真理的唯一标准。 确实,理论知识只有在实践中才能实现。 这也是工程的预期结果。 通过这个实验,我们可以更具体地理解理论,对学习有很大的帮助。 从这次课程设计中,我也看到了自己的很多不足。 我对知识的掌握还不够扎实,一知半解。 有时候做事不够稳定,太浮躁,无法冷静分析遇到的问题和错误。 这在以后的工作和生活中是不可取的。 通过理解并纠正自己的问题,我相信你能够更好地再次解决同样的问题。 未来的设计实验也将更好地完成。参考文献1徐伟祥,刘旭民。 单片机原理及应用。

19.有限公司:大连理工大学出版社,19962 李光飞,楼然苗,胡嘉文,谢向佐。 微控制器课程设计和实例指导。 北京:北京航空航天大学出版社,2004 3 余永泉. 89系列FLASH单片机原理及应用。 北京:电子工业出版社,20024刘延川,董玉华,刘忠福,韩志敏。 单片机原理与系统设计。 北京:电子工业出版社,2014 附录1 系统硬件电路图 附录2 物理框图 附录3 程序列表 #include#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longuchar 码表10 = 0x0

20, 3, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09;uchar i=1,j=0;uchar key,temp;uchar e;uint ss8;uint b=0,A,H ,result,k=1;sbit E=P23;/1602 使能引脚 sbit RW=P36;/1602 读写引脚 sbit RS=P24;/1602 数据/命令选择引脚 void Delay_1ms(uint i)/1ms Delay uint x ,j;for (j=0;ji;j+);for (x=0;x=148;x+);void 延迟()_nop_();_nop_();_nop_()

21.;_nop_();_nop_();位Busy(void)位busy_flag = 0;RS = 0;RW = 1;E = 1;delay();busy_flag = (位)(P0 & 0x80);E = 0;返回busy_flag;void wcmd(uchar del)while(Busy();RS = 0;RW = 0;E = 0;延迟();P0 = del;延迟();E = 1;延迟();E = 0;void wdata(uchar del)while(Busy();RS = 1;RW = 0;E = 0;延迟();P0 = del;d

22. elay();E = 1;delay();E = 0;void L1602_init(void)wcmd(0x38);Delay_1ms(5);wcmd(0x38);Delay_1ms(5);wcmd(0x38);Delay_1ms( 5);wcmd(0x38);wcmd(0x08);wcmd(0x0c);wcmd(0x04);wcmd(0x01);void L1602_char(ucharhang,ucharlie,char符号)uchara;if(hang=1)a = 0x80;if(hang = 2) a = 0xc0;a = a + lie – 1;wcmd(a);wd

23. ata(sign);void L1602_string(uchar Hang,uchar lie,uchar *p)uchar a,b=0;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie – 1;while(1)wcmd(a+);b+;if(*p = 0)|(b=16) break;wdata(*p);p+;uint exp(uint m) /数字函数 uint n =1;while(m)n=n*10;-m;return n;uint f(uint g,uint d)/结果函数 uint m=0,i,j;for (i=0;i10) z =

24.z/10; n+; 返回n; void show(uint h) / 显示数字函数 uint n,i,dat;n=length(h);for(i=n;i0;-i) dat=h /(exp(i-1); L1602_char( 2,k+,dat + 48);h=h%(exp(i-1); void keyscan() /矩阵键盘 P3=0xfe;temp=P3;temp=temp&0xf0 ;if(temp!=0xf0)Delay_1ms(10 );temp=P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xee: key=1;break

25.;情况0xde:密钥=2; 中断;情况 0xbe:键=3; 中断;情况 0x7e:键=15; 休息; while(temp!=0xf0) temp=P3;temp=temp&0xf0; if(key=1&key=4&key=7&key=9) L1602_char(1,i,key + 48);i+;ssb=key;b+;Delay_1ms(300); if(key=13)L1602_string(1,i+,-);e=-; A=f(ss,b);b=0; P3=0XF7; 温度=P3; 温度=温度&0xf0; if(temp!=0xf0) D

26. elay_1ms(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xe7: key=10; 中断;情况 0xd7:键=0; 中断;情况 0xb7 :键=11; 中断;情况 0x77:键=12; 中断; while(temp!=0xf0)temp=P3;temp=temp&0xf0; if(key=12) L1602_string(1,i+,+); e=+; A=f(ss,b); b = 0; if(key=11) L1602_string(1,i+,=); e=;

27.A=f(ss,b); b = 0; if(key=11) /= H=f(ss,b);b=0;switch(e)case +: 结果=A+H; 打破;案例-:结果= AH; 中断;情况*:结果=A*H; 中断;情况/:结果=A/H; 休息; 默认:结果=H; L1602_string(1,i+,=); 显示(结果);if(key=10) /clear wcmd(0x01);wcmd(0x80);b=0;i=1;k=1; if(key=0) L1602_char(1,i,key + 48); i+;ssb=键;b+;Delay_1ms(300); void main() /主函数L1602_init();while(1)keyscan();

单片机

蓝莓树如何种植树苗?蓝莓树苗的种植方法有哪些?

2024-4-7 18:04:32

单片机

树莓阅读免费版一款阅读软件,说明你会喜欢上它

2024-4-7 19:02:52

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索