数字电子打铃器数电课程设计.docx
《数字电子打铃器数电课程设计.docx》由会员分享,可在线阅读,更多相关《数字电子打铃器数电课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
数字电子打铃器数电课程设计
重庆科技大学
课程设计报告
(数字电子技术)
院(系):
_电气与信息学院___专业班级:
自动化
学生姓名:
陈东武学号:
设计地点(单位)_自动控制工程实验室________
设计题目:
_数字电子打铃器_____
完成日期:
2010年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.2T0中断服务程序框图
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程序设计(第三版)谭浩强著,清华大学出版社,2005年7月
2、电子CAD——基于Protel99SE(高等职业教育“十一五”精品课程规划教材)及力主编,北京邮电大学出版社,2008年
3、付家才电子工程实践技术,化学出版社,2003年9月
4、高吉祥电子技术基础实验与课程设计,电子工业出版社,2005年6月
5、康华光电子技术基础模拟部分(第五版),高等教育出版社,2007年12月
6、康华光电子技术基础数字部分(第五版),高等教育出版社,2007年12月
7、例说51单片机(C语言版)人民邮电出版社,2008年4月
八、附录
附件1整机电路图
附件2程序清单
#include"reg51.h"
#include
#defineTHCO0xee
#defineTLCO0x0
#defineFREQ11059200
unsignedcharcodeDuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x38};
//共阴极数码管,0-9段码表
unsignedcharData_Buffer[4]={0,0,0,0};
//四个数码管显示数值,数组变量定义
unsignedcharHour=0,Min=0,Sec=0;//实时时间
unsignedcharN_Hour=0,N_Min=0;//闹钟时间
bitN_flag=0;//1\0:
贪睡功能开启或关闭
bitBrush_flag=0;//更新数码管标志
sbitP10=P1^0;//四个数码管的位码口定义
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
sbitK_Mode=P2^0;//按键定义
sbitK_UP=P2^1;
sbitK_DN=P2^2;
sbitLED1=P2^3;//四个指示灯
sbitLED2=P2^4;
sbitLED3=P2^5;
sbitLED4=P2^6;
sbitPIN_MSC=P1^4;//音乐输出端口//
unsignedcharMode=0;
//MODE,0:
实时时钟;1:
修改小时;2:
修改分钟,3:
修改闹钟小时,4:
修改闹钟分钟,5:
启停闹钟;6:
整点报时
bitN_Ring=0;//启动闹铃标志,1:
启动
bitN_keyclose=0;//1:
贪睡功能开启时,有键按下,即关闭贪睡闹钟
unsignedcharZD_time=1;//整点报时
bitZD_N_flag=1;//整点报时功能开启否
unsignedcharcodemusic_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
};
unsignedcharcodemusic_l_tab[8]={0,1,2,3,4,6,8,16};//节拍延时单位
unsignedcharcodemusic_freq_tab[16]={
0xff,0xea,//0休止符
255-FREQ/24/1049/256,//1do高字节//255-FREQ/24/x/256
255-FREQ/24/1049%256,//1do低字节//256-FREQ/24/x%256
255-FREQ/24/1178/256,256-FREQ/24/1178%256,//2re
255-FREQ/24/1322/256,256-FREQ/24/1322%256,//3mi
255-FREQ/24/1400/256,256-FREQ/24/1400%256,//4fa
255-FREQ/24/1572/256,256-FREQ/24/1572%256,//5suo
255-FREQ/24/1665/256,256-FREQ/24/1665%256,//6la
255-FREQ/24/1869/256,256-FREQ/24/1869%256,//7xi
};
unsignedchartemp_TH1;
unsignedchartemp_TL1;
voidmusic_delay(unsignedcharn);//音乐节拍延时
voidmusic_play(unsignedchar*msc);//播放音乐子程序
voidmain()
{
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;}
elseif(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;
}
elseif(Mode==5)
{
Data_Buffer[0]=10;//L段码序号
Data_Buffer[1]=10;
Data_Buffer[2]=0;
Data_Buffer[3]=N_flag;
}
elseif(Mode==6)
{
Data_Buffer[0]=8;//B段码序号
Data_Buffer[1]=5;//S
Data_Buffer[2]=0;
Data_Buffer[3]=ZD_N_flag;
}
}
}
}
voidtimer0()interrupt1
{
staticunsignedcharBit=0;//静态变量,退出程序后,值保留
staticunsignedcharcount=0,K_count=0;
staticunsignedchartime_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;}
elseN_Ring=0;//贪睡功能关闭,则最多闹一分钟
if(N_keyclose&&N_flag)//贪睡功能开启,且未按键关闭
{
if(time_n==0)N_Ring=1;//第一次需开启闹钟
time_n++;
if(time_n>=5){time_n=0;}//后4分钟关闭闹钟
}
elsetime_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)//送位码
{
case0:
P10=0;break;
case1:
P11=0;break;
case2:
P12=0;break;
case3:
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;}//实时时间
elseif(Mode==1)LED1=0;//修改小时
elseif(Mode==2){LED1=1;LED2=0;}//修改分钟
elseif(Mode==3){LED2=1;LED3=0;}//修改分钟
elseif(Mode==4){LED3=1;LED4=0;}//修改分钟
}
elseif(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;}
elseif(Mode==2)//实时时间分钟加
{Min++;if(Min>=60)Min=0;}
elseif(Mode==3)//闹钟时间小时加
{N_Hour++;if(N_Hour>=24)N_Hour=0;}
elseif(Mode==4)//闹钟时间分钟加
{N_Min++;if(N_Min>=60)N_Min=0;}
elseif(Mode==5)N_flag=!
N_flag;
elseif(Mode==6)ZD_N_flag=!
ZD_N_flag;
}
elseif(K_DN==0)
{
if(Mode==1)//小时减
{
if(Hour==0)Hour=23;
elseHour--;
}
elseif(Mode==2)//分钟减
{
if(Min==0)Min=59;
elseMin--;
}
elseif(Mode==3)//小时减
{
if(N_Hour==0)N_Hour=23;
elseN_Hour--;
}
elseif(Mode==4)//分钟减
{
if(N_Min==0)N_Min=59;
elseN_Min--;
}
elseif(Mode==5)N_flag=!
N_flag;
elseif(Mode==6)ZD_N_flag=!
ZD_N_flag;
}
}
}
elseK_count=0;
}
//---------------------------------------------------------------------------//
voidmusic_int_t1(void)interrupt3using1//定时中断1//
{
PIN_MSC=~PIN_MSC;
TH1=temp_TH1;
TL1=temp_TL1;
}
//---------------------------------------------------------------------------//
voidmusic_delay(unsignedcharn)//延时ms毫秒
{
//延时125*n毫秒
unsignedchari=125,j;
do{
do{
for(j=0;j<230;j++)_nop_();
}while(--i);
}while(--n);
/*inti;
for(;ms>0;ms--)
{for(i=1;i<124;i++)
{;}
}
*/
}
//---------------------------------------------------------------------------//
voidmusic_play(unsignedchar*msc)//音乐
{
unsignedcharmusic_long;//节拍
unsignedcharmusic_data=0;//音符数据
temp_TH1=0xff;