数字电子打铃器(数电课程设计)

时间:2024.4.21

重庆科技大学

课程设计报告

(数字电子技术)

   

院(系):_电气与信息学院 ___ 专业班级:    自动化      

学生姓名:       陈东武       学    号:                

设计地点(单位)_    自动控制工程实验室  ______ _   _

设计题目:_             数字电子打铃器     _ ___      _

        完成日期:  20##年 7 月 2 日

指导教师评语: _______________________________________

_________________________________________________________________________________________________________________________________________________________________________________________________________    __________ _        

成绩(五级记分制):______ __________

指导教师(签字):________  ________

一,课程设计的目的

本课程设计是在学完《数字电子技术基础》《数字电子技术实验》之后,集中一周时间,进行的复杂程度较高,综合性较强的设计课题的实践环节,通过该教学环节,要求达到以下目的:

1. 使学生进一步掌握数字电子技术的理论知识,培养学生工程设计能力和综合分析问 题,解决问题的能力;

2. 使学生基本掌握常用电子电路的一般设计方法,提高电子电路的设计和实验能力;

3. 熟悉并学会选用电子元器件,为以后从事生产和科研工作打下一定的基础。

4、利用51单片机做,可以比较超前的学习单片机原理及C语言编程。

二,课程设计任务及指标要求

2.1 设计任务

设计并制作一个用于学校的电子打铃器

电路设计指标要求和给定的条件:

2.1.1 电子表的功能:包括计时,对时,定时的功能

A. 计时: 计时显示格式中有 时/分/秒。

B. 对时: 可以通过按键,设定电子表的时间。

C. 定时: 可以通过按键,设定电子表的“响闹”时间,具有“闹”钟的功能。

2.1.1 打铃器的功能:包括打铃,打铃设置功能

2.2 设计要求

1) 设计时要综合考虑实用,经济并满足性能指标要求;

2) 必须独立完成设计课题;

3) 合理选用元器件;

4) 按时完成设计任务并提交设计报告。

三、设计框图、方案及思路

3.1、设计方案概述

3.1.1 本次课程设计采用的方案有:

方案一:

利用函数信号发生器来进行脉冲信号的输出、利用74LS160、74LS90或74160N来设置十进制、六进制和二十四进制的进位输出、利用数码显示器来显示时间、利用或门、与门、非门、与非门、等电路元件进行组合、级联后设计达到要求。

实现总原理图:

 方案二:

 利用STC89C51作为主控芯片,外接数码管电路和最小系统电路,功放驱动电路构成一个智能打铃器。

3.1.2 方案选择

 由于方案一利用组合逻辑电路和时序逻辑电路实现起来,需要的器件和步骤很多,比较繁琐,而且时间比较仓促,所以本次设计主要是以方案二来实现,即用单片机系统控制来实现。

本打铃器系统主要有51单片机最小系统、晶振电路、电源电路、闹铃信号放大电路构成。实现了计时、对时调整时钟,设定电子表的“响闹”时间,具有“闹”钟的功能,整点报时等功能。

利用单片机编写程序,实现定时打铃和整点报时,通过设定打铃时间,,如果相等就进行开关电铃,不等则返回。

3.2、总体设计方案

3.2.1总体设计框图

3.3、设计原理分析

3.3.1 校时模式

有时数字时钟会不准,这就需要校时来调节。

第一次按下 Mode键,第一个指示灯亮,进入校时设置模式,可以开始对数字时钟的小时部分校时调节,按下Up 键时增加,Down键是减;第二次按下 Mode键,第二个指示灯亮,进入分钟部分校时调节。秒钟部分通过小数点闪烁显示,闪一次就是一秒。

3.3.2定时模式

第三次按下Mode 键,第三个指示灯亮,进入定时打铃设置模式,可以开始对闹铃的时钟部分进行设置,按下Up 键时增加,Down键是减;第四次按下Mode 键,可以对闹钟分钟部分进行设置。本次课程设计的打铃器,铃声是用C语言编写的音乐小曲《两只老虎》,使得闹铃更动感,具有人性化和美感。

另外本打铃器还添加了整点报时功能,并且打铃的次数可以

3.3.3 工作模式

第五次按下Mode 键,指示灯都灯不亮,可以调节闹铃模式是否开和关,当按下Up 键,数码管显示为00时,为关闭闹铃状态,显示为01时,为闹铃开启状态;当时钟走到所定的闹铃时刻,闹铃就开始响,直到小曲播放完停止;第六次按下Mode 键,指示灯也都不亮,数码管上显示"85.00"或"85.01",可以设置是否整点报时:数码管上显示"85.00"表示整点报时功能关闭,01表示报时功能开启,按UP或DN键可在00或01间循环选择。

四、各单元电路的设计原理及调试

4.1、硬件部分

4.1.1 芯片部分

本部分用AT89C51单片机芯片,复位电路,晶振电路构成单片机最小系统,通过把编写好的程序烧录到C51芯片进行控制。

4.1.2 放大电路

由于通过控制后,从单片机端口输出的驱动信号微弱,为了更好的达到效果,就需把驱动信号放大。这里用LM386芯片构成功放电路。

4.1.3 数码管部分

通过数码管部分,可以显示当前时间,还可以显示闹铃、整点报时的设置状态。本次设计的初始化为时间为0时0分。通过调节可以对准当前时间。

4.1.4 电源部分

通过电源部分给单片机供电,AT89C51的稳态电压为5V。

4.1.5 按键部分

通过按键部分,可以对时钟进行设置:调整时钟进行对时,设置闹铃,关闭或启动闹铃,设置整点报时的开和关

4.16 总实物图

4.2 软件部分

4.2.1定时器T0的检测

 

4.2.2  T0中断服务程序框图

 

圆角矩形: 1次圆角矩形: 2次圆角矩形: 3次圆角矩形: 4次圆角矩形: 5次圆角矩形: 6次  

 

 

4.2.3 闹铃打铃流程

 

五、设计、安装及调试中的体会

在调试过程中,数码管经常显示断码,有一位不能正常显示数字,经过查阅资料才了解到管显示原理:最常用的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。
第3讲 数码管显示 - 998me - 998me 的博客
其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。
数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两个编码的各位正好相反。

共阳极组和共阴极组所送的编码是不同,刚开始我们做共阴极组,但送的是共阳极组编码,才至此调试现象。后来输送共阴极组编码,调试成功。

其他方面的调试都没什么大问题。本次课程设计还算顺利。

六、本次课程设计的心得体会

为期一周的数字电子技术课程设计结束了,我收获了很多。

本次课程设计虽然我没有用组合逻辑电路和时序逻辑电路来实现,但我利用这次课程设计的机会,自学了单片机,利用单片机,C语言编程来控制,实现了和用纯硬件完成的功能相同的电子打铃器,而且用软件代替了很多复杂的硬件电路。这点让我感到很高兴,节约了硬件的花费成本。在以后的工程实践中这点也是值得考虑的一部分。

由于时间的仓促,也就没时间在做一个纯硬件的打铃器。但在此过程中我和其他组员也查了资料,探讨这个设计方案,并借此课程设计机会学习了一下硬件电路设计方面的知识。

当然,在此过程中我也曾遇到过硬件,软件方面的问题,但通过图书馆看书、网上查阅资料,得到了解决办法。在本次数字电子技术课程中,老师和同学们也给了很大帮助。在此我对老师和同学们表示衷心的感谢。

七、参考文献

1、C程序设计(第三版)谭浩强著,清华大学出版社,20##年7月

2、电子CAD——基于Protel 99 SE(高等职业教育“十一五”精品课程规划教材) 及力主编,北京邮电大学出版社,20##年

3、付家才 电子工程实践技术,化学出版社,20##年9月

4、高吉祥 电子技术基础实验与课程设计,电子工业出版社,20##年6月

5、康华光 电子技术基础 模拟部分(第五版),高等教育出版社,20##年12月

6、康华光 电子技术基础 数字部分(第五版),高等教育出版社,20##年12月

7、例说51单片机(C语言版) 人民邮电出版社,20##年4月

八、附录

附件1   整机电路图

附件2   程序清单

#include "reg51.h"

#include <intrins.h>

#define THCO   0xee

#define TLCO   0x0

#define  FREQ 11059200

unsigned char  code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x38};

//共阴极数码管,0-9段码表

unsigned char  Data_Buffer[4]={0,0,0,0};

//四个数码管显示数值,数组变量定义

unsigned char Hour=0,Min=0,Sec=0;//实时时间

unsigned char N_Hour=0,N_Min=0;//闹钟时间

bit N_flag=0;//1\0:贪睡功能开启或关闭

bit Brush_flag=0;//更新数码管标志

sbit P10=P1^0;             //四个数码管的位码口定义

sbit P11=P1^1;

sbit P12=P1^2;

sbit P13=P1^3;

sbit K_Mode=P2^0; //按键定义

sbit K_UP=P2^1;

sbit K_DN=P2^2;

sbit LED1=P2^3; //四个指示灯

sbit LED2=P2^4;

sbit LED3=P2^5;

sbit LED4=P2^6;

sbit PIN_MSC=P1^4;                   //  音乐输出端口  //

unsigned char Mode=0;

 //MODE, 0:实时时钟;1:修改小时;2:修改分钟,3:修改闹钟小时,4:修改闹钟分钟,5:启停闹钟; 6:整点报时

bit N_Ring=0;//启动闹铃标志,1:启动

bit N_keyclose=0;//1:贪睡功能开启时,有键按下,即关闭贪睡闹钟

unsigned char ZD_time=1;//整点报时

bit ZD_N_flag=1;//整点报时功能开启否

unsigned char code music_table[]={    //两只老虎,高4位为音乐节拍,低4位为音符

                     0x31,0x32,0x33,0x31,0x31,0x32,0x33,0x31,0x33,0x34,0x45,0x33,0x34,0x45,

                     0x25,0x16,0x25,0x14,0x33,0x31,0x25,0x16,0x25,0x14,0x33,0x31,

                     0x31,0x35,0x41,0x31,0x35,0x41,

                     0

            };

unsigned char code music_l_tab[8]={0,1,2,3,4,6,8,16};//节拍延时单位     

unsigned char code music_freq_tab[16]={          

                0xff,0xea,                                      //0 休止符

                255-FREQ/24/1049/256,        //1 do 高字节 //255-FREQ/24/x/256

                255-FREQ/24/1049%256,        //1 do 低字节 //256-FREQ/24/x%256

                255-FREQ/24/1178/256,256-FREQ/24/1178%256,        //2 re

                255-FREQ/24/1322/256,256-FREQ/24/1322%256,        //3 mi

                255-FREQ/24/1400/256,256-FREQ/24/1400%256,        //4 fa

                255-FREQ/24/1572/256,256-FREQ/24/1572%256,        //5 suo

                255-FREQ/24/1665/256,256-FREQ/24/1665%256,        //6 la

                255-FREQ/24/1869/256,256-FREQ/24/1869%256,        //7 xi              

            };

unsigned char temp_TH1;

unsigned char temp_TL1;

           

           

void music_delay(unsigned char n);   //音乐节拍延时

void music_play(unsigned char *msc); //播放音乐子程序

void main()

{    

   TMOD=0x11;          //定时器0初始化

      TH0=THCO;

      TL0=TLCO;

      TR0=1;

      ET0=1;

      EA=1;

       TR1=0;

       ET1=1;

      while(1) 

       {    

     if(N_Ring==1)//闹铃启动

              {                  

                      music_delay(10);

                      music_play(music_table); //播放音乐一次              

               }   

       else

           {

               if(ZD_N_flag==1&&ZD_time!=0)//整点报时功能开启,且报时次数不为0

               {             

            while(ZD_time>0)  //整点响ZD_time次

                     {

                       PIN_MSC=0;

                       music_delay(4);

                       PIN_MSC=1;

                       music_delay(4);        

                       ZD_time--;

                     }

               }

           }    

        if(Brush_flag==1)//更新数码管显示

        {

             Brush_flag=0;

              if(Mode<=2)            //实时时间

              { Data_Buffer[0]=Hour/10;

                Data_Buffer[1]=Hour%10;             

                Data_Buffer[2]=Min/10;          

                Data_Buffer[3]=Min%10;}

              else if(Mode<=4)  //闹钟时间

              {

                Data_Buffer[0]=N_Hour/10;

                Data_Buffer[1]=N_Hour%10;         

                Data_Buffer[2]=N_Min/10;            

                Data_Buffer[3]=N_Min%10;

              }

              else if(Mode==5)

              {

                Data_Buffer[0]=10;//L段码序号

                Data_Buffer[1]=10;         

                Data_Buffer[2]=0;           

                Data_Buffer[3]=N_flag;

              }

              else if(Mode==6)

              {

                Data_Buffer[0]=8;//B段码序号

                Data_Buffer[1]=5;//S       

                Data_Buffer[2]=0;           

                Data_Buffer[3]=ZD_N_flag;

              }

        }

       }

}

void timer0() interrupt 1

{

 static unsigned char Bit=0;   //静态变量,退出程序后,值保留

 static unsigned char count=0,K_count=0;

 static unsigned char time_n=0;

 TH0=THCO;

 TL0=TLCO;

 count++;

 if(count>=200)     //秒计时,定时器定时5ms,计200次为一秒

 {

   count=0;

   Sec++;

   if(Sec>=60)

   {

            Sec=0;    

               Min++;  Brush_flag=1;             //更新数码管显示

               if(Min>=60) //时间计时

                      {

                          Min=0; Hour++;

                           if(Hour>=24)Hour=0;     

                            ZD_time=Hour; //整点响

                   }

               

              if(N_Hour==Hour&&N_Min==Min)//闹钟相等

                    {N_Ring=1;N_keyclose=1;}

              else N_Ring=0;//贪睡功能关闭,则最多闹一分钟

      

              if(N_keyclose&&N_flag)//贪睡功能开启,且未按键关闭

              {          

            if(time_n==0)N_Ring=1; //第一次需开启闹钟

                     time_n++;

                     if(time_n>=5){time_n=0;}//后4分钟关闭闹钟       

              }

              else time_n=0;

              if(Min==30)

              {

                ZD_time=1; //半点响一声

              }

   }

 }

 Bit++;  

 if(Bit>=4)Bit=0;

 P1|=0x0f;                                 //先关位码

 P0=Duan[Data_Buffer[Bit]];      //开段码

 if(count<100&&Bit==1)P0|=0x80;//0.5S中间小数点亮,之后灭,不断循环

 switch(Bit)                         //送位码

 {

  case 0: P10=0;break;

  case 1: P11=0;break;

  case 2: P12=0;break;

  case 3: P13=0;break;

 }

 if(K_Mode==0||K_UP==0||K_DN==0)      //有键按下, 低电平按下

 {

      K_count++;

      if(K_count>=30)    //消除抖动处理

      {

          if(N_flag==0&&N_Ring==1)//贪睡功能关闭,且闹铃启动

        {N_Ring=0;return;}

           K_count=0;

              Brush_flag=1;

              if(K_Mode==0)     //修改Mode,

                  {

                      Mode++;

                      if(Mode>=7)Mode=0;

                      if(Mode==0){LED1=1;LED2=1;LED3=1;LED4=1;}//实时时间

                      else if(Mode==1)LED1=0;   //修改小时

                      else if(Mode==2){LED1=1;LED2=0;}//修改分钟                  

                      else if(Mode==3){LED2=1;LED3=0;}//修改分钟                  

                      else if(Mode==4){LED3=1;LED4=0;}//修改分钟    

                     }

               else if(K_UP==0)

                    {

                      if(N_Ring==1&&N_flag==1)

                           {N_Ring=0;N_keyclose=0;return;}//关闭闹铃

                      

                     if(Mode==1)   //实时时间小时加

                      { Hour++; if(Hour>=24)Hour=0; }

                      else if(Mode==2)//实时时间分钟加

                      { Min++; if(Min>=60)Min=0;  }

                      else if(Mode==3)//闹钟时间小时加                

                      { N_Hour++; if(N_Hour>=24)N_Hour=0; }                  

                      else if(Mode==4)//闹钟时间分钟加                

                      { N_Min++; if(N_Min>=60)N_Min=0;  }      

                      else if(Mode==5)  N_flag=!N_flag;                 

                      else if(Mode==6)  ZD_N_flag=!ZD_N_flag;

                    }

               else if(K_DN==0)

                    {

                      if(Mode==1) //小时减

                       {

                        if(Hour==0)Hour=23;

                        else Hour--;

                       }

                      else if(Mode==2) //分钟减

                       {

                        if(Min==0)Min=59;

                       else Min--;

                       }

                      else if(Mode==3) //小时减

                       {

                        if(N_Hour==0)N_Hour=23;

                        else N_Hour--;

                       }

                      else if(Mode==4) //分钟减

                       {

                        if(N_Min==0)N_Min=59;

                       else N_Min--;

                       }

                      else if(Mode==5)  N_flag=!N_flag;   

                      else if(Mode==6)   ZD_N_flag=!ZD_N_flag;

                     }

        }

 }

 else K_count=0;

}

 //---------------------------------------------------------------------------//

void music_int_t1 (void) interrupt 3 using 1    //定时中断1//

{

      PIN_MSC=~PIN_MSC;

      TH1=temp_TH1;

      TL1=temp_TL1;

}

            //---------------------------------------------------------------------------//

            void music_delay(unsigned char n)     //延时 ms 毫秒

            {

                                         //延时 125*n 毫秒

                unsigned char i=125,j;

                do {

                    do {

                        for (j=0; j<230; j++) _nop_();

                    }while(--i);

                }while(--n);

                           

                            /*  int i;

                              for(;ms>0;ms--)

                              {for(i=1;i<124;i++)

                                  {;}

                              }

                             */

            }

            //---------------------------------------------------------------------------//

            void music_play(unsigned char *msc)   //音乐

                {

                unsigned char music_long;         //节拍

                unsigned char music_data=0;       //音符数据

                temp_TH1=0xff;

                temp_TL1=0xea;                    //关输出(输出超声波)  

                TH1=temp_TH1;

                TL1=temp_TL1;

                            TR1=1;                            //开T1定时器中断

                           

            //---------------------------------------------------------

                while (*msc != 0x00&&N_Ring==1)//闹铃一直启动

                    {

                    music_data=*msc & 0x07;

                    music_long=*msc>>4;

                    //---------------------------------------------------------

                    if (music_long != 0)          //是音符

                        {

                         temp_TH1=music_freq_tab[music_data*2];                                    

                         temp_TL1=music_freq_tab[music_data*2+1];

                                          music_delay(music_l_tab[music_long&0x07]);

                         }         

                    msc++;

                }

                TR1=0;                           //播放结束

                PIN_MSC=1;                       //关输出

            }

附件三   元器件清单

更多相关推荐:
数字电子技术课程设计报告

吉林建筑大学电气与电子信息工程学院数字电子技术课程设计报告设计题目:数字钟的电路设计专业班级:电气112班学生姓名:学号:指导教师:设计时间:20XX.06.17-20XX.06.28数字钟的电路设计报告一、设…

数电课程设计报告

数电课程设计说明题目数字电子钟的设计部班级名号书系专业姓学指导教师起止日期摘要这次课程设计采用的课题是数字电子钟的设计数字钟是一种用数字电路技术实现时分秒计时的装置与机械式始终相比具有更高的准确性和直观性且无机...

数字电子钟课程设计报告

数字电子钟课程设计报告姓名学号学院电子与信息工程学院班级自动化目录一引言3二方案论证选择421设计目的422设计要求423系统框图4三电路仿真与设计531所需芯片及芯片管脚图532时分秒显示电路模块设计833校...

数字电子技术课程设计报告

南京航空航天大学数字电路课程设计之数字钟作品名称数字钟所属学院管理单位作者联系电话电子邮件指导教师时间数字电子技术课程设计报告一设计目的数字钟是一种用数字电路技术实现时分秒计时的装置与机械式时钟相比具有更高的准...

数字电子技术课程设计报告

课程设计课程名称数字电子技术课程设计题目名称四人智力竞赛抢答器学生学院专业班级学号学生姓名指导教师200年月日1目录一设计题目3二设计任务和要求31设计任务32设计要求3三原理电路31以锁存器为中心的编码显示电...

数字电子课程设计报告

数字电子课程设计报告多功能电子钟一设计题目多功能数字电子钟的设计二设计要求1有时分秒23小时59分59秒显示且有校时功能设计秒脉冲发生器2有整点报时功能选上下午日期闹钟等3用中规模小规模集成电路及模拟器件实现4...

数字电子钟课程设计报告-数电

华东交通大学理工学院课程设计报告书所属课程名称数字电子技术课程设计题目数字电子钟课程设计分院电信分院专业班级10电信2班学号20xx0210410201学生姓名陈晓娟指导教师徐涢基2012年12月18日目录第1...

数字电子技术基础课程设计报告

扬州大学能源与动力工程学院本科生课程设计题目课程专业班级学号姓名指导教师完成日期智力竞赛抢答器数字电子技术基础1总目录第一部分任务书第二部分课程设计报告第三部分设计图纸2第一部分任务书3数字电子技术基础课程设计...

数电电子钟课程设计报告

数字电子钟课程设计报告课程名称数字电路技术基础设计题目数字电子钟逻辑电路设计专业电子科学与技术班级20xx级电子3班姓名同组者指导老师20xx年1月4日目录一内容摘要4二课设内容及要求4三方案比较5123方案一...

数字电子技术基础课程设计报告电子秒表

三亚学院20xx20xx学年第2学期数字电子技术基础课程设计报告学院专业班级学号学生姓名指导教师20xx年9月3日理工学院电子信息工程10011010720xx2王连胜电子秒表一设计任务与要求设计一个电子秒表电...

数字电路课程设计报告

摘要数字电路八路花样灯控制电路是利用数字逻辑电子元件连接而成具有8个受控制的输出端通过输出8个有规律的信号以达到控制8个LED灯的目的选择不同的芯片和不同的连接方式都会产生不同的控制信号并产生不同的花样灯本次课...

数字电子技术课程设计报告(数字钟)

目录一设计目的1二实现功能1三制作过程1四原理框图341数字钟构成342设计脉冲源443设计整形电路544设计分频器545实际计数器646译码驱动器电路的设计747校时电路848整点报时电路949绘制总体电路图...

数字电子课程设计报告(24篇)