单片机电子时钟系统设计论文.doc_第1页
单片机电子时钟系统设计论文.doc_第2页
单片机电子时钟系统设计论文.doc_第3页
单片机电子时钟系统设计论文.doc_第4页
单片机电子时钟系统设计论文.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

一、设计内容利用单片机内部的定时/计数器,中断系统,按键以及八段数码管等元器件,设计一个具有校时功能,闹铃功能的数字钟。该数字钟选用单片机at89c51控制,6位led数码管由软件编译直接驱动显示。该时钟能显示当前的时、分、秒,可以进行计时,校准、定时闹铃。电路结构简单,系统控制方便。二、 电路原理多时刻定时数字钟电路图如下。单片机at89c51外接12mhz的晶振。p0口输出字形码,p2口味扫描的字形码。显示电路采用6只共阳极数码管,其共阳极由三极管8550驱动。蜂鸣器作闹铃,也是由三极管8550驱动。单片机各端口分配如下: p1.0:s1校时按钮p1.1: s2校分按钮 p1.2: s3定时设置存储按钮 p1.3: s4定时设置退出按钮p3.0:ha 蜂鸣信号电源:采用usb 接电脑usb 获得5v标准工作电压。时间调整:分别按下校时、校分按钮s1、s2即可调整校时,持续不放,时、分数值连续加1,此操作使秒值清零。定时设置:按下定时设置存储按钮s3,计时显示切换到定时时间值显示,初值为“00”时“00”分“00”秒。再按s1设时数值,按s2设分数值,每按一下数值加1,调整到设定值时,再按s3保存第一闹铃时刻。然后再分别按s1、s2校时校分,再按s3保存第二闹铃时刻,如此可设定24个闹铃时刻。每次设好异时空都可以按s4退出定时设置状态,恢复正常走时、在操作过程中会听到“滴滴”声提示。数码管显示原理:6只共阳数码管由6个三极管8550驱动,选通端接三极管的集电极,6个三极管的基极经电阻与分别与p2.0p2.6相连,p2口做选通控制端,当输出0时相应的数码管被选通。三、 硬件电路制作与调试设计好电路原理图后就要完成硬件电路的制作与调试根据电路原理图,首先需要完成硬件电路的布局,一个好的布局不仅使整个硬件电路好看,而且能使焊接变得更简单,不易出现引脚间的短路,因此要合理布局。然后就是焊接。首先要完成主要元器件的焊接,第一步先将单片机的dip40引脚插座焊到插件板上。第二步就要焊接数码管,因为使用6个共阳的数码管,因此在焊接是需要将各个数码管的字型输入端并连起来,最后分别接入p0口,p0口需串如排阻,起上拉电阻作用。由p0口输出字形控制码。将各个数码管的公共选通端与对应三极管8550的c端连接。三极管8550的基极经电阻与p2.0p2.6相连,e端都接+vcc。第三步是焊接时间调节电路。时间调节电路由四个按键构成,与p1.0p1.3相连,当按键动作时会有高或低电平(1或0)输入,单片机根据输入读取信息调节显示时间和设置闹铃时间。第四步焊接复位电路和闹铃蜂鸣器电路。复位电路由复位按键和电解电容组成。闹铃蜂鸣器经三极管8550与p3.0口相连,当启动闹铃程序后,p3.0输出0,蜂鸣器开始蜂鸣。最后一步焊接晶振电路。采用12mhz晶振。焊接完成后,仔细检查无明显短路引脚后,运行调试程序:mov p0, #00hmov p2, #00hsjmp $end 若显示满屏“88.88.88”则说明硬件电路制作成功。如不能正常显示则:1.观察触摸芯片等器件是否发烫,器件是否接反。2.检查电源电压是否正常,整机电流应为200ma左右。3.用示波器观察晶振引脚电压波形,判断震荡电路是否起振。4.显示驱动电路是否正常。、四、 程序编写与调试1.编写思路: 时钟信号将由单片机内部定时器t0中断产生,让t0工作在方式1循环产生50ms时基信号,通过计数20次产生秒信号,在经过计数得分和时的信号。因为采用定时器t0中断运行时不占cpu的时间,所以保证走时的精度。程序开始内定时间为00点00分00秒,提供开机时使用,不然会出现显示乱码。 p1口的按钮信号采用查询法判别,当有效时,调用对应功能子程序。多时刻闹铃程序采用数据对比法,先比较时数据,再比较分数据,与设定时刻相同时调用闹铃程序。2.运行调试:软件编写调试采用“循序渐进法”,此方法尤其适合大型复杂程序的编写调试。在本设计中我们先编写6位数码管动态扫描显示固定数值,如“012345”。仿真烧写成功实现后,在此基础上添加定时中断并显示走时数值程序,编写校时程序。最后嵌入定时存储设置和到时刻闹铃程序,如此完善整个程序的编写。 附:元器件列表1. 单片机at89c51 1个2. 共阳极数码管 6个3. 三极管8550 7个4. 4.7k电阻 8个5. 10 k电阻 5个6. 排阻 1个7. 30pf电容 2个8. 10电容 1个9. 10f电解电容 1个10. 蜂鸣器 1个11. 12mhz晶振 1个12. 按键 5个13. led灯 1个14. dip 40 脚插座 1个15. 电路板 1个16. 开关 1个17. usb外接口 1个18. 连接用导线 若干附:源程序代码;*; 带有时间设置和秒显示的数字闹钟; date : 2010.6.26 12mhz晶振 ; create by :赵红斌;p1.2设置键p1.0小时调整键p1.1分钟调整键p3.0定时输出指示;*;*; 变量地址分配;* swdelay equ 2; 设置按键时去抖动时间displaybuffer equ 30h; 设置显示缓冲区的地址为30h-35h共6个字节beepval equ 38h; 蜂鸣时间长短存储器地址 onesecondcounter equ 39h; 设置1秒计数器的地址,1秒计数器是用来计数1秒内计时器的中断次数hour equ 3ah; 设置小时计数器的地址minute equ 3bh; 设置分钟计数器的地址second equ 3ch; 设置秒计数器的地址year equ 3dh; 设置月日年计数器的地址month equ 3eh;day equ 3fh;p1val equ 40h; 设置数码管位驱动值的地址clockmode equ 20h.0; 模式(正常走时/闹时)设置寄存器地址,值为0时正常走时,为1时闹时设定alarmonoff equ 20h.1; 闹钟开启/关闭标志,为0关闭,为1开启alarmtimeon equ 20h.2; 此位为1时表示闹时时间到datamode equ 20h.3disphour equ 21h; 设置小时显示寄存器的地址dispminute equ 22h; 设置分钟显示寄存器的地址dispsecond equ 23h; 设置秒显示寄存器的地址dnum equ 24halarmhour equ 2eh; 设置闹时小时计数器的地址alarmminute equ 2fh; 设置闹时分钟计数器的地址alarmsetkey bit p1.2; 闹钟设置键minutekey bit p1.1; 定义分设置键hourkey bit p1.0; 定义小时设置键datasetkey bit p1.3;relayout equ p3.0; 定义输出引脚;*; 程序开始;* org 0000h ajmp reset ;程序开始 org 000bh ;timer0中断向量地址 ajmp timeint ;跳到中断处理程序 org 0020hreset: ;以下为初始化程序,为各个变量赋初值 mov sp,#70h; setb relayout mov onesecondcounter,#125 ; mov hour,#00 mov minute,#00 mov second,#00 ;设置上电时时钟显示的初值 ; mov year,#10 mov month,#6 mov day,#27 ; mov alarmhour,#00 mov alarmminute,#00 ;设置上电时闹时时间的初值 ; clr alarmonoff ;上点复位后闹时功能处于关闭状态 clr clockmode ;正常走时模式 clr alarmtimeon setb relayout ;清闹时输出 clr datamode ; mov 36h,#10 mov 37h,#11 ; ;*; use timer 0 mode 1; 400us interrupt;* mov tmod,#00000001b mov th0,#0e3h mov tl0,#5dh mov ie, #82h ;开全局中断 setb ea setb et0 setb tr0 ;开定时中断;*; 主程序;*mainloop: jb alarmsetkey,checkminutekey ;闹时设置键按下了吗?没有则转去检测秒设置键 call delay jb alarmsetkey,checkminutekey ;按下的时间超过500ms吗? setb clockmode ;置为闹时设置模式 call alarmsetcheckminutekey: jb minutekey,checkhourkey ;分设置键按下了吗?没有则转去检测小时设置键 ;如按下调用蜂鸣器发音程序 mov a,minute add a,#1; 如果按下则将分钟加一 十进制调整 mov minute,a; cjne a,#3ch,notover1; 到60分钟了吗? mov minute,#0; 到60分钟则将分钟清0notover1: ;以下等待按键释放及防抖动 jnb minutekey,$checkhourkey: jb hourkey,checkdatakey; ; 如按下调用蜂鸣器发音程序 mov a,hour add a,#1; 如果按下则将小时加1 mov hour,a cjne a,#18h,notover2 mov hour,#0; 到24小时则将小时清0notover2: ;以下等待按键释放及防抖动 jnb hourkey,$checkdatakey: jb datasetkey,checkalarm call delay jb datasetkey,checkalarm setb datamode call datasetcheckalarm: jnb alarmtimeon,toreturn call alarmprocesstoreturn: ajmp mainloop;*; 定时器timer0中断服务程序(此程序每8ms执行一次);*timeint: mov th0,#0e3h; 重新加载定时参数 mov tl0,#5dh; push acc push psw; 保护累加器及程序状态字的内容 setb rs0; 选择工作寄存器组1, clr rs1; 这样可保护原工作寄存器组(0组)的内容 djnz onesecondcounter,notonesecond; 中断了125次了吗?即够1秒了吗? mov onesecondcounter,#125; 如够1秒则重新设置onesecondcounter计数器 call clock ; 调用将时钟内容加1秒的子程序 call daynum call convertobuffer ; 调用将时钟内容转换到显示缓冲区子程序notonesecond: call scandisplay ; 调用扫描显示子程序 pop psw pop acc ; 恢复累加器及程序状态字的内容 reti ; 中断返回;*; 扫描显示子程序;*scandisplay: mov r1,#displaybuffer ;指向显示数据首址 mov r5,#01h ;扫描控制字初值play: mov a,r5 ;扫描字放入a mov p2,a ;从p2口输出 mov a,r1 ;取显示数据到a mov dptr,#tab ;取段码表地址 movc a,a+dptr ;查显示数据对应段码 mov p0,a ;段码放入p1口 lcall delay inc r1 ;指向下一地址 mov a,r5 ;扫描控制字放入a jnb acc.7,endout ;扫到第六位时结束 rl a ;a中数据循环左移 mov r5,a ;放回r5内 ajmp play ;跳回play循环endout: mov p2,#0ffh ;一次显示结束,p2口复位 mov p0,#00h ;p1口复位 ret ;子程序返回 tab: db 40h ,79h ,24h, 30h,19h, 12h , 02h , 78h,00h, 10h , 08h , 03h,46h, 21h ,06h , 0eh;共阴段码表 012 34567 89-c;*; 时钟内容加1秒的子程序;*clock: mov a,second; 将原秒值送入a add a,#1; 加1秒 mov second,a cjne a,#3ch,notoverflow; 够60秒了吗? mov second,#0; 够了则将秒值清0 ; mov a,minute add a,#1 mov minute,a; 分钟加1 cjne a,#3ch,notoverflow; 够60分了吗? mov minute,#0; 够了则将分值清0 ; mov a,hour add a,#1 mov hour,a; 小时加1 cjne a,#18h,notoverflow; 够24小时吗? mov hour,#0; 够了则将小时值清0 ; mov a,day add a,#1 mov day,a cjne a,dnum,notalarm mov day,#1 ; mov a,month add a,#1 mov month,a cjne a,#13,notalarm mov month,#1 ; mov a,year add a,#1 mov year,a cjne a,#11,notalarm mov year,#0notoverflow: jnb alarmonoff,notalarm; 闹钟开启了吗?如没有开启则无需理会是否到闹时时间 mov a,second jnz notalarm; 秒为零吗? mov a,minute cjne a,alarmminute,notalarm; 时间分钟值和闹时设置分钟值相等吗? mov a,hour cjne a,alarmhour,notalarm; 时间小时值和闹时设置小时值相等吗? setb alarmtimeon; 到了闹时时间则将“闹时时间到”标志设为1notalarm: ret;*; 将时钟内容或闹时设置值转换到显示缓冲区子程序;*convertobuffer: mov r1,#displaybuffer jnb datamode,timedisp mov a,day mov dispsecond,a mov a,month mov dispminute,a mov a,year mov disphour,a ajmp converttimedisp: jb clockmode,dispalarmset; 判断时钟模式,以决定是显示实时时间还是闹时时间 mov a,second; mov dispsecond,a; mov a,minute; mov dispminute,a; mov a,hour; mov disphour,a; 显示实时时间 ; ajmp convertdispalarmset: jb alarmonoff,alarmon mov dispsecond,#00h ajmp nextalarmon: mov dispsecond,#11; 显示闹时时间及显示闹钟状态:显示“00”表示关闭闹钟,next: ;“11”表示开启闹钟 mov a,alarmminute; mov dispminute,a; mov a,alarmhour; mov disphour,a; ;convert: mov a,dispsecond; 取秒值 mov b,#10 div ab mov r1,b; inc r1; 缓冲寄存器的地址加1 mov r1,a; 将秒值的十位值存入缓冲区 ; inc r1 mov a,dispminute mov b,#10 div ab mov r1,b; inc r1; 缓冲寄存器的地址加1 mov r1,a; 将秒值的十位值存入缓冲区 ; inc r1 mov a,disphour mov b,#10 div ab mov r1,b; inc r1; 缓冲寄存器的地址加1 mov r1,a; 将秒值的十位值存入缓冲区 ret;*;天数判断,平年,闰年;* daynum: mov a,month mov dptr,#tabl movc a,a+dptr mov dnum,a mov a,year mov b,#4 div ab mov a,b cjne a,#0,bb mov a,month cjne a,#2,bb inc dnumbb: ret tabl: db 31,32,29,32,31,32,31,32,32,31,32,31,32 ;*; 闹时设置子程序;*alarmset: jnb alarmsetkey,$ call delay; 等待“alarmsetkey”键释放checkarmminutekey: ; jb minutekey,checkarmhourkey; 分设置键按下了吗?没有则转去检测小时设置键 setb alarmonoff mov 37h,#0 mov a,alarmminute add a,#1; 如果按下则将分钟加1 十进制调整 mov alarmminute,a; cjne a,#3ch,armnotover1; 到60分钟了吗? mov alarmminute,#0; 到60分钟则将分钟清0armnotover1: ;以下等待按键释放及防抖动 jnb minutekey,$checkarmhourkey: jb hourkey,alarmsetend; 小时设置键按下了吗?没有则返回反复检测 setb alarmonoff mov a,alarmhour add a,#1; 如果按下则将小时加1 mov alarmhour,a cjne a,#18h,armnotover2 mov alarmhour,#0; 到24小时则将小时清0armnotover2: ;以下等待按键释放及防抖动 jnb hourkey,$alarmsetend: jb alarmsetkey,alarmset; 设置完毕了吗? jnb alarmsetkey,$; clr clockmode; 从设置模式转为走时模式 ret;*; 日期调整;*dataset:

温馨提示

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

评论

0/150

提交评论