第一篇:单片机课程论文设计-电子钟课程设计
单片机课程论文设计 ——电子钟
一 课程设计的主要内容 1 设计思想 1.1硬件设计思想 1.1.1电路设计思想
电路原理图见图1,由动态数码显示组成时、分、秒的显示。把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中S-S8端口上;“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上。
1.1.2键盘设计思想
键盘是微机的主要设备,按键的读取容易引起错误动作。可采用软件去抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖动,延时时间20ms.1.2软件设计思想
本系统的主程序主要完成时间显示和修改时间的功能。而时间单元进位,时间设定时,调定时间设定时等功能全部在中断服务程序中完成。
1.2.1数据与代码转换
由前述可知,从P2口输出位选码,从P0口输出段选码,LED就会显示出数字来。但P0口的输出的数据是要BCD码,各存储单元存储的是二进制数,也就是和要显示出的字符表达的含义是不一致的。可见,将要显示的存储单元的数据直接送到P0口去驱动LED数码管显示是不能正确表达的,必须在系统内部将要显示的数据经过BCD码行转换后,将各个单元数据的段选代码送入P0口,给CD4511译码后去驱动数码管显示。具体转换过程如下:
我们先将要显示的数据装入累加器A中,再将A中的数据转换成高低两位 的BCD码,再放回A中,然后将A中的值输出。如:有一个单元存储了45这样一位数,则需转换成四位的BCD码:(0100)(0101)然后放入A中。A中BCD码,高位四位代表¡4¡低四位代表¡5¡同时送给两个译码器中,译码后¡ 45¡ 字就在两个LED中显示出来。
1.2.2计时功能的实现与中断服务程序
时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器T0打开后,进入计时,满100毫秒后,重装定时。中断一次,满一秒后秒进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位。得到时、分、秒存储单元的值,并经译码后,通过扫描程序送LED中显示出来,实现时钟计时功能。累加是用指令INC来实现的。进入中断服务程序以后,执行PUSH PSW和PUSH A将程序状态寄存器PSW的内容和累加器A中的数据保存起来,这便是所谓的¡ 保护现场¡.以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。在软件的控制之下,堆栈可在片内RAM中的任一区间设定,而堆栈的数据存取与一般的RAM存取又有区别,对它的操作,要遵循¡ 后进先出¡ 的原则。
1.2.3时间控制功能与比较指令
系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:先将执行设备开启的时间和关闭时间置入RAM某一单元,在计时主程序当中执行几条比较指令,如果当前计时时间与执行设备的设定开启时间相等,就执行一条CLR指令,将对应的那路P3置为高电位,开启;如果当前计时时间与执行设备设定的关闭时间相等,就执行SETB对应的P3置低电位,二极管截止。实现此控制功能用到的比较指令为CJNE A,#direct,rel,其转移条件是累加器A中的值与立即数不等则转移。
二 课程设计的目的
实现的功能:
①开机时,电子钟从12:00:00开始自动计时。②设置按键,能对时、分、秒进行调整。
三设计方案的论证
3.1电路原理与电路图 3.1.1电路原理
电路原理图见图1,由动态数码显示管组成时、分、秒的显示。P0口的8条数据线P0.0至P0.7分别与两个CD4511译码的ABCD口相接,P2口的P2.0至P2.2分别通过电阻R10至R13与VT1至VT3的基极相连接。这样通过P0口送出一个存储单元的高位、低位BCD显示代码,通过P2口送出扫描选通代码轮流点亮LED1至LED6,就会将要显示的数据在数码管中显示出来。从P0口输出的代码是BCD码,从P2口输出的就是位选码。这是扫描显示原理。
电路原理图
C130pFU1X119CRYSTAL18XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD*********617S-0S-1S-2S-3S-4S-5S-6S-7C230pFXTAL2R210kR310kR410kR110k9RSTC310uF293031PSENALEEARP1987654321RESPACK-***78P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51时分秒S-7S-6S-5S-4S-3S-2S-1S-001234567
图 1 电路原理图
3.2 流程图与算法描述 3.2.1流程图
3.3软件设计
SECOND
EQU 30H;MINITE EQU 31H;HOUR
EQU 32H;HOURK
BIT P0.2 MINITEK BIT P0.1 SECONDK BIT P0.0 DISPBUF EQU 40H DISPBIT EQU 48H 流程图
秒寄存器
分寄存器
時寄存器 图
T2SCNTA
EQU 49H
T2SCNTB EQU 4AH TEMP
ORG 00H;
程序执行开始EQU 4BH 地址
LJMP
START;
执行
ORG
0BH;T0
LJMP
INT_T0;
;主程序
START: MOV
SECOND,#00H;
得单元
MOV
MINITE,#00H
MOV
HOUR,#12
MOV
DISPBIT,#00H
MOV
T2SCNTA,#00H
MOV
T2SCNTB,#00H
MOV
TEMP,#0FEH
LCALL
DISP;
子程序
MOV
TMOD,#01H
MOV
TH0,#(65536-2000)/ 256;
MOV
TL0,#(65536-2000)/ 256
SETB
TR0;
SETB
ET0;
SETB
EA;
WT:
跳转到标号START
中断程序入口
跳至IN-T0执行
清0存放秒分时值
在2KB范围内长调用 显示2毫秒
允许TO中断
开启T0定时器
总中断开放
按键扫描子程序及校时调整
JB
SECONDK, NK1;SECONDK为1(sp1建按下)时跳到
LCALL
DELY10MS
JB
SECONDK,NK1
INC
SECOND;
对计数器加1
MOV
A,SECOND
CJNE
A,#60, NS60;沒到60秒返回,到60秒清0;判断计数器是否满59
MOV
SECOND,#00H NS60:
LCALL
DISP
JNB
SECONDK,$;
NK1: JB
MINITEK,NK2;
LCALL
DELY10MS
JB
MINITEK,NK2;
INC
MINITE
MOV
A,MINITE
CJNE
A,#60, NM60
MOV
MINITE,#00H NM60:
LCALL DISP
JNB
MINITEK, $;
NK2:
JB
HOURK,NK3
LCALL
DELY10MS
JB
HOURK,NK3
INC
HOUR
MOV
A, HOUR
CJNE
A, #24,NH24
MOV
HOUR,#00H
不满60秒就循环执行 分控制键按下时跳转
分控制键按下时跳转
不满60分就循环执行
NH24:
LCALL
DIS
JNB
HOURK,$;
不满24小时就循环执行
NK3 LJMP
WT DELY10MS:;
延时1毫秒的子程序
MOV D1:
MOV
;显示子程序
DISP:
;
地址
MOV
ADD
DEC
MOV
MOV
MOV
DIV
MOV
DEC
MOV
MOV
DEC
MOV
MOV
DEC
MOV R6, #10 R7, #248 DJNZ
R7, $ DJNZ
R6, D1 RET
A, #DISPBUF;
A, #8 A R1, A A, HOUR;
B, #10;
AB @R1, A;
R1 A, B @R1, A R1;A, #10 @R1, A R1 A, MINITE;
将得出的时间存入40H(DISPBUF)之后的将temp中的十六进制数转换成10进制 時送A
10进制/10=10进制 累加器送内部RAM单元
分送A
MOV B, #10
DIV
AB;
十進制調整
MOV @R1, A
DEC
R1
MOV
A, B
MOV
@R1, A
DEC
R1
MOV
A, #10
MOV
@R1,A
DEC
R1
MOV
A, SECOND;
MOV
B, #10
DIV
AB;
MOV @R1, A
DEC
R1
MOV A, B
MOV @R1, A
DEC
R1
RET INT_T0:;T0
MOV TH0,#(65536-2000)/ 256;
MOV TL0,#(65536-2000)/ 256
MOV A, #0FFH
MOV P3, A
MOV A, #DISPBUF
ADD
A, DISPBIT;
MOV R0, A
MOV A, @R0;
MOV DPTR, #TABLE;
MOVC A,@A+DPTR;
秒送A
十进制调整 TIME子程序 2毫秒 地址加,并将时间的各位送到p1 取显示数据到A 取段码表地址
查显示数据对应段码
中断服务子程序,即计时
MOV
P1, A;
分十位送P1口显示
MOV
A, DISPBIT
MOV
DPTR, #TAB;
表地址送数据指针
MOVC A,@A+DPTR
MOV
P3, A
INC
DISPBIT
MOV A, DISPBIT
CJNE A, #08H, KNA
MOV
DISPBIT, #00H KNA:
INC
T2SCNTA;
MOV A, T2SCNTA
CJNE
A, #100, DONE
MOV T2SCNTA, #00H
INC T2SCNTB
MOV A, T2SCNTB
CJNE A, #05H, DONE
MOV T2SCNTB,#00H
INC
SECOND;秒加一
MOV A, SECOND;
CJNE A, #60, NEXT;
MOV SECOND, #00H;
INC
MINITE;分加1
MOV A, MINITE;
CJNE A, #60, NEXT;
MOV
MINITE, #00H;
INC
HOUR;
時加1
MOV A, HOUR
CJNE A, #24, NEXT;
MOV
HOUR, #00H
时间的增加与进位 到60秒了吗? 到60秒清0 到60分了吗? 到60分清0 到24小時了吗?
NEXT:
LCALL
DISP DONE:
RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H TAB:
DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07F
四 系统调试
系统由AT89C51、SEG数码管、按键、电容、晶振、电阻等部分构成,能实现时间的调整、时间校对、定时时间的设定,输出等功能。系统的功能选择由按键‘时’、‘分’、‘秒’、完成。开机时,显示12:00:00的时间开始计时;按键P0.0/AD0控制“秒”的调整,每按一次加1秒;P0.1/AD1控制“分”的调整,每按一次加1分;P0.2/AD2控制“时”的调整,每按一次加1个小时;系统的主程序主要完成时间显示和定时输出判断功能。而时间单元进位,时间设定时,调定时间设定时等功能全部在中断服务程序中完成。该电子钟的精确度在仿真软件中效果良好。
五 心得体会
计算机控制技术是一门很综合的课程。任何一个计算机系统都是一个复杂的整体,学习计算机控制技术是要涉及到整体的每一部分。讨论某一部分原理时又要涉及到其它部分的工作原理。这样一来,不仅不能在短时间内较深入理解计算机的工作原理,而且也很难孤立地理解某一部分的工作原理。所以,在循序渐进的课堂教学过程中,我总是处于“学会了一些新知识,弄清了一些原来保留的问题,又出现了一些新问题”的循环中,直到课程结束时,才把保留的问题基本搞清楚。
学习该门课程知识时,其思维方法也和其它课程不同,该课程偏重于工程思维,灵活知识运用,具体地说,在了解了计算机编程后,剩下的是如何将它们用于实际系统中,其创造性劳动在于如何用计算机的有关技术和厂家提供的各种芯片,设计实用的电路和系统,再配上相应的应用程序,完成各种实际应用项目。
这次课程设计较为综合,主要的困难来自对程序的编写和校对,功夫不负有心人,经过我的虚心求学和查找资料,最终对实验的原理有了较清晰的认识。但是仍然存在很多的不足,今后需要加强的地方还是很多,所以在今后的求学路上我会更加努力。望老师批评改正。
六 参考文献:
[1].潘新民,王燕芳编著.微型计算机控制技术[M].北京:电子工业出版社,2003 [2].何立民.单片机应用技术选编(1)[M].北京:北京航空航天大学出版社,1995,6 [3].刘国荣,梁景凯.计算机控制技术与应用[M] .北京:机械工业出版社,1999,5 [4].齐维毅,丁言镁,齐振国.单片机原理及应用设计实验[M] .沈阳:辽宁大学出版社,2006,5 [5].李华.MCS-51系列单片机实用接口技术[M].北京:北京航空航天大学出版社,1993,8 [6].潘新民,王燕芳编著.单片微型计算机实用系统设计[M].北京:人民邮电出版社,1992
第二篇:单片机课程设计电子钟设计
单片机课程设计电子钟设计
目录
一、摘要
二、设计任务
三、基本原理
数码管显示可以用静态显示或动态显示方法。静态显示需要数据锁存器等硬件,接口复杂,时钟显示用四个数码管。动态显示相对简单,但需动态扫描,扫描频率要大于人视觉暂留频率,信息看起来才稳定。译码方式可分为软件译码和硬件译码,软件译码通过译码程序查的显示信息的字段码;硬件译码通过硬件译码器得到显示信息的字段码,实际中通常采用软件译码。
在具体处理时,定时器计数器采用中断方式工作,对时钟的形成在中断服务程序中实现。在主程序中只需对定时器计数器初始化、调用显示子程序和控制子程序。另外,为了使用便,设计了简单的按键,可以通过按键实现时、分的调整,这样在主程序中就加入了按键设置子程序。
四、编程算法思路
五、程序流程图
六、硬件单元设计
七、软件单元设计
八、调试结果分析
九、设计总结及心得体会
十、参考文献
一设计任务
1、基本任务:利用定时器/计数器中断和静态显示或动态显示,实现电子时钟的时分秒精确走时和校准
。时间显示用四个数码管分别显示时、分、秒用点表示,在时和分的中间闪动,时间显示格式(18:49)
时间校准用2个键实现:一个键K1作移位选择(选中要修改的位,选中的位用闪烁指示),一个键K2做加1(对选中的位进行加1修改)。
2、功能增强型任务:在基本任务的基础上加上日历功能、准时报时功能和跑表功能
(1)日历功能:能实现时、分、秒和年、月、日计时,增加1个按键控制分3屏例如显开始的第1屏默认显示“时、分、秒”四位+秒点,按下K3键显示“月和日”四位,再按下课K3键显示“年份”四位,再按下K3键显示“时、分、秒”,依次类推。程序要能处理闰年、闰月功能。
(2)准点报时功能:可以在增加一个按键K4设计具有闹钟功能,实现定点报时。具体操作是:按下
K4键,进入闹钟设置功能,再通过K1、K2键来完成定点报警时间的设置。
(3)跑表功能:再增加一个按键K5设计跑表功能,实现启动毫秒计数,相当与田径运动比赛的跑
表工作。
三基本原理
软件时钟时利用单片机内部的定时器/计数器来实现的,它的过程如下:首先定单片机内部的一个定时器/计数器工作于定时方式,对机器周期形成基准时间,然后用另一个定时器/计数器或软件计数的方法对基准时间计数形成秒,秒计60次形成分,分计60次形成小时,小时计24次则计满一天。然后通过数码管把它们的内容在相应位置显示出来即可。
四编程算法思路
1、主程序的设计:串行口工作方式0,定时器/计数器1工作在方式1进行初始化,然后通过循环(调用显示子程序)等待定时中断的到来。
2、按键的控制:KEY1控制时的调节,kEY2控制分的调节,KEY3控制时、分定型
3、中断服务程序的设计:中断服务程序主要功能是实现时、分、秒的计时处理。
4、时、分、秒计时的实现:秒计时时采用中断方式进行溢出次数的累计得到的。从秒到分,从分到时可通过软件的累加和比较到位方法来实现。要求每满1秒,则“秒”单元中的内容加1;“秒”单元每满60,则“秒”单元清0,同时“分”单元中的内容加1;“分”单元每满60,则“分”单元清0,同时“时”单元加1。“时”单元每满24,则将“时”单元清0。
5、显示子程序:采用数码管静态显示来显示时钟的走动
6,延时子程序:用来实现按键操控延时和实现整点12时报时
五程序流程图
六硬件单元设计
1、电路总设计图
2、AT89C51芯片
七软件单元设计
1、资源分配:定时器T1,P1.6为调整时钟,P1.5为调整分钟,P1.4为控制调整
30H秒显示单元,31H分显示单元,32H时显示单元,08H放分调整标
志,09H放时调整标志,0AH放闪烁标志
2、程序清单(加注释)
八调试结果分析
在实验操作过程中,将所写好的程序打入计算机内,通过编译检查其是否有错误,如有错误将其改正,直至无误后下载仿真器,实现运行。观察实验箱上的数码管显示,判断其是否为所需结果,如果与所要求的有差别,需继续调试,重新修改程序,检查硬件设施不断地调试,不断地检查直至得到所要的结果。在调试过程中,开始运行时能够实现时钟的显示,但是无法实现其闪烁功能,后经不断调试修改及同学的帮助最终实现该功能,能够达到时钟显示调节的基本要求,还可以实现整点报时。但在增加其功能显示年月时又出现一定的问题,未能实现该功能,程序存在一定的不足性,需继续完善,实现更多的功能
九设计总结及心得体会
经过两天的单片机课程设计,终于完成了我的电子时钟的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这次设计把一些基本功能都做了出来,只是一些增强型功能未能实现。
在本次设计的过程中,我发现很多的问题,虽然以前还做过一些实验但这次设计真的让我长进了很多单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,要有通篇的全局思想考虑问题。在操作的过程中,出现许多错误,都是在连接处不能够上下连贯正确运行,还需继续努力。有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在课程设计中的最大收获,同时,要把所学只是灵活应用才能真正领悟其中的意义,加深对它的理解与掌握。还有,通过此次的操作也使我的实践操作能力得到了进一步的提高。
十参考文献
【1】张毅刚,彭喜元,董继成。单片机原理及应用。北京:高等教育出版社,2003
【2】周航慈。单片机应用程序设计技术(修订版)。北京:北京航空航天大学出版社,2002
【3】万光毅等。单片机实验与实践教程。北京:北京航空航天大学出版社,2003
【4】何立民,I2C总线应用系统设计。北京:北京航空航天大学出版社,2002
【5】周航慈,朱兆优,李跃忠。智能仪器原理与设计。北京:北航大学出版社,2005
第三篇:单片机课程设计电子钟
课程设计任务书
(指导教师填写)
课程设计名称电子技术课程设计学生姓名专业班级设计题目数字钟
一、课程设计的任务和目的任务:设计一台能显示“时”、“分”、“秒”的数字钟,周期为24小时;具有校时、正点报时功能。
目的:培养学生综合运用所学知识的能力,综合设计能力,培养动手能力及分析问题、解决问题的能力。
二、设计内容、技术条件和要求
1.数字钟可显示“时”、“分”、“秒”,且“时”、“分”、“秒”分别用两个数码管显示,计满23小时60分钟60秒,则全部清零。
2.具有校时功能,时、分校时用1HZ的信号进行,而秒较时用2HZ时钟信号进行。
3.整点能自动报时。要求报时声响为四低一高,最后一响为整点,前四声用500HZ信号让喇叭发声,最后一声用1000HZ信号。
4.根据上述要求,画出电路总框图,简述各部分工作原理。
5.进行各部分电路的设计,要求有分析过程、原理图表示。
6.对原理图进行仿真。
7.在实验箱上组装、调试。
8.撰写设计总结报告。
三、时间进度安排
第一周:理论设计。
周一上午布置设计任务,讲解设计要求,安排答疑、实验时间;
周三、周四下午课程设计答疑,其他时间学生查资料,做初步理论设计;
周五交设计初稿,由指导教师审查;
第二周:仿真和安装调试、撰写设计总结报告
周一、二学生进实验室做仿真实验,并根据实验情况修正设计图;
周三至周五做插接线实验,最后根据实验情况总结、撰写设计说明书。
四、主要参考文献
1.各种版本的数字电子技术基础教材
2.各种版本的电子技术课程设计指导书
3.集成电路手册
指导教师签字:年月日
第四篇:单片机课程设计-电子钟-完整
单片机课程设计
题目
专业 通信工程 班级 11级1班 学号 姓名
电 子 钟 设 计
单片机原理与应用课程设计
电子钟设计
功能要求:
1、设计一个电子时钟,要求可以显示时、分、秒,用户可以设置时间。
2、实现秒表功能。
功能描述
(1)
时钟。初始界面是时钟显示,按键S1是调时选位,按键S2是加数。根据不同的闪烁位置进行调节。
(2)
年与日,星期。在初始状态下,按下S2,则跳转,显示年月日,5S后跳回初始界面。若在年月日界面再次按下S2,则再次跳转,显示星期,几秒后跳转回初始界面。
(3)
秒表。在初始界面下,按下S3,则跳转,进入秒表。秒表功能键如下:S1 退出秒表;S2 停止开始计时;S3 秒表清零。
(4)
闹钟。在设置中设置好时间,最高位设为“1”则打开闹钟。最高位设为“0”则关闭闹钟。在闹钟响是,按S3进行关闹钟。
工作原理 硬件
采用80C51系列单片机作为CPU,P0口作为数据线,通过锁存器进行段选和位选,是数码管不断地显示数字。数码管的显示是扫描式。(1)
本电子钟用的单片机型号是STC89C516RD+。P0口作为段选和位选的数据线。P10口为段选寄存器的使能端。P11口为位选寄存器的使能端。晶振采用的12MHz晶振。要求频率稳定。
(2)
本电子钟用的是共阴极数码管。从左到右,第1,2位是秒位;第4,5位是分位;第7,8位是时位。第3,6位是“--”。
(3)
通过单片机的P0口,先对数码管进行位选,即在位锁存器使能是将P0口数据进行锁存。再通过段锁存器将P0口送来的段数据进行锁存。此时数码管的第一位显示数字。同样的步骤进行第二位显示。以非常快的速度进行,由于人眼的余辉效应,会看到8位数码管一起亮。即可以显示时间。通过单片机的内部TO,T1的计数。即可以实现时钟,秒表等功能。(4)电路图如下:
软件
程序代码包括三部分:1.bujian(部件库)2.main(主函数)3.H(头文件库)。一 .bujian(部件库)(1)xianshi.c #include
//数码管秒个位
P0=t[s%10];p11=0;P0=0xff;delay(m);p10=1;p10=0;p11=1;P0=0xbf;p11=0;
//消隐
P0=t[s/10];
//消隐 //数码管秒十位
P0=0xff;delay(m);} void led_f(unsigned int s){ p10=1;// P0=t[s%10];p10=0;p11=1;P0=0xef;
p11=0;
P0=0xff;delay(m);p10=1;
P0=t[s/10];p10=0;p11=1;P0=0xf7;p11=0;
P0=0xff;delay(m);} void led_h(unsigned int s){
// p10=1;P0=t[s%10];p10=0;p11=1;P0=0xfd;
p11=0;// P0=0xff;delay(m);p10=1;
P0=t[s/10];p10=0;p11=1;P0=0xfe;p11=0;
数码管分个位 //消隐
//数码管分十位
//消隐
数码管时个位
消隐
//数码管时十位
//消隐
P0=0xff;delay(m);}
void line(void){ p10=1;P0=0x40;p10=0;p11=1;P0=0xfb;delay(m);p11=0;
p10=1;P0=0x40;p10=0;p11=1;P0=0xdf;p11=0;delay(m);}
//消隐
P0=0xff;
//数码管“---”
//消隐
P0=0xff;
//数码管“---”
(2)miaobiao.c #include
#include
{ while(!s3){led_s(mms);led_f(ms);line();led_h(mf);} TR1=0;mms=0;ms=0;mf=0;} } }
(3)Delay.c #include
void delay(unsigned int a)
{ unsigned char l;
while(a--)
{for(l=0;l<100;l++);} }
(4)gongneng.c #include
#include
if(s2==0){ delay(3);if(s2==0)while(!s2){ led_s(s);delay(1);line();led_f(f);delay(1);led_h(h);delay(1);}
// while(1){ led_s(r);delay(2);led_f(y);delay(2);line();led_h(nian);delay(2);aa++;if(s2==0)
{ while(!s2)
{
led_s(r);delay(1);line();led_f(y);delay(1);led_h(nian);delay(1);}
//星期显示
while(1)
{led_f(xing);delay(2);
bb++;
if(bb==100){bb=0;break;}
日期显示 }
}
if(aa==100)
line();led_f(y);delay(1);led_h(nian);delay(1);
} } if(s1==0){ delay(3);if(s1==0){
switch(x){ case 1 : if(shanshuo==1){led_s(s);} line();led_f(f);delay(2);led_h(h);delay(2);break;case 2 :led_s(s);if(shanshuo==1){led_f(f);} delay(2);line();led_h(h);delay(2);break;case 3 : led_s(s);led_f(f);delay(2);line();if(shanshuo==1){led_h(h);} delay(2);break;case 4 : if(shanshuo==1){led_s(r);} led_f(y);delay(2);line();led_h(nian);delay(2);break;case 5 : led_s(r);if(shanshuo==1){led_f(y);} delay(2);line();led_h(nian);delay(2);break;case 6 :led_s(r);led_f(y);delay(2);line();if(shanshuo==1){led_h(nian);} delay(2);break;case 7 :if(shanshuo==1){led_f(xing);delay(5);} break;case 8 :if(shanshuo==1){led_s(nf);} line();led_f(nh);delay(2);led_h(ns);delay(2);break;case 9 :led_s(nf);if(shanshuo==1){led_f(nh);} delay(2);line();led_h(ns);delay(2);break;case 10:led_s(nf);led_f(nh);delay(2);line();if(shanshuo==1){led_h(ns);} delay(2);break;default : break;}
aa++;if(s2==0){ while(!s2){if(x==1||x==2||x==3){ led_s(s);delay(1);line();led_f(f);delay(1);led_h(h);delay(1);} if(x==4||x==5||x==6){ led_s(r);delay(1);line();led_f(y);delay(1);led_h(nian);delay(1);} if(x==7){ led_f(xing);} if(x==8||x==9||x==10){led_s(nf);led_f(nh);delay(2);line();led_h(ns);delay(2);} }
switch(x)
{ case 1 : s++;if(s>59)s=0;break;
while(!s1);while(1)
{ if(x==1||x==2||x==3)TR0=0;else TR0=1;if(aa==20){shanshuo=!shanshuo;aa=0;}
{ break;} { led_s(r);delay(1);
} if(s1==0)
case 2 :
}
f++;if(f>59)f=0;break;
case 3 : h++;if(h>23)h=0;break;case 4 : r++;if(r>31)r=1;break;case 5 : y++;if(y>12)y=1;break;case 6 : case 7 :
nian++;if(nian>20)nian=10;break;xing++;if(xing>7)xing=1;break;
case 8 : nf++;if(nf>59)nf=0;break;case 9 : nh++;if(nh>23)nh=0;break;case 10: ns=!ns;break;
default: break;{while(!s1){if(x==1||x==2||x==3){ led_s(s);delay(1);line();led_f(f);delay(1);led_h(h);delay(1);} if(x==4||x==5||x==6){ led_s(r);delay(1);line();led_f(y);delay(1);led_h(nian);delay(1);} if(x==7){ led_f(xing);} if(x==8||x==9||x==10){led_s(nf);led_f(nh);delay(2);line();led_h(ns);delay(2);} }
x++;if(x>10){ x=0;TR0=1;break;} } } } } } } 二.H(头文件库)(1)Delay.h #ifndef _DELAY_H__
void led_s(unsigned int s);void led_h(unsigned int s);#define _DELAY_H__ void delay(unsigned int a);#endif(2)xianshi.h #ifndef _XIANSHI_H__ #define _XIANSHI_H__
void led_f(unsigned int s);void line(void);#endif(3)gongneng.h
#ifndef _DONGNENG_H__ #define _GONGNENG_H__ void gongneng(void);#endif(4)miaobiao.h
#ifndef _MIAOBIAO_H__ #define _MIAOBIAO_H__ void miaobiao(void);#endif(5)dingyi.h #ifndef _DINGYI_H__ #define _DINGYI_H__ sbit s1=P2^4;
sbit s2=P2^5;
sbit s3=P2^6;sbit p10=P1^0;sbit p11=P1^1;sbit p12=P1^2;#endif
//流水灯使能端 //按键1 //按键2 //按键3 sbit p37=P3^7;//蜂鸣器时能
三.Main(主函数)(1)main.c #include
ET0=1;TH0=6;TR0=1;
//关闭流水灯
ET1=1;TH1=(65535-5000)/256;TL1=(65535-5000)%256;TR1=0;while(1){ if((s3==0)&&(ns==0)){while(!s3);miaobiao();} if(s1==0||s2==0)gongneng();else { led_s(s);line();led_f(f);line();led_h(h);} if((f==nf)&&(h==nh)&&(ns==1))ll=1;else ll=0;} } void zhongduan(void)interrupt 1 {
if((ll==1)&&(ns==1))
{ p37=!p37;if((s3==0)&&(ns==1)){ while(!s3)ns=0;p37=1;} } n++;if(n==5000){n=0;s++;if(s==60){ s=0;f++;} if(f==60){ f=0;h++;}
if(h==24){ h=0;r++;xing++;} switch(r){ case 29 : if(nian/4==0){if(y==2)r=0;} y++;case 31 : if(y==4||y==6||y==9||y==11){ } if(xing>7)xing=1;if(y==13){ y=1;nian++;} } } default : break;
break;case 30 : if((nian/4)!=0){if(y==2){ r=0;y++;}} break;
r=0;y++;} break;case 32 : if(y==1||y==3||y==5||y==7||y==8||y==10||y==12){r=0;y++;} break;void zhongduan1(void)interrupt 3
{
TH1=(65535-5000)/256;
m++;TL1=(65535-5000)%256;if(m==2){mms++;m=0;if(mms>=100){ mms=0;ms++;} if(ms==60){ ms=0;mf++;} if(mf==60){ mf=0;} } }
参考文献:
单片机中级教程(第2版)、单片机语言C51程序设计(赵文博)感想: 这次课程设计整体来说是成功的,但我也发现了自己许多错漏和不足之处。譬如,最简单的程序没写好就想着写更复杂的程序,做事还是缺乏耐性和细心,当有时遇到问题时,总觉得无从下手,对于课本上的知识不能很好的组织起来。在编写各功能程序时,特别是后来增添的比较复杂的程序
第五篇:多功能电子钟设计 单片机课程设计报告东华理工
单片机原理及应用设计课程
设计报告
课题名称:多功能电子钟设计 姓 名: 学 号: 班 级: 指导老师:
2017年6月13日
目录
一、设计任务
....................................................1 1.1 基本任务..................................................1 1.2 功能增强型任务
.........................................1
二、任务分析
....................................................1 2.1 计时方案分析
...............................................1 2.2显示方案分析
.................................................2 2.3 预期功能实现
............................................2
三、设计思路......................................................2 3.1 计时部分课程设计思路
..................................2 3.2 按键判断部分课程设计思路
..............................3 3.3 数码管显示部分..........................................3
四、电路图
....................................................3
五、程序流程图
..................................................6
六、调试结果
....................................................8 6.1 时钟模块调试结果..............................................8 6.2 秒表模块调试结果..........................................8 6.3 日历功能调试模块..........................................9
七、总结
........................................................9
八、程序代码.....................................................10
一、设计任务
1、基本任务:利用定时器/计数器中断和静态显示或动态显示,实现电子钟的时分秒精确走时和校准。时间显示用四个数码管分别显示时、分,秒用点表示,在时和分的中间闪动,时间显示格式:
时间校准用 2 个键实现:一个键 K1做移位选择键(选中要修改的位,选中的位用闪烁指示),一个键 K2做加 1 键(对选中的位进行加 1 修改)。
2、功能增强型任务:在基本任务的基础上日历功能、准点报时功能和跑表功能:
(1)日历功能:能实现时、分、秒和年、月、日计时,增加 1 个按键控制分 3 屏显示,例如开始的第 1 屏默认显示“时、分、秒”四位+秒点,按下 K3键显示“月和日”四位,再按下 K3键显示“年份”四位,再按下 K3 键显示“时、分、秒”,依次类推。程序要能处理闰年、闰月功能。
(2)准点报时功能:可以再增加一个键 K(4)设计具有闹钟功能,实现定点报时。具体操作是:按下 K4 键,进入闹钟设置功能,再通过 K1、K2键来完成定点报警时间的设置。
(3)跑表功能:再增加一个键 K5 设计跑表功能,实现启动毫秒计数,相当与田径运动比赛的跑表工作。
二、任务分析
本次设计时钟电路,使用ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一蜂鸣器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、开关电路、报警电路、LED数码管显示即可满足设计要求。
1、计时方案分析:
使用单片机内部的可编程定时器。
利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计时。该方案节省硬件成本,但程序设计较为复杂。
2、显示方案分析:
对于实时时钟而言,显示显然是另一个重要的环节。通常LED显示有两种方式:动态显示和静态显示。
静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。
LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。
本系统需要采用4位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。
3、预期功能实现: 1.基本任务要求:
(1)时间走时准确,每天误差不能超过5秒。
(2)仿照电子表的校时功能,校时修改时,被修改位能闪烁显示,按键要灵敏。(3)若最高位为 0,高位能灭零显示。2.增强型任务要求:
(1)跑表功能计数误差 1ms。
(2)日历程序要能处理闰年、闰月功能。(3)准点报时能人工解除和自动解除。
三、设计思路
1、计时部分课程设计思路
该课程设计是利用80C51单片机内部的定时/计数器、中断系统、以及行列键盘,设计一个单片机电子时钟。设计的电子时钟通过数码管显示,并能通过按键实现设置时间、校时、启动控制等。
用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数,初值设为62500ms(自己计算)。形成定时时间为62500ms。用片内RAM的2FH单元对62500ms计数,计16次产生秒计数器34H单元加1,秒计数器加到60则分计数器33H单元加1,分计数器加到60则时计数器32H单元加1,时计数器加到24则时计数器清0。然后把分、时、日、月计数器分成分单元和时单元放到4个数码管的显示缓冲区,通过数码管显示出来。显示格式为小时高位、小时低位---分高位、分低位和显示日期格式为月高位、月低位---日高位、日低位。
2、按键判断部分课程设计思路
当每十六微秒进位一次时,程序就进行一次判断按键是否有按下的(是否有校正键按下),判断是否与上次按键相同。
如果相同直接送入时间缓冲间送出显示,如果不相同就保存按下的按键再进行判断是不是切换键按下,如果是时间时期同时取反,将取反时间送入时间缓冲间送出显示同时将取反日期送入日期缓冲间送出显示。
如果不是,判断是否是校正键按下,如果不是重复将取反时间送入时间缓冲间送出显示同时将取反日期送入日期缓冲间送出显示。如果是校正键按下就进入校正状态,将校正指针初值设成(00,01、10、11、分别代表分、时日、月)同样判断校正指针中的值进入下面分、时、日、月四个子程序中执行,同时进入每个时间日期子程序中都要进行判断是否有键按下,每次按键任何一个键都要送入时间日期缓冲间显示。
3、数码管显示部分
把我们设计好的程序通过查表在数码管上显示出来,数码管上从左到右分别显示月、日/时、分,四个数码管分别显示高位和低位,切换时间显示时,要显示出小数点闪烁。
四、电路图
实验电路包括LED数码管显示、键盘和报警喇叭三部分电路,如下所示。
图4.1 按键电路部分
图4.2 拨键开关连接电路
图4.3 闹钟报警电路
图4.4 动态数码管显示电路
图4.6 晶振电路
本设计晶振电路采用12M的晶振。晶振的作用是给单片机正常工作提供稳定的时钟信号。单片机的晶振并不是只能用12M,只要不超过20M就行,在准许的范围内,晶振越大,单片机运行越快,还有用12M的就是好算时间,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us,那么定时器计一次数就是1us了,电容范围在20-40pF之间,这里连接的是30pF的电容。
机器周期=10*晶振周期=12*系统时钟周期
图4.7 上电按钮复位电路
本设计采用上电按钮复位电路:首先经过上电复位,当按下按键时,RST直接与VCC相连,为高电平形成复位,同时电解电容被电路放电;按键松开时,VCC对电容充电,充电电流在电阻上,RST依然为高电平,仍然是复位,充电完成后,电容相当于开路,RST为低电平,单片机芯片正常工作。其中电阻R2决定了电容充电的时间,R2越大则充电时间长,复位信号从VCC回落到0V的时间也长。
图4.8 总电路图
五、程序流程图
开始等待外部中断按键按下外部中断0判断是外部中断0还是外部中断1外部中断1从当前显示时间开始计时停止计时,等待设置时间扫描矩阵键盘,判断按键否是根据不同按键控制设置位,以及时间的加减
主函数程序流程图
键盘扫面程序流程图
定时器中断程序流程图
外部中断程序流程图
六、调试结果
图6.1 时钟模块调试结果
图6.2 秒表模块调试结果
图6.3 日历功能调试模块
七、总结
通过这几天的的单片机课程设计,有很多的心得体会,有关于单片机的,也有关于之前所学过模电数电等基础科目的。下面是我对这几天课程设计的总结:
1.本次课程设计我主要通过Proteus软件仿真得到实验结果。本次实验我完成了实验的基本设计任务,即电子钟的设计,也达到了其所有的设计要求。在这基础上,我还完成了功能增强型的几项任务,如日历功能,其中跑秒的误差控制在了1ms范围内。但美中不足的是,日历功能不太完善,我设计的程序并不能处理闰年和闰月,且并没有闹钟这个模块,这正是我有待改善的地方。
2.本次实验,我又加深了对单片机的记忆。有些知识会迁移和联系模电数电。课堂教学考虑到大多数同学的需求,主要强调“基本”——基本知识、基本理论、基本方法、基本技能。而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
3.单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。实践中获得的知识能让我对单片机的知识有更好的认识和理解。虽然这次的课程设计我参考了一些文献资料,没有做到创新,但在对程序的读写过程中我明白了许多。4.通过本次课程设计让我更加了解了单片机各模块的功能,包括数码管显示,4*4矩阵 键盘,独立按键。实验过程让我更加了解并进一步掌握了中断,定时计数,4*4键盘输入等程序编写。以及掌握了通过Proteus构造自己所需要的外围电路,进行仿真实验。通过此次课程设计,初步掌握了使单片机多个模块进行工作的原理和方法。
八、程序代码
#include
//定义全局变量
unsigned char code key[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb, 0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
//按键状态定义
unsigned char code number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};unsigned char code which[]={0x00,0x01,0x03,0x04,0x06,0x07};unsigned int HH=0;hh=0;MM=0;mm=0;SS=0;ss=0;sbit P32=P3^2;//延迟函数
void delay(unint k)
{unint i,j,x;
for(x=1;x<=k;x++)
for(i=0;i<10;i++)
for(j=0;j<17;j++);
}
//按键扫描
unsigned char Scan_keyboard()
{ unsigned char h_code,l_code,key_code;
P1=0xf0;
h_code =P1;
h_code = h_code &0xf0;
P1=0x0f;
l_code =P1;
l_code = l_code &0x0f;
key_code = h_code | l_code;
return key_code;
}
void timer0_int(void)interrupt 1 {
ss++;
if(ss>9)
{
SS++;
ss=0;
}
if(SS>5)
{
mm++;
SS=0;
}
if(mm>9)
{
MM++;
mm=0;
}
if(MM>5)
{
hh++;
MM=0;
}
if(hh>9&&HH<2)
{
HH++;
hh=0;
}
if(HH==2&&hh>3)
{
HH=0;
hh=0;
}
TH0=0x3c;
TL0=0xb0;}
void P3_2()
{
TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;
//总中断打开 TR0=1;
//中断标志位 ET0=1;
//中断允许位 while(1){
int k=0;
delay(2);P2=0x00;P0=number[5];
delay(2);P2=0x01;P0=number[hh];
delay(2);P2=0x02;P0=number[10];
delay(2);P2=0x03;P0=number[MM];
delay(2);P2=0x04;P0=number[mm];
delay(2);P2=0x05;P0=number[10];
delay(2);P2=0x06;P0=number[SS];
delay(2);P2=0x07;P0=number[ss];
}
} main(){
unsigned char keynumber;while(1){ int k=0;
delay(2);P2=0x02;P0=number[10];
delay(2);P2=0x05;P0=number[10];for(;k<6;k++){
delay(2);P2=which[k];P0=number[0];} // if(P32==0)14
P3_2();/* keynumber=Scan_keyboard();if(keynumber!=0xff)
{
switch(keynumber)
{
case 0xee:P2=0x07;P0=number[i++];break;
case 0xde:P2=0x07;P0=number[i--];break;
case 0xbe:P2=0x07;i=0;P0=number[i];break;
default:break;
}
delay(150);
} if(i>9)i=0;else if(i<0)i=9;*/ } }