基于AT89S51数字钟课程设计报告Word文档下载推荐.docx
《基于AT89S51数字钟课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于AT89S51数字钟课程设计报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
(1)、设计思想:
利用单片机来设计数字钟是单片机初学者的入门设计,而51系列单片机易学、易懂,应用广泛。
分析题可知:
当LED的显示位数较多时,I/O口较少时,为了简化电路,降低成本,由I/O口控制共阴极点或共阳极数码管显示。
如果各位同时导通,LED只能显示相同的字符。
要想每位显示不同的字符并且使用最少的I/O口,必须采用扫描显示方式动态显示。
(2)、扫描原理:
在某一瞬间,只让某一位的字位线处于选通状态,即共阴极的为低电平,共阳极为高电平,同时字段线上输出相应位要显示字符的字段码。
而其他各位的字位线处于悬空状态,不显示,这样,在每一瞬时,每位LED只有选通的那一位LED显示出字符,而其他位是熄灭的,同样在下一瞬时,只显示下一位LED,如此循环每位LED。
虽然这些字符是在不同的瞬时轮流显示出来的,但由于人眼的视觉残留效应,看到的是每位同时显示字符。
(3)、驱动电路:
LED显示器所需的工作电流较大。
在静态显示方式下,一般每段需要几mA。
在动态显示方式下,为了要达到足够的亮度,瞬时电流约为静态方式的N倍(N是显示器位数)。
共阴极点或共阳极点处的电流因要考虑8段同时导通,其数值就更大,因此在LED接口电路中常接有驱动器。
常用的驱动器有7406(六反相缓冲/驱动器,OC门)、7407(六缓冲/驱动器,OC门)、75452(双与非驱动器)等。
也可以用分立元件三极管作为驱动器。
在一些场合为了更进一步节约I/O口的开支,采用硬件译码的形式,即,将待显示的数据不在CPU内部查表,而是直接用4条I/O口线输出BCD码,用BCD→7段字段码的硬件如MC14495、74LS47、74LS48等器件来译码,然后输出。
(4)、设计结构框图
(5)、电路仿真图
(6)、电路原理图
(7)、PCB制作图
(8)、3D效果图
五、数字钟的《使用手册》如下:
数字钟工作初始时刻为:
12:
00:
00
图中有三个开关
按键1:
控制“秒、分、十”之间的切换、每按键一次在“秒、分、十“间切换一次(且时间停止不及时),当按键1按了4次以后重新进入计时状态。
按键2:
数字钟的“加1”位,每按一次加1。
。
按键3:
字钟的“减1“位,,每按一次减1。
六、元器件清单
ObjectKindObjectHandlePathDescriptionDesignatorFootPrintPartType
Part0D12051C:
0D13A514Sheet1.Sch*U1LED4_4X2LED4_LWQ
0D13B0C8Sheet1.Sch*U2LED4_4X2LED4_LWQPart0D12051C:
0D13BCECSheet1.Sch*R1axial0.3510R
0D13C8F0Sheet1.Sch*R2axial0.3510R
0D13D50CSheet1.Sch*R3axial0.3510R
0D13E128Sheet1.Sch*R4axial0.3510R
0D13ED44Sheet1.Sch*R5axial0.3510R
0D13F960Sheet1.Sch*R6axial0.3510R
0D14057CSheet1.Sch*R7axial0.3510R
0D141198Sheet1.Sch*R8axial0.3510R
0D141DB4Sheet1.Sch*R11axial0.3510R
0D1429D0Sheet1.Sch*R12axial0.3510R
0D1435ECSheet1.Sch*R14axial0.3510R
0D144208Sheet1.Sch*R15axial0.3510R
0D144E24Sheet1.Sch*R16axial0.3510R
0D145A40Sheet1.Sch*R17axial0.3510R
0D14665CSheet1.Sch*R18axial0.3510R
0D147278Sheet1.Sch*R19axial0.3510R
0D147E94Sheet1.SchPNPTransistorQ2TO-92A8550
0D148AA0Sheet1.SchPNPTransistorQ3TO-92A8550
0D1496B8Sheet1.SchPNPTransistorQ4TO-92A8550
0D14A2D0Sheet1.SchPNPTransistorQ5TO-92A8550
0D14AEE8Sheet1.SchPNPTransistorQ6TO-92A8550
0D14BB00Sheet1.SchPNPTransistorQ7TO-92A8550
0D14C718Sheet1.SchPNPTransistorQ8TO-92A8550
0D14D330Sheet1.SchPNPTransistorQ9TO-92A8550
0D14DF48Sheet1.Sch*Q1DIP4089S51
0D14EB60Sheet1.Sch*C1RAD0.1CAP
0D14F778Sheet1.Sch*C2RAD0.1CAP
0D150390Sheet1.SchCrystalY1XTAL1CRYSTAL
0D150FA8Sheet1.Sch*R9SIP9RES*8
0D151BC0Sheet1.Sch*S1SW_1XSW-PB
0D1527D8Sheet1.Sch*S2SW_1XSW-PB
0D1533F0Sheet1.Sch*S3SW_1XSW-PB
0D15400CSheet1.Sch*S4SW_1XSW-PB
0D154C24Sheet1.Sch*S5SW_1XSW-PB
0D15583CSheet1.SchBi-PolarCapacitorE2RB.2/.4CAP2
0D156454Sheet1.Sch*R21AXIAL0.3200R
0D15707CSheet1.Sch*R22AXIAL0.310K
0D157C98Sheet1.Sch*R23AXIAL0.31K
0D1588B4Sheet1.SchPNPTransistorQ10TO-92A8550
0D1594C0Sheet1.Sch*LS1AXIAL0.4SPEAKER
0D15A0E8Sheet1.Sch*U4SIP4USB
0D15ACF4Sheet1.Sch*D2LEDLED
0D15B90CSheet1.SchConnectorH1SIP2VCC_IN
0D15C524Sheet1.SchCapacitorC3RAD0.1CAP
0D15D13CSheet1.SchCapacitorC4RAD0.1CAP
0D15DD54Sheet1.Sch*U3TO-126LM7805
0D15F3B4Sheet1.SchBi-PolarCapacitorE1RB.2/.4CAP2
0D15FFCCSheet1.SchBi-PolarCapacitorE3RB.2/.4CAP2
0D1615A8Sheet1.Sch*D1DQ1BRIDGE2
0D162A30Sheet1.Sch*R13axial0.310k
0D163658Sheet1.Sch*D3LEDLED
0D164264Sheet1.Sch*J1DIP10*
0D170D40Sheet1.Sch*R20AXIAL0.310K
0D178E64Sheet1.Sch*R10SIP3SIP3
七、设计流程图
八、源程序
#include<
regx52.h>
#definekey1P1_0//秒、分、时间的切换键
#definekey2P1_1//加1
#definekey3P1_2//减1
#definespeakerP3_1
unsignedcharcodetable1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//笔段码
unsignedcharcodetable2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//位选码
unsignedcharcount1=0;
/****************************************************/
unsignedcharhour=12,min=0,sec=0;
//时钟赋初值
/******************T0__50mS中断程序*******************/
voidT0_1s(void)interrupt1//50mS中断程序
{
staticunsignedcharcount=0;
TR0=0;
TH0=(65536-50000)/256;
//设置T0初始值为:
15536
TL0=(65536-50000)%256;
//记数为50000次//50000*1us=50ms*20=1s
TR0=1;
count++;
if(count==20)//中断服务程序
{//定时1s时间到(需要中断20次)
count=0;
sec++;
if(sec==60)//1分钟时间到
{
sec=0;
min++;
if(min==60)//1小时时间到
min=0;
hour++;
if(hour==24)//24小时时间到
sec=0;
min=0;
hour=0;
}
}
}
/**************************************************************/
voiddelay_5ms()//动态扫描显示--软件延时
unsignedchari,j;
for(i=0;
i<
20;
i++)
for(j=0;
j<
50;
j++)//50
;
}
/*****************************************************************/
voiddisp_led()
/****************显示时钟******************************/
P0=table1[hour/10];
//显示小时十位数
P2=table2[0];
delay_5ms();
P0=0xff;
P0=table1[hour%10];
//显示小时个位数
P2=table2[1];
P0=0xbf;
//显示分隔符‘-’
P2=table2[2];
P0=table1[min/10];
//显示分钟十位数
P2=table2[3];
P0=table1[min%10];
//显示分钟个位数
P2=table2[4];
P2=table2[5];
P0=table1[sec/10];
//显示秒十位数
P2=table2[6];
P0=table1[sec%10];
//显示秒个位数
P2=table2[7];
/*******************闹钟程序****************************/
voidclock()
{unsignedinti;
if(hour==12&
&
min==0&
sec==30)
{speaker=0;
for(i=0;
500;
i++)//15秒蜂鸣器
{
disp_led();
}
speaker=1;
}
/*********************蜂鸣器按键声*****************************/
voidspeak()
{unsignedcharm;
speaker=0;
for(m=0;
m<
3;
m++)
{
disp_led();
speaker=1;
/********************按键扫描程序***************************/
voiddelay_10ms()//键盘去抖动--软件延时
40;
j++)
/*******************调时钟按键扫描*******************************/
voidkey_scan()//键盘扫描子程序
if(key1==0)//检测是否有键按下
{
delay_10ms();
//去抖动延时
if(key1==0)//再次确认否有键按下
{{speak();
count1++;
//切换次数
TR0=0;
//关计时
ET0=0;
}
if(count1==4)
{count1=0;
//到4次后重新记
TR0=1;
//开计时
ET0=1;
}
while(key1==0)disp_led();
//等待按键释放,并且调用显示程序
}
if(count1==1)
{if(key2==0)//调整秒钟加//检测是否有键按下
{
delay_10ms();
//去抖动延时
if(key2==0)//再次确认否有键按下
{speak();
//按键声
sec++;
if(sec==60)sec=0;
while(key2==0)disp_led();
if(key3==0)//调整秒钟减//检测是否有键按下
{
if(key3==0)//再次确认否有键按下
sec--;
if(sec==-1)sec=59;
}
while(key3==0)disp_led();
//等待按键释放,并且调用显示程序
if(count1==2)
{
if(key2==0)//调整分钟加//检测是否有键按下
min++;
if(min==60)min=0;
if(key3==0)//调整分钟减//检测是否有键按下
if(key3==0)//再次确认否有键按下
min--;
if(min==-1)min=59;
if(count1==3)
{if(key2==0)//调整小时加//检测是否有键按下
hour++;
if(hour==24)
{hour=0;
min=0;
sec=0;
}
if(key3==0)//调整小时减//检测是否有键按下
hour--;
if(hour==-1)hour=23;
/*********************主函数***********************/
voidmain()
TMOD=0x01;
//设置T0初始值
TL0=(65536-