理 论 课 授 课 教 案
第二篇:数字电子打铃器(数电课程设计)
重庆科技大学
课程设计报告
(数字电子技术)
院(系):_电气与信息学院 ___ 专业班级: 自动化
学生姓名: 陈东武 学 号:
设计地点(单位)_ 自动控制工程实验室 ______ _ _
设计题目:_ 数字电子打铃器 _ ___ _
完成日期: 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中断服务程序框图
4.2.3 闹铃打铃流程
五、设计、安装及调试中的体会
在调试过程中,数码管经常显示断码,有一位不能正常显示数字,经过查阅资料才了解到管显示原理:最常用的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。
其中引脚图的两个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; //关输出
}
附件三 元器件清单