信息与电气工程学院
课程设计说明书
(2011/2012学年第 二学期)
课程名称 : 单片机课程设计 题 目 : 简易计算器的设计 专业班级 : 学生姓名 : 学 号: 指导教师 :
设计周数 : 两周 设计成绩 :
2012年 6 月 21 日
目 录
1、课程设计目的……………………………………………………………………3 2、课程设计正文……………………………………………………………………3 2.1、设计所需器材…………………………………………………………………3 2.2、设计任务和要求………………………………………………………………3 2.3、设计方案………………………………………………………………………4
2.3.1、硬件设计…………………………………………………………………4
1.STC90C52AD说明…………………………………………………………4 2.数码管说明………………………………………………………………4
3.晶体振荡电路设计………………………………………………………6
4.数码管和位选设计………………………………………………………6 5. 复位设计……………………………………………………………… 7 6.蜂鸣器电路设计……………………………………………………… 8 7.矩阵键盘的设计…………………………………………………………8
2.3.2、软件设计…………………………………………………………………9
2.4、软硬件调试……………………………………………………………………14 3、课程设计总结……………………………………………………………………14 4、参考文献…………………………………………………………………………15 附录一、系统原理图…………………………………………………………………16 附录二、PCB图………………………………………………………………………17 课程设计评语及成绩…………………………………………………………………18
2
一、课程设计目的
1.熟悉和掌握单片机的结构及工作原理。
2.掌握单片机的接口技术及相关外围芯片的外特性及控制方法。
3.通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解表关电路参数的计算方法。
4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
5.通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应打下基础。 二、课程设计正文 2.1 设计所需器材
电阻: 1K (8个) 0.330k(8个) 10k(1个) 按键开关:16个 极性电容(1个 10uf) 非极性电容:30pf(5个) 晶振:6MHZ(1个)
三极管:PNP(1个) NPN(2个) 共阴极数码管:2个 蜂鸣器:1个
底座:DIP40(1个)DIP16(1个) 万能电路板:1个
芯片:STC90C52AD(1片) MAX232(1片) ,74HC573(片) 发光二极管:3个 接线端子:1个 2.2 设计任务和要求
课程设计任务要求做一个简易数字计算器。设计的主要内容是采用STC90C51AD作为控制单元,实现简易计算器功能。
原始数据及主要任务:设计一个以MCS-51单片机为核心的简易计算器系统。能够进行5以内的数字简单的加,减,乘,除运算,用2个数码管显示运算结果。若进行除法运算,则小数点保留1位显示。如果除数为0,则清0显示,且蜂鸣器响,当按下任意键后,
3
蜂鸣器停止。
主要任务:
(1)确定总体设计方案;
(2)2位数码管显示电路设计,4*4按键电路设计,报警电路设计; (3)设计硬件电路原理图和PCB图,绘制软件程序流程图,编写程序; (4)软硬件联机调试。
技术要求:以MCS-51单片机为核心,主机用P1口接4*4矩阵按键;P0口用作数码管段码接口,P2端口用作数码管位码选通接口和蜂鸣器电路接口。
2.3设计方案
简易数字计算器设计,主要的部分是STC90C52AD,编写程序,实现软硬结合,能够进行5以内的数字简单的加,减,乘,除运算,且具备清零功能。6个数字键,6个功能键。进行除法运算时,小数点保留1位显示。如果除数为0,则清0显示,蜂鸣器响,当按下任意键后,蜂鸣器停止。可扩展计算连续功能,数据溢出清0显示,蜂鸣器响,按下任意键后,蜂鸣器停止。
2.3.1硬件设计 1.STC90C52AD说明
4
AT89C51的引说明和功能说明如下:
XTAL1 :接外部晶振的一个引脚。在单片机内部,它是一反相放大器输入端,这个放大器构成了片内振荡器。它采用外部振荡器时,些引脚应接地。
XTAL2 :接外部晶振的一个引脚。在片内接至振荡器的反相放大器输出端和内部时钟发生器输入端。当采用外部振荡器时,则此引脚接外部振荡信号的输入。
RST :STC90C52AD的复位信号输入引脚,高电位工作,当要对芯片又时,只要将此引脚电位提升到高电位,并持续两个机器周期以上的时间,AT89C51便能完成系统复位的各项工作,使得内部特殊功能寄存器的内容均被设成已知状态。
P0口(P0.0~P0.7)是一个8位漏极开路双向输入输出端口,当访问外部数据时,它是地址总线(低8位)和数据总线复用。外部不扩展而单片应用时,则作一般双向I/O口用。P0口每一个引脚可以推动8个LSTTL负载。
P2口(P2.0~P2.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),当访问外部程序存储器时,它是高8位地址。外部不扩展而单片应用时,则作一般双向I/O口用。每一个引脚可以推动4个LSTL负载。
P1口(P1.0~P1.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),其输出可以推动4个LSTTL负载。仅供用户作为输入输出用的端口。
P3口(P3.0~P3.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),它还提供特殊功能,包括串行通信、外部中断控制、计时计数控制及外部随机存储器内容的读取或写入控制等功能。
2.数码管
LED显示器由8段发光二极管组成,排列成8字形状,称为8段LED显示器,器件内部接线图如图所示:
为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字0~9的共阴极字形代码如下表:
5
显示字符 段码
3.晶体振荡电路设计
0 3FH 1 06H 2 5BH 3 4FH 4 66H 5 6DH + 70H - 40H * 76H / 49H
图2.3-2 晶体振荡电路
采用6MHZ的晶振,接在芯片的18,19引脚上。在复位端口加低电平。 4.数码管和位选设计
6
图2.3-3 数码管和位选电路
需要显示时间选用共阴极的数码管是三极管驱动,接有1000欧姆的保护电阻而成的两个数码管在显示时需要选通,采用STC90C52AD的P0口作为位选信号的输出端,高电平有效。由于P0口有8个输出端,当端口为高电平使对应的数码管选通。共阴极的数码管是低电平有效,所以采用NPN的三极管。
7
5. 复位设计
复位键直接加在单片机的复位端,当按键S1被按下时,系统复位。
图2.3-4 复位电路
6.蜂鸣器电路设计
图2.3-5 蜂鸣器电路
蜂鸣器接在P3.5口上,当触发时P3.5产生低电平使其导通,蜂鸣器响,报警。
7.矩阵键盘的设计
8
图2.3-6 矩阵键盘
开关接在P1口上,P1.0~P1.7,按键按下后相应的按键由高电平变为低电平,P1.0~P1.3为行。
2.3.2软件设计 系统程序: #include code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x3e,0x76,0x40,0x76,0x49}; // 0 1 2 3 4 5 6 7 8 9 + - * / int flag,num1,num2,num3,num4,key1,key2,xianshi,result,num,temp; int t1; uint frq; /**********延时函数***************/ void delay(unsigned char ms) { unsigned char i; 9 } while(ms--) { } for(i = 0; i < 120; i++); void inter_init() { } /**********结果显示判断***************/ void panduan() { int i; if(flag==1) { } 10 TMOD = 0x01; frq = 0x00; TH0 = 0x00; TL0 = 0xff; IE = 0x82; TR0=1; //工作方式1,定时器0 flag=0; for(i=0;i<10000;i++) SPK=~SPK; if((key1%2==0)||(key2%2==0)) {result=num1+num2;} if((key1%2!=0)||(key2%2!=0)) {result=num3+num4;} xianshi=result; } /**********按键扫描***************/ uchar keyscan() { P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe7: { key1++; num1=1; num2=1; xianshi=num1; if(num==11) { num3=1; num4=3; xianshi=num2; 11 //带返回值函数 //开始扫描第一行键 } } } } break; case 0xd7: { } break; key2++; num1=3; num2=3; xianshi=num1; if(num==11) { } num3=1; num4=3; xianshi=num2; while(temp!=0xf0) } { } temp=P1; //松手检测 temp=temp&0xf0; P1=0xfb; temp=P1; //开始扫描第二行键 temp=temp&0xf0; while(temp!=0xf0) { 12 } return xianshi; delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xeb: { num=11; xianshi=num; } break; case 0xdb: { num=8; flag=1; } break; } while(temp!=0xf0) //松手检测 { temp=P1; temp=temp&0xf0; } } //得到返回值 13 } /*****************主函数********************/ void main() { } /*****************中断********************/ void timer0() interrupt 1 using 1 { } 2.4、软硬件调试 系统调试:根据系统设计方案,本系统的调试共分为两大部分:硬件调试,软件调试。 (1)硬件调试 对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。首先用数字万用表对实物板上的各元器件进行测试,在测试过程中,检验出一些错误,如数码管的引脚接错了,导致数码管无法显示,将数码管各引脚正确焊接后,数码管正常工作。 14 P2=0x01; num=16; inter_init(); while(1) { } //数码管位选 xianshi=keyscan(); panduan(); P0=table[xianshi]; TH0 = 0xfe; TL0 = frq; (2)软件调试 软件调试采用单片机仿真器keil uVision及protus,将编好的程序进行调试,主要是检查语法错误。再进行仿真,检验各个子程序是否正确执行,和硬件模块的协调性。由于能力有限,程序中仍然存在如下BUG,不能进行连续除法,尚未实现加减法和乘除法之间的混合运算,错误报警后按运算符号键结束警报 三、课程设计总结 回顾起此次单片机课程设计,我感慨颇多,从选题到定稿,从理论到实践,在接近两个星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好…… 通过这次课程设计之后,一定把以前所学过的知识重新温故。 这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在岑毅南老师的辛勤指导下,终于得到解决。同时,在岑毅南老师那里我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! 四.参考文献 [1]张毅刚.单片机原理及应用.高等教育出版社,2003 [2]苏家键等.单片机原理及应用技术.北京:高等教育出版社,2004 [3]钟睿.MCS-51 单片机原理及应用开发技术.北京:中国铁道出版社,2006 [4]范蟠果.工控单片机原理及应用.北京:清华大学出版社,2007 15 附录一、系统原理图 16 附录二、PCB图 17 课程设计评语及成绩 课程设计 评 语 课程设计 成 绩 指导教师 (签字) 年 月 日 18 因篇幅问题不能全部显示,请点此查看更多更全内容