1、河北工程大学单片机课程设计报告目 录一、课程设计目的2二、课程设计内容22.1方案设计 22.1.1 STC90C52AD的功能参数介绍 2 2.1.2 综合电路设计 42.2单元电路设计52.2.1电源供电单元 52.2.2动态显示驱动设计 52.2.3 时钟产生单元 6 2.2.4 串口驱动电路单元 72.2.5 蜂鸣器电路单元 72.2.6动态显示控制电路单元 72.2.7 按键电路单元 72.2.8 译码单元 72.3系统调试82.4系统分析92.5系统设计9 2.5.1程序流程图92.6系统实施92.7 C语言程序10 三、个人心得体会及总结19四、参考文献20 附录一、系统原理图附
2、录二、PCB图附录三、课程设计评语及成绩 带提醒功能的时钟单片机设计1、课程设计目的1.1用单片机课程及已学电子电路知识设计一简易时钟显示装置,包括电路图的设计和制版等。 1.2通过课程设计加深对单片机课程的相关知识的学习和理解。1.3初步学会一些设计思想和实践技能。提高学生综合素质。1.4让学生从设计过程中领悟到相互合作的重要性。2、课程设计内容2.1方案设计2.1.1 STC90C52AD的功能参数介绍STC90C52AD是由宏晶公司生产的高性能八位单片机。如图一所示。该芯片采用FLASH存储技术,内部具有8KB字节快闪存存储器,采用DIP封装,是目前在中小系统中应用最为普及的单片机。 S
3、TC90C52AD可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。只要程序长度小于8K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需10毫秒,仅为8751/87C51的擦除时间的百分之一,与8751/87C51的12V电压擦写相比, 不易损坏器件,没有两种电源的要求,改写时不拔下芯片, 图一适合许多嵌入式控制领域。工作电压范围(2.7V6V),全静态工作,工作频率宽在0Hz24MHz之间,比8751/87C51等51系列的6MHz12MHz更具有灵活性,系统能快能慢。STC90C52AD芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手
4、段,能完全保证程序或系统不被仿制。P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。STC90C52AD单片机为40引脚芯片如图一所示,在本设计中,主要用到P0口、P2口、P1.0口及P3.0、P3.1、P3.2口。P0口可作为通用I/O口,但须外接上拉电阻,所以在设计显示数码管我们避免了使用P0口这样大大简化了动态显示电路。P1口:8位、双向I/0口,内部含有上拉电阻。P1口可作普通I/O口。输出缓冲器可驱动四个TTL负载;用作输入时,先将引脚置1,由片内上拉电阻将其抬到高电平。P1口的引脚可由外部负载拉到低电平,通过上拉电阻提供电流。在FLASH并行编程和
5、校验时,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,由内部上拉电阻抬位高电平。若外部的负载是低电平,则通过内部上
6、拉电阻向输出电流。在本设计中,P3口作为时间设置的4按键输入,因为有上拉电阻,所以可以通过按键直接接地,简化了电路。在与FLASH并行编程和校验时,P3口可输入某些控制信号。P3口除了通用I/O口功能外,还有替代功能如表1所示。表1 P3口的第二功能端口引脚各个功能P3.0RXD(串行口输入端)P3.1TXD(串行口输出端)P3.2INT0(外部中断0请求输入端,低电平有效)P3.3INT1(外部中断1请求输入端,低电平有效)P3.4T0(定时/计数器0计数脉冲输入端)P3.5T1(定时/计数器1计数脉冲输入端)P3.6WR(外部数据存储器写选通信号输出端,低电平有效)P3.7RD(外部数据存
7、储器读选通信号输出端,低电平有效)单片机使用宏晶公司支持串口下载程序(ISP)的单片机,为STC90C52AD课程设计配发的小电路板(ISP-MCU Basic circuit)电路原理图见下图。该板作为课程设计的核心电路板使用,板上有单片机及附属电路,RS-232通信驱动电路,高低电平测试电路等。课程设计电路中需要的其他电路在此基础上扩展,通过插孔连接。课程设计配发的小电路板(ISP-MCU Basic circuit)电路原理图见下图。扩展电路在万用板上制作用四位数码管显示小时与分钟,中间那个点用来区分小时与分钟;每秒用一个LED闪烁一下;用了4个按键,一个是选择键,一个是加键,一个是减键
8、, 一个是确认键。时间要精确,整点报时,声音间隔1秒,并且可以调整时间调整位闪烁提示。 扩展电路用到得器件:4个按键,一个是调节键,一个是设置键,一个是加1键,一个是确定键;四个DPY7-SEG DP共阴极动态LED;四个NPN三极管;8个300欧姆和四个1千欧的电阻;导线;一个74LS245进行驱动。每各引脚可吸收8各TTL的灌电流。作为输入时,首先应将引脚置1。P0也可用做访问外部程序存储器和数据存储器时的低8位地址/数据总线的复用线。在该模式下,P0口含有内部上拉电阻。在FLASH编程时,P0口接收代码字节数据;在编程效验时,P0口输出代码字节数据(需要外接上拉电阻)。2.1.2综合电路
9、设计 串口通信电路 时钟电路STC90C52AD单片机时间调整按键电路 动态显示电路 动态显示控制电路采用单片机的TO定时器,使其工作在方式1,产生一个100ms定时中断,循环10次,到1s时,秒加1;秒到60时,分加1,秒清零;分到60时,秒清零,分清零。数码管采用动态显示,一个扫描周期共循环四次,依次显示秒的低位、秒的高位、分的低位、分的高位,每次显示延时4ms。这期间要将不同的数送到P1口,以及将P2口的不同位置1。调节时,调用相应的子程序,来完成功能。2.2单元电路设计2.2.1电源供电单元如图二所示图二2.2.2动态显示驱动设计数码管动态显示接口是单片机中应用最为广泛的一种显示方式之
10、一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,如图三所示。 图三2.2.3 时钟产生单元图四52单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。 在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。内部振荡方式的外部电路如下图所示。 图中,电容器Col,C02起稳定振荡频率、快速起振的作用,其电容值一般在5-30pF。晶振频率的典型值为12MHz,采用6MHz的情况也比较多。内部振荡方式所得的时钟情号比较
11、稳定,实用电路中使用较多。外部振荡方式是把外部已有的时钟信号引入单片机内。这种方式适宜用来使单片机的时钟与外部信号保持同步。 2.2.4 串口驱动电路单元 DB-9引脚定义 针脚功能5信号地线1载波检测6数据准备完成2接受数据7发送请求3发送数据8发送删除4数据终端准备完成9振铃指示图五如图五所示,MAX232是RS-232收发器,用于实现TTL电平与微机串口的RS-232电平信号之间的转换。采用单+5V电源供电,数据传输速率为120kbit/s。图六2.2.5 蜂鸣器电路单元 如图六所示 2.2.6 动态显示控制电路单元图七如图七所示另外为每个数码管的公共极COM增加位选通控制电路,位选通由
12、各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms。 2.2.7按键电路单元 2.2.8译码单元如图八所示 如图九所示 如图九其功能介绍如下: BI:4脚是消隐输入控制端,当BI=0 时, 不管其它输入端状态如何,七段数码管均处于熄灭(消隐)状态,不显示数字。 LT:3脚是测试
13、输入端,当BI=1,LT=0 时,译码输出全为1,不管输入 DCBA 状态如何,七段均发亮,显示“8”。它主要用来检测数码管是否损坏。 LE:锁定控制端,当LE=0时,允许译码输出。 LE=1时译码器是锁定保持状态,译码器输出被保持在LE=0时的数值。 A1、A2、A3、A4、为8421BCD码输入端。 a、b、c、d、e、f、g:为译码输出端,输出为高电平1有效。 2.3系统调试 硬件调试时可先检查印制板及焊接的质量情况,在检查无误后可通电检查LED显示器的点亮状况。若亮度不理想,可以调整P1口的电阻大小,一般情况下取200电阻即可获得满意的亮度效果。 实验室制作时,可结合示波器测试晶振及P
14、1,P2端口的波形情况进行综合硬件测试分析。硬件调试:硬件调试是利用DVCC实验与开发系统、基本测试仪器(万用表、示波器等),检查用户系统硬件中存在的故障。硬件调试可分为静态调试与动态调试两步进行。静态调试:是在用户系统未工作时的一种硬件检测。第一步:目测。检查外部的各种元件或者是电路是否有断点。第二步:用万用表测试。先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。第三步:加电检测。给板加电,检测所有插座或是器件的电源端是否符合要求的值 第四步:联机检查。因为只有用单片机开发系统才能完成对用户系统的调试。 动态调试:是在用户系统工作的情况下发现和排除用户系统硬件中
15、存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。动态调试的一般方法是由近及远、由分到合。由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的 器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。由分到合的调试既告完成。由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。软件调试:软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与
16、逻辑错误并加以排除纠正的过程。可以利用仿真器加以调试,对系统单个单元进行调试,当单元电路成功后,在对整个程序调试,最后在用CPU芯片调试。2.4系统分析通过软件编程,将相应的端口赋成变量的形式。分别通过调用中断子程序,动态显示子程序,时间调整子程序,整点报时子程序等来控制各端口的输出,以达到理想的效果。2.5系统设计2.5.1程序流程图如图主程序开始定时器初始化数码管扫描显示时间调整子程序时间调整键是否按下是否返回闹钟报时子程序是否到闹钟时间是蜂鸣器响 返回响10s2.6系统实施软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。可以利用仿真器加以调
17、试,对系统单个单元进行调试,当单元电路成功后,在对整个程序调试,最后在用CPU芯片调试。最后本次课设实现了简易时钟显示,可以实现整点报时,可以调整小时,分钟的显示位及调整位的闪烁。2.7 C语言程序: #include #define uint unsigned int#define uchar unsigned charuchar min,scd,a_min,a_scd,cnt=0,tiao_cnt=0,set_cnt=0,time_flag=1,buzzer_flag;int tiao_flag=0,set_flag=0,a_cnt=0; sbit Key_tiao=P32; sbit K
18、ey_set=P33; sbit Key_add=P34; sbit Key_start=P35; sbit wei_1=P20;sbit wei_2=P21;sbit wei_3=P22;sbit wei_4=P23;sbit buzzer=P36;sbit led=P37;void my_delay10nums(uint i) unsigned char j; for(i; i 0; i-) for(j = 255; j 0; j-); void delay(uint z) int x,y;for(x=z;x0;x-)for(y=1;y0;y-);void smg_show(uchar m
19、in,uchar scd) if(tiao_flag!=1) /秒低位 wei_1=1; wei_2=1; wei_3=1; wei_4=1; if(set_flag) P1=a_scd%10; else P1=scd%10; wei_3=1; wei_4=0; delay(50); if(tiao_flag!=2) /秒高位 wei_1=1; wei_2=1; wei_3=1; wei_4=1; if(set_flag) P1=a_scd/10; else P1=scd/10; wei_3=0; wei_4=1; delay(50); /分低位 if(tiao_flag!=3) wei_1=
20、1; wei_2=1; wei_3=1; wei_4=1; if(set_flag) P1=a_min%10; else P1=min%10; wei_1=1; wei_2=0; delay(50); if(tiao_flag!=4) /分高位 wei_1=1; wei_2=1; wei_3=1; wei_4=1; if(set_flag) P1=a_min/10; else P1=min/10; wei_1=0; wei_2=1; delay(50); void Keyin() if(Key_tiao=0) my_delay10nums(10); if(time_flag) time_fla
21、g=0; set_flag=0; if(tiao_flag=0) tiao_flag=1; else if(tiao_flag=1) tiao_flag=2; else if(tiao_flag=2) tiao_flag=3; else if(tiao_flag=3) tiao_flag=4; else if(tiao_flag=4) tiao_flag=1; while(!Key_tiao); my_delay10nums(5); while(!Key_tiao); if(Key_set=0) my_delay10nums(10); set_flag=1; if(tiao_flag=0) t
22、iao_flag=1; else if(tiao_flag=1) tiao_flag=2; else if(tiao_flag=2) tiao_flag=3; else if(tiao_flag=3) tiao_flag=4; else if(tiao_flag=4) tiao_flag=1; while(!Key_set); my_delay10nums(5); while(!Key_set); if(Key_add=0) my_delay10nums(10); if(tiao_flag=1)|(tiao_flag=-1) if(set_flag)a_scd=a_scd+1;if(a_scd
23、%10=0)a_scd=a_scd-10;else scd=scd+1;if(scd%10=0)scd=scd-10; else if(tiao_flag=2)|(tiao_flag=-2) if(set_flag)a_scd=a_scd+10; if(a_scd60)a_scd=a_scd%10;else scd=scd+10;if(scd60)scd=scd%10; else if(tiao_flag=3)|(tiao_flag=-3) if(set_flag) a_min=a_min+1; if(a_min%10=0)a_min=a_min-10;else min=min+1; if(m
24、in%10=0)min=min-10; else if(tiao_flag=4)|(tiao_flag=-4) if(set_flag) a_min=a_min+10; if(a_min60)a_min=a_min%10;else min=min+10; if(min60)min=min%10; while(!Key_add); my_delay10nums(5); while(!Key_add); if(Key_start=0) my_delay10nums(10); /while(!Key_start); set_flag=0; tiao_flag=0; time_flag=1; whil
25、e(!Key_start); my_delay10nums(5); while(!Key_start); void init_timer0()TMOD=0x01;TH0=(65536-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;void main() init_timer0();/初始化定时器0 smg_show(0,0); while(1)Keyin();/按键事件 smg_show(min,scd);void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65535-50000)%256
26、;tiao_cnt+;if(tiao_cnt=2) tiao_cnt=0; tiao_flag=-tiao_flag;set_cnt+;if(set_cnt=2) set_cnt=0; set_flag=-set_flag;cnt+;if(cnt=10) cnt=0; / led=led; if(time_flag) scd+; if(scd=60) scd=0; min+; if(min=60) min=0; if(set_flag=0)&(a_min=min)&(a_scd=scd) buzzer=0; /闹钟时刻到报警 buzzer_flag=1; a_cnt=0; /闹钟时间 if(b
27、uzzer_flag) a_cnt+; led=led;if(a_cnt10)/闹钟时间 a_cnt=0; buzzer=1; buzzer_flag=0; led=1; 三总结: 这次单片机课程设计我们历时两个星期,在我们班里算是倒数几组完成的吧,但经过这两个星期的实践和体验下来,我们又怎么会去在乎那个先后问题呢,因为对我来说学到的不仅是那些知识,更多的是团队和合作。现在想来,也许学校安排的课程设计有着它更深层的意义吧,它不仅仅让我们综合那些理论知识来运用到设计和创新,还让我们知道了一个团队凝聚在一起时所能发挥出的巨大潜能! 没想到这项看起来不需要多少技术的工作却是非常需要耐心和精力在两个星
28、期后的今天我已明白课程设计对我来说的意义,它不仅仅是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手能力和独立思考的能力,更重要的是同学间的团结! 其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如PCB制图、C语言等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程
29、序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自
30、学,若遇到实在搞不明白的问题就会及时请教老师,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名自动化专业的学生,单片机的课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于这门课懂的并不多,很多基础的
31、东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。我认为这个收获应该说是相当大的。觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合相处,以及自身的动脑和努力,都是以后工作中需要的。 四、参考文献1张毅刚.单片机原理及应用.高等教育出版社,20032 权明富,齐佳音,舒华英.客户价值评价指标体系设计J.南开管理评论,2004,7(3):17-18.3苏家键等.单片机原理及应用技术.北京:高等教育出版社,20044钟睿.MCS-51单片机原理及应用开发技术.北京:中国铁道出版社,20065蓝清华等.单片机应用教程.北京:清华大学出版社,1999附录一、系统原理图附录二、PCB图附录三、课程设计评语及成绩课程设计评 语课程设计成 绩指导教师(签字) 年 月 日22