第一篇:基于单片机的时钟控制器设计
时钟控制器设计任务书
1.设计目的与要求
设计出一个用于数字时钟的控制器,准确地理解有关要求,独立完成系统设计,要求所设计的电路具有以下功能:
(1)显示: 可以显示时、分和秒
(2)调时功能:时(0-24)、分和秒(0-60)可以连续可调(3)时间日误差< 2秒(4)增加整点报时功能(5)增加闹钟任意设定功能 2.设计内容
(1)画出电路原理图,正确使用逻辑关系;(2)确定元器件及元件参数;(3)进行电路模拟仿真;(4)SCH文件生成与打印输出;(5)PCB文件生成与打印输出; 3.编写设计报告
写出设计的全过程,附上有关资料和图纸,有心得体会。4.答辩
在规定时间内,完成叙述并回答问题。
目录
1.引言…………………………………………………………………………-1-2 总体设计方案………………………………………………………………-1-2.1 设计思路…………………………………………………………………-1-2.2 方案确立…………………………………………………………………-1-2.3 设计方框图………………………………………………………………-2-3 设计原理分析………………………………………………………………-2-3.1 系统硬件电路设计 ……………………………………………………-2-3.2 主控器件AT89S51 ………………………………………………………-2-3.3 译码器74HC245 …………………………………………………………-3-3.4 显示电路 …………………………………………………………………3-3.5 按键电路…………………………………………………………………-4-3.6 复位电路…………………………………………………………………-4-3.7 蜂鸣电路…………………………………………………………………-5-3.8 时钟电路…………………………………………………………………-5-3.9 总体原理图………………………………………………………………-5-3.10程序框图…………………………………………………………………-5-4 结束语………………………………………………………………………-7-参考文献………………………………………………………………………-8-附录 1 电路总原理图 ………………………………………………………-9-附录 2 总程序………………………………………………………………-10-
基于单片机控制的时钟控制器
摘要:本设计以Atmel公司的AT89S51单片机为控制系统的核心,模型采用单片机作为主控制器,以汇编语言为程序设计的基础,设计的一个用两个四位一体数码管串口显示的时钟控制电路,包含了时钟控制电路的基本功能:数码显示,时间调整,闹钟设定,秒表显示等,按照二十四小时循环,具有调节方便,简单实用,可靠性强的优点,有很高的利用价值。关键词:单片机 AT89C51 74LS245 数码管 引言
数字钟是采用数字电路实现对时、分、秒及数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。为了适应时代的潮流,本设计采用AT89S51单片机为核心,使得计时的精度有了很大的提高,而且调节也变的简单实用,采用数字显示也跟加的直观方便。总体设计方案
2.1 设计思路
本设计采用AT89S51单片机为控制核心,产生精确的时钟震荡,来控制数码管显示电路来进行数码显示,外围电路主要有复位电路,震荡电路,按键电路,显示电路,蜂鸣电路组成;复位电路可及时的对单片机进行复位,恢复到初始的状态,震荡电路主要用于计数,定时,产生合适的波特率,按键电路主要是给人们提供一个合适的人机对话的界面,方便人们进行实时的调节,显示电路主要用于数码的显示,蜂鸣电路用于闹铃设定等辅助功能。2.2 方案确立
本设计主要有包含了时钟电路,按键扫描,显示电路等几个部分。由单片机实现时钟功能单片机内部具有定时器,可方便实现定时功能。按键电路:键盘分为矩阵式键盘扫描电路和独立式按键电路。。矩阵式键盘电路,此类键盘是采用行列扫描方式,优点是当按键较多时可以降低占用单片机的I/O口数目,缺点是电路复杂且会加大编程难度。独立按键电路,每个键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。缺点是当按键较多时占用单片机的I/O数目较多,优点是电路设计简单,且编程极其容易。由于该系统采用了常规钟表式的校对方式,用键较少,系统资源足够用,故采用了独立按键电路。显示电路分为:静态显示法与动态显示法,由于静态显示法需要数据锁存器等硬件,接口复杂一些,又考虑到时钟显示只有6位,且系统没有其它复杂的处理任务,所以决定采用动态显示法。2.3 硬件设计方框图
电路的设计以AT89S51单片机为核心,包含了按键电路,复位电路,震荡电路,数 码显示电路,整点报时电路等一系列独立环节,下面介绍一下电路设计过程中的总体框图,如图1所示。
图1 时钟电路总体框图 设计原理分析
用AT89S51单片机控制的数字时钟电路,外接震荡电路,按键电路,显示电路,蜂鸣电路等:用单片机电路P0口来输出7段码数据,P2.0~P2.5口作列扫描输出;按键用P1口控制,分别用于调节时,分,以及秒表和闹钟的设定;P1.7口接5V的小蜂鸣器,用于按键发音以及定时提醒,整点报时提醒等;采用74HC245作为数码管的段码驱动,为了提供共阳LED数码管的列扫描驱动电压,用三极管8550做电源的驱动输出;采用12MHZ晶振,可提高秒计时的精确性;在软件设计方面,应完成时钟控制电路的各项要求。
3.1 系统硬件电路设计
系统硬件电路主要组成:主控制器AT89S52、译码器74HC245、显示电路、蜂鸣器电路,复位电路时钟电路。3.2 主控器件AT89C51 AT89S51是一款低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。管脚如图2所示。
图2 DIP-40封装89C51引脚图
3.3译码器74LS245 74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。当89S51单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)DIR=“1”,信号由 A 向 B 传输;(发送)当CE为高电平时,A、B均为高阻态。P0口与74LS245输入端相连,E端接地,保证数据线畅通。管脚如图3所示。
图3 74LS245管脚图
3.4 显示电路
LED显示块是由发光二极管显示字段的显示器件。这种显示块有共阴与共阳两种结构。共阴极LED显示块的发光二极管阴极共地,当某个发光二极管的阳极为高电平时,发光二极管点亮。共阳极LED显示块的放光二极管阳极并接。显示块与单片机接口非常容易,只要将一个8位并行输出口语显示块的发光二极管引脚相连即可(AT89S51需要加上拉电阻)。此次电路采用2个4位共阳LED数码管,从P0口输出段码,列扫描用P2.0~P2.7来实现。如图4所示。
图4 74LS245驱动段码显示电路图
3.5 按键电路
按键调节电路有四个独立的按键接到P1口的P1.0—P1.3端口,控制着电路的调时,调分以及秒表功能和闹钟的设定。具体电路如下图5所示。
图5 按键电路图
3.6 复位电路
AT89S51单片机的复位电路,如图5所示中左边电路。在RESET输入端出现高电平时实现复位和初始化。在震荡器运行的情况下,要实现复位操作,必须使RST引脚至少 保持两个机器周期的高电平。在CPU在第二个机器周期内执行内部复位操作,以后每一个机器周期重复一次,直至RST端电平变低复位期间不产生ALE信号。当RST引脚返回低电平以后,CPU从0地址开始执行程序。3.7 蜂鸣电路
蜂鸣器是广泛应用于各种电子产品的一种元器件,它用于提示、报警、音乐等许多应用场合。三极管8550作蜂鸣器的驱动,增加了蜂鸣器的驱动电流。蜂鸣器的正极性的一端接到三极管的集电极,另一端连接到地,三极管的基极由单片机的P1.7管脚控制,底电平时蜂鸣器响,高电平时不响。另外,蜂鸣器的声音大小及音调可以通过调整P1.7管脚的置低时间及输出的波形进行控制。蜂鸣器的连接电路的原理图如图5所示。3.8 时钟电路
AT89S51内部片内有一个由反相放大器构成的振荡电路,XTAL1和XTAL2分别为震荡电路的输入端和输出端。时钟可以由内部方式产生或外部方式产生。在XTAL1和XTAL2引脚上外接定时元件,内部震荡电路就产生自己震荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。外部方式的时钟电路,XTAL1接地,XTAL2接外部振荡器。一般要求输入方波信号的频率低于33Mhz。本文设计的系统采用的是内部方式的时钟电路。如图6所示。
图6 时钟电路原理图
3.9 总体原理图
见附录1 3.10程序框图
主程序如图7所示首先是初始化部分,主要是计时单元清零,中断初始化,启动定时器工作,然后是调用显示子程序,接着是判断有无按键。无按键则回到调用显示子程序处;有按键,则执行按键处理子程序,执行完后回到调用显示子程序处,重复循环。定时器T0中断如图8所示
图7 主程序流程图
图8 中断程序流程图 结束语
三周实习很快就过去了,通过自行设计、焊接和调试一个单片机系统,我熟悉了单片机基本的开发流程和单片机的深入学习。在完成这个设计的同时,我复习了书本上的许多相关内容,受益匪浅。因此我在获得理论知识的同时,实践中也获得了许多书本上没有的东西。提高了调试以及查找并解决问题的能力,我深入了解了焊普通元件与电路元件的技巧、数字时钟的工作原理及其它各电路元件的作用等。这些知识不仅在课堂上有效,对以后的学习工作有很大的指导意义,在日常生活中更是有着现实意义;也对自己的动手能力是个很大的锻炼。实践出真知,纵观古今,所有发明创造无一不是在实践中得到检验的。没有足够的动手能力,就奢谈在未来的科研尤其是实验研究中有所成就。最后,感谢老师对我们这次实习的辛勤指导和帮助。
参考文献
[1] 李光飞,楼然苗,胡佳文编著.单片机课程设计实例指导.北京:北京航空航天大学出版社.2004 [2] 黄仁欣主编.单片机原理及应用技术.北京: 清华大学出版社.2005.[3] 高吉祥主编.电子技术基础实验与课程设计.北京:电子工业出版社.2002 [4] 肖玲妮.印刷电路板设计教程.[M].北京:清华大学出版社,2003.[5] 康华光.电子技术基础.[M].北京;高等教育出版社,2006.[6] 余小平等.电子系统设计.[M].北京:北京航空航天大学出版社,2007.附录1: 11 电路总原理图
附录2: 总程序
ORG 0000H LJMP START ORG 000BH LJMP INIT0 START: MOV 70H,#0 MOV 71H,#0 MOV 72H,#0 MOV 73H,#0 MOV 74H,#0 MOV 75H,#0 MOV 76H,#0 MOV 77H,#0 MOV 78H,#0 MOV 79H,#0 MOV 7AH,#0 MOV 7BH,#0 MOV 7CH,#0 MOV 7DH,#0 MOV 7EH,#0 MOV 72H,#0AH;对连字符进行装值
MOV 75H,#0AH MOV 60H,#0 MOV 61H,#0 MOV 63H,#0 MOV 64H,#0 CLR P1.7 MOV TMOD,#01H;选择定时器/计数器T0的方式1 MOV TL0,#0B0H;对低位赋初值 MOV TH0,#03CH;高位赋初值 SETB EA SETB ET0 SETB TR0 START1: LCALL SCAN LCALL KEYSCAN SJMP START1 DL1MS: MOV R6,#14H;延时1子程序 DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET DELAY: MOV R6,#10 D1: MOV R7,#30 DJNZ R7,$ DJNZ R6,D1 RET
DL20MS: ACALL SCAN;延时20ms子程序 ACALL SCAN ACALL SCAN RET
;整点报时将秒和分的单元与零比较 SCAN: MOV A,7EH;7F单元的内容为0
CJNE A,79H,NEXT MOV A,7DH
CJNE A,7AH,NEXT SETB P1.7 AJMP NEXT1 NEXT: CLR P1.7 NEXT1:
MOV A,79H
CJNE A,#0,NEXT2 MOV A,78H
CJNE A,#0,NEXT2 SETB P1.7 LJMP NEXT3 NEXT2:CLR P1.7
;数码管总显示程序开始分两部分
;校正时间和数码管正常工作的显示程序 NEXT3: MOV A,78H MOV B,#0AH
DIV AB;时间秒的十位送给A,时间秒的个位送B
MOV 71H,A;时间秒要显示的十位
MOV 70H,B;时间秒要显示的个位
MOV A,79H MOV B,#0AH
DIV AB;时间分的十位送给A,时间分的个位送B
MOV 74H,A;时间分要显示的十位送地址
MOV 73H,B;时间分要显示的个位送地址
MOV A,7AH MOV B,#0AH DIV AB;时间时的十位送给A,时间时的个位送B MOV 77H,A;时间时显示的十位送地址
MOV 76H,B;时间时要显示的个位送地址
MOV R1,#70H LCALL DL1MS JB P1.2,LAST HERE3:JNB P1.2,HERE3 INC 7EH MOV A,7EH
CJNE A,#3CH,LOOP3 MOV 7EH,#00H;调制闹铃的时间显示 LOOP3: MOV DPTR,#TAB MOV R5,#0FEH MOV A,7DH MOV R3,#09H
MOV B,#10 SCAN1: MOV A,R5;数码管正常工作的显 DIV AB 示程序
MOV 64H,A MOV P2,A MOV 63H,B MOV A,@R1 MOV A,7EH MOV DPTR,#TAB
MOV B,#10 MOVC A,@A+DPTR;对字段表取值 DIV AB 显示
MOV 61H,A MOV P0,A MOV 60H,B MOV A,R5 MOV P2,#0F7H LCALL DL1MS MOV A,60H INC R1 MOVC A,@A+DPTR MOV A,R5 MOV P0,A RL A LCALL DELAY MOV R5,A MOV P2,#0EFH DJNZ R3,SCAN1 MOV A,61H MOV P2,#00H MOVC A,@A+DPTR MOV P0,#00H MOV P0,A JB P1.3,QQ LCALL DELAY LCALL DL1MS MOV P2,#0DFH JB P1.3,QQ MOV P0,#40H HERE: JNB P1.3,HERE LCALL DELAY SJMP LOOP1 MOV P2,#0BFH
MOV A,63H QQ: LJMP LAST MOVC A,@A+DPTR LOOP1:JB P1.1,LOOP2 MOV P0,A LCALL DL1MS LCALL DELAY JB P1.1,LOOP2 MOV P2,#07FH HERE1:JNB P1.1,HERE1 MOV A,64H INC 7DH MOVC A,@A+DPTR MOV A,7DH
MOV P0,A CJNE A,#18H,LOOP2 LCALL DELAY MOV 7DH,#00H JB P1.3,LOOP4 LOOP2:JB P1.2,LOOP3 LCALL DL1MS 14 JB P1.3,LOOP4 HERE4:JNB P1.3,HERE4 LJMP LAST LOOP4:LJMP LOOP1 LAST: RET;“0~9”和“-”的字段表 TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
;定时/计数器T0中断程序 INIT0: PUSH ACC PUSH PSW CLR ET0 CLR TR0 MOV TL0,#0B0H MOV TH0,#03CH SETB TR0 INC 7BH MOV A,7BH CJNE A,#14H,OUTT0;50ms是否到20次,没有到就继续执行50ms的延时
MOV 7BH,#00 INC 78H MOV A,78H CJNE A,#3CH,OUTT0;一秒的延时是否计到60次,没有就继续执行
MOV 78H,#00 INC 79H MOV A,79H CJNE A,#3CH,OUTT0 MOV 79H,#00 INC 7AH MOV A,7AH CJNE A,#18H,OUTT0;60分钟的延时是否计到24次,没有就继续执行程序 MOV 7AH,#00 OUTT0: SETB ET0;启动定时器T0 POP PSW POP ACC RETI;按键处理程序 KEYSCAN:CLR EA
JNB P1.0,KEYSCAN0;P1.0有按键按下则跳转到子程序
JNB P1.1,KEYSCAN1;P1.1有按键按下则跳转到子程序
JNB P1.2,KEYSCAN2;P1.2有按键按下则跳转到子程序
KEYOUT: SETB EA RET
KEYSCAN0:LCALL DL20MS;20ms的延时消抖
JB P1.0,KEYOUT WAIT0: JNB P1.0,WAIT0;判断按键是否松手,松手就往下执行程序 INC 7CH MOV A,7CH CLR ET0 CLR TR0
CJNE A,#04H,KEYOUT;按下第一次和第二次对时、分选定
MOV 7CH,#00;按下第三次时就启动计时
SETB ET0 SETB TR0 LJMP KEYOUT
KEYSCAN1:LCALL DL20MS;按键加一的程序
JB P1.1,KEYOUT WAIT1: JNB P1.1,WAIT1 MOV A,7CH
CJNE A,#03H,KSCAN11;如果功能键按下则对时加一调整 INC 78H MOV A,78H
CJNE A,#60,KEYOUT MOV 78H,#00 LJMP KEYOUT
KSCAN11: CJNE A,#02H,KSCAN12 INC 79H MOV A,79H
CJNE A,#60,KEYOUT;如果加到60则清零
MOV 79H,#00 LJMP KEYOUT KSCAN12:CJNE A,#01H,KEYOUT INC 7AH;如果功能键是按下第二次则对分进行加一调整
MOV A,7AH CJNE A,#18H,KEYOUT MOV 7AH,#00 LJMP KEYOUT KEYSCAN2:LCALL DL20MS;延时消抖程序 JB P1.2,KEYOUT WAIT2: JNB P1.2,WAIT2;判断是否放开按键
MOV A,7CH;如果功能键是按下第一次对时进行减一 CJNE A,#03H,KSCAN22 DEC 78H MOV A,78H CJNE A,#00H,KEYOUT MOV 78H,#3BH LJMP KEYOUT KSCAN22:CJNE A,#02H,KSCAN23 DEC 79H MOV A,79H CJNE A,#00H,KEYOUT1 MOV 79H,#3BH LJMP KEYOUT KSCAN23:CJNE A,#01H,KEYOUT1 DEC 7AH MOV A,7AH;如果功能键是按下第二次则对分进行减一 CJNE A,#00H,KEYOUT1 MOV 7AH,#17H LJMP KEYOUT1 KEYOUT1: SETB EA RET END
第二篇:基于单片机的时钟控制器设计论文
单片机原理与应用技术课程设计报告
基于单片机控制的时钟控制器
专业班级: _电气XX班_ __ 姓
名:__ ___XXX__ ___ 时 间:2013/11/25~12/15 指导教师: XXXX XXX
2013年12月11日
基于单片机控制的时钟控制器课程设计任务书
1。设计目的与要求
设计出一个基于单片机控制的时钟控制器。通过向单片机输入不同的指令可以实现24小时制时钟的基本显示和连续的调时,调分和调秒的功能,同时又扩展了整点报时功能。该电路硬件较为简单、计时精度高、可控性好,可以随时调整和设定时间,并且调时间的误差小,操作简单、通用性强。
(1)基本功能
<1>、显示:可以显示时、分和秒
<2>、调时功能:时(0-24)、分和秒(0-60)可以连续可调(2)性能:时间日误差< 2秒(3)扩展功能 <1>.增加整点报时功能 <2>.增加闹钟任意设定功能 2.设计内容
(1)画出电路原理图,正确使用逻辑关系;(2)确定元器件及元件参数;(3)进行电路模拟仿真;(4)SCH文件生成与打印输出; 3.编写设计报告
写出设计的全过程,附上有关资料和图纸,有心得体会。4.答辩
在规定时间内,完成叙述并回答问题。
目录
摘要...................................................................1 1.引言................................................................1 2.设计目的和要求......................................................1 3.总体设计方案........................................................1 3.1 方案设计要求.......................................................1 3.2 方案设计与论证.....................................................1 3.3 整体设计框图.......................................................2 3.4 系统设计流程图.....................................................2 4.设计原理分析........................................................3 4.1 外接晶振电路..................................................3 4.2 复位电路...........................................................3 4.3 数码管显示电路.....................................................3 4.4 键盘控制电路.......................................................4 4.5 Proteus仿真电路....................................................4 4.6 单片机程序的编写...................................................5 4.7 电路的检测.........................................................5 4.8 CAD电路的连接及PCB电路布线并做出电路板............................5 4.9 软件与硬件的调试...................................................5 5.总结与体会..........................................................5 6.附录................................................................5 6.1 CAD电路连接图......................................................5 6.2 PCB电路布线图......................................................6 6.3 时钟控制器参考源程序...............................................6 7.参考文献...........................................................13
基于单片机控制的时钟控制器 班级:电气115班 姓名:赵传阳
摘要:近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点。本次设计的时钟控制器是以单片机(AT89C51)为核心,结合相关的元器件(3个2位共阳数码管,一个发光二极管和一个蜂鸣器)和应用程序(在Proteus软件和KEIL编译软件),构成相应的应用系统。
关键词:单片机 AT89C51 共阳数码管 发光二极管 蜂鸣器 Proteus软件 KEIL编译软件 中断
1.引言
随着科技的发展,电子技术得到了飞速的发展,尤其是单片机的应用更为普遍。单片机的应用已深入众多技术领域,从军事、工业到家庭日常生活,单片机因体积小、功能强、价格低廉而得到广泛应用。在此基础上,越来越多各式各样的时钟也逐渐走进我们的生活,它们设计精巧、方便、耐用、美观,深得各领域的厚爱。随着科技的进步,基于单片机控制的时钟控制器的出现则打破了人们对时钟的传统概念,因为数字时钟不仅可以通过数字直观地显示出时间,还可以定时发出各种声、光、电信号,以启动各种设备实现实时控制、时间顺序控制。该课程设计既有一般时钟的基本显示和调整功能,同时又增加了整点报时功能,复位功能及实时时钟控制功能。
2.设计目的与要求
设计出一个基于单片机控制的时钟控制器。通过向单片机输入不同的指令可以实现24小时制时钟的基本显示和连续的调时,调分和调秒的功能,同时又扩展了整点报时功能。该电路硬件较为简单、计时精度高、可控性好,可以随时调整和设定时间,并且调时间的误差小,操作简单、通用性强。
在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。
本文主要介绍用单片机为核心部件的时钟控制器,本设计由单片机AT89C51芯片和3个两位一体的共阳极的数码管为核心,辅以必要的电路,构成了一个单片机时钟控制器。基本要求:1.显示: 可以显示时、分和秒
2.调时功能:时(0-24)、分和秒(0-60)可以连续可调并进行校准 3.能够完成时间的显示、定时闹钟、整点报时及复位功能
3.总体设计方案
3.1.方案设计要求
设计制作一个时钟控制器,要求能实现基本走时,并以数字形式显示时、分、秒,采用24小时制,能实现校时、校分连续可调、整点报时功能、复位功能以及闹钟任意设定功能。3.2方案设计与论证
方案一:采用各种纯数字芯片实现数字时钟的设计。优点:各个模块功能清晰,电路易于理解实现。缺点:各个模块功能已定不能进行智能化调整,整体电路太庞大。
方案二:采用 FPGA模块用硬件语言实现功能。优点:运算速度快,走时精度高,算法简单。缺点:成本高,大材小用。
方案三:采用单片机最小系统实现功能。优点:电路简单,能通过程序进行随机调整并扩展功能,成本低,易于实现。缺点:走时有一定的误差。
经过综合考虑成本问题以及电路实现问题,选择第三种方案实现设计要求。3.3整体设计框图
整体设计框图如图1所示:
4.设计原理分析
4.1外接晶振电路
晶振连接电路图如图3,以12MHZ晶振为基准。
图3 外接晶振电路连接图
XTAL1、XTAL2:XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择,一般选用12MHZ晶振,电容取30PF左右。4.2复位电路
常用复位电路图如图4:
图4 复位电路连接图
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引:脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。4.3 数码管显示电路
二位一体共阳极数码管电路连接图如图5,以PNP三极管为驱动。
图5 数码管显示电路连接图
4.4 键盘控制电路
键盘控制电路如图6。
图6 时钟按键控制电路图
通过S1、S2、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。按下S4键显示闹钟,松开后显示时间;按下S1键进入时间修改模式,再按S1键时间的时加1,按S3分加1,调整结束后按下S4恢复正常显示;按下S2键进入闹钟修改模式,再按S3键闹钟的时加1,按S3分加1,调整结束后按下S4恢复正常显示。在按键按下和放开时会出现抖动现象。通过延时程序,可以进行去抖动设计。4.5 Proteus仿真电路
整体电路连接图如图7:
图7 整体电路连接图
4.6 单片机程序的编写
用KEIL编译软件进行程序的设计、编译并生成可执行文件。4.7 电路的检测
电路连接完毕后,应用单片机程序烧录工具进行程序烧录,然后单击运行按钮进行仿真,检测电路是否有误。
4.8 CAD电路的连接及PCB电路布线并做出电路板
待仿真电路检测无误后,则通过CAD软件进行电路图的连接并对元件进行封装,确定无误后生成PCB图进行电路的布线,之后做出电路板进行元件的焊接。4.9 软件与硬件的调试
单片机应用系统的调试包括硬件和软件两部分,但是它们并不能完全分开。一般的方法是排除明显的硬件故障,再进行综合调试,排除可能的软件或硬件故障。
软件调试是指用仿真软件进行仿真调试,验证系统的各项功能;硬件调试即软件调试成功后,将程序下载至AT89C51芯片中,用焊接好的电路来进行各项功能的验证与检测。
需要特别注意的是软件调试与硬件调试的差异,软件调试只是初步的估测,硬件的调试才是最真实的。
5总结与体会
经过三周的实习设计,我设计的时钟控制器实现了它最基本功能,三个星期的紧张实习,让我获益非浅,更加熟练的掌握了Proteus软件、KEIL软件及CAD软件的应用,使我看到了自己专业知识的浅薄与不足。通过本次的课程设计,我对单片机这门课程有了更深的了解,单片机课程设计则是人生课程,我学到了很多课堂上无法学到的东西,懂得了学习的不容易,在以后的学习中我会更加努力的去学习和研究,以取得更好的成绩。
6.附录
6.1 CAD电路连线图如图8。
图8 CAD电路连接图
6.2 PCB电路布线图如图9。
图9 PCB布线电路图(注:未连线的端口用外接线连接)
6.3 时钟控制器参考源程序
使用keil软件编写源程序 ORG 0000H LJMP START ORG 000BH LJMP TIME;********初始化********* START: MOV SP, #50H MOV 20H,#00H;定义秒
MOV 21H,#00H;定义分 MOV 22H,#00H;定义时
MSTOP1: MOV C,P1.3;P1.3为0时转移 JNC MSTOP1 LCALL DELAY1;延时
MOV A,50H
INC 50H
CJNE A,#00H,HJ1
LJMP L0 HJ1: MOV C,P1.3 JNC MSTOP1 INC 22H;小时自加一 MOV A,22H CJNE A,#18H,GO12;MOV 22H,#00H;MOV 34H,#00H MOV 35H,#00H LJMP L0 L1: JB P1.1,L2;P1.1=1 MOV C,P1.1 JC L1 LCALL DELAY1;JC L1 MSTOP2: MOV C,P1.1 JNC MSTOP2 LCALL DELAY1;MOV C,P1.1 JNC MSTOP2 INC 21H;MOV A,21H CJNE A,#3CH,GO11;MOV 21H,#00H;MOV 32H,#00H MOV 33H,#00H LJMP L0 GO11: MOV B,#0AH DIV AB MOV 32H,B;MOV 33H,A;LJMP L0 GO12: MOV B,#0AH DIV AB MOV 34H,B;MOV 35H,A;LJMP L0 L2: JB P1.0,L0;P1.0 MOV C,P1.0 JC L2 LCALL DELAY1;MOV C,P1.0 JC L2 STOP1: MOV C,P1.0 JNC STOP1
小时计数循环
复位 时转移 延时;P1.1=0时转移 延时 分钟加一 分钟计数循环 复位 将A的低4位存入32单元 将A的高4位存入33单元 将A的低4位存入34单元 将A的高4位存入35单元=1时转移 延时;P1.0=0时转移
LCALL DELAY1;延时 MOV C,P1.0 JNC STOP1
MOV 50H,#00H LJMP MAIN;*******设置闹钟******* SETATIME:LCALL DISPLAY2;调用DISPLAY2显示闹钟 N0: LCALL DISPLAY2 MM2: JB P1.2,N1;P1.2=1时转移 MOV C,P1.2 JC MM2 LCALL DELAY1;JC MM2 MSTOP3: MOV C,P1.2 JNC MSTOP3 LCALL DELAY1;
LJMP N0 HJ2: MOV C,P1.2 JNC MSTOP3 INC 24H;MOV A,24H CJNE A,#24,GO22;MOV 24H,#00H;MOV 38H,#00H MOV 39H,#00H LJMP N0 N1: JB P1.1,N2;P1.1 MOV C,P1.1 JC N1 LCALL DELAY1;JC N1 MSTOP4: MOV C,P1.1 JNC MSTOP4 LCALL DELAY1;MOV C,P1.1 JNC MSTOP4 INC 23H;MOV A,23H CJNE A,#60,GO21;MOV 23H,#00H;MOV 36H,#00H MOV 37H,#00H LJMP N0 GO21: MOV B,#0AH DIV AB MOV 36H,B;MOV 37H,A;LJMP N0
延时 =0时转移 延时 小时加一 小时计数循环 复位 =1时转移 延时 =0时转移 延时 分钟加一 分钟计数循环 复位 将A的低4位存入36单元 将A的高4位存入37单元
;P1.2 MOV A,50H INC 50H CJNE A,#00H,HJ2;P1.1
GO22: MOV B,#0AH DIV AB MOV 38H,B;将A的低4位存入38单元 MOV 39H,A;将A的高4位存入39单元 LJMP N0 N2: JB P1.0 ,N0;P1.0=1时转移 MOV C,P1.0 JC N2 LCALL DELAY1;延时 MOV C,P1.0 JC N2 STOP2: MOV C,P1.0 JNC STOP2 LCALL DELAY1 MOV C,P1.0 JNC STOP2
MOV 50H,#00H LJMP MAIN;*******闹钟判断***************** TIMEPRO: MOV A,21H MOV B,23H CJNE A,B,BK;判断定时闹钟的分钟 MOV A,22H MOV B,24H CJNE A,B,BK;判断定时闹钟的小时 SETB 25H.0 MOV C,25H.0 LCALL TIMEOUT;调用TIMEOUT BK:RET;**************喇叭报警***************** TIMEOUT: X1: LCALL BZ;调用喇叭响应程序 CLR 25H.0;调用喇叭响应程序结束 LCALL DELAY;延时 CLR 25H.0 LJMP DISPLAY1 BZ:MOV C,25H.1 MOV P1.6,C CLR P1.7 MOV R7,#0FFH;喇叭响应时间 T2: MOV R6,#0FFH T3: DJNZ R6,T3 DJNZ R7,T2 SETB P1.7 RET;*************显示闹钟时间************ LOOKATIME:LCALL DISPLAY2 MM: JNB P1.0,LOOKATIME LCALL DELAY1 LJMP MAIN DELAY1: MOV R4,#14H;时间延时
0
POP ACC RETI;********显示子程序********** DISPLAY1: MOV R0,#30H MOV R3,#0FEH MOV A,R3 PLAY1: MOV P2,A MOV A,@R0;取要显示的数据 MOV DPTR,#DSEG1;指向字形段码首地址 MOVC A,@A+DPTR CJNE R0,#34H,PA ORL A,#80H PA:CJNE R0,#32H,PB ORL A,#80H PB:CPL A;MOV P0,A;LCALL DL1 MOV P2,#0FFH MOV A,R3;RL A;JNB ACC.6,LD1 INC R0;MOV R3,A LJMP PLAY1 LD1: RET DISPLAY2: PUSH ACC;PUSH PSW MOV R0,#36H MOV R3,#0FBH MOV A,R3
PLAY2: MOV P2,A MOV A,@R0;MOV DPTR,#DSEG1;MOVC A,@A+DPTR CJNE R0,#38H,PP ORL A,#80H PP:CPL A;MOV P0,A;LCALL DL1;MOV P2,#0FFH MOV A,R3;RL A;JNB ACC.6,LD2 INC R0;MOV R3,A LJMP PLAY2;LD2: POP PSW POP ACC;RET;******DELAY*******
查表取字形段码 指向P0口 判断是否显示到最低位 左移一位 缓冲器地址加一 保护现场 取要显示的数据 指向字形段码首地址 查表取字形段码 指向P0口 调用DL1 判断是否显示到最低位左移一位 缓冲器地址加一 调用PLAY2 恢复现场
DL1: MOV R7,#20H DL: MOV R6,#20H DL6: DJNZ R6,$ DJNZ R7,DL RET DSEG1: DB 3FH,06H,5BH,4FH,66H;七段码表 DB 6DH,7DH,07H,7FH,6FH END 7.参考文献
[1].王建校,杨建国.51系列单片机及C51程序设计.北京:科学出版社, 2002.[2].吴金戊, 沈庆阳等.8051单片机实践与应用.北京:清华大学出版社, 2002.[3].李建忠.单片机原理及应用(第二版).西安:西安电子科技大学出版社, 2008.2.[4].张毅刚.新编MCS-51单片机应用设计(第3版).哈尔滨: 哈尔滨工业大学出版社, 2006.10.[5].李学礼.基于Proteus的8051单片机实例教程.电子工业出版社出版时间, 2008.6.[6].百度文库:http://wenku.baidu.com/view/a9243c18fad6195f312ba6d3.html
第三篇:AVR单片机的时钟设计(范文)
基于AVR单片机Mega16的时钟设计报告
1摘 要
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此越来越广泛地应用各个领域.本文的电子钟系统是以单片机(ATmega16)为核心,时钟芯片、数码管显示驱动芯片等元器件组成。具体介绍应用Proteus的ISIS软件进行单片机系统的电子钟设计与仿真的实现方法。该方法既能准确验证所设计的系统是否满足技术要求,又能提高系统设计的效率和质量,降低开发成本,具有推广价值。
关键词:单片机; 时钟芯片 ;数码管显示驱动芯片 ;电子钟
2引 言
单片机电子时钟系统可以用多种技术手段实现。本文借助于Proteus仿真系统进行系统虚拟开发成功之后再进行实际操作,可以节约开发时间,降低开发成本,具有很大的灵活性和可扩展性。在国外有包括斯坦福、剑桥等在内的几千家高校将Proteus作为电子工程学位的教学和实验平台;在国内也有众多大学正在体验Proteus的独一无二的功能并申报大学计划。该方法具有普遍意义。通过实际应用发现,采用该方法可以大大简化硬件电路测试和系统调试过程中电路板制作、元器件安装、焊接等过程。很明显,使用该方法可以提高开发效率、降低开发成本、提升开发…
AVR系列的单片机不仅具有良好的集成性能,而且都具备在线编程接口,其中的系列还具备仿真和下载功能;含有片内看门狗电路、片内程序FLASH、同步串行接口SPI;多数AVR单片机还内嵌了A/D转换器、EEPROM、模拟比较器、PWM定时计数器等多种功能;AVR单片机的I/O接口具有很强的驱动能力,灌人电流可直接驱动继电器、LED等元件,从而省去驱动电路,节约系统成本。
3设计思路
利用单片机(ATmega16)制作简易电子时钟,由六个LED数码管分别显示小时十位、小时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。6个PNP管分别控制六个数码管的亮灭,此外还可以实现时间调整、等多种实用功能。整个设计分硬件和软件两大部分。硬件部分采用MEGA16单片机作为可编程芯片,字符液晶作为信号显示;软件部分利用C语言作为设计语言,对MEGA16进行编程实现各种功能。
硬件设计电路分解为单片机、晶体振荡器和数码管3个部分,其结构简单,经济实惠。单片机内部晶体振荡器的外接电路。由两个电容和晶体振荡器构成,其电路如图1所示。图中X1和X2分别接MEGA16的两个脉冲控制端,使得MEGA16的内部脉冲电路为电子时钟和整个系统时钟提供脉冲。
图1所示给出了采用单片机外加电源及晶体振荡器构成最小单片机系统。配合单片机开发的设计、调试和下载,最终将时钟信息从端口输出到字符液晶显示。
图26位模式与单片机的端口相连。
4软件设计及调试过程
软件设计包括Proteus的ISIS软件、Code Vision AVR编辑软件和AVRStudio4调试。利用ISP将生成程序timer.cof 下载到目标板。其主要程序如下:
void display(void)// 6 位LED 数码管动态扫描函数
{
PORTC = 0xff;
PORTA = led_7[dis_buff[posit]];
if(point_on &&(posit==2||posit==4))PORTA |= 0x80;
PORTC = position[posit];
if(++posit >=6)posit = 0;
}
// Timer 0 比较匹配中断服务
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
display();// 调用LED 扫描显示
if(++time_counter>=100)
{
time_counter = 0;
time_1s_ok = 1;
}
}
void time_to_disbuffer(void)// 时钟时间送显示缓冲区函数
{
char i,j=0;
for(i=0;i<=2;i++)
{
dis_buff[j++] = time[i] % 10;
dis_buff[j++] = time[i] / 10;
}
}
// INT0 中断服务程序
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(++time[2]>=24)time[2] = 0;
}
// INT1 中断服务程序
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(++time[1]>=60)time[1]=0;
}
void main(void)
{
PORTA=0x00;// 显示控制I/O 端口初始化
DDRA=0xFF;
PORTC=0x3F;
DDRC=0x3F;// T/C0 初始化
PORTA=0xFF;
DDRA=0xFF;
GICR|=0xC0;// 允许INT0、INT1 中断
MCUCR=0x0A;// INT0、INT1 下降沿触发
GIFR=0xC0;// 清除INT0、INT1 中断标志位
TCCR0=0x0B;// 内部时钟,64 分频(4M/64=62.5KHz),CTC 模式
TCNT0=0x00;
OCR0=0x7C;// OCR0 = 0x7C(124),(124+1)/62.5=2ms
TIMSK=0x02;// 允许T/C0 比较匹配中断
time[2] = 14;time[1] = 01;time[0] = 55;// 设时间初值23:58:5
5posit = 0;
time_to_disbuffer();
#asm(“sei”)// 开放全局中断
while(1)
{
if(time_1s_ok)// 1 秒到
{
time_1s_ok = 0;
point_on = ~point_on;
if(++time[0] >= 60)// 以下时间调整
{
time[0] = 0;
if(++time[1] >= 60)
{
time[1] = 0;
if(++time[2] >= 24)time[2] = 0;
}
} time_to_disbuffer();// 新调整好的时间送显示缓冲区
5总结心得
这次设计报告培养了学生综合运用所学知识,发现,提出,分析和解决问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机设计,我仍感慨颇多,的确,从选题到定稿,从理论到仿真,在这些日子里,我学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师那里我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
}结束语
单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。尤其是AVR单片机可以用高级语言编程,极容易地实现系统移植,并且加快了软件的开发过程。这次设计通过对它的学习、应用,以Mage16单片机为核心,辅以必要的电路,采用高级C语言编程,设汁了一个简易的电子时钟,由
4.5 V直流电源供电,通过数码管能够准确显示时间。
第四篇:基于51单片机电子时钟设计
基于51单片机的电子时钟设计
摘要
本电子时钟以STC89C52单片机作为主控芯片,采用DS12C887时钟芯片,使用1602液晶作为显示输出。该时钟走时精确,具有闹钟设置,以及可同时显示时间、日期等多种功能。本文将详细介绍该电子时钟涉及到的一些基本原理,从硬件和软件两方面进行分析。
【关键词】
STC89C52单片机
DS12C887时钟芯片
1602液晶
蜂鸣器
目录
一、绪论…………………………………………………………4
1.1 电子时钟功能…………………………………………1.2设计方案………………………………………………4
二、硬件设计……………………………………………………4
2.151
2.2 单片机部分设计………………………………4
USB供电电路设计………………………………5
2.3 串行通信电路设计………………………………6
2.4DS12C887时钟芯片电路的设计…………………6
2.51602LCD液晶屏显示电路设计………………7
2.6
蜂鸣器电路设计………………………………8
2.7
按键调整电路设计…………………………8
三、软件设计…………………………………………9
3.1 系统程序流程图设计…………………………9
3.2程序设计……………………………………11
四、心得体会………………………………………………22 参考文献……………………………………………………23
一、绪
论
1.1电子时钟功能
(1)在1602液晶上显示年、月、日、星期、时、分、秒,并且按秒实时更新显示。(2)具有闹铃设定即到时报警功能,报警响起时按任意键可取消报警。
(3)能够使用实验板上的按键随时调节各个参数,四个有效键分别为功能选择键、数值增大键、数值减小键和闹钟查看键。
(4)每次有键按下时,蜂鸣器都以短“滴”声报警。
(5)利用DS12C887自身掉电可继续走时的特性,该时钟可实现断电时间不停、再次上电时时间仍准确显示在液晶上的功能。
1.2设计方案
DS12C887时钟芯片+1602LCD液晶屏
DS12C887时钟芯片功能丰富、价格适中,能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部含有世纪寄存器,从而利用硬件电路解决“千年”问题。DS12C887中自带锂电池,外部掉电时,其内部时间信息还能保持10年之久。1602LCD液晶屏可以输出2行,每行显示16个字符。1602LCD液晶屏显示清晰且不会闪烁,由于液晶屏是数字式的,因此和单片机系统的接口简单,操作方便。
以STC89C52为主控芯片,DS12C887为时钟芯片,1602LCD液晶屏作为显示器。程序控制DS12C887时钟芯片实现小时、分、秒和年、月、日的计时,并在1602LCD液晶屏上显示出来。当时间走到程序所设定的时间时,蜂鸣器响起,起到闹钟功能。
二、硬
件
设
计
2.1 51单片机部分设计
单片机部分如图2—1所示:
以STC89C52单片机为核心,选用12MHZ的晶振,由于晶振的频率越高,单片机的运行速度就越快,考虑到单片机的运行速度快会导致对存储器的要求就会变高,因此12MHZ为最佳选择。外接电容的值虽然没有严格的要求,但是外接电容的大小会影响振荡器的频率高低、振荡器的稳定性和起振的快速性,因此选用30pF的电容作为起振电容。复位电路为按键高电平复位,当按键按下,RES端为高电平,当高电平持续4us的时间单片机即复位。
2.2 USB供电电路设计
USB供电电路如下图2—2所示:
该电子时钟采用USB端口的方式为单片机供电,LPOW1为电源显示灯,当按键S5按下,电源显示灯LPOW1亮,表示给单片机供+5V电。
2.3 串行通信电路设计
串行通信电路如下图2—3所示:
图中通过MAX232进行RS—232电平与单片机TTL电平之间的转换,从而为单片机和上位机之间通信提供通道。通信电路的目的就是让通信双方的电平匹配,单片机用的是TTL电平,上位机的串口用的是RS—232电平。TTL电平逻辑1的电压范围是+3.3V到+5V,逻辑0的电压范围是0到+3.3V;RS—232电平的逻辑1的电压范围是—15V到—5V,逻辑0的电压范围是+5V到+15V。MAX232可以把输入的+5V电源电压变换成为RS—232输出电平所需的+10V电压。所以采用此芯片接口的串行通信系统只需单一的+5V电源就可以了。对于没有+12V电源的场合,其适应性更强,2.4 DS12C887时钟芯片电路的设计
时钟芯片电路如下图2—4所示:
DS12C887时钟芯片共需要13条信号线,分别是并行数据地址复用线AD0~AD7,CS,AS,R/W,DS和IRQ。
MOT—总线操作时序选择端。它有两种工作模式,当MOT接
VCC时,选用Motorola模式;当MOT接GND或悬空时,选用Intel模式。NC—空引脚。
AD0~AD7—复用地址数据总线。在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的是数据信息。GND,VCC—系统电源接入端。当
VCC输入为+5V时,用户可以访问DS12C887内RAM的输入小于+4.25V时,禁止用户对内部RAM中的数据,并可对其进行读/写操作;当
VCC进行读/写操作,此时用户不能正确芯片内的时间信息;当
VCC的输入小于+3V时,DS12C887会自动的将电源切换到内部自带的锂电池上,以保证内部的电路能正常工作。
CS—芯片片选端。
AS—地址选通输入端。在进行读/写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论CS是否有效,DS12C887都将执行该操作。
R/W—读/写输入端。该引接脚有两种工作模式,当MOT接
VCC时,R/W工作在Motorola模式。此时该引脚的作用是区分读操作还是写操作,R/W高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该引脚工作在Intel模式,此时该引脚为写允许输入,此信号的上升沿锁存数据。
DS—数据选择或读输入脚。该引脚有两种工作模式,当MOT接
VCC时,选用Motorola模式,此时,每个总线周期后一部分的DS为高电平,称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁存在DS12C887中。当MOT接GND时,选用Intel模式,此时该引脚是读允许输入引脚。
RESET—芯片复位引脚。
IRQ—中断请求输出。用作处理器的中断申请输入。只要引起中断的状态位置位,并且相应中断使能位也置位,IRQ将一直保持低电平,处理器程序通常读取C存储器来清除IRQ引脚输出,RESET引脚也会清除未处理的中断。没有中断发生时,IRQ为高阻状态,可将多个中断器件接到一条IRQ总线上,只要它们均为漏极开路输出即可。IRQ引脚为漏极开路输出,需要使用一个外接上拉电阻与SQW—方波输出引脚。当供电电压
VCC相连。
VCC大于4.25V时,SQW引脚可输出方波。
2.5 1602LCD液晶屏显示电路设计
1602LCD液晶屏显示电路如下图2—5所示:
1602液晶为5V电压驱动,带背光,可显示2行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。接口说明如下:(1)液晶1,2端为电源;15,16为背光电源;为防止直接加5V电压烧坏背光灯,在15脚串接一个1K电阻用于限流。
(2)液晶3端为液晶对比度调节端,通过一个10K电位器接地来调节液晶显示对比度。首次使用时,在液晶上电状态下,调节至液晶上面一行显示出黑色小格为止。
(3)液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.5口。
(4)液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择为写状态,即低电平接地。
(5)液晶6端为使能信号,是操作时必须的信号,接单片机的P3.4口。
2.6 蜂鸣器电路设计
蜂鸣器电路如下图2—6所示:
蜂鸣器电路接在单片机的P2.3引脚上,当该引脚一个低电平,三极管导通,蜂鸣器发出声音作为闹铃。
2.7 按键调整电路设计
按键调整电路如下图2—7所示:
四个独立键盘均采用查询方式,将按键的一端接地,另一端各接一根输入线直接与STC89C52的I/O口相连。当按键闭合时,相当于该I/O口通过按键与地相连,变成低电平,单片机通过检测I/O口的电平状态,即可识别出按下的键。通过四个键实现参数的调节,S1为功能选择键,S2为数值增大键,S3为数值减小键,S4为闹钟查看键。
三、软
件
设
计
3.1 系统程序流程图设计
流程图1:实验主程序流程图
流程图2:定时中断程序流程图
流程图3:调时功能流程图
3.2 程序设计
#include
//延时函数 {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);} void di()
//蜂鸣器报警声音 {
beep=0;
delay(100);
beep=1;} void
write_com(uchar com)
//写液晶命令函数
{
rs=0;
lcden=0;
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;} void write_data(uchar
data)
//写液晶数据函数 {
rs=1;
lcden=0;
P0=data;
delay(3);
lcden=1;
delay(3);
lcden=0;} void
init()
//初始化函数 {
uchar
num;
EA=1;
//打开总中断
EX1=1;
//开外部中断1
IT1=1;
//设置负跳变沿触发中断
flag1=0;
//变量初始化
t0_num=0;
s1num=0;
week=1;
dula=0;
//关闭数码管显示
wela=0;
lcden=0;
rd=0;/*以下几行在首次设置DS12C887时使用,以后不必再写入
write_ds(0x0A,0x20);
//打开振荡器
write_ds(0x0B,0x26);
//设置24小时模式,数据二进制格式,开启闹铃中断
set_time();
//设置上电默认时间
---------------*/
write_com(0x38);
//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
//写入液晶固定部分显示
{
write_data(table[num]);
delay(1);}
write_com(0x80+0x40);
for(num=0;num<11;num++)
{
write_data(table1[num]);
delay(1);
} } void write_sfm(uchar add,char data)
{ //1602液晶刷新时分秒函数,4为时,7为分,10为秒
char
shi,ge;
shi=data/10;
ge=data%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);} void
write_nyr(uchar add,char
data)
{
//1602液晶刷新年月日函数,3为年,6为月,9为日
char
shi,ge;
shi=data/10;
ge=data%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);void
write_week(char we)
//写液晶星期显示函数 {
write_com(0x80+12);
switch(we)
{
case 1:
write_data('M');delay(5);
write_data('O');delay(5);
write_data('N');
break;
case 2:
write_data('T');delay(5);
write_data('U');delay(5);
write_data('E');
break;
case 3:
write_data('W');delay(5);
write_data('E');delay(5);
write_data('D');
break;
case 4:
write_data('T');delay(5);
write_data('H');delay(5);
write_data('U');
break;
case 5:
write_data('F');delay(5);
write_data('R');delay(5);
write_data('I');
break;
case 6:
write_data('S');delay(5);
write_data('A');delay(5);
write_data('T');
break;
case 7:
write_data('S');delay(5);
write_data('U');delay(5);
write_data('N');
break;
} } void keyscan(){ if(flag_ri==1){
//这里用来取消闹钟报警,按任意键取消报警
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
delay(5);
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
while(!(s1&&s2&&s3&s&s4));di();
flag_ri=0;
//清除报警标志
}
}
}
if(s1==0)
//检测s1
{
delay(5);
if(s1==0)
{
s1num++;
//记录按下次数
if(flag1==1)
if(s1num==4)
s1num=1;
flag=1;
while(!s1);di();
switch(s1num)
{
//光标闪烁点定位
case 1: write_com(0x80+0x40+10);
write_com(0x0f);
break;
case 2: write_com(0x80+0x40+7);
break;
case 3: write_com(0x80+0x40+4);
break;
case 4: write_com(0x80+12);
break;
case 5: write_com(0x80+9);
break;
case 6: write_com(0x80+6);
break;
case 7: write_com(0x80+3);
break;
case 8: s1num=0;
write_com(0x0c);
flag=0;
write_ds(0,miao);
write_de(2,fen);
write_ds(4,shi);
write_ds(6,week);
write_ds(7,day);
write_ds(8,month);
write_ds(9,year);
break;
}
}
}
if(s1num!=0)
//只有当s1按下后,才检测s2和s3
{
if(s2==0)
{
delay(1);
if(s2==0)
while(!s2);di();
switch(s1num)
{
//根据功能键次数调节相应数值
case 1: miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
break;
case 2: fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
break;
case 3: shi++;
case 4:
case 5:
case 6:
case 7:
}
}
}
if(s3==0)
{
delay(1);
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
break;week++;
if(week==8)
week=1;
write_week(week);
write_com(0x80+12);
break;day++;
if(day==32)
day=1;
write_nyr(9,day);
write_com(0x80+9);
break;month++;
if(month==13)
month=1;
write_nyr(6,month);
write_com(0x80+6);
break;year++;
if(year==100)
year=0;
write_nyr(3,year);
write_com(0x80+3);
break;
if(s3==0)
{
while(!s3);di();
switch(s1num)
{
//根据功能键次数调节相应数值
case 1: miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
break;
case 2: fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
break;
case 3: shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
break;
case 4: week--;
if(week==0)
week=7;
write_week(week);
write_com(0x80+12);
break;
case 5: day--;
if(day==0)
day=31;
write_nyr(9,day);
write_com(0x80+9);
break;
case 6: month--;
if(month==0)
month=12;
write_nyr(6,month);
write_com(0x80+6);
break;
case 7: year--;
if(year==-1)
year=99;
write_nyr(3,year);
write_com(0x80+3);
break;
}
}
}
}
if(s4==0)
//检测s4
{
delay(5);
if(s4==0)
{
flag1=~flag1;
while(!s4);di();
if(flag1==0)
{
//退出闹钟设置时保存数值
flag=0;
write_com(0x80+0x40);
write_data(' ');
write_data(' ');
write_com(0x0c);
write_ds(1,miao);
write_ds(3,fen);
write_ds(5,shi);
}
else
{
//进入闹钟设置
read_alarm();
//读取原始数据
miao=amiao;
//重新赋值用以按键调节
fen=afen;
shi=ashi;
write_com(0x80+0x40);
write_data('R');
//显示标志
write_data('i');
write_com(0x80+0x40+3);
write_sfm(4,ashi);
//送液晶显示闹钟时间
write_sfm(7,afen);
write_sfm(10,amiao);
}
}
} } void write_ds(uchar add,uchar
data){
//写12C887函数
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=add;
//先写地址
dsas=0;
dsrw=0;
P0=data;
//再写数据
dsrw=1;
dsas=1;
dscs=1;} uchar
read_ds(uchar add){
//读12C887函数
uchar
ds_data;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P0=add;
//先写地址
dsas=0;
dsds=0;
P0=0xff;
ds_data=P0;
//再读数据
dsds=1;
dsas=1;
dscs=1;
return ds_data;} /*---首次操作12C887时给予寄存器初始化-----void set_time(){
//首次上电初始化时间函数
write_ds(0,0);
write_ds(1,0);
write_ds(2,0);
write_ds(3,0);
write_ds(4,0);
write_ds(5,0);
write_ds(6,0);
write_ds(7,0);
write_ds(8,0);
write_ds(9,0);}----------------------*/
void
read-alarm(){
//读取12C887闹钟值
amiao=read_ds(1);
afen=read_ds(3);
ashi=read_ds(5);} void main()
//主函数 {
init();
//调用初始化函数
while(1)
{
keyscan();
//按键扫描
if(flag_ri==1)
//当闹钟中断时进入这里
{
di();
delay(100);
di();
delay(500);
}
if(flag==0&&flag1==0)
//正常工作时进入这里
{
keyscan();
//按键扫描
year=read_ds(9);
//读取12C887数据
month=read_ds(8);
day=read_ds(7);
week=read_ds(6);
shi=read_ds(4);
fen=read_ds(2);
miao=read_ds(0);
write_sfm(10,miao);
//送液晶显示
write_sfm(7,fen);
write_sfm(4,shi);
write_week(week);
write_nyr(3,year);
write_nyr(6,month);
write_nyr(9,day);
}
} } void
exter()interrupt 2
//外部中断1服务程序 {
uchar
c;
//进入中断表示闹钟时间到
flag_ri=1;
//设置标志位,用于大程序中报警提示
c=read_ds(0x0c);
//读取12C887的C寄存器表示响应了中断 }
_______________________________________________________________________________ 以下为define.h源代码:
_______________________________________________________________________________ #define uchar unsigned char #define uint unsigned int sbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;
//功能键 sbit s2=P3^1;
//增大键 sbit s3=P3^2;
//减小键 sbit s4=P3^6;
//闹钟查看键 sbit rd=P3^7;sbit beep=P2^3;
//蜂鸣器 sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^3;bit flag1,flag_ri;
//定义两个位变量
uchar count,s1num,flag,t0_num;
//其他变量定义 char miao,shi,fen,year,month,day,week,amiao,afen,ashi;uchar code
table[]=“201-
”;
//液晶固定显示内容 uchar code
table1[]=“
:
:
”;
void write_ds(uchar,uchar);
//函数申明 void set_alarm(uchar,uchar,uchar);void read_alarm();uchar read_ds(uchar);void set_time();
四、心
得
体
会
在本次电子时钟设计中对单片机的内部结构有了一定的了解,熟悉了各个引脚的功能,同时熟知了1602LCD液晶、DS12C887时钟芯片的使用,以及各种电路的功能。
通过此次课程设计,无论是从软件方面还是硬件方面,都进一步学习和巩固了程序的总体设计和单片机的应用。在软件方面,进一步熟悉了各条指令的功能及用法,定时、中断的用法,更深一步学习了用C语言编写实现电子时钟的功能。在硬件方面,进一步熟悉并使用了keil软件,在keil中编程,调试,运行;对电路的一些基本结构和设计有了更深一步的了解。在整个设计过程中,虽然出现了很多问题,有时确实叫人很心烦,但在发现问题后努力去解决,并获得成功,这时会感到无比的快乐和具有成就感。只有自己动手去做,去应用,才能将学到的知识变成自己的。
程序不要光看不写,一定要自己写一次。最开始的时候,可能自己啥都不懂,这时可以抄人家的程序过来。但在抄的时候一定要看看每一句是干什么用的,来达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次。此时会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。
单片机提高重在实践,想要学好单片机,软件编程必不可少。但是熟悉硬件对于学好单片机也是非常重要的。如何学习好硬件,动手实践是必不可少的。我们可以通过自己动手做一个自己的电子制作,通过完成它,以提高对一些芯片的了解和熟练运用。这样我们就可以多了解一些芯片的结构。
我学习的目标是希望在若干年以后能够独立设计一个复杂的系统,包括硬件电路和软件部分。总之,通过这次电子技术设计我学到了许多,似乎离自己的目标又近了一步。
参
考
文
献
[1]郭天祥.51单片机C语言教程.电子工业出版社.2009 [2]谭浩强.C程序设计.清华大学出版社.1991 [3]孙育才 王荣兴
孙华芳.ATMEL新型AT89S52系列单片机及其应用.清华大学出版社.2006 [4]谢维成.单片机原理及应用与51程序设计.清华大学出版社.2006
[5]鲍宏亚.MCS—51系列单片机应用系统设计及实用技术.中国宇航出版社.2005 [6]赵文博
刘文涛.单片机语言C51程序设计.人民邮电出版社.2006 [7]求是科技.8051系列单片机C程序设计.人民邮电出版社.2006
第五篇:基于单片机AT89C51的交通灯控制器的设计
2014届本科生毕业设计
分类号:TP368.1
题目:基于单片机AT89C51的交通灯控制器的设计
姓 名: 张建猛 学 号 : 2010080870 学 院: 机械与电子工程学院 专 业: 自动化 指导教师职称: 胡波 刘明
指导教师职称: 助教(硕士)工程师
2014-05-11
摘 要
本文采用AT89C51单片机芯片为核心控制器件设计的交通灯控制器,该系统主要包括单片机最小系统,按键,数码管显示,交通灯演示系统。系统主要具有有人行道,交通灯的基本功能,倒计时,紧急情况处理,根据具体情况手动控制等功能。通过AT89C51并接数码管和发光二极管来实现交通灯的变化规律,P1口设置红,绿灯点亮时间功能的实现;红绿灯循环点亮,倒计时剩余10秒时黄灯闪烁警示。本系统的研发周期短,可靠性高,实用性,操作简单,维护方便,扩展功能强大。本系统软硬件相结合,通过Proteus软件仿真,基本实现了交通信号灯的模拟。
关键词:AT89C51;数码管;交通灯控制器
ABSTRACT In this paper, AT89C51 chip as the core control device design traffic light controller, the system includes smallest single-chip system, keyboard, digital display, traffic lights demonstration system.System mainly has a sidewalk, the basic functions of traffic lights, countdown, emergency treatment, according to the specific circumstances of manual control and other functions.And connected via AT89C51 LED digital tube and realized traffic lights change, P1 port settings of red, green lighting time function is implemented;traffic light cycle light, countdown 10 seconds remaining yellow flashing warning.The system development cycle is short, high reliability, practicality, simple operation, easy maintenance, expansion and powerful.This system combines hardware and software, Through the Proteus Software Simulation,the basic realization of traffic lights simulation.Keywords: AT89C51;System;Digital pipe;Traffic light controller
目录
绪
论...........................................................................................................................1 1.整体方案设计...........................................................................................................2 1.1 方案分析.........................................................................................................2 1.2 方案确立.........................................................................................................3 2.系统的硬件设计.......................................................................................................3
2.1设计原理及方法..............................................................................................3 2.2 AT89C51单片机最小系统..............................................................................4 2.2.1 复位电路..............................................................................................4 2.2.2 时钟电路..............................................................................................5 2.2.2 EA脚的功能及接法.............................................................................6 2.3其它硬件模块介绍及连接..............................................................................7
2.3.1 倒计时显示模块.................................................................................7
2.3.2 交通灯显示模块................................................................................8
2.3.3 按键控制模块......................................................................................9 2.3.4 电源模块............................................................................................10 3.系统的软件设计.....................................................................................................10
3.1系统相关参数计算........................................................................................10 3.1.1 T0的计数初值...................................................................................10 3.1.2 倒计时显示的理论分析....................................................................10 3.1.2 交通灯状态显示的理论分析............................................................11 3.2系统主程序设计............................................................................................11 4.系统的 Proteus软件仿真....................................................................................12 4.1 Proteus仿真图............................................................................................12 4.2 Proteus仿真的结果分析............................................................................12 结束语.........................................................................................................................14 参考文献.....................................................................................................................14 致 谢.........................................................................................................................15 附录:程序源代码.....................................................................................................16
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
绪 论
随着人口的迅速增长,道路资源的有限性和交通工具爆炸性的发展,城市交通正面临着严峻考验,因此造成日益严重的交通问题,每天的交通拥堵成了家常便饭但又不得不忍受。在这种情况下,与我国城市道路交通的实际情况相结合,开发出适合我们自身特点的智能信号灯控制系统已成为一个主要的任务。一个好的交通灯控制系统,将给道路拥堵,违章行驶等方面给予技术创新。随着电子技术的发展,采用单片机技术,能够智能管理交通灯,已成为目前广泛使用的方法。
在人类的生活,工作环境中,交通扮演着极其重要的角色,人们的出行与交通时时刻刻打着交道。城市交通控制系统是基于城市交通信号控制技术为主导的发展,与汽车行业的发展并行。在其发展的不同阶段,由于交通出现的各种矛盾,人们总是试图把各个历史阶段的最新科技成果应用到交通自动控制中,从而促进交通自动控制技术不断发展。
早在1850年,城市交叉路口处安全和拥堵问题引起人们的关注,全球第一个自动交通灯诞生,打开城市交通控制的序幕。在1868年,英国工程师娜奕特在伦敦西部威斯敏斯特街口安装一个红色和绿色煤气照明灯,用来控制交叉路口的马车通行,但一次煤气爆炸事故致使交通信号灯消失了近半个世纪。1914年,美国克利夫兰,纽约和芝加哥重新出现的交通信号灯,他们使用电动驱动,与现在意义的交通信号灯几乎是一样的。随着时代的发展,各种运输方式和交通管制的需要,第一光名副其实的三色灯(红,黄,绿)出生于1918年。它的周围是三色圆形投影机被安装在纽约市五号街一座高塔上,由于它的诞生,城市交通大大改善。
在近一个世纪的发展,道路交通信号控制系统经历了一个手动到自动,从固定到灵活配时,从无感应控制到有感应控制,从单点控制到干线控制,从区域控制到网络控制的长期过程。
交通网络是城市的动脉,是一个城市的生活经济水平,工业文明的象征。交通关系到人民对财产,安全和时间相关的利益。凭借优良科学的交通控制技术对资源物流和人们出行是非常有价值的,确保交通安全线的畅通,才能确保舒适的出行,物流按时到位,甚至是生命通道延伸。为了确保安全,高效的交通秩序,除了制定一系列的交通规则,而且还必须通过一定的技术手段来实现。随着单片机和传感器技术的迅速发展,自动检测领域发生了翻天覆地的变化,交通自动检测控制研究已经取得了显着的进步,必将以其优良的性能价格比,逐步取代传统的交通控制措施。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
1.整体方案设计
1.1 方案分析
交通灯一般设在城市道路的十字路口,可以分为东西方向(主干道)和南北方向(次干道),东西南北四个路口均设有有红绿黄3种灯和1个二位数码显示管。在某一时刻规定只有一个方向可以通行,另一方向被禁行,状态经过一定的过渡时间,将通行方向和禁行方向相互对换。其具体状态如下图所示。(白色表示灭)。通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如图1:
图1 交通灯状态图
·东西方向(主干道)红灯灭,同时绿灯亮,南北方向(次干道)黄灯灭,同时红灯亮,倒计时显示60秒。在此种状态下,东西方向(主干道)允许通行,南北方向(次干道)禁止通行。
·东西方向(主干道)绿灯灭,同时黄灯闪烁,南北方向(次干道)红灯亮,倒计时显示10秒。在此种状态下,除了正在通行中的车辆外,其他所有的车辆都应该等待状态转换。
·南北方向(次干道)红灯灭,同时绿灯亮,东西方向(主干道)黄灯灭,同时红灯亮,倒计时50秒。在此种状态下,东西方向(主干道)禁止通行,南北向允许通行。
·南北方向(次干道)绿灯灭,同时黄灯闪烁,东西方向(主干道)红灯亮,倒计时10秒。在此种状态下,除了正在通行中的车辆外,其他所有车辆都应该等待状态转换。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
1.2 方案确立
本设计系统以AT89C51单片机为控制核心,连接成最小系统,由倒计时显示模块、交通灯显示模块、按键开关控制模块组成。软件部分使用的是C 语言编程,由软件设置交通灯的初始时间,东西方向(主干道)通行60秒,南北方向(支干道)通行50秒,数码管采用动态显示,P0口送字形码,P2口送字位选通信号,通过单片机的P1口控制各种信号灯的点亮与熄灭,采用中断方式实现各按键的功能。
2.系统的硬件设计
2.1 设计原理及方法
本设计采用模块化的分层次设计方法,以单片机AT 89C 51为控制核心,连接成最小系统,由倒计时显示模块、交通灯显示模块、按键开关控制模块等组成。系统的总体框图如下所示。
图2 交通灯控制器框图
本系统采用AT89C51单片机及外围器件构成最小控制系统,12个发光二极管分成4组红绿黄三色灯构成信号灯指示模块,4个数码管东西南北方向各一个构成倒计时显示模块,通过四个按键K0、K1、K2、K3模拟控制交通灯东西通行,南北通行,返回,紧急情况各个交通灯工作情况之间相互转化。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2 AT89C51单片机最小系统
单片机最小系统一般有晶振、复位、电源、系统的输入控制、输出显示,以及其他外围模块(如通信、数据采集等)等模块组成。2.2.1 复位电路
单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。当复位电平持续两个机器周期以上时复位有效。复位电平的持续时间必须大于单片机的两个机器周期。具体数值可以由RC电路计算出时间常数。复位电路由手动复位和上电复位两部分组成。
(1)上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
(2)手动复位:手动复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。单片机复位期间不产生ALE和PSEN信号,即ALE=1和PSEN=1。这表明单片机复位期间不会有任何取指操作。
图3 单片机手动复位电路
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2.2 时钟电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。单片机晶振的作用是为系统提供基本的时钟信号。单片机的时钟电路由外接的一只晶振和两只起振电容,以及单片机内部的时钟电路组成,晶振的频率越高,单片机处理数据的速度越快,系统功耗也会相应增加,稳定性也会下降。
单片机的时钟电路设计有两种方式,一种是内部时钟方式,一种是外部时钟方式。
在内部时钟方式下单片机内部的高增益、反相放大器通过XTAL1、XTAL2外接作为反馈元件的外部晶体管振荡器与电容组成的并联谐振回路构成一个稳定的自激振荡器,向内部时钟电路提供振荡时钟。振荡器的频率主要取决于晶体的振荡频率。外部时钟方式是把外部已有的时钟信号引入到单片机内。此方式常用于多片单片机同时工作,以便于各单片机的同步。一般要求外部信号高电平的持续时间大于20μs,且为频率低于12MHz的方波。本设计采用内部时钟方式,单片机系统常用的晶振频率有6MHz、11.0592MHz、12MHz、本系统采用11.0592MHz晶振,电容选22pF或30pF均可。
图4 单片机时钟电路
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2.2 EA脚的功能及接法
AT89C51 单片机的EA/VPP(31 脚)是内部和外部程序存储器的选择管脚。当EA 保持高电平时,单片机访问内部程序存储器;当EA 保持低电平时,则不管是否有内部程序存储器,只访问外部存储器。由于现在单片机内部的flash容量都很大,因此基本都是从内部的存储器读取程序,即不需要外接ROM来存储程序,因此,EA脚必须接高电平。
图5 单片机最小系统
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3 其它硬件模块介绍及连接 2.3.1 倒计时显示模块
系统要求南北和东西方向的信号灯时间不一样,所以就利用单片机的P0口送出数据的段码,位选信号用P2口送出,用动态扫描的方法显示东西、南北的倒计时间。7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点。当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符。本设计采用共阴数码管,需要接上470欧上拉电阻以提供足够大的电流来驱动数码管,数码管的每段的电流是约10毫安。
图6 数码管显示模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.2 交通灯显示模块
本系统利用单片机的P1口来驱动和控制各种信号灯的燃亮和燃亮时间,在实际中,交通灯的信号灯需要用高电压控制,在这里我们只是模拟一下它的控制信号,所以我们就只用单片机的信号引脚直接来控制发光二极管。发光二极管是半导体二极管的一种,可以把电能转化成光能,常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,从P区注入到N区的空穴和由N区注入到P区的电子,在PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自发辐射的荧光。不同的半导体材料中电子和空穴所处的能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约5伏。它的正向伏安特性曲线
很陡,使用时必须串联限流电阻以控制通过管子的电流。
图7 交通灯模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.3 按键控制模块
本系统设置了有4个键:K0键,K1键,K2键,K3键。每个按键一端接地,另一端接上二极管。低电平有效,当按键按下端口接地,单片机捕获到低电平,从而得到相应的输入信息。本系统采用了二极管做开关,是为了防止有一按键被按下3根线同时被低,中断无效。二极管在正向电压作用下电阻很小,处于导通状态,相当于一只接通的开关;在反向电压作用下,电阻很大,处于截止状态,如同一只断开的开关。利用二极管的开关特性,可以组成各种逻辑电路。
程序开始运行先东西段通行、南北段禁止60s,后南北段通行、东西段禁止50s,依此循环。系统分三种工作模式:南北通行模式、东西通行模式、返回模式、紧急情况模式,并且通过四个按键K0、K1、K2、K3实现之间的相互转化。
图8 按键控制模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.4 电源模块
单片机工作时需要的+5V电压,所以在设计电源电路时,需要一个电子元件能提供+5V电压,由于78L05能够提供5V电压的三端稳压电源,78L05一脚为电源输入端,二脚为公共接地端,三脚即为我们所需要的+5V电压输出端.本系统采用典型的78L05提供电压的电路,即在78L05的1脚和公共接地端(即2脚)之间接入0.3μF的电容,在公共接地端和三脚+5V电压输出端之间接入0.1μF的电容.图9 电源模块
3.系统的软件设计
3.1 系统相关参数计算 3.1.1 T0的计数初值
T0的计数初值:X=216-12*50*1000/12=15536=3CB0H 3.1.2 倒计时显示的理论分析
倒计时显示的理论分析:利用定时器中断,设TH0=TH1=(65536-50000)/256,即每0.05秒中断一次。每到第20次中断即过了20*0.05秒=1秒时,使时间的计数值减1,便实现了倒计时的功能。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
3.1.2 交通灯状态显示的理论分析
状态灯显示的理论分析:黄灯闪烁同样可以利用定时器中断。每到第10次中断即过了10*0.05秒=0.5秒时,使黄灯标志位反置,即可让黄灯1秒闪烁一次。
3.2 系统主程序设计
本系统采用AT89C51单片机实现交通灯的控制,程序的编写用C语言来完成。系统控制程序可以分为若干模块:初始化程序,按键开关控制程序,交通灯转换控制程序,LED数码管显示程序,按键消抖动程序,延时程序,中断服务子程序等。系统相应的程序流程如图所示。
图10 程序流程图
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
4.系统的 Proteus软件仿真
4.1 Proteus仿真图
交通灯控制系统的仿真是通过 proteus 软件实现的交通灯控制系统仿真效果,仿真如下图9所示:
图11 仿真图
4.2 Proteus仿真的结果分析
Proteus仿真实现东西方向和南北方向的十字路口的车辆相互交替通过,东西方向(主干道)每次通行时间设置为60秒、南北方向(次干道)通行时间设置为50秒。同时可以实现红灯、黄灯、绿灯各状态之间的相互转换,黄灯闪烁时间设置为10秒,数码管可以准确进行倒计时显示。按下东西放行键K0,东西方向(主干道)绿灯亮,南北方向(次干道)红灯亮;按下南北放行键K1,南北方向(次干道)绿灯亮,东西方向(主干道)红灯亮;无论在任何时候按下返回键K2,该控制系统都将返回到初始状态;若遇紧急情况,按下紧急情况按键K3,东西南北方向都亮红灯,实现主干道和支干道全部禁止通行;模拟了控制交通灯东西方向(主干道)通行,南北方向(次干道)通行,返回,紧急情况各个交通灯工作情况之间相互转化,实现了课程设计的要求。宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
结束语
通过这次毕业设计,使我受益匪浅。使我在软硬件结合的综合运用能力上有了进一步的提升,对课堂上所学的单片机知识有了进一步的加深和巩固,在C语言的掌握方面也向前迈了一大步,在老师和同学的帮助下,提高了个人分析解决实际问题的综合能力以及协同合作的能力,同时还锻炼了我查阅资料的能力、动手能力、发现问题、解决问题的能力。面对电脑搜索资料,一点点,一块块的电路慢慢拼成完整的电路经过一次次的反复修改终于设计出了属于自己的程序和电路,虽然还有诸多不足之处,不过使自己真正的体会到了探索事物的奥秘的快乐,同时自己也更深入的了解到了单片机的巨大的潜力,虽然有的时候可能遇到了一些困难,但是我最终解决了,我也会感觉到成功给我带来的喜悦,我知道我在专业知识上的掌握还是远远不够的,我还要更加努力的去学习,提高自己了实践能力。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
参考文献
[1] 杨素行.模拟电子技术[M].北京:高等教育出版社.2006 [2] 余孟尝.数字电子技术[M].北京:高等教育出版社. 2006 [3] 邱关源,罗先觉.电路[M].北京:高等教育出版社.2011 [4] 张毅刚.单片机原理及应用[M].北京:高等教育出版社.2011 [5] 凌志浩.AT89C52单片机原理与接口技术[M].北京:高等教育出版社.2011 [6] 郭循钊,邝帆.基于单片机的多功能交通灯控制系统设计与仿真实现[J].公路交通技术.2010 [7] 刘日华,宋海.基于单片机的交通灯设计[J].科技致富向导.2012 [9] 高文庆,吕英英. 基于AT89C51单片机的数字秒表设计[J]. 电脑知识与技术.2012 [10] 谭浩强著,C程序设计 第三版[M].清华大学出版社.2006 [11] 彭虎,周佩玲. 微机原理与接口技术[M].电子工业出版社.2011 [12] GUO Haili.Design of Traffic Light Control System Based on Proteus and Single-chip Computer.Journal of Hengshui University[J].2012 [13] Tang Jing-nan, Qin Shen .Development and Examples of 51 Microcontroller's C Language [M].Posts & Telecom Press.2008
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
致 谢
本毕业设计在胡波和刘明老师的亲切关怀和悉心指导以及同学们的热心帮助下完成的。感谢他们在此次毕业设计过程中给予我的悉心指导与各方面的帮助,他们给了我许多非常有益的建议和意见,使我在思路上得到了很大的启发,从中认识到了自己存在的不足,并且学到了很多非常宝贵的知识。同时也要感谢系里其它同学和我的朋友在设计中给我提供的帮助和支持。总的来说,这次设计给了我一个很好的锻炼机会,让我学到了很多东西,让我将自己所掌握的理论知识切实运用于工作和生活实践中,这不仅有利于加深对书本知识的理解和巩固,而且在很大程度上提高了我们在理论知识的指导下观察、分析和解决问题的能力。最后,再次向所有帮助过我的老师、同学表示衷心的感谢!谢谢你们!宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
附录:程序源代码
/*#include
code 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
{ uchar i;
while(ms--){ {} for(i=0;i<200;i++)}
} /*中断0处理程序*/ void int0(void)interrupt 0 { EA=0;/*CPU禁止响应一切中断*/ P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/
{ P2=weima[0],P0=duanma[(SN_G+Y)%10];/*南北方向数码管显示可通行 while(1)/*无条件循环*/ 时间的个位*/ delayms(10);/*延时*/
P2=weima[1],P0=duanma[(SN_G+Y)/10];/*南北方向数码管显示可通行 delayms(10);/*延时*/ 时间的十位*/ P2=weima[2],P0=duanma[(WE_G+Y)%10];/*东西方向数码管显示可通行时间的个位*/ delayms(10);/*延时*/
P2=weima[3],P0=duanma[(WE_G+Y)/10];/*东西方向数码管显示可通行时间的十位*/
/*设置南北方向通行时间*/ if(K0==0)/*P3^7=0*/ { delayms(10);/*延时*/ 17 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
delayms(20);/*延时,把抖动的时间抛掉*/ if(K0==0)*/ { } SN_G++;/*南北方向绿灯时间+1*/ if(SN_G==100)SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/ }
} /*设置东西方向通行时间*/ if(K1==0)/*P3^6=0*/ { { while(K0==0)/*当松开K0开关时,跳出空循环,执行后面的程序 delayms(20);/*延时,把抖动的时间抛掉*/ if(K1==0){ while(K1==0)/*当松开K1开关时,跳出空循环,执行后面的程序*/ { } WE_G++;/*东西方向绿灯时间+1*/ if(WE_G==100)WE_G=0;/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/ }
} /*返回*/ if(K3==0)/*P3^5=0*/ delayms(20);/*延时,把抖动的时间抛掉*/ if(K3==0){ { 18 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程
{ } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行序*/ 时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/
led();/*调用数码管函数*/ EA=1;/*CPU开放总中断*/
break;/*跳出*/ }
} } } /*中断1处理程序*/ {
P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/ TR0=!TR0;/*计数器停止工作*/ {/*数码管扫描程序,*/ P2=weima[0];/*显示南北方向个位*/ delayms(10);/*延时*/ delayms(10);/*延时*/ P2=weima[2];/*显示东西方向个位*/ delayms(10);/*延时*/ P2=weima[3];/*显示东西方向十位*/ delayms(10);/*延时*/ /*返回*/ EA=0;/*CPU禁止响应一切中断*/ while(1)/*无条件循环*/
void int1(void)interrupt 2 P2=weima[1];/*显示南北方向十位*/ if(K3==0)/*P3^5=0*/ { 19 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
delayms(20);/*延时,把抖动的时间抛掉*/
if(K3==0){ while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程序*/
{ } TR0=!TR0;/*启动计数器*/ EA=1;/*CPU开放总中断*/
break;/*跳出*/
}
} } } /*键盘程序*/ void key(){ /*南北有车而东西无车*/ if(K0==0)/*K0=0*/ { delayms(20);/*延时,把抖动的时间抛掉*/ if(K0==0){ while(K0==0)/*当松开K0开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } }
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
/*南北无车而东西有车*/ if(K1==0)/*K1=0*/ { delayms(20);/*延时,把抖动的时间抛掉*/ if(K1==0){ while(K1==0)/*当松开K1开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } count=0;/*清零*/ k=1;/*南北方向不通车,东西方向通车*/ SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ light();/*调用交通灯函数*/
} /*定时函数*/ void time1(void)interrupt 1 {
TH0=0x3c;TL0=0xb0;/*计50000个数,用时50ms*/ count++;/*自增运算*/ if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/ { SN--;/*自减运算*/ WE--;/*自减运算*/ count=0;/*清零*/ if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/ { } led();/*调用数码管函数*/ } k++;/*自增运算*/ if(k>3)/*当k>3时,执行程序*/ 21 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
k=0;/*清零*/ switch(k)/*switch 语句*/ { case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ case 1:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/ case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ case 3:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/ } } } /*交通灯函数*/ void light(){
P1=deng[k];/*交通灯对应着k的值变化*/ if(P1==deng[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
{ TH1=(65536-50000)/256;
} TL1=(65536-50000)%256;/*延时50ms*/
P1=0xDF;/*南北方向黄灯熄灭,东西方向亮红灯*/ } else if(P1==deng[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/ { TH1=(65536-300000)/256;
TL1=(65536-300000)%256;/*延时50ms*/ P1=0xFB;/*南北方向亮红灯,东西方向黄灯熄灭*/ 22 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
} } /*数码管函数*/ void led(){
} /*主函数*/
void main(void){
init();/*调用程序初始化函数*/ { key();/*调用键盘程序*/ light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } while(1)/*无条件循环*/ P2=weima[0],P0=duanma[SN%10];/*显示南北方向个位*/ P2=weima[1],P0=duanma[SN/10];/*显示南北方向十位*/ delayms(10);/*延时*/ P2=weima[2],P0=duanma[WE%10];/*显示东西方向个位*/ delayms(10);/*延时*/ P2=weima[3],P0=duanma[WE/10];/*显示东西方向十位*/ delayms(10);/*延时*/ delayms(10);/*延时*/ } 23