基于AT89S51数字钟课程设计报告Word文档下载推荐.docx

上传人:b****6 文档编号:18796438 上传时间:2023-01-01 格式:DOCX 页数:19 大小:442.14KB
下载 相关 举报
基于AT89S51数字钟课程设计报告Word文档下载推荐.docx_第1页
第1页 / 共19页
基于AT89S51数字钟课程设计报告Word文档下载推荐.docx_第2页
第2页 / 共19页
基于AT89S51数字钟课程设计报告Word文档下载推荐.docx_第3页
第3页 / 共19页
基于AT89S51数字钟课程设计报告Word文档下载推荐.docx_第4页
第4页 / 共19页
基于AT89S51数字钟课程设计报告Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于AT89S51数字钟课程设计报告Word文档下载推荐.docx

《基于AT89S51数字钟课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于AT89S51数字钟课程设计报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。

基于AT89S51数字钟课程设计报告Word文档下载推荐.docx

(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-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 设计艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1