
课程设计说明书
(2010 /2011 学年第 2 学期)
课程名称 : 单片机课程设计
题 目 : 答辩用计时器设计
专业班级 :
学生姓名 :
学 号:
指导教师 :
设计周数 : 2周
设计成绩 :
2011年 7 月 7 日
一、课程设计的目的
1.1 目的:
(1) 了解倒计时计时器的原理,从而学会制作答辩用计时器。
(2) 通过答辩用计时器的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及使用方法。
(3) 学习与掌握各种组合逻辑电路与时序电路的原理与使用方法。
1.2 注意事项:
(1) 实验开始前,应先检查本组的仪器设备是否齐全完备,了解设备使用方法及线路板的组成和接线要求。
(2) 实验时每组同学应分工协作,轮流接线、记录、操作等,使每个同学受到全面训练。
(3) 接线前应将仪器设备合理布置,然后按电路图接线。实验电路走线、布线应简洁明了、便于测量。
(4) 完成实验系统接线后,必须进行复查,按电路逐项检查各仪表、设备、元器件的位置、极性等是否正确。确定无误后,方可通电进行实验。
(5) 实验中严格遵循操作规程,改接线路和拆线一定要在断电的情况下进行。绝对不允许带电操作。如发现异常声、味或其它事故情况,应立即切断电源,报告指导教师检查处理。
(6) 测量数据或观察现象要认真细致,实事求是。使用仪器仪表要符合操作规程,切勿乱调旋钮、档位。注意仪表的正确读数。
(7) 未经许可,不得动用其它组的仪器设备或工具等物。
(8) 实验结束后,实验记录交指导教师查看并认为无误后,方可拆除线路。最后,应清理实验桌面,清点仪器设备。
(9) 爱护公物,发生仪器设备等损坏事故时,应及时报告指导教师,按有关实验管理规定处理。
(10) 自觉遵守学校和实验室管理的其它有关规定。
二、课程设计正文
2.1技术要求:
(1)四位数码管用于显示分十位、分个位;秒十位,秒个位;(2)调节键、加1建、减1建、开始键;(3)蜂鸣器及红色发光二极管。要求;上电时,显示为10:00,一旦运行开始,蜂鸣器不响,发光二极管不亮。经过一秒刷新数据,仅有“开始”键有效。根据“调节”键按下的次数,分别用于调整分十位、分个位、秒十位。按下“加1”或“减1”键是针对具体调节对象进行数据修改。奇数次按下“开始”键,从当前显示数据开始倒计时,偶数次按下“开始”键,暂停计时,且保持显示数据不变。当定时结束时,以一定频率驱动蜂鸣器,并使发光二极管发光。
2.2 器件清单:
| 序号 | 名称 | 型号与规格 | 数量 |
| 1 | 七段数码管 | LM3914 | 4 |
| 2 | 发光二极管 | LED | 1 |
| 3 | 电容 | 30pF | 2 |
| 4 | 电容 | 10uF | 1 |
| 5 | 开关按钮 | 4 | |
| 6 | 电阻 | 300 | 7 |
| 7 | 电阻 | 4.7K | 14 |
| 8 | 电阻 | 10K | 1 |
| 9 | 电阻 | 1K | 1 |
| 10 | 译码器 | CD4511 | 1 |
| 11 | 三极管 | 9013 | 5 |
| 12 | 蜂鸣器 | 1 |
(1)CD4511
CD4511是一组用来驱动共阴极LED七段显示器,起译码作用。其引脚图:
其各引脚功能如下:
LT:做灯泡测试用,当LT=0,则不论其它输入状态为何,其输出abcdefg=1111111,使七段显示器全亮,即显示8,以便观测七段显示器是否正常。当LT=1,则正常解码。
BI:空白输入控制,当BI=0 (LT 为1 时),则不论DCBA 之输入为何,其输出abcdefg皆为0,即七段显示器完全不亮,此脚可供使用者控制仅对有效数据译码,避免在无意义的数据输入时显示出来造成字型的系乱。
LE:数据栓锁致能控制;在CD4511 中,不但具译码功能,更具有数据栓锁的记忆功能。当LE=0 时(LT=1 且 BI=1),DCBA 数据会被送入IC 的缓存器中保存,以供译码器码;当LE=1 时,则IC 中的暂存器会关闭,仅保存原来在LE=0 时的DCBA数据供译码器译码。换句话说当LE=1 时,不论DCBA 的输入数据为何,皆不影响其输出,其输出abcdefg 仍保留原来在LE 由0转为1以前的资料。
(2)STC90C52AD
STC90C52AD是由宏晶公司生产的高性能八位单片机。如图所示。该芯片采用FLASH存储技术,内部具有8KB字节快闪存存储器,采用DIP封装,是目前在中小系统中应用最为普及的单片机。
STC90C52AD可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。只要程序长度小于8K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需10毫秒,仅为8751/87C51的擦除时间的百分之一,与8751/87C51的12V电压擦写相比,不易损坏器件,没有两种电源的要求,改写时不拔下芯片,适合许多嵌入式控制领域。工作电压范围(2.7V~6V),全静态工作,工作频率宽在0Hz~24MHz之间,比8751/87C51等51系列的6MHz~12MHz更具有灵活性,系统能快能慢。STC90C52AD芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制。P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。
STC90C52AD单片机为40引脚芯片如图所示,在本设计中,主要用到P1口、P2口、P3口。
P0口可作为通用I/O口,但须外接上拉电阻,所以在设计显示数码管我们避免了使用P0口这样大大简化了动态显示电路。
P1口:8位、双向I/0口,内部含有上拉电阻。
P1口可作普通I/O口。输出缓冲器可驱动四个TTL负载;用作输入时,先将引脚置1,由片内上拉电阻将其抬到高电平。P1口的引脚可由外部负载拉到低电平,通过上拉电阻提供电流。
在FLASH并行编程和校验时,P1口可输入低字节地址。在串行编程和效验时,P1.5/MO-SI,P1.6/MISO和P1.7/SCK分别是串行数据输入、输出和移位脉冲引脚。
P2口:具有内部上拉电阻的8位双向I/O口。
P2口用做输出口时,可驱动4各TTL负载;用做输入口时,先将引脚置1,由内部上拉电阻将其提高到高电平。若负载为低电平,则通过内部上拉电阻向外部输出电流。
在FLASH并行编程和校验时,P2口可输入高字节地址和某些控制信号。
P3口:具有内部上拉电阻的8位双向口。
P3口用做输出口时,输出缓冲器可吸收4各TTL的灌电流;用做输入口时,首先将引脚置1,由内部上拉电阻抬位高电平。若外部的负载是低电平,则通过内部上拉电阻向输出电流。在本设计中,P3口作为时间设置的4按键输入,因为有上拉电阻,所以可以通过按键直接接地,简化了电路。
单片机使用宏晶公司支持串口下载程序(ISP)的单片机,为STC90C52AD课程设计配发的小电路板(ISP-MCU Basic circuit)电路原理图见下图。该板作为课程设计的核心电路板使用,板上有单片机及附属电路,RS-232通信驱动电路,高低电平测试电路等。课程设计电路中需要的其他电路在此基础上扩展,通过插孔连接。课程设计配发的小电路板(ISP-MCU Basic circuit)电路原理图见下图。
扩展电路用到得器件:4个按键,一个是调节键,一个是加键,一个是减键,一个是开始键;四个共阴极动态LED数码管;五个NPN三极管;7个300欧姆、1个10千欧、1个1千欧、14个4.7千欧的电阻;导线;一个CD4511进行译码;发光二极管一个、蜂鸣器一个。
每各引脚可吸收8各TTL的灌电流。作为输入时,首先应将引脚置1。P0也可用做访问外部程序存储器和数据存储器时的低8位地址/数据总线的复用线。在该模式下,P0口含有内部上拉电阻。在FLASH编程时,P0口接收代码字节数据;在编程效验时,P0口输出代码字节数据(需要外接上拉电阻)。
(3)数码管:
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。本次设计用的是共阴数码管。但由于共阴极数码管没有驱动亮度不够,所以联接了上拉电阻以增大电流来提高亮度,增强效果。
(4)动态显示驱动
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
2.4 各模块功能
2.4.1 LED和蜂鸣器模块
因为课题要求定时结束时LED蜂鸣器同时工作来声光报警,这样就可以把它们并联到一起,鉴于单片机P3口带负载能力有限,我们选择了NPN三极管9013作为驱动,同时又为了给LED限流,我们又串入了电阻,这样可以达到理想的结果。 模块电路如右图2-4-1所示
图2-4-1
2-4-2 键盘部分
键盘部分如图,摁下后低电平读入p2口,接上拉
图2-4-2 电阻,确护芯片正常工作,控制电流的大小。
2-4-3数码显示部分
如图为共阴极七段数码管显示模块,使用CD4511进行驱动,通过限流电阻后与CD4511相连,经过CD4511译码来控制各个数码管的工作。三极管NPN发射集接地,基极接限流电阻,集电极接数码管公共端,通过高低电平控制晶体管的导通来控制数码管的点亮与熄灭。
图2-4-3
2.5 程序:
#include #define uchar unsigned char #define uint unsigned int sbit k1=P2^7; //调节键 sbit k2=P2^6; //加键 sbit k3=P2^5; //减键 sbit k4=P2^4; //开始键 sbit d1=P3^6; //控制灯和蜂鸣器 uchar n=0,m=10,s=0,t=0,tt=0; bit ok=0,flag=0,sta=0; //显示部分 void delay() { uchar i,j; for(i=3;i>0;i--) for(j=50;j>0;j--); } void led(uchar i,uchar j) { uchar k; uchar wei[4]={0x08,0x04,0x02,0x01}; //位选 uchar table[4]={0,0,0,0}; //保存显示的数据 table[0]=i/10; table[1]=i%10; table[2]=j/10; table[3]=j%10; for(k=0;k<4;k++) { P1=table[k]; P2|=wei[k]; delay(); P2&=0xf0; } } //按键部分 void delay1() { uchar i,j; for(i=20;i>0;i--) for(j=50;j>0;j--); } bit key_adj() { bit i=0; if(k1==0) { delay1(); if(k1==0) { i=1; while(!k1) led(m,s); } } return i; } bit key_add() { bit i=0; if(k2==0) { delay1(); if(k2==0) { i=1; while(!k2) led(m,s); } } return i; } bit key_sub() { bit i=0; if(k3==0) { delay1(); if(k3==0) { i=1; while(!k3) led(m,s); } } return i; } bit key_sta() { bit i=0; if(k4==0) { delay1(); if(k4==0) { i=1; while(!k4) led(m,s); } } return i; } //调时部分 void adjust() { bit a,b,c,d; a=key_adj(); b=key_add(); c=key_sub(); d=key_sta(); if(!sta) { if(a) //调节键 { n++; flag=0; if(n==4) n=0; } if((b)&&(n>0)) //加键 { switch(n) { case 1: m+=10;if((m/10)==10) m=m%10;break; case 2: m++;if((m%10)==0) m=((m-1)/10)*10;break; case 3: s+=10;if((s/10)==6) s=s%10;break; } } if((c)&&(n>0)) //减键 { switch(n) { case 1: if(m<10) m+=100;m-=10;break; case 2: if(m%10==0) m+=10;m--;break; case 3: if(s<10) s+=60;s-=10;break; } } } if(d) { ok=!ok; n=0; sta=1; } } //计时部分 void counter() { if(ok) { TR0=1; } else { TR0=0; } if(t==10) { t=0; s--; } if(s==255) { s=59; m--; } if((m==0)&&(s==0)&&(sta)) { TR0=0; flag=1; //蜂鸣器鸣响标志 ok=0; sta=0; } if(flag) { TR1=1; } else { TR1=0; //关灯与蜂鸣器 d1=0; } } //时间基准定时器 void timer0_init() { TMOD=0X01; TH0=(65536-50000)>>8; TL0=(65536-50000)&0xff; ET0=1; EA=1; } //控制蜂鸣器和灯闪烁定时器 void timer1_init() { TMOD|=0X10; TH1=(65536-50000)>>8; TL1=(65536-50000)&0XFF; ET1=1; EA=1; } void main() { d1=0; timer0_init(); timer1_init(); while(1) { adjust(); counter(); led(m,s); } } void timer0() interrupt 1 //计时 { TH0=(65536-50000)>>8; TL0=(65536-50000)&0xff; t++; } void timer1() interrupt 3 //控制蜂鸣器和灯 { TH1=(65536-50000)>>8; TL1=(65536-50000)&0XFF; tt++; if(tt==5) { d1=!d1; } if(tt==10) { d1=!d1; tt=0; } } 2.6 系统调试 静态调试:是在用户系统未工作时的一种硬件检测。 第一步:目测。检查外部的各种元件或者是电路是否有断点。 第二步:用万用表测试。先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。 第三步:加电检测。给板加电,检测所有插座或是器件的电源端是否符合要求的值 第四步:联机检查。因为只有用单片机开发系统才能完成对用户系统的调试。 动态调试:是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。动态调试的一般方法是由近及远、由分到合。由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。由分到合的调试既告完成。由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。调试时,采用去掉无关元件的方法,逐层调试下去,就定位故障元件了。 软件调试:是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。 可以利用仿真器加以调试,对系统单个单元进行调试,当单元电路成功后,在对整个程序调试,最后在用CPU芯片调试。 2.7原理图 三、心得体会 通过两周的设计学习,让我了解了设计电路的程序,以及答辩用计时器的原理与设计。同时在软件设计编程上,让我了解到很多编程方面的技巧,并且使我对单片机的各个引脚的功能有更深入的了解,巩固了单片机的书面知识,发现了以往在学习中忽视的东西,明白了在实际的设计工作中只有书面知识是不足的,只有在自己的实践中才能发现问题并解决问题,从而不再犯眼高手低的错误。 在此次的过答辩用计时器设计程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。在设计电路中,是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,要学会自己检查。总的来说,通过这次的设计实验更进一步地增强了实验的动手能力,提高组成系统、编程、调试的动手能力,也提高了我们的合作能力。而且在此次设计中,我了解到了团队合作的重要性,对以后步入社会积累了很好的经验。 四、参考文献 [1]张毅刚.单片机原理与应用.定时期/计数器的编程和应用.北京:高等教育出版社.2006.6(4) 133~135 [2]彭为,黄科,雷道仲.单片机典型系统设计实例精讲.北京:电子工业出版社.2006.5(3,4)248~268 [3],秦永左. 单片机原理及应用.北京:中国林业出版社,2006.9 [4]李建忠.单片机原理及应用. 西安:西安电子科技大学出版社,2002 [5]王幸之,钟爱琴,王雷,王闪. AT系列单片机原理与接口技术. 北京:北京航空航天大学出版社,2004 课程设计 成 绩 (签字) 年 月 日评 语 课程设计 指导教师
