单片机课程设计报告电子万年历设计.doc

上传人:e****s 文档编号:92380136 上传时间:2023-06-03 格式:DOC 页数:35 大小:375KB
返回 下载 相关 举报
单片机课程设计报告电子万年历设计.doc_第1页
第1页 / 共35页
单片机课程设计报告电子万年历设计.doc_第2页
第2页 / 共35页
点击查看更多>>
资源描述

《单片机课程设计报告电子万年历设计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告电子万年历设计.doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、九 江 学 院 单片机课程设计报告 题目:电子万年历专业:自动化班级:A0931姓名:组员: 指导老师: 二零一二年二月 目录绪论333.硬件电路44.软件流程65.程序清单156.变量说明327.硬件系统的检测与调试338.设计体会3335绪论:由单片机设计的系统已经被广泛应用到工业、商业、国防和日常生活等各个领域,具有使用灵活,性价比高的特点。其系统的的开发融合了硬件和软件的相关技术。本文介绍了使用单片机最小系统电路和数码管设计实现简易功能的电子万年历。1 内容提要本设计主要功能为用单片机和数码管简单地实现电子万年历功能。其中包含时、分、秒、年、月、日、星期的显示以及简单按键功能。硬件电路

2、主要是晶振产生电路,数码管显示电路和按键电路。软件设计思想是:利用单片机的定时器设定每10ms产生一次溢出,100次溢出,也就是1秒后令时间加一秒。用2个4位共阳数码管来显示时间。主程序就是显示程序。利用数码管的动态扫描将时间值扫描并显示。设置时间值来控制什么时候显示年、月、日信息,什么时候显示时、分、秒信息。时间日期的显示调整则设定4个按键。按键1用来暂停时间,按下后秒不再加。按键2则用来选择需要显示的时间是日期(年、月、日和星期),按键3实现恢复时间秒加1。按键4功能为单片机自身的复位功能。该设计总体思路简单清晰,硬件容易实现。程序中涉及到了定时器的设置使用,中断的使用。2概述 系统主要功

3、能用单片机和数码管可以简易地实现电子万年历功能。该设计可以在两个4位数码管上显示时、分、秒、年、月、日、星期等信息。硬件组成简单,主要是单片机的数码管显示电路,晶振电路和按键电路。可以在程序中预先设置每一分钟的某一段时间用来显示时、分、秒和星期信息,另一段时间显示年、月、日和星期信息。可以看到时、分、秒和年、月、日交替显示。同时利用按键可以切换时间的显示。 小组工作描述:小组经过讨论,确定好课题,阅读了相关书籍。刘升发主要负责写汇编程序和焊接电路;曾子亮主要负责整理设计报告。刘妞负责硬件检测,提供帮助和建议 资源安排:本设计使用了一个12M晶振,两个33PF瓷片电容,一个10uF电容,四个10

4、K电阻,一个2K电阻,一个1K的8脚上拉排阻,一块AT89C51单片机,2个4位的共阳数码管,4个按键和导线若干。用AT89C51单片机定时器来产生时间,并执行动态扫描,用数码管显示时间。用4个按键实现时间的切换显示功能。 设计原理:为了实现电子万年历的功能,首先要使时间可以变化,每过一秒单片机的时间也要加一秒,因此我们采用了定时器来产生时间。而12M晶振下AT89C51单片机的定时器采用工作方式1定时的最大定时时间为35ms,为了实现时间秒加一,我们设定定时器每10ms溢出一次,计算出定时器的初值是TH0=0D8H,TL0=0F0H。用一个变量来统计定时器的溢出次数,每当定时器溢出100次,

5、我们就让秒加1,这样我们就可以得到准确的时间秒。秒加到60后,让秒清零,分加1;判断分加到60以后,分清零,时加1;判断时加到24后,时清零,日期和星期加1;判断日期到了31后,日期置1,月加1;判断月加到13后,月置1,年加1;判断年加到100时,年清零;判断星期加到8后,星期置1。这样时间的正确变化就实现了。得到时间后,就要考虑怎么来显示了。我们采用数码管的动态扫描来显示时间。在两个4位共阳数码管上,一次只能显示时、分、秒、和星期信息。时和分,分和秒之间用小数点来区分。秒和星期之间用一横来区分。同理,显示年、月、日、星期时年和月,月和日之间用小数点来区分,日和星期之间用一横来区分。那什么时

6、候让数码管显示时分秒星期,什么时候显示年月日星期呢?我们可以在程序中设定。比如我们可以设定每分钟的4044秒的时候显示年月日,其余时间显示时分秒。让数码管的动态扫描每次都扫描32H39H单元里面的内容,而在4044秒时我们往32H39H里面送时分秒星期的值,在其余时间我们往32H39H送年月日星期的值。这样就实现了万年历的显示问题。实现了时间的产生和显示问题后,还有一个按键功能的实现问题。时间日期的显示调整设定了4个按键。按键1用来暂停时间,这个很简单,只要关闭中断总开关,时间就不能加了,实现了暂停时间的功能。按键2则用来选择需要显示的时间是日期(年、月、日)信息。由于前面显示时间中就考虑到了

7、时间的切换,我们只要让按键按下后进入往32H39H送年月日星期的程序就可以了。按键3实现恢复时间秒加1,只要再次打开终端就可以了。按键4功能为单片机的自身的复位。3 硬件电路硬件电路主要是单片机最小系统。包括单片机、晶振电路、复位电路。总体原理图如下:复位电路: 当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。复位电路由电容串联电阻构成,由电容电压不能突变的性质可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位。

8、这里我们取R4=2K和C3=10uf,R5=10K.晶振电路:单片机最小系统起振电容C2、C3一般采用1533pF,并且电容离晶振越近越好,晶振离单片机越近越好。上拉电阻P0口为开漏输出,作为输出口时需加上拉电阻,接数码管时,阻值一般为1K。硬件仿真结果:软件升级,按键功能增加后的仿真图如下:软件流程 汇编语言流程汇编软件流程中,主函数设定了了定时器溢出时间为10ms,通过中间变量CHISHU来控制溢出达100次,也就是1秒后万年历的秒加1。中间变量SHEZHI用来控制中断开关。在PANDUAN2程序中来确定时分秒年月日星期有没有达到最大值,达到最大值后又从最小值重新循环。SFM程序获得时分秒

9、的个位十位分别送到数码管动态扫描扫描的存储单元中,同理NYR程序获得年月日的个位十位送到相应存储单元中。通PANDUAN这个变量来控制执行SFM或执行NYR程序。主函数随时都在检测按键按下与否。按键按下后通过改变中间变量的值来实现按键的功能。显示子程序中每次都扫描完32H39存储单元的值。显示子程序还用ZHONGJIANZHI这个变量实现了时和分,分和秒之间用小数点来区分,年和月,月和日之间用小数点来区分。 中断子程序中,可以判断溢出次数,溢出达到100次,秒就加1. 具体流程图如下: 主函数时间赋初值判断,设置=1次数=100定时器设定设置开中断中间值、输出=0R5=40调用显示函数A=45

10、?设置=1?CLR EAA=秒判断=1A40?判断=0R5减10?判断2NNNNYYDIS:YY A减分 ,A0?秒=0,分+1,A=60A0?分=0,时+1,A=24A减时,A0?时=0,日+1,A=31A=60,A减秒判断2星期+1A减日,A0?日=1,月+1,A=13A减月,A0?月=1,年+1,A=100A减年,A0?年=0,A=7A减星期,A0?Y 跳到SFMY 跳到SFMY 跳到SFMNNNNNNNY 跳到NYRY 跳到NYRY 跳到NYRY 跳到NYR 判断=1? 星期=1SFM判断 1? 秒个,十位放34H,35H分个,十位放36H,37H时个,十位放38H,39H“”放33H

11、星期放32H日个,十位放34H,35H月个,十位放36H,37H年个,十位放38H,39H“”放33H星期放32HNYRNNNYY跳到DIS 按键1按下?设置=0,关闭中断按键2按下? 判断=0,显示年月日按键3按下?设置=1,开中断结束中断程序次数减10 次数=100秒+1PUSH PSWCLR TF0定时器重装初值RETI结束POP PSWYYYYNNN 显示子程序要显示小数点?TIMES=8XIABIAO=0R0= #32H消隐P0=0获得WEIMAXIAOBIAO送P2TIMES自减1为0 ? 获得DUANMAR0送SHUCHUORL SHUCHU,#80HP0= SHUCHUXIAO

12、BIAO+1R0+1RETNYNY C程序流程C程序中我们增加了按键功能。万年历增加了时间的调整功能。按键1的功能是暂停时间。按键2确定修改时间的位数,按下5次后可以恢复时钟。按键3可以使按键2选择好的位数时间加1。开始按键1按下?暂停时间确定修改数据位数时间加1时间复位返回按键2按下?按键3按下?按键4按下?按键子程序:显示子程序如下:开始判断此时应该显示的内容消隐选择段码位码是2或4?获得位码显示数字和小数点获得位码显示数字8位数码管扫描完了返回此时在修改数?据?闪烁相应位主程序:开始定时器初始化调用显示子程序设置中断打开调用判断子程序秒等于40?显示年月日星期秒等于45?显示年月日星期按

13、键1按下?调用按键子程序5 完整程序清单 汇编程序如下:/本程序用于实现电子万年历的作用,通过定时器0的定时10ms/加上软件定时循环100次达到准确的1秒钟/初始时间为12年02月21日08时18分32秒星期二/首先显示-2之后显示12.02.21-2,星期一直显示/通过判断中间变量使秒在40-45秒时显示年月日星期(-2)/在其余时间显示时分秒星期(-2)/硬件有4个按键,按键1:暂停,按键2:显示日期(年月日星期)/按键3:恢复,按键4:单片机自带的复位按键NIAN DATA 40H /年YUE DATA 41H /月RIQI DATA 42H /日SHI DATA 43H /时FEN

14、DATA 44H /分MIAO DATA 45H /秒XINGQI DATA 46H /星期XIABIAO DATA 47H /中间变量TIMES DATA 48H /时间次数PANDUAN BIT 49H /控制年月日和时分秒的显示时间SHEZHI BIT 50H /设置时间CHISHU DATA 51H /定时器循环次数OVERTIME EQU 100 /定时器循环次数100ZHONGJIANZHI DATA 52H /中间变量SHUCHU DATA 53H /中间变量ORG 0000HLJMP MAINORG 000BHLJMP CTC2ORG 0030HMAIN: /主程序开始MOV

15、NIAN,#12 /初始化:12年MOV YUE,#02 /02月MOV RIQI,#21 /21日MOV SHI,#08 /08时MOV FEN,#18 /18分MOV MIAO,#32 /32秒MOV XINGQI,#02 /星期二SETB PANDUANSETB SHEZHIMOV SP,#5FHMOV CHISHU,#OVERTIME /定时器初始化MOV TH0,#0D8H /装初值MOV TL0,#0F0H /装初值MOV TMOD,#00000001B /设置工作方式SETB ET0 /该中断等SETB TR0SETB EAMOV ZHONGJIANZHI,#00 /初始化中间值

16、MOV SHUCHU,#00 /初始化中间值DIS:MOV R5,#40DIS1:LCALL XIANSHIDJNZ R5,DIS1/循环40次JB SHEZHI,TIAOZHUAN1CLR EA/中断关闭 TIAOZHUAN1: /控制判断位MOV A,MIAO/当秒等于45S后,显示时、分、秒、星期CJNE A,#45,PANDUAN1SETB PANDUANPANDUAN1:CJNE A,#40,PANDUAN2/当秒等于40S后,显示年、月、日、星期CLR PANDUANPANDUAN2:/第一段显示代码开始MIAO2: MOV A,#60SUBB A,MIAOCJNE A,#0,SF

17、M /秒等于60分时清零 MOV MIAO,#00HINC FEN /分+FEN2:MOV A,#60SUBB A,FENCJNE A,#0,SFM /分等于60分时清零MOV FEN,#00HINC SHI /时+SHI2:MOV A,#24SUBB A,SHICJNE A,#0,SFM /时等于24分时清零MOV SHI,#00HINC XINGQI /星期+INC RIQI /日+XINGQI2: /一直在最后两位显示MOV A,#7SUBB A,XINGQICJNE A,#0,SFM /星期等于7时清零MOV XINGQI,#00H /第二段显示代码开始RIQI2:MOV A,#30S

18、UBB A,RIQICJNE A,#0,NYR /天数等于30天时清零MOV RIQI,#00HINC YUE /月+YUE2:MOV A,#12SUBB A,YUECJNE A,#0,NYR /月等于12月时清零MOV YUE,#00HINC NIAN /年+NIAN2:MOV A,#100SUBB A,NIANCJNE A,#0,NYR /年等于100年时清零MOV NIAN,#00H/输入数据 显示 秒、分、时、星期SFM:JNB PANDUAN,NYRMIAO1: /秒钟MOV A,MIAO MOV B,#10DIV ABMOV 35H,AMOV 34H,BFEN1: /分钟 MOV

19、A,FENMOV B,#10DIV ABMOV 37H,AMOV 36H,BSHI1: /小时 MOV A,SHIMOV B,#10DIV ABMOV 39H,AMOV 38H,BXINGQI1: /星期 MOV 33H,#0AHMOV 32H,XINGQILJMP DIS/输入数据,显示日、月、年NYR:JB PANDUAN,SFMRIQI1:MOV A,RIQI /天数MOV B,#10DIV ABMOV 35H,AMOV 34H,BYUE1: /月份 MOV A,YUE MOV B,#10DIV ABMOV 37H,AMOV 36H,BNIAN1: /年份 MOV A,NIANMOV B

20、,#10DIV ABMOV 39H,AMOV 38H,BLJMP DISWEIMA:DB 01111111B,10111111B,11011111B,11101111B,11110111B,11111011B,11111101B,11111110BDISPTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H /断码0、1、2、3、4、5、6、7、8、9、XIANSHI: /显示程序开始 PUSH PSWPUSH ACCMOV TIMES,#8 /循环8次,扫描8个数码管 MOV XIABIAO,#00HMOV R0,#32HXUNHUAN:MOV

21、 P0,#00H /消隐 MOV A,XIABIAO MOV DPTR,#WEIMAMOVC A,A+DPTRMOV P2,AMOV A,R0MOV DPTR,#DISPTABMOVC A,A+DPTRMOV SHUCHU,AMOV A,ZHONGJIANZHIMOV B,#2DIV ABMOV A,BCJNE A,#0,TIAO3 /判断是否为偶数位,在第二.四位后面点亮小数点 LCALL TIAO2 TIAO3:MOV P0,SHUCHUINC XIABIAOINC R0INC ZHONGJIANZHIMOV A,ZHONGJIANZHICJNE A,#08,TIAO1MOV ZHONGJ

22、IANZHI,#00TIAO1:ANJIAN:/按键检测开始并执行相应程序 JB P1.0,ZHUXIANSHI/按键1:暂停,关闭定时器,使秒数不加LCALL ANJIAN1ZHUXIANSHI:JB P1.1,ANJIAN3/按键2:显示日期(年、月、日、星期)LCALL ANJIAN2ANJIAN3:JB P1.2,FUWEI/按键3:恢复,打开定时器,使秒数加LCALL FUWEI1FUWEI: DJNZ TIMES,XUNHUANPOP ACCPOP PSWRETANJIAN1:/按键1子程序PUSH PSWPUSH ACCCLR SHEZHIPOP ACCPOP PSWRETANJ

23、IAN2:/按键2子程序PUSH PSWPUSH ACCCLR PANDUANPOP ACCPOP PSWRET FUWEI1:/按键3子程序PUSH PSWPUSH ACCSETB EASETB SHEZHIPOP ACCPOP PSWRETTIAO2:/小数点子程序:点亮2、4位小数点6、8位不点亮PUSH PSWPUSH ACCMOV A,ZHONGJIANZHICJNE A,#00,TIAO6LJMP TIAO5TIAO6:MOV A,ZHONGJIANZHICJNE A,#02,TIAO4LJMP TIAO5TIAO4:ORL SHUCHU,#80HTIAO5:POP ACCPOP

24、PSWRETCTC2:/定时器中断程序,每秒钟秒数加1PUSH PSWDJNZ CHISHU,NEXTMOV CHISHU,#OVERTIMEINC MIAONEXT:POP PSWCLR TF0 /重装初始值MOV TH0,#0D8HMOV TL0,#0F0HRETIEND5.2 C语言程序清单:/本程序是通过定时器0产生1S准确时间的电子万年历/通过8位数码管交替显示:年月日星期 和 时分秒星期/并在修改时间时,相应位数可以闪烁/有三个按键;按键1:停止按键;/按键2:确定修改哪位数据,并在按下5次后恢复时钟/按键3:修改对应位的数据#include unsigned char Table

25、11 = 0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40; /段码vart_init();/函数申明Updata_LED1();Updata_LED2();Delay();Delay1();Xiugai();Xiugaishu();sbit led0 = P20;/定义P2各口sbit led1 = P21;sbit led2 = P22;sbit led3 = P23;sbit led4 = P24;sbit led5 = P25;sbit led6 = P26;sbit led7 = P27;sbit stop = P10;/定

26、义P10-P12口sbit wei = P11;sbit jia = P12;unsigned int miao = 32;/秒unsigned int fen = 18;/分unsigned int shi = 8;/时unsigned int riqi = 21;/日unsigned int yue = 2;/月unsigned int nian = 12;/年unsigned int xingqi = 2;/星期bit qufen = 0;/区分显示 年月日星期 或 时分秒星期bit zhanting = 0; /保持按键1按下后允许执行的程序段int weishu = 0; /判断此时

27、修改哪位数据int ncounter = 0;/定时器循环次数int counter = 0;int ZJ = 3;/定时器T1内部自加变量bit zhongj1 = 0;/判断修改时间时的闪烁位数bit zhongj2 = 0;bit zhongj3 = 0;bit zhongj4 = 0;bit zhongj5 = 0;bit zhongj6 = 0;bit zhongj7 = 0;bit zhongj8 = 0;main()/主程序开始vart_init(); /定时器初始化while(1)Updata_LED1(); /判断子程序Updata_LED2(); /显示子程序if(miao

28、 = 40)/秒等于40秒时显示日期(年月日星期)qufen = 1;if(miao = 45)/秒等于45秒时显示时间(时分秒星期)qufen = 0;if(stop = 0)/判断按键1是否按下并执行后面程序zhanting = 1;if(zhanting = 1)/判断按键1按下,并调用按键子程序Xiugai(); /主程序结束Xiugai()/按键子程序:暂停,判断是否执行数据修改TR0 = 0;/关闭定时器T0if(wei = 0)/判断按键2是否按下并执行相应程序 weishu+;Delay1(); if(weishu = 6)/当按键2按下6次后打开中断 /并关闭数据修改子程序,

29、恢复时钟继续运行 TR0 = 1;/打开定时器T0zhanting = 0; weishu = 0; Xiugaishu();Xiugaishu()/数据修改子程序if(qufen = 0)/判断此时显示为时分秒星期 switch(weishu)case(1):if(jia = 0)/检查按键3是否按下并执行下面程序shi+;/时+Delay1();/消抖;break;case(2):if(jia = 0)/检查按键3是否按下并执行下面程序fen+;/分+Delay1();break;case(3):if(jia = 0)/检查按键3是否按下并执行下面程序miao+;/秒+Delay1();b

30、reak;case(4):if(jia = 0)/检查按键3是否按下并执行下面程序xingqi+;/星期+Delay1();break; else if(qufen = 1) switch(weishu)case(1):if(jia = 0)/检查按键3是否按下并执行下面程序nian+;/年+Delay1();break;case(2):if(jia = 0)/检查按键3是否按下并执行下面程序yue+;/月+Delay1();break;case(3):if(jia = 0)/检查按键3是否按下并执行下面程序riqi+;/日+Delay1();break;case(4):if(jia = 0)

31、/检查按键3是否按下并执行下面程序xingqi+;/星期+Delay1();break;Updata_LED1()/判断秒、分、时、日、月、年、星期是否到上限if(ZJ = 99)/定时器T1内部自加变量ZJ = 4;/并初始化,向上一级进位if(miao = 60)/判断秒是否到60秒fen+; miao = 0;if(fen = 60)/判断分shi+;fen = 0;if(shi = 24)/判断小时riqi+;xingqi+;shi = 0;if(riqi = 30)/判断日期 yue+; riqi = 0;if(yue = 12)/判断月nian+;yue = 0;if(nian =

32、 100)/判断年nian = 0;if(xingqi = 8)/判断星期xingqi = 1; Updata_LED2()/显示子程序 if(qufen = 0) /判断此时显示为时分秒星期int nTemp,xiaoshu = 0x00;if(weishu = 5)/修改星期数据时闪烁程序zhongj4 = 0;if(weishu = 4 & ZJ%2 = 0)zhongj4 = !zhongj4;zhongj3 = 0;if(zhongj4 = 0)P2 = 0XFF;/显示星期P0 = Tablexingqi;led7 = 0;Delay();if(weishu = 3 & ZJ%2

33、= 0)/修改秒数据时闪烁程序zhongj3 = !zhongj3;zhongj2 = 0;if(zhongj3 = 0)nTemp = miao/10;/显示秒十位P2 = 0XFF;P0 = TablenTemp;led4 = 0;Delay();nTemp = miao%10;/显示秒个位P2 = 0XFF;P0 = TablenTemp;led5 = 0;Delay(); if(weishu = 2 & ZJ%2 = 0)/修改分数据时闪烁程序zhongj2 = !zhongj2;zhongj1 = 0;if(zhongj2 = 0)nTemp = fen/10;/显示分十位P2 = 0XFF;P0 = TablenTemp;led2 = 0;Delay();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁