片机课程设计---数字钟设计.doc_第1页
片机课程设计---数字钟设计.doc_第2页
片机课程设计---数字钟设计.doc_第3页
片机课程设计---数字钟设计.doc_第4页
片机课程设计---数字钟设计.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中北大学单片机原理及接口技术课程设计说明书中北大学单片机课程设计说明书数字钟设计1 设计任务与要求11.1设计任务11.2设计要求12单片机简介22.1单片机的发展历程23系统设计思路和方案33.1系统总体方案33.2硬件简介43.2.1硬件选择43.2.2 51单片机的构成43.2.3 STC89C52RC引脚功能说明53.2.4 LED简介63.3 Keil调试74、系统实物图95、课程设计体会10参考文献11附录A12附录B13附录C14第 页 共 页II1 设计任务与要求1.1设计任务本课题应完成以下设计内容:1)硬件设计设计数字钟的电路原理图,用PROTEL绘制硬件电路。制作实物。2)软件设计(1)时、分、秒的设置及显示;(2)画出程序框图;(3)调试与分析。用PROTEUS仿真。3)课程设计说明书1.2设计要求本课程设计的基本要求是使学生全面掌握单片机控制系统设计的基本理论,熟悉掌握MCS51 系列单片机的编程方法,具体要求:本例利用AT89C51的定时器和6位7段数码管,设计一个电子时钟。显示格式为“XX XX XX”,由左向右分别是:时、分、秒。2单片机简介2.1单片机的发展历程单片机是微型计算机的一个重要分支,也是一种非常活跃和颇具生命力的机种,特别适用于工业控制领域。1971年微处理器研制成功不久,就出现了单片机,但最早的单片机是1位的,处理能力有限。单片机的发展共分四个阶段:第一阶段是初级阶段,功能非常简单;第二阶段是低性能阶段, 16位定时器/计数器,片内ROM、RAM容量加大,直到现在仍被广泛应用,是目前应用数量较多的单片机。、32位单片机推出阶段,以满足不同的用户需要。纵观单片机几十年的发展历程,单片机的今后发展方向将向多功能、高性能、高速度、低功耗、低价格、外围电路内装化以及内存储器容量增加和FLASH存储器化方向发展。2.2实用价值与理论意义 在单片机模块里比较常见,数字时钟是一种用0数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更高的使用寿命,新词得到了广泛的应用。 数字时钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公用场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字时钟的精度远远超过老式钟表,钟表的数字化给人们的生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。因此研究数字时钟及扩大其应用有着非常现实的意义。3系统设计思路和方案3.1系统总体方案图3.1整体设计思路针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、定时程序。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。3.2硬件简介3.2.1硬件选择(1)单片机的选择 选用STC89C52单片机,并配备12MHz晶振,复位电路采用上电复位。(2)显示电路选择 采用软件译码动态显示,P3.0-P3.3作数码管的位选口。P1.0-P1.6作数码管的段选口。考虑直接用单片机I/O口作位选时驱动功率不够,(3)电源选择 采用直流3V电源供电。(4)STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-FlashProgramableandErasableReadOnlyMemory)的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。3.2.2 51单片机的构成STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。主要特性如下:1、增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.2、工作电压:5.5V3.3V(5V单片机)/3.8V2.0V(3V单片机)3、工作频率范围:040MHz,相当于普通8051的080MHz,实际工作频率可达48MHz4、用户应用程序空间为8K字节5、片上集成512字节RAM6、通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。7、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片8、具有EEPROM功能9、具有看门狗功能10、共3个16位定时器/计数器。即定时器T0、T1、T211、外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒12、通用异步串行口(UART),还可用定时器软件实现多个UART13、工作温度范围:-40+85(工业级)/075(商业级)14、PDIP封装3.2.3 STC89C52RC引脚功能说明VCC(40引脚):电源电压VSS(20引脚):接地 RST(9引脚):复位输入。当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST引脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/(30引脚):地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚()也用作编程输入脉冲。(29引脚):外部程序存储器选通信号()是外部程序存储器选通信号。当AT89C51RC从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。/VPP(31引脚):访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,必须接GND。注意加密方式1时,将内部锁定位RESET。为了执行内部程序指令,应该接VCC。在Flash编程期间,也接收12伏VPP电压。XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。XTAL2(18引脚):振荡器反相放大器的输入端。 图3.2 STC89C52RS3.2.4 LED简介LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2.7(a)是共阴和共阳极数码管的内部电路图,它们的发光原理是一样的,只是它们的电源极性不同而已。将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将b和c段接上正电源,其它端接地或悬空,那么b和c段发光,此时,数码管显示将显示数字“1”。而将a、b、d、e和g段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它数字的显示原理与此类同。LED的7段数码管利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。在这次的设计中采用的均是共阴极的LED显示,当I/O口输出为高电平的时候,对应段就被点亮。LED数码管的结构图如图2.4(b)所示。 (a) (b) 图3.3 LED分类结构图和结构图这次设计的显示部分采用AT89C51单片机动态扫描完成,在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。在没有富余端口的情况下,应通过优化设计程序和扩展电路达到预期的目的。动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。3.3 Keil调试启动Keil软件,选择“Project”菜单下的“New Project”命令,输入项目的文件名,选择存储路径,点击“保存”按钮。在“Select Device”窗口中选择“Atmel”下的“AT89C51” 芯片,单击“确定”按钮。展开“Project Workspace”窗口中的“Target 1”, 右击 “Target 1”,选择“Options for Target Target 1”,选择“Target”选项在Keil (MHZ)右边输入“12m”。选择“Debug”选项,选择“Use Keil Monitor-51 Driver”。单击“Settings”按钮,串口选择“COM1”,波特率选择“38400”,单击“OK”按钮。右击“Source Group 1”,选择“Add files to Group Source Group 1,在文件类型中选择“Asm Source file”,找到将要编译的程序,单击 “ADD”按钮,然后再单击“CLOSE”按钮。单击“Rebuild all target files”,在“Build”窗口中观察编译结果,根据提示修改程序,直到没有错误出现。4、系统实物图 图4.1 系统实物图5、课程设计体会这次电子技术课程设计,我很用心的去完成,当总原理图绘好的那一刻,心里有说不出的满足感。从这次课程设计中,我真正学到了很多有用的知识。拿到课题后,我首先将单片机原理与应用及C51程序设计中有关本次设计的内容复习了一遍,比如七段译码显示器、计数器、振荡器等等。然后根据设计要求,我去图书馆查阅了相关的资料,对整体框架做了一个初步的了解。做完准备工作后就正式开始设计与绘图。先要将没每一功能模块设计出来,再整体排版、连接。这次设计让我熟练掌握了课本上的一些理论知识,在这次课程设计中,反复查找资料,发现电路中的错误和改善电路中的错误,让我将课本上的理论知识重新过了一遍。回过头来一想,其实设计这些电路也并不是很困难,而且还十分有意思,特别是用protues将电路图模拟成功后很有成就感。课程设计是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。它不仅加深了我对单片机课程的理解,还让我感受到了设计电路的乐趣。在这次设计中,我一点也不怕麻烦,反复设计、绘图与修改,就是希望能把这次课程设计做好。因此对我来说,这次课程设计是非常有意义的。参考文献1杨文龙.单片机原理及应用M.西安:西安电子科技大学出版社,19932胡汉才.单片机原理及系统设计M.北京:清华大学出版社,20033杨忠煌,黄博俊,李文昌.单芯片8051实务与应用M.北京:中国水利水电出版社,20014王守中,51单片机开发入门与典型实例M.人民邮电出版社5徐爱钧,单片机原理与应用:基于Proteus虚拟仿真技术M.北京:机械工业出版社,2010.76周润景,基于PROTEUS的电路及单片机设计与仿真(第二版)M.北京:北京航空航天大学出版社,2009.127 肖洪兵. 跟我学用单片机M. 北京:北京航空航天大学出版社,2002.8 8 何立民. 单片机高级教程M第1版北京:北京航空航天大学出版社,2001 9 赵晓安. MCS-51单片机原理及应用M. 天津:天津大学出版社,2001.3 10 李广第单片机基础第1版M北京:北京航空航天大学出版社,1999 11 孙涵芳. MCS-51/96系列单片机原理及应用(修订版)M.北京航空航天大学出版社,1994 12 李朝青. 单片机原理及接口技术(第3版)M. 北京航空航天大学出版社,200513 夏继强. 单片机实验与实践教程M. 北京:北京航空航天大学出版社,2001 14陈小虎.电工实习(I)M.北京:中国电力出版社,199615焦辎厚.电子工艺实习教程M.哈尔滨:哈尔滨工业大学出版社,199316宋春荣.通用集成电路速查手册M.山东科学技术出版社,199517高吉祥.电子技术基础实验与课程设计M.电子工业出版社,2002附录A 硬件原理图PROTEUS仿真运行结果附录B 软件设计流程图附录C#include #include #define uchar unsigned char#define uint unsigned int sbit dis_bit1=P27;/定义数码管控制口sbit dis_bit2=P26;/定义数码管控制口sbit dis_bit3=P24;/定义数码管控制口sbit dis_bit4=P23;/定义数码管控制口sbit dis_bit5=P21;/定义数码管控制口sbit dis_bit6=P20;/定义数码管控制口sbit led1_bit=P22;/定时LED的控制口sbit led2_bit=P25;/定时LED的控制口sbit s1_bit=P10; /定义S1控制口sbit s2_bit=P11; /定义S2控制口sbit s3_bit=P12; /定义S3控制口sbit speak=P37; /定义蜂鸣器控制口#define smg_data P0/定义数码管数据口 void delay_50us(uint t);/延时50*T微妙函数的声明void display1(uchar dis_data);/数码管1显示子程序void display2(uchar dis_data);/数码管2显示子程序void display3(uchar dis_data);/数码管3显示子程序void display4(uchar dis_data);/数码管4显示子程序void display5(uchar dis_data);/数码管5显示子程序void display6(uchar dis_data);/数码管6显示子程序void init_t0();/定时器0初始化函数void dis_led();/LED处理函数void judge_s1();/S1按键处理函数void judge_s2();/S2按键处理函数void judge_s3();/S3按键处理函数void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);/显示子程序void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);/闪烁显示子程序void judge_dis();/显示处理函数void judge_clock();/显示处理函数/共阳数码管断码表const unsigned char tabl117=0xc0,0xf9,0xa4,0xb0,0x99,0x92, / 0 1 2 3 4 5 0x82,0xf8,0x80,0x90,0x86,0x87,0xFF, /6 7 8 9 E T B 0xc6,0xa1,0x8e,0xb6; / C D F 三 uchar t0_crycle;uchar hour_count,minute_count,second_count,msecond_count;uchar clock_hour,clock_minute;uchar clock_en;/闹钟关闭和开启的标志,1开启,0关闭uchar flag1,zancun1,zancun2,zancun3;/,flag2;uchar clock_flag;uint speak_count;/主程序void main() P3=0x00; flag1=0; zancun3=0; speak=1;/关闭蜂鸣器 speak_count=0; clock_hour=0; clock_minute=0; clock_flag=0; clock_en=0;/开机时默认关闭闹钟 init_t0(); TR0=1;/ /接下来开始编写让数码管显示的程序 while(1) judge_dis();/显示处理 judge_s1(); judge_s2(); judge_s3(); judge_clock();/闹钟处理程序 void timer0() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)/256; t0_crycle+; if(t0_crycle=2)/ 0.1秒 t0_crycle=0; msecond_count+; if(msecond_count=10)/1秒 msecond_count=0; second_count+; if(second_count=60) second_count=0; minute_count+; if(minute_count=60) minute_count=0; hour_count+; if(hour_count=24) hour_count=0; /显示处理函数void judge_dis() if(flag1=0) dis(hour_count/10,hour_count%10,minute_count/10,minute_count%10,second_count/10,second_count%10); dis_led(); if(flag1!=0) switch(flag1) case 1: dis(5,10,11,1,12,12);/显示SET1 led1_bit=1; led2_bit=1; break; case 2: dis(5,10,11,2,12,12);/显示SET2 break; case 3: dis(5,10,11,3,12,12);/显示SET3 break; case 4: dis(5,10,11,4,12,12);/显示SET4 break; case 5: dis(5,10,11,5,12,12);/显示SET5 break; case 6: dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,1); break; case 7: dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,2); break; case 8: dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,3); break; case 9:/进入修改时间,时间分位个位闪烁 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,4); break; case 10:/进入修改闹钟,闹钟小时十位闪烁 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,1); break; case 11:/进入修改闹钟,闹钟小时个位闪烁 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,2); break; case 12:/进入修改闹钟,闹钟小时十位闪烁 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,3); break; case 13:/进入修改闹钟,闹钟小时个位闪烁 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,4); break; case 14:/进入修改闹钟的开关 dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,6); break; default: break; /S1按键处理函数void judge_s1() s1_bit=1;/置IO为1,准备读入收据 if(s1_bit=0)/判断是否有按键按下 delay_50us(1);/ 延时,去除机械抖动 if(s1_bit=0) switch(flag1) case 0: flag1=1; break; case 1: flag1=2; break; case 2: flag1=3; break; case 3: flag1=4; break; case 4: flag1=5; break; case 5: flag1=0; break; case 6:/在修改时间小时十位下按S1键 flag1=7; break; case 7: flag1=8; break; case 8: flag1=9; break; case 9: flag1=6; break; case 10: flag1=11; break; case 11: flag1=12; break; case 12: flag1=13; break; case 13: flag1=14; break; case 14: flag1=10; break; default: break; while(s1_bit=0) judge_dis(); /等待按键释放 /S2按键处理函数void judge_s2() s2_bit=1;/置IO为1,准备读入收据 if(s2_bit=0)/判断是否有按键按下 delay_50us(1);/ 延时,去除机械抖动 if(s2_bit=0) switch (flag1) case 1: /在显示SET1状态下按S2件,进入修改时间 flag1=6; zancun1=hour_count; zancun2=minute_count; break; case 2:/在显示SET2状态下按S2,进入设置闹钟 zancun1=clock_hour; zancun2=clock_minute; flag1=10; break; case 6:/修改时钟小时十位状态下按S2件 hour_count=zancun1; minute_count=zancun2; second_count=0; flag1=0; break; case 7:/修改时钟小时个位状态下按S2件 hour_count=zancun1; minute_count=zancun2; second_count=0; flag1=0; break; case 8:/修改时钟分钟十位状态下按S2件 hour_count=zancun1; minute_count=zancun2; second_count=0; flag1=0; break; case 9:/修改时钟分钟个位状态下按S2件 hour_count=zancun1; minute_count=zancun2; second_count=0; flag1=0; break; case 10: clock_hour=zancun1; clock_minute=zancun2; clock_en=zancun3; flag1=0; break; case 11: clock_hour=zancun1; clock_minute=zancun2; clock_en=zancun3; flag1=0; break; case 12: clock_hour=zancun1; clock_minute=zancun2; clock_en=zancun3; flag1=0; break; case 13: clock_hour=zancun1; clock_minute=zancun2; clock_en=zancun3; flag1=0; break; case 14: clock_hour=zancun1; clock_minute=zancun2; clock_en=zancun3; flag1=0; break; default: break; while(s2_bit=0) judge_dis(); /等待按键释放 /S3按键处理函数 void judge_s3() s3_bit=1;/置IO为1,准备读入收据 if(s3_bit=0)/判断是否有按键按下 delay_50us(1);/ 延时,去除机械抖动 if(s3_bit=0) switch (flag1) case 6:/修改时间小时的十

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论