1、单片机课程设计报告第 1 页 共 17 页一 需求分析本设计是基于51单片机时钟的LED显示,通过单片机产生计数功能,通过LED数码管显示,显示时间时、分、秒,并用按键进行时间调整,同时带有整点报时功能。二 总体设计1 设计思路通过51内部定时器产生时钟来进行准确计时,用独立键盘来实现时钟的可调,最后由LED 数码管来显示。2.器件选择AT89C52 74LS138 8 位共阴数码管 7407 MAX232 串行口九针插头12M 晶振 按键 电容 排阻3.开发环境KEIL Uvision4 4.下载工具STC-ISP-V3.5单片机课程设计报告第 2 页 共 17 页三 硬件电路分析该硬件电路
2、由显示电路、电源电路、信号处理电路、单片机最小系统、串口通信以及按键控制电路六部分构成。该单片机开发板具备了电源、复位、时钟、键盘、显示等电路,可用于编程开发单片机的多种控制功能。由于外部硬件电路已经确定,单片机各引脚已经连接好,其对应位也已经确定好,因此在进行程序设计前,要对AT89C52各引脚连接的电路以及所控制的电路进行分析,分析后确定了以下信息:(1)P0口连接数码管八段,通过写P0 口来控制数码管显示的内容;(2)P1.0口控制着电路板上的绿色指示灯的亮灭,其中1为灭,0为亮;(3)P2口:单片机课程设计报告第 3 页 共 17 页P2.7 P2.4分别连接K1K4按键,编程时,需要
3、通过读取P2.7 P2.4的值获取按键状态;P2.0 P2.2分别连接3-8译码器的A、B、C输入端,编程时需要写P2.0 P2.2口来实现控制六个数码管的显示;P2.3连接3-8译码器的使能端,编程时需要对P2.3写入0,;(4)单片机复位电路已经连接好,复位键可以直接使用,编程时无需编写复位程序;(5)振荡电路已连接好,其中晶振为12MHz,通过利用中断进行精确计时;四 软件设计1 进行软件设计前需要先学习下 KEIL Uvision4 和 STC-ISP-V3.5 两款软件的使用方法。关于KEIL Uvision4 软件使用时需要注意问题:1)新建工程后,会弹出一个“Select Dev
4、ice For Target”对话框,此时需要点开Atmel然后选择AT89C52,确定;2)在刚建的工程下,新建file,编好文件保存时在给文件命名是一定要带上扩展名“.c ”;3)编写好的C文件需要添加到当前Target下,编译前需要找到 “Option For Target”对话框进行设置,把晶振频率设置为12MHz,点击“output”,在“create HEX fi”前打上勾,生成十六进制的文件,以用于下载到单片机内。关于STC-ISP-V3.软件使用时需要注意的问题:1)选择单片机型号(STC89C52RC );2)选择Clear Buffer (清缓冲区),Open File打开
5、待烧录的.HEX 文件 ;3)根据实际连接选择COM口,实际所用COM口可通过设备管理器查询得到;4)冷启动。电路板断电后点击Download按钮,然后接通电路板电源,等单片机课程设计报告第 4 页 共 17 页待编程结束,成功下载到单片机内。2.程序设计思路本次要实现的功能是可调数字钟,分析后把程序分成五个子模块进行编写,其中五个子模块分别为时间处理子程序、显示子程序、整点报时子程序、按键扫描子程序以及中断子程序。3.各模块实现的功能以及分析(1)时间处理子程序该模块中把秒设置为六十进制,分钟设置为六十进制,小时设置为二十四进制,同时实现秒分和分时之间的进位。实验程序如下:void time
6、_dis( void) if(sec=60) /秒钟设为 60 进制 sec=0;min+;if( min=60) /分钟设为 60 进制 min=0;hour+;if(hour=24) /时钟设为 24 进制hour=0; (2)显示子程序该程序实现数码管的显示。除了正常计时显示还需要考虑上调节状态下数码管的显示情况,因此需要用到一系列的条件判断语句。调节按键没有按下时,数码管显示时钟,此状态下,时与分和分与秒之间的小数点以2Hz的频率闪烁;一旦调节按键按下,则相应的调节位以2Hz的频率闪烁,由于调节时,只调时分秒的个位,十位一直显示即可。单片机课程设计报告第 5 页 共 17 页显示时的程
7、序流图如下:开始Y0 选通,数码管时的十位显示,写 P0 口Y1 选通,数码管时的个位选通flash=0写 P0 口,数码管亮P0=0x00;数码管灭flash=0写 P0 口,小数点亮,P0 或上 0X80写 P0 口,小数点灭按下调节键K4,adjust_key=3Y NY N Y N而对于显示分的子程序,同显示时的程序一样,判断条件为adjust_key=2,在写P0口时,写的分的十位和个位;而对于显示秒的子程序,判断条件为adjust_key=1由于小数点不需要闪烁,因此,如果没有按键按下,则直接把秒的个位值写进P0 口即可,无需判断 flash。(3)整点报时子程序整点报时子程序通过
8、P2.7口控制,当K1(P2.7 )按下时,通过变量baoshi_flag记录按键的状态,按键有0、1两个状态,0状态对应整点报时功能关,1状态对应着整点报时功能开,在分和秒都为0时,则报时,此时绿灯灭一下。该段程序程序流图如下:单片机课程设计报告第 6 页 共 17 页开始K1(P2.7)按下baoshi_flag=baoshi_flag;baoshi_flag=1TL0=0xb0;工作方式设置:TMOD=0x01。中断服务子程序如下:timer(void) interrupt 1 using 0 /利用定时器 0 方式 1,50ms 中断一次,设置定时初值TR0=0;TH0=0x3c;TL
9、0=0xb0;TMOD=0x01;if(t9) t+;elset=0;flash=flash; /flash 以 2Hz 的频率变化if(con=0)if(mstcnt19)mstcnt+;elsemstcnt=0;sec+; /1 秒计时,秒加TR0=1; /开定时器单片机课程设计报告第 8 页 共 17 页注意的问题:在中断子程序末尾一定要记得开定时器。(6)主程序主程序中打开定时器,设置定时初值以及定时器的工作方式,然后利用while (1)语句,反复执行各个子程序即可。主程序如下:void main(void) P2=0xff; /初始化 p2 口,全设为 1 TMOD = 0x01;
10、 /time0 为定时器,方式 1TH0=0x3c; /预置计数初值TL0=0xb0;EA=1; ET0=1; TR0=1; en=0;while (1) keyscan(); /按键扫描time_dis(); /时间处理display(); /显示时间 baoshi(); /整点报时 单片机课程设计报告第 9 页 共 17 页五 收获与总结通过为期一周的单片机课程设计,收获很大。首先,以前在学习单片机的时候,老师所讲的全是汇编语言,而此次课程设计我用的是C语言,因此自己课下通过看相关单片机教学视频以及教学资料学习了基于51单片机的C语言程序的编写以及相关软件KEIL Uvision4、STC
11、-ISP-V3.5的使用,通过自己反复实践编程下载,现在可以熟练使用这两款软件进行单片机开发。其次,通过此次单片机课程设计,更加深入掌握了51单片机的结构和原理,51单片机内部定时系统的开启和设置、中断调用和如何使用单片机内部时钟实现精确计时以及如何对单片机的双向口进行读写操作等。除此之外,也更加深入理解了数码管动态扫描显示原理。最后,通过连续几天来不断地编程下载和调试,自己形成了一定的编程思维。起初,自己先是从网上搜集资料,通过对一系列的单片机C语言程序的研究,掌握到了基本的编程思路以及了解到要实现相关的功能应该采取何种操作。然后,根据自己的单片机课程设计数字钟的设计需求,先是实现基本的计时
12、显示功能,这就需要编写好时间处理子程序、中断程序以及显示子程序,编写好后进行编译调试,无错误无警告后下载到开发板上,观察板子的显示情况,然后再根据具体情况具体的对程序进行改动。记得一开始自己把程序下载到板子上时,只显示不计数,然后自己就在想可能哪错了,能显示说明显示子程序没问题,问题出在时间处理子程序和中断子程序,最后检查出自己忘了打开定时器导致数字钟不计数,因此修改后编译下载,正确显示并计数。当基本功能实现后,就开始考虑调节时间功能。调时需要扫描按键,因此编写按键扫描子程序。首先得对各按键功能进行定义,然后再编写程序。开始我用了三个按键分别控制时分秒的加,最后一个按键则为确认键,这时我发现有
13、点资源浪费,四个按键全用了确只能加不能减,考虑到实际数字钟用一个键控制调节位,一个按键加,一个按键减,因此重新编写按键子程序。最后一个闲置的按键则用来实现了整点报时功能的控制。当把自己想实现的功能都实现后,接下来要做的单片机课程设计报告第 10 页 共 17 页就是完善程序,改善显示效果。在调节时让相应的位闪烁,并且按键按下后数码管上的显示不闪烁等等,其实完善程序也是一个相当艰难而且漫长的过程,调节位闪烁与不闪烁需要改动的地方很多。比如,我在调节状态时,定时器已经关了,此时2Hz 变化的变量flash 不会变了,那么要想闪烁我就必须把定时器打开,但定时器打开后调节时时钟状态还在变化,秒个位一直
14、在加一,因此我就又添了一个变量con ,调节状态下,把 con置1,恢复时间状态后把 con清0,而sec自加前判断一下con 标志位是否为 0决定是否自加,这样就即可以实现调节位闪烁,同时sec不再自加。此次课程设计虽然单调但也充满了无穷的乐趣。在编程的过程中,出现过不少问题,有时出现好几十个错误,但是有时这好几十个错误竟会是少一个大括号或是大括号放错了位置引起的,把大括号放对后,0个错误。因此,只要自己按着思路一步步编是不会出现太多错误的,这个时候自己一定要有耐心,耐心的根据错误位置及错误提示仔细的检查,不断地修改不断地编译,再修改再编译。这个过程中,使得自己以后编程中对于C中一些常见的错误也能准确快速地修改了。
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。