找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8903|回复: 2
收起左侧

带闹钟的智能电子时钟单片机课程设计实验报告下载

[复制链接]
ID:188789 发表于 2017-4-12 13:03 | 显示全部楼层 |阅读模式
上海电力学院电子科学技术专业等电子课设作业实验报告
微处理器综合设计实践报告
1.001.jpg
题目:智能电子时钟的设计
院系:电子与信息工程学院   
专业: 电子科学与技术年级2014

姓名:沙沁  学号:20141378
指导老师:杨芳

一、课程设计目的

    综合应用所学的微处理器原理,汇编语言及相关硬件知识,设计一个具有一定功能的电路。熟练掌握仿真器和编程器的使用。

二、课程设计要求:

    在面包板上搭建好硬件电路。以单片机为核心器件,组成一个电子时钟系统。系统显示用4位7段LED显示器,显示当前时间的小时和分。能够通过按键实现对当前时间的调整,系统时间到整点后能够通过蜂鸣器报时,时间为1s;能通过按键设置闹钟时间,闹钟时间到后,通过蜂鸣器报时。

三、系统组成与工作原理:

   1、电路原理图

       1.002.jpg

2、工作原理

  • 设计原理及思路

本课程设计要求以AT89C52单片机为核心器件,组成一个电子时钟系统。我们可以利用单片机自带的定时器功能来进行定时,再通过一些软件编程来构造出一个时钟,同时也可以利用软件的编程来实现所要求的其他功能。

通过四个按键开关来控制电子时钟的工作模式。KEY1、KEY2分别对应时钟的调时和调分。KEY3可以设置闹钟,进入闹钟模式后,KEY1、KEY2将转变成闹钟的调时和调分键。此外,当按下KEY4就可以进入秒表模式,进入秒表模式以后,KEY1可以控制秒表的开始于暂停,KEY2可以对秒表清零,再次按下KEY4键便退出秒表模式。程序运行时主程序一直在循环查询各按键的状态,并将当前时间与闹钟设定时间不断进行比较,如果时间相同则响铃,同时通过动态显示的方式将相应的时间显示在数码管显示器上。与此同时,整个过程中时钟的时间都是由单片机的定时器进行计时的。

单片机的P0口负责输出段码,P2.0~P2.3对应四个数码管的位选端,分别为数码管1号、2号、3号、4号(由右至左编号);P1.0对应蜂鸣器;P2.4~P2.7对应四个按键4、3、2、1(由上至下编号)。

各个分电路:

  • 蜂鸣器电路
1.003.jpg

当P1.0为低电平时,三极管导通,蜂鸣器开始工作

  • 上电复位电路
1.004.jpg

在通电瞬间,电容C通过电阻R20充电,RST端出现正脉冲,用以复位。只要接通电源就完成了系统的复位初始化。

  • 振荡电路

1.005.jpg

此处晶振为12MHz,提供单片机的时钟频率。晶振频率越高,单片机运行速度越快。

  • 数码管显示电路

1.006.jpg

P0口连接上拉电阻(排阻),用万用表测试得数码管为共阳极。当P2.3~P2.0口输出低电平时,三极管导通,所对应的数码管显示;因为共阳极,所以P0口为低电平的端口所对应的段码显示。

  • 按键电路
1.007.jpg

当按键没有按下时,P2.4~P2.7为高电平,若按下则变低电平。

  • 所用存储单元
31H——时钟分的个位           3AH——时钟分的个位的段码
32H——时钟分的十位           3BH——时钟分的十位的段码
33H——时钟时的个位           3CH——时钟时的个位的段码
34H——时钟时的十位           3DH——时钟时的十位的段码
41H——闹钟分的个位           4AH——闹钟分的个位的段码
42H——闹钟分的十位           4BH——闹钟分的十位的段码
43H——闹钟时的个位           4CH——闹钟时的个位的段码
44H——闹钟时的十位           4DH——闹钟时的个位的段码
51H~54H  分别存放着秒表模式下1~4号管要显示的数字
5AH~5DH 分别存放着秒表模式下1~4号管要显示的数字的段码
其中,1号管——秒的十分位
      2号管——秒的个位
      3号管——秒的十位
      4号管——分的个位
R7的初值为20,控制定时器T0的中断次数,T0中断1次定时50ms,20次定时1s;
R0用来记录秒;
  • 总流程图
详见附件



四、总结

因为平时对于电路设计这方面的训练比较少,电路也是自己最薄弱的地方。因此,在第一天拿到器件以后完全没有方向,不知道从哪里开始设计。后来通过自己上网搜索资料,逐渐摸索出了思路,最终完成了电路的设计。

电路设计完之后,在面包板上搭建也让我犯了难。什么器件应该放在哪个位置,这么放插孔够不够用,这么放连线方不方便成了我一直头疼的问题。后来通过观察上一届学长的面包板和同学的讨论,终于搭好了板子。但是因为对于面包板不熟悉,搭小灯泡时,把它的两个引脚插在了联通的两个孔里,导致小灯泡一直不亮;插按键的时候也是,没有搞清楚按键和面包板的构造,把按键的两边引脚都插在联通的一排里,导致后面在验证的时候出现了数码管一直不亮的问题,后来经过老师的指导,解决了这个问题。

软件的编写可能是最困难的一个部分了。虽然之前有做过单片机实验,写过代码,但是,实验的代码非常简短,实现的功能很简单。这次因为要实现很多功能,一开始我想偷懒,直接写了代码。这样就导致了我的思路不成熟,运行下来有很多地方都是错误的。因此我才意识到,直接写代码是不可能的,要先画流程图理清思路。在我画完流程图以后,再会过去看我原来的代码,才知道有多么的混乱。后来经过我分模块的编写,最后把它们汇总到一起,构成了最后的代码,开始调试。

首先,我先在WAVE软件里写了一个最小系统的代码,再通过wellon软件,烧制到AT89C52单片机上,对最小系统进行测试。测试时发现小灯和蜂鸣器都没有正常的工作。因为当时刚刚开始,并不知道该如何调试,就马上叫老师了,老师发现小灯的两个引脚插在了联通的两个孔里,才导致了不亮。当我把小灯的引脚插在其他地方时,灯就亮了。至于蜂鸣器不响的问题,我用万用表测试了蜂鸣器周围的所有电路发现都是正确的,测试蜂鸣器两端的电压,发现也是有电压差的,我的代码又没有问题,一时不知道怎么办才好。后来,我又连接电源,让电路运行了一次,发现其实蜂鸣器是发出声音的,只是很微弱以至于我们都把它忽略了。然后我就想是不是因为蜂鸣器两端电压太小导致的。于是,我就把和蜂鸣器相连接的电阻拿掉了,终于蜂鸣器也响了。最小系统测试完成。

后来,老师教我们使用了仿真器,这让整个调试过程变得方便了许多。当我把整个代码都编译到仿真器里面时,板子上的数码管没有任何反应,但是换成同学的板子就可以显示,这让我觉得很不可思议。当我又写了段测试数码管的程序,让它显示的时候,数码管也是可以正确显示的。我实在想不出办法,决定单步运行,看看到底哪里出现了问题。但是我单步运行了几次,都没有发现哪里有问题,于是只能求助于老师。老师通过设断点的方法发现,我的按键完全没有实现它的功能,于是就询问我怎么安装的按键,这才找出了原因,原来我的按键的安装方向错了。在改正了之后,我的数码管就能正常的显示了。

数码管显示之后,我发现我的闹钟到了指定时间不会响,然后我仔细再看了我的代码,发现虽然写了闹铃的子程序,但是在主程序里面并没有调用,这才导致了闹钟不响。在有加了一句调用语句以后,闹钟就能正常工作了。

当我把前一天调试好的程序第二天再用仿真器进行测试时,发现蜂鸣器只要一通电就响了,完全不受程序的控制。为什么我程序一点都没改过但是再次验证又失败了呢?我又拿了同学的板子做测试,发现她跟我是一样的问题,于是我就想会不会是仿真器的问题。于是,我又拿了另一个仿真器测试了一下,发现程序是正常运行的;我又把蜂鸣器接在了第一个仿真器的P3口进行实验,发现程序也是正常运行的。因此,我认为是第一个仿真器的P1口坏了。

通过这次课程设计,我对单片机有了更加深刻的认识,体会到了单片机的强大。同时,从设计电路图到最后的验证成功,在这整个过程中遇到了很多的问题,当遇到问题时我认为最重要的还是冷静下来自己思考,仔细的检查。因为很多的问题的出现大部分程度上是因为自己的不仔细。一个地方的出错可能就导致了整个数码管的不显示,整个程序的实现不了功能。当出现了问题时,应该自己默默地看代码,仔仔细细地观察,看看到底哪里出现了问题,因为自己的代码只有自己知道具体哪里是干什么的,自己检查出来错误才会有成就感。总之,通过这次课程设计,我学习到了很多,也意识到了自己在动手方面的不足,希望在以后的学习中能改正这一缺点。


程序清单:



  1. ORG 0000H
  2.         AJMP MAIN
  3.         ORG 000BH
  4.         LJMP TIME    ;时钟程序
  5.         ORG 001BH
  6.         LJMP IT1P    ;IT1P用于秒表计时
  7.         ORG 0030H
  8.   MAIN: MOV SP,#60H     ;堆栈指针初始化
  9.         MOV IE,#8AH     ;允许T0和T1中断
  10.         MOV TMOD,#11H   ;T0和T1均工作在方式1
  11.         MOV TL0,#0B0H   ;给T0装初值,中断一次定时50ms
  12.         MOV TH0,#3CH
  13.         MOV R0,#0       ;用R0记录秒
  14.         MOV R7,#20      ;中断20次,定时1s
  15.         MOV 31H,#00H    ;时间初始化,显示器显示:00:00
  16.         MOV 32H,#00H
  17.         MOV 33H,#00H
  18.         MOV 34H,#00H
  19.         MOV 3AH,#0C0H
  20.         MOV 3BH,#0C0H
  21.         MOV 3CH,#0C0H
  22.         MOV 3DH,#0C0H
  23.         MOV 41H,#00H    ;闹钟初始化,定在00:00时刻
  24.         MOV 42H,#00H
  25.         MOV 43H,#00H
  26.         MOV 44H,#00H
  27.         MOV 4AH,#0C0H
  28.         MOV 4BH,#0C0H
  29.         MOV 4CH,#0C0H
  30.         MOV 4DH,#0C0H
  31.         MOV DPTR,#TAB   ;段码表首地址传给DPTR
  32.         SETB  P1.0
  33.         SETB TR0
  34. START1: JB P2.7,NEXT1    ;按键1调时
  35.         LCALL DEL1       ;调用延时程序,消除按键抖动
  36.         JB P2.7,NEXT1
  37.         JNB P2.7,[        DISCUZ_CODE_1        ]nbsp;      ;等待按键弹开
  38.         LCALL KEY1
  39. NEXT1: JB P2.6,NEXT2    ;按键2调分
  40.         LCALL DEL1
  41.         JB P2.6,NEXT2
  42.         JNB P2.6,$
  43.         LCALL KEY2
  44. NEXT2: JB P2.5,NEXT3    ;按键3设置闹钟
  45.         LCALL DEL1
  46.         JB P2.5,NEXT3
  47.         JNB P2.5,$
  48.         LCALL KEY3
  49. NEXT3: LCALL NAOZHONG      ;闹钟响铃程序,当前时间与闹钟时间相同则响铃
  50.         JB P2.4,DSPLY1   ;按键4秒表
  51.         LCALL DEL1
  52.         JB P2.4,DSPLY1
  53.         JNB P2.4,$
  54.         LCALL KEY4

  55. DSPLY1:  ;显示时间
  56.         MOV P2,#0FEH     ;1号管显示分的个位
  57.         MOV P0,3AH
  58.         LCALL DEL2
  59.         MOV P2,#0FDH     ;2号管显示分的十位
  60.         MOV P0,3BH
  61.        LCALL DEL2
  62.         MOV P2,#0FBH     ;3号管显示时的个位
  63.         MOV P0,3CH
  64.         CLR P0.7         ;点亮3号管后的小数点,区别时和分
  65.         LCALL DEL2
  66.         MOV P2,#0F7H     ;4号管显示时的十位
  67.         MOV P0,3DH
  68.         LCALL DEL2
  69.         LJMP START1

  70.   TIME:   ;时钟程序
  71.         DJNZ R7,LOOP1
  72.         MOV R7,#20
  73.         INC R0
  74.         CJNE R0,#60,LOOP1
  75.         MOV R0,#00H
  76.                   INC 31H
  77.                   MOV R1,31H
  78.                   CJNE R1,#10,TABLP1
  79.                   MOV 31H,#00H
  80.                   INC 32H
  81.                   MOV R1,32H
  82.                   CJNE R1,#6,TABLP1
  83.                   MOV 32H,#00H
  84.             LCALL BAOSHI
  85.                   INC 33H
  86.         MOV R1,33H
  87.         MOV R2,34H
  88.         CJNE R2,#2,LOOP2    ;判断时的十位是否为2,若不是跳转到LOOP2
  89.         CJNE R1,#4,TABLP1   ;接着判断时的个位是否为4,若不是查表获取段码
  90.         MOV 33H,#00H        ;若为24时,则将时的个位和十位清零
  91.         MOV 34H,#00H
  92.         SJMP TABLP1
  93. LOOP2: CJNE R1,#10,TABLP1
  94.         MOV 33H,#00H
  95.         INC 34H
  96. TABLP1: MOV A,31H
  97.         MOVC A,@A+DPTR
  98.         MOV 3AH,A          ;分的个位的段码
  99.         MOV A,32H
  100.         MOVC A,@A+DPTR
  101.         MOV 3BH,A          ;分的十位的段码
  102.         MOV A,33H
  103.         MOVC A,@A+DPTR
  104.         MOV 3CH,A          ;时的个位的段码
  105.         MOV A,34H
  106.         MOVC A,@A+DPTR
  107.         MOV 3DH,A          ;时的十位的段码
  108. LOOP1: MOV TL0,#0B0H      ;给T0重装初值
  109.         MOV TH0,#3CH
  110.         RETI

  111.   DEL1:  ;按键去抖延时程序(约10ms)
  112.         MOV R6,#20
  113. DEL11: MOV R5,#248
  114.         DJNZ R5,$
  115.         DJNZ R6,DEL11
  116.         RET

  117.   DEL2:  ;动态显示延时程序(约5ms)
  118.         MOV 2CH,#10
  119. DEL21: MOV 2BH,#248
  120.         DJNZ 2BH,$
  121.         DJNZ 2CH,DEL21
  122.         RET

  123.   KEY2:  ;调分程序
  124.         MOV R0,#0         ;秒清零,使校时更加精准
  125.         MOV R7,#20
  126.         INC 31H           ;分的个位增1
  127.         MOV R1,31H
  128.         CJNE R1,#10,TABLP2
  129.         MOV 31H,#00H
  130.         INC 32H
  131.         MOV R1,32H
  132.         CJNE R1,#6,TABLP2
  133.         MOV 32H,#00H
  134. TABLP2: MOV A,31H
  135.         MOVC A,@A+DPTR
  136.         MOV 3AH,A         ;时钟分的个位的段码
  137.         MOV A,32H
  138.         MOVC A,@A+DPTR
  139.         MOV 3BH,A         ;时钟分的十位的段码
  140.         RET



  141.   KEY1:  ;调时程序
  142.         INC 33H           ;时的个位增1
  143.         MOV R1,33H
  144.         MOV R2,34H
  145.         CJNE R2,#2,LOOP3
  146.         CJNE R1,#4,TABLP3
  147.         MOV 33H,#00H
  148.         MOV 34H,#00H
  149.         AJMP TABLP3
  150. LOOP3: CJNE R1,#10,TABLP3
  151.         MOV 33H,#00H
  152.         INC 34H
  153. TABLP3: MOV A,33H
  154.         MOVC A,@A+DPTR
  155.         MOV 3CH,A          ;时的个位的段码
  156.         MOV A,34H
  157.         MOVC A,@A+DPTR
  158.         MOV 3DH,A          ;时的十位的段码
  159.         RET

  160.   KEY3:   ;闹钟设置程序
  161. START2: JB P2.5,NEXT4   ;判断是否完成闹钟设置
  162.         LCALL DEL1
  163.         JB P2.5,NEXT4
  164.         JNB P2.5,$
  165.         LJMP EXIT1
  166. NEXT4: JB P2.7,NEXT5   ;按键1闹钟调时
  167.         LCALL DEL1
  168.         JB P2.7,NEXT5
  169.         JNB P2.7,$
  170.         LCALL AKEY1
  171. NEXT5: JB P2.6,DSPLY2  ;按键2闹钟调分
  172.         LCALL DEL1
  173.         JB P2.6,DSPLY2
  174.         JNB P2.6,$
  175.         LCALL AKEY2
  176. DSPLY2: MOV P2,#0FEH    ;1号管显示闹钟分的个位
  177.         MOV P0,4AH
  178.         CLR P0.7          ;点亮1号管后面的小数点,区分时钟和闹钟
  179.         LCALL DEL2
  180.         MOV P2,#0FDH    ;2号管显示闹钟分的十位
  181.         MOV P0,4BH
  182.         LCALL DEL2
  183.         MOV P2,#0FBH    ;3号管显示闹钟时的个位
  184.         MOV P0,4CH
  185.         CLR P0.7        ;点亮3号管后面的小数点,区别时和分
  186.         LCALL DEL2
  187.         MOV P2,#0F7H    ;4号管显示闹钟时的十位
  188.         MOV P0,4DH
  189.         LCALL DEL2
  190.         LJMP START2
  191. EXIT1: RET

  192. AKEY2:  ;闹钟调分程序
  193.         INC 41H
  194.         MOV R3,41H
  195.         CJNE R3,#10,TABLP4
  196.         MOV 41H,#00H
  197.         INC 42H
  198.         MOV R3,42H
  199.         CJNE R3,#6,TABLP4
  200.         MOV 42H,#00H
  201. TABLP4: MOV A,41H
  202.         MOVC A,@A+DPTR
  203.         MOV 4AH,A         ;闹钟分的个位的段码
  204.         MOV A,42H
  205.         MOVC A,@A+DPTR
  206.         MOV 4BH,A         ;闹钟分的十位的段码
  207.         RET


  208. AKEY1:  ;闹钟调时程序
  209.         INC 43H
  210.         MOV R3,43H
  211.         MOV R4,44H
  212.         CJNE R4,#2,LOOP4
  213.         CJNE R3,#4,TABLP5
  214.         MOV 43H,#00H
  215.         MOV 44H,#00H
  216.         AJMP TABLP5
  217. LOOP4: CJNE R3,#10,TABLP5
  218.         MOV 43H,#00H
  219.         INC 44H
  220. TABLP5: MOV A,43H
  221.         MOVC A,@A+DPTR
  222.         MOV 4CH,A         ;闹钟时的个位的段码
  223.         MOV A,44H
  224.         MOVC A,@A+DPTR
  225.         MOV 4DH,A         ;闹钟时的十位的段码
  226.         RET

  227. NAOZHONG:  ;闹钟响铃程序
  228.         MOV A,31H          ;当前时间与闹钟设定时间相同则响铃
  229.         CJNE A,41H,OFF
  230.         MOV A,32H
  231.         CJNE A,42H,OFF
  232.         MOV A,33H
  233.         CJNE A,43H,OFF
  234.         MOV A,34H
  235.         CJNE A,44H,OFF
  236.         CLR P1.0
  237.         AJMP ON
  238.    OFF: SETB P1.0
  239.     ON: RET
  240.   KEY4:  ;秒表程序
  241.         MOV 51H,#00H    ;秒的十分位
  242.         MOV 52H,#00H    ;秒的个位
  243.         MOV 53H,#00H    ;秒的十位
  244.         MOV 54H,#00H    ;分的个位
  245.         MOV 5AH,#0C0H   ;秒表初始化,显示器显示:0:00.0
  246.         MOV 5BH,#0C0H
  247.         MOV 5CH,#0C0H
  248.         MOV 5DH,#0C0H
  249.         MOV TL1,#0B0H   ;T1装初值,中断一次计时50ms
  250.         MOV TH1,#3CH
  251.         MOV R4,#2       ;中断两次,定时0.1s
  252.         SETB PT1        ;设T1为高优先级中断
  253.         CLR TR1
  254. START3: JB P2.4,NEXT6   ;判断是否退出秒表模式
  255.         LCALL DEL1
  256.         JB P2.4,NEXT6
  257.         JNB P2.4,$
  258.         LJMP EXIT2
  259. NEXT6: JB P2.7,NEXT7   ;秒表开始/暂停
  260.         LCALL DEL1
  261.         JB P2.7,NEXT7
  262.         JNB P2.7,$
  263.         CPL TR1
  264. NEXT7: JB P2.6,DSPLY3   ;秒表清零



  265. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



完整的论文下载(word格式可编辑):

11111.doc (684 KB, 下载次数: 50)

评分

参与人数 1黑币 +4 收起 理由
sysxzhdr + 4 很给力!

查看全部评分

回复

使用道具 举报

ID:26961 发表于 2017-4-12 19:26 | 显示全部楼层
汇编写的,以前的了.可以参考.
回复

使用道具 举报

ID:265574 发表于 2017-12-23 10:12 | 显示全部楼层
参考  看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表