《简易计算器单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《简易计算器单片机课程设计报告.docx(31页珍藏版)》请在三一办公上搜索。
1、简易计算器单片机课程设计报告目录一、概述2二、实验内容3三、硬件设计31 设计总体框图32 实际电路4(1)复位电路4(2)时钟电路5(3)EA/VPP(31脚)的功能和接法6(4)键盘输入电路6(5)数码管显示电路7四、软件设计91 程序内容92 C语言程序9五、Protues仿真9六、设计总结10七、附录111 C语言程序:112焊接电路板实物图193 芯片引脚图19一、概述单片机课程设计是一门实践课程,要求学生具有制作调试单片机最小系统及外设的能力,能够掌握单片机内部资源的使用。单片机课程设计内容包括硬件设计、制作及软件编写、调试,学生在熟练掌握焊接技术的基础上,能熟练使用单片机软件开发
2、环境Keil C51编程调试,并使用STC ISP调试工具采用串口下载方式联调制作的单片机最小系统。单片机课程设计题目包含基本部分及扩展部分,基本部分即单片机最小系统部分,扩展部分是对单片机内部资源及外部IO口的功能扩展,使制作的单片机系统具有一定的功能。二、实验内容自制一个单片机最小系统,包括串口下载、复位电路,采用外部小键盘输入数据,能够实现加法、乘法及一个科学计算,计算结果显示在四位一体的数码管上。三、硬件设计1 设计总体框图2 实际电路(1)复位电路在单片机系统中,复位电路是非常关键的,当程序跑飞(运行不正常)或死机(停止运行)时,就需要进行复位。MCS-5l 系列单片机的复位引脚RS
3、T( 第9 管脚) 出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST 持续为高电平,单片机就处于循环复位状态。复位操作通常有两种基本形式:上电自动复位和开关复位。上电瞬间,电容两端电压不能突变,此时电容的负极和RESET 相连,电压全部加在了电阻上,RESET 的输入为高,芯片被复位。随之+5V电源给电容充电,电阻上的电压逐渐减小,最后约等于0,芯片正常工作。并联在电容的两端为复位按键,当复位按键没有被按下的时候电路实现上电复位,在芯片正常工作后,通过按下按键使RST管脚出现高电平达到手动复位的效果。一般来说,只要RST 管脚上保持10ms 以上的高电平,就能使单片机有效的复位
4、。本次课程设计选用开关复位电路,设计如下:(2)时钟电路XTAL1(19 脚) :芯片内部振荡电路输入端。XTAL2(18 脚) :芯片内部振荡电路输出端。XTAL1 和XTAL2 是独立的输入和输出反相放大器,它们可以被配置为使用石英晶振的片内振荡器,或者是器件直接由外部时钟驱动。本次课程设计采用的是内时钟模式,即采用利用芯片内部的振荡电路,在XTAL1、XTAL2 的引脚上外接定时元件(一个石英晶体和两个电容),内部振荡器便能产生自激振荡。一般来说晶振可以在1.2 12MHz 之间任选,甚至可以达到24MHz 或者更高,但是频率越高功耗也就越大。在本次课程设计采用的11.0592M 的石英
5、晶振。和晶振并联的两个电容的大小对振荡频率有微小影响,可以起到频率微调作用。当采用石英晶振时,电容可以在20 40pF 之间选择(本实验套件使用30pF);当采用陶瓷谐振器件时,电容要适当地增大一些,在30 50pF 之间。通常选取33pF 的陶瓷电容就可以了。具体电路如下:(3)EA/VPP(31脚)的功能和接法51 单片机的EA/VPP(31 脚) 是内部和外部程序存储器的选择管脚。当EA 保持高电平时,单片机访问内部程序存储器;当EA 保持低电平时,则不管是否有内部程序存储器,只访问外部存储器。对于现今的绝大部分单片机来说,其内部的程序存储器(一般为flash)容量都很大,因此基本上不需
6、要外接程序存储器,而是直接使用内部的存储器。 在本实验套件中,EA 管脚接到了VCC 上,只使用内部的程序存储器。(4)键盘输入电路在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。由于本次实验是制作简易计算器,按键需求较多,所
7、以输入设备选择为一个矩阵键盘,具体电路设计如下:(5)数码管显示电路数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码
8、管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。本次课程设计采用共阴数码管作为显示设备,驱动芯片采用3态8位缓冲器芯片,具体型号为SN74LS244N,位选采用4个NPN三极管驱动,具体型号为S9013,具体电路如下:四、软件设计1 程序内容本次课程设计的程序包括:主程序(实现乘法,加法,科学计算等),延时子程序,键盘扫描子程序,数码管显示子程序。2 C语言程序见附录五、Protues仿真具体仿真图如下:需要说明的是,本次仿真主要检验程序是否正确,所以省去了复位电路,晶振电路,电源电路等。
9、因为在仿真中这些电路没有不会影响程序的运行。这样可以节省时间,避免做些无用功,同时电路看起来更简洁,更易理解,把最关键的与程序有关的电路连接凸显出来。六、设计总结在本次课程设计中我体会最深刻的就是“理想是丰满的,现实是残酷的”。平常在学习中,我们只学习了书本上理论的知识,知道原理。具体做起实物来问题百出!在这次实验中,困扰我很深的是数码管的显示问题,一直想用三极管来进行位选,实现动态显示,但是电路连接好后三极管基极只要给一点电压(大约超过0.7V左右),集电极和发射极就导通,从而导致数码管一直导通,显示出数字8,不受程序控制。刚出现这个问题的时候,我一直没找出是软件还是硬件问题。直到用万用表测
10、出基极电压才找出问题。但是我换了基极电阻的大小,最后还是没有没有解决问题。最后我改变了硬件电路连接,决定直接把位选接到P2口,这样虽然亮度没有原来的强,但是由于有驱动芯片,亮度还是比较满意,可以满足要求。这样就解决了之前的问题。在整个课程设计过程中,还遇到了其他的小问题,在这里不一一赘述了。这次课程设计题目看起来简单,但还是从中学到了些有用的东西。尤其要感谢老师的严格要求,这样加强了我把这次课程设计做好的动力。七、附录1 C语言程序:#include /52系列单片机头文件#include#include #define uchar unsigned char#define uint unsi
11、gned int#define cheng0#define jia1#define kaifang 2sbit wei1=P30; /定义4个位选端口sbit wei2=P31;sbit wei3=P32;sbit wei4=P33; uchar code table= /数码管编码0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint);void display(uint shi);uchar keyboard();uchar key_ok=0;ucha
12、r num_key=0;/按键号 uchar count=0;/按键有效标识 void main()uint a=0,num1=0,num2=0,num3=0,num_count=1;char fuhao=0;/while(1)display(456);while(1) a=keyboard();if(key_ok=1)key_ok=0;if(count=1&a10)if(num_count=1)num1=a*1;else num2=a*1;if(num_count=3) num_count=1;else if(a10)if(num_count=1) num1=num1*10+a;else n
13、um2=num2*10+a;if(a=11)count=0;fuhao=cheng;if(num_count=3)num1=num3;num_count=2;else if(a=12)count=0;fuhao=jia;if(num_count=3)num1=num3;num_count=2;else if(a=13)count=0;fuhao=kaifang;if(num_count=3)num1=num3; if(fuhao=kaifang)num3=sqrt(num1);num1=0;num2=0;num_count=3;else if(a=16)count=0;if(fuhao=che
14、ng)num3=num1*num2;else if(fuhao=jia)num3=num1+num2;num1=0;num2=0;num_count=3; if(num_count=1) display(num1);else if(num_count=2)display(num2);else if(num_count=3)display(num3); void delayms(int t)int x,y;for(x=0;xt;x+)for(y=0;y=10)P1=tableshi;P3=0xfB;delayms(2);P3=0xfF;delayms(3);if(a=100)P1=tableba
15、i;P3=0xfD;delayms(2);P3=0xff;delayms(3);if(a=1000)P1=tableqian;P3=0xfE;delayms(2);P3=0xfF;delayms(3);/*不完善的显示判断程序,不如上面的好if(a=1000)P3=0xf0;P1=tableqian;/wei1=1;P3=0xf8;delayms(5);P3=0xf0;P1=tablebai;/wei2=1;P3=0xf4;delayms(5);P3=0xf0;P1=tableshi;/wei3=1;P3=0xf2;delayms(5);P3=0xf0;P1=tablege;/wei4=1;P
16、3=0XF1;delayms(5);else if(a=100)wei1=0;P1=tablebai;wei2=1;delayms(5);wei2=0;P1=tableshi;wei3=1;delayms(5);wei3=0;P1=tablege;wei4=1;delayms(5);else if(a=10)wei2=0;P1=tableshi;wei3=1;delayms(5);wei3=0;P1=tablege;wei4=1;delayms(5);else wei3=0;P1=tablege;wei4=1;delayms(5);*/矩阵键盘.无按键动作时其返回值num_key=0,否则返回
17、按键号num_key*检测高四位 unsigned char keyboard() / unsigned char num_key=0;/按键号 unsigned char temp=0;/读取P2口线数据 static unsigned char temp_code=0;/用于保存按键值 static unsigned char temp_circle=0xFE;/保存P2线上的循环扫描值 static unsigned char num_check=0;/低电平计数 static unsigned char key_flag=0;/按键有效标识 P2=temp_circle;/0xFX t
18、emp=P2;/读取P2口线数据 if(temp!=temp_circle)/有按键动作 num_check+;/低电平计数|逢低电平加1 if(num_check=5)/连续10次(10ms)低电平有效 key_flag=1;/按键有效标识置1 temp_code=temp;/保存按键值 else/松手OR无按键动作,此时应该改变扫描线 num_check=0; if(key_flag=1)/按键有效判断 key_flag=0; count+;key_ok=1; switch(temp_code)/读取按键号 /P20线 case 0xEE: num_key=4; break; case 0
19、xDE: num_key=3; break; case 0xBE: num_key=2; break; case 0x7E: num_key=1; break; /P21线 case 0xED: num_key=8; break; case 0xDD: num_key=7; break; case 0xBD: num_key=6; break; case 0x7D: num_key=5; break; /P22线 case 0xEB: num_key=12; break; case 0xDB: num_key=11; break; case 0xBB: num_key=0; break; ca
20、se 0x7B: num_key=9; break; /P23线 case 0xE7: num_key=16; break; case 0xD7: num_key=15; break; case 0xB7: num_key=14; break; case 0x77: num_key=13; break; temp_circle=_crol_(temp_circle,1);/改变扫描线 if(temp_circle=0xEF) temp_circle=0xFE; return(num_key);/返回按键号 2焊接电路板实物图3 芯片引脚图51单片机引脚图:74ls244和74ls245引脚图: 四位一体共阴数码管引脚图: