基于51单片机的数字钟的设计与开发_第1页
基于51单片机的数字钟的设计与开发_第2页
基于51单片机的数字钟的设计与开发_第3页
基于51单片机的数字钟的设计与开发_第4页
基于51单片机的数字钟的设计与开发_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们的爱情,我们的理想,我们的未来,我们的成长,我们的幸福我们的爱情,我们的理想,我们的未来,我们的成长,我们的幸福数字钟项目硬件总体设计说明书编制单位:侏罗纪工作室作者发布日期:2011-1-22审核人:批准人:目录1. 引言 11.1. 编写目的: 11.2. 背景 11.3. 定义 21.4. 参考资料 22. 总体设计 32.1开发与运行环境 32.2硬件功能描述 32.3硬件结构 33. 硬件模块设计 43.1. 描述 43.1.1. AT89C51单片机简介 43.1.2. 键盘电路的设计 53.1.3. 段码驱动电路 53.1.4. 显示器的选择 73.1.5. 蜂鸣器驱动电路 83.2. 功能 84. 嵌入式软件设计 94.1. 流程逻辑 94.2. 算法 94.2.1. 中断定时器的设置 264.2.2. 闹钟子函数 274.2.1. 计时函数 284.2.2. 键盘扫描函数 294.2.3. 时间和闹钟的设置 305.经验总结 316.附录 364引言编写目的:20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成的。而钟表的数字化给人们生产生活带来了极大的方便。数字钟是通过数字电路实现时,分,秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烤箱、通断动力设备、甚至各种定时电气的自动启用等。所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。背景单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。在硬件方面,除了CPU外,使用八个七段LED数码管来进行显示,LED采用的是动态扫描显示,使用74LS245芯片进行驱动。通过LED能够较为准确地显示时、分、秒。四个简单的按键实现对时间的调整。软件方面采用C语言编程。整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟的功能。选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。介绍并使用Keil单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真,并且利用Protel软件来绘制PCB板。本设计应解决的主要问题有两大方面,即硬件电路设计和软件设计两大方面。其中硬件电路部分又可分为四个模块:键盘模块、显示模块、计时模块和发声模块。硬件电路部分致力于低成本、低功耗和易实现性。软件部分则应做到代码的精简、准确、易读懂。最后通过硬软件的结合实现数字钟的精确计时、校时、三组闹钟设置和定时报警功能。定义单片机:单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。定时器:51单片机内有两个16位的可编程的定时器/计数器,即定时器T0和定时器T1。中断:51单片机内有5个中断源,这里运用的是定时器中断。CPU一旦设置开启定时功能后,定时器便在晶振的作用下开始自动计时,当定时器的计数器计满后,会产生中断。闹钟:预置一个定时时间,当走时到定时的时间后,闹铃响铃。LED:8位共阴极数码管。参考资料《单片机原理及接口技术》第三版北京航空航天大学出版社李朝青《新概念51单片机C语言教程》电子工业出版社郭天翔总体设计2.1开发与运行环境在硬件方面,除了CPU外,使用八个七段LED数码管来进行显示,LED采用的是动态扫描显示,使用74LS245芯片进行驱动。通过LED能够较为准确地显示时、分、秒。四个简单的按键实现对时间的调整。软件方面采用C语言编程。使用Keil单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真,并且利用Protel软件来绘制PCB板。2.2硬件功能描述硬件部分设置了的三个按键S1、S2、S3、S4。当按键S1第一次按下时,停止计时进入闹钟1的秒设置,当按键S1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当按S1第四、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按S1第七、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按S1第十、第二一、第十二次按下时分别进入时间的秒、分、时设置,在S1按下的各阶段,可用按键S2、S3进行时间和闹铃时间的时、分、秒进行加减设置;当按键S1第十三次按下时恢复到时间显示功能。当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为60秒。在各个闹钟设置阶段,如果有S4按下,则相应闹钟功能关闭或开启;如在闹铃时有S4按下则提前停止闹铃。另外,闹铃电路有音乐闹钟的扩展的功能(可以将蜂鸣器换成扬声器再加一段音乐程序或利用音乐芯片即可实现)。因时间有限,扩展功能还未能及时实现,比如音乐闹铃。2.3硬件结构硬件模块设计描述AT89C51单片机简介AT89C51是一款单片封装的微控制器,适合于许多要求高集成度、低成本的场合。可以满足多方面的性能要求。AT89C51采用了高性能的处理器结构,指令执行时间只需2到4个时钟周期。6倍于标准51单片机器件。AT89C51集成了许多系统级的功能,这样可大大减少元件的数目和电路板面积并降低系统的成本。AT89C51单片机内部主要有以下部件:8031CPU、振荡电路、总线控制部件、中断控制部件、片内Flash存储器、并行I/O接口、定时器和串行I/O接口。键盘电路的设计方案一:4×4矩阵式键盘。如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷,但程序较为复杂。

方案二:独立式按键。如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,因此,此方案适用于按键较少的情况。如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。

由于并不需要经常修改时间和设置闹铃时间,而且方案二的程序简单,按键少、成本低,因此,选择方案二。图3-1独立按键图3-2键盘输入电路段码驱动电路由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74LS245来驱动段码,用P2口作位码驱动。图3-3段码驱动器74LS245\o"查看图片"

74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。*74LS245还具有双向三态功能,既可以输出,也可以输入数据。*当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。*当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;(接收)*DIR=“1”,信号由A向B传输;(发送)当/CE为高电平时,A、B均为高阻态。由于P2口始终输出地址的高8位,接口时74LS245的三态控制端/1G和/2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,/E端接地,保证数据现畅通。8051的/RD和/PSEN相与后接DIR,使得/RD且/PSEN有效时,74LS245输入(P0.i←Di),其它时间处于输出(P0.i→Di)。显示器的选择方案一:液晶显示器。如果选择此方案,将会降低系统的功耗,这样就可以用电池供电,便于携带。但液晶显示器的驱动电路复杂,使用起来有一定的难度。

方案二:用数码管作为显示器。数码管的驱动电路简单,使用方便,如果选择了此方案,那么在夜间看时间的时候就不需要有光源,非常方便。其缺点是功耗较大。由于数码管使用起来较为方便,在夜间看时间也很方便,因此我选择了方案二。蜂鸣器驱动电路发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。图3-4蜂鸣器驱动电路功能键盘模块在此次设计时用了四个按键,分别为S1,S2,S3,S4.当按键S1第一次按下时,停止计时进入闹钟1的秒设置,当按键S1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当按S1第四、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按S1第七、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按S1第十、第二一、第十二次按下时分别进入时间的秒、分、时设置,在S1按下的各阶段,可用按键S2、S3进行时间和闹铃时间的时、分、秒进行加减设置;当按键S1第十三次按下时恢复到时间显示功能。当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为60秒。在各个闹钟设置阶段,如果有S4按下,则相应闹钟功能关闭或开启;如在闹铃时有S4按下则提前停止闹铃。段码驱动电路74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。*74LS245还具有双向三态功能,既可以输出,也可以输入数据。*当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。*当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;(接收)*DIR=“1”,信号由A向B传输;(发送)当/CE为高电平时,A、B均为高阻态。在设计硬件电路时,74LS245的DIR=“1”,信号由A向B传输。由P0口送信号至74LS245,再由其驱动数码管的段选,实现数字的显示。蜂鸣器电路发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。嵌入式软件设计流程逻辑图4-1主程序流程图算法//****************************头文件********************************#include<reg51.h>#include<intrins.h>//****************************宏定义********************************#defineucharunsignedchar#defineuintunsignedint//****************************位声明********************************sbitkey1=P1^0;sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;sbitfmq=P3^0; //************************数码管显示的数值**************************ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //****************************函数声明******************************voidjia();voidjian();//********************数组定义,数组内含有8个数值******************uchartable1[8],table2[8],table3[8],table4[8];//**************************时间显示初始值**************************ucharshi=12,fen=0,miao=0;//**************************定义全局变量****************************ucharshi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;ucharshi4,fen4,miao4;ucharflag,flag1,wss,cnt,cnt1,alm1,alm2,alm3;//1秒等时位闪次数校时闹1闹2闹3uintflag2;//蜂鸣//*********************延时函数,用于动态扫描数码管*****************voiddelay(uchari){ucharx,y;for(x=i;x>0;x--)for(y=120;y>0;y--);}//*******************************初始化函数*************************voidinit(){TMOD=0x01;//工作方式1 TH0=0x3c;//定时时间为:50ms (65536-50000)/256TL0=0x0b0;//(65536-50000)%256ET0=1;//打开定时器EA=1;//开总中断TR0=1;//启动定时器}//********************显示子函数,用于显示时间数值*****************voiddisplay(){uchari,j;if(cnt!=10||wss==0){table1[0]=miao%10;//分离秒的个位与十位table1[1]=miao/10; } else {table1[0]=table1[1]=11;} if(cnt!=11||wss==0) {table1[3]=fen%10;//分离分的个位与十位table1[4]=fen/10; } else {table1[3]=table1[4]=11;} if(cnt!=12||wss==0) {table1[6]=shi%10;//分离时的个位与十位table1[7]=shi/10; } else {table1[6]=table1[7]=11;}table1[2]=table1[5]=10;j=0xfb;for(i=0;i<=7;i++)//从秒到时的扫描{P2=j;P0=table[table1[i]];//显示数值delay(10);j=_cror_(j,1);//循环右移}}//*******************显示子函数,用于显示定时1时间*****************voiddisplay1(){uchari,j;if(alm1==0){if(cnt!=1||wss==0) {table2[0]=miao1%10;//以下含义同上table2[1]=miao1/10; } else {table2[0]=table2[1]=11;} if(cnt!=2||wss==0) {table2[3]=fen1%10;table2[4]=fen1/10; } else {table2[3]=table2[4]=11;} if(cnt!=3||wss==0) {table2[6]=shi1%10;table2[7]=shi1/10; } else {table2[6]=table2[7]=11;} } else table2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;table2[2]=table2[5]=10;j=0xfb;for(i=0;i<=7;i++){P2=j;P0=table[table2[i]]; delay(10);j=_cror_(j,1);}}//********************显示子函数,用于显示定时2时间******************voiddisplay2(){uchari,j;if(alm2==0){if(cnt!=4||wss==0) {table3[0]=miao2%10;//以下含义同上table3[1]=miao2/10; } else {table3[0]=table3[1]=11;} if(cnt!=5||wss==0) {table3[3]=fen2%10;table3[4]=fen2/10; } else {table3[3]=table3[4]=11;} if(cnt!=6||wss==0) {table3[6]=shi2%10;table3[7]=shi2/10; } else {table3[6]=table3[7]=11;} } else table3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;table3[2]=table3[5]=10;j=0xfb;for(i=0;i<=7;i++){P2=j;P0=table[table3[i]]; delay(10);j=_cror_(j,1);}}//***************显示子函数,用于显示定时3时间数值****************//voiddisplay3(){uchari,j;if(alm3==0){if(cnt!=7||wss==0) {table4[0]=miao3%10;//分离秒的个位与十位table4[1]=miao3/10;} else {table4[0]=table4[1]=11;} if(cnt!=8||wss==0) {table4[3]=fen3%10;//分离分的个位与十位table4[4]=fen3/10; } else { table4[3]=table4[4]=11;} if(cnt!=9||wss==0) {table4[6]=shi3%10;//分离时的个位与十位table4[7]=shi3/10; } else { table4[6]=table4[7]=11;}}else table4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;table4[2]=table4[5]=10;j=0xfb;//从秒到时的扫描for(i=0;i<=7;i++){P2=j;P0=table[table4[i]];//显示数值 delay(10);j=_cror_(j,1);//循环右移}}//***********************时间子函数*****************************//voidshijian(){if(flag>=20)//判断是否到一秒{wss=~wss; flag=0; //到了,则标志位清零 if(cnt1!=0) {miao4++;//秒加1if(miao4>59)//判断秒是否到60s{miao4=0;//到了,则清零fen4++;//分加1if(fen4>59)//以下含义同上{fen4=0;shi4++;if(shi4>23)shi4=0; } }} else{miao++;//秒加1if(miao>59)//判断秒是否到60s{miao=0;//到了,则清零fen++;//分加1if(fen>59)//以下含义同上{fen=0;shi++;if(shi>23)shi=0; } }}}}//**************************键盘扫描子函数************************//voidkey_scan(){if(key1==0){while(!key1)//防止掉显{if(cnt==1||cnt==2||cnt==3){display1();} if(cnt==4||cnt==5||cnt==6){display2();} if(cnt==7||cnt==8||cnt==9){display3();} if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){display();}}cnt++;//记下按键key1按下的次数 if(cnt==10&&cnt1==0) {miao4=miao; fen4=fen; shi4=shi; cnt1++; } if(cnt==13) {cnt=0; if(cnt1==1) {miao=miao4; fen=fen4; shi=shi4; } cnt1=0; }}if(key2==0)//判断key2是否按下{while(!key2)//防止掉显{if(cnt==1||cnt==2||cnt==3){display1();} if(cnt==4||cnt==5||cnt==6){display2();} if(cnt==7||cnt==8||cnt==9){display3();} if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){display();}}jia();}if(key3==0)//判断key3是否按下{while(!key3)//防止掉显{if(cnt==1||cnt==2||cnt==3){display1();} if(cnt==4||cnt==5||cnt==6){display2();} if(cnt==7||cnt==8||cnt==9){display3();} if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){display();}}jian(); //调用减1子函数} if(key4==0) //判断key4是否按下 {while(!key4) //防止掉 {if(cnt==1||cnt==2||cnt==3) {alm1=~alm1; display1(); } if(cnt==4||cnt==5||cnt==6) {alm2=~alm2; display2(); } if(cnt==7||cnt==8||cnt==9) {alm3=~alm3; display3(); } if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13) display(); } }}//****************************加1子函数***************************voidjia(){if(cnt==1) //判断key1按下的次数是否为1{miao1++; //是,则秒加1if(miao1>59) //判断秒是否大于60,是,则秒清零miao1=0;}if(cnt==2) //以下含意同上{fen1++;if(fen1>59)fen1=0;}if(cnt==3){shi1++;if(shi1>23)shi1=0;}if(cnt==4){miao2++;if(miao2>59)miao2=0;}if(cnt==5){fen2++;if(fen2>59)fen2=0;}if(cnt==6){shi2++;if(shi2>23)shi2=0;}if(cnt==7){miao3++;if(miao3>59)miao3=0;}if(cnt==8){fen3++;if(fen3>59)fen3=0;}if(cnt==9){shi3++;if(shi3>23)shi3=0;}if(cnt==10){miao++;if(miao>59)miao=0; cnt1++;}if(cnt==11){fen++;if(fen>59)fen=0; cnt1++;}if(cnt==12){shi++;if(shi>23)shi=0; cnt1++;}}//***************************减1子函数**************************//voidjian(){if(cnt==1) //判断key1按下的次数是否为1,是则秒减1{miao1--;if(miao1==255) //判断秒是否减到255,是,则秒置59miao1=59;}if(cnt==2) //以下含意同上{fen1--;if(fen1==255)fen1=59;}if(cnt==3){shi1--;if(shi1==255)shi1=23;}if(cnt==4){miao2--;if(miao2==255)miao2=59;}if(cnt==5){fen2--;if(fen2==255)fen2=59;}if(cnt==6){shi2--;if(shi2==255)shi2=23;} if(cnt==7){miao3--;if(miao3==255)miao3=59;}if(cnt==8){fen3--;if(fen3==255)fen3=59;}if(cnt==9){shi3--;if(shi3==255)shi3=23;}if(cnt==10){miao--;if(miao==255)miao=59; cnt1++;}if(cnt==11){fen--;if(fen==255)fen=59; cnt1++;}if(cnt==12){shi--;if(shi==255)shi=23; cnt1++;}}//***************************闹铃子函数***************************//voidclock()//判断秒的数值是否相等{if(miao==miao1&&alm1==0||miao==miao2&&alm2==0||miao==miao3&&alm3==0)//是,在判断分是否相等if(fen==fen1&&alm1==0||fen==fen2&&alm2==0||fen==fen3&&alm3==0)//是,再判断时是否相等 if(shi==shi1&&alm1==0||shi==shi2&&alm2==0||shi==shi3&&alm3==0){flag2=0;//是,则标志位,flag2清零while(!(flag2==1200)&&(cnt==0))//判断flag2是否到1200且不 //为调时状态{if(key4==0) //没有,则继续驱动蜂鸣器响 {while(!key4) flag2=1200; } if(flag1>1) //等时方波驱动蜂鸣器 {fmq=~fmq; flag1=0; }shijian();//调用时间子函数display();//调用显示子函数}fmq=1;//关闭蜂鸣器 }}//**************************主函数********************************//voidmain(){init();//调用初始化子函数while(1){clock();//闹钟子函数 if(cnt==1||cnt==2||cnt==3)//显示子函数{display1();} if(cnt==4||cnt==5||cnt==6){display2();} if(cnt==7||cnt==8||cnt==9){display3();} if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){display();} shijian(); //调用时间子函数 key_scan(); //调用键盘扫描子函数}}//**************************定时中断******************************//voidtime0()interrupt1{TH0=0x3c;//初值50ms(65536-50000)/256TL0=0x0b0; //(65536-50000)%256flag++;//标志位flag1++; flag2++; }中断定时器的设置数字电子钟设计中主要使用定时器T0中断ET0,利用ET0中断进行计时时间的自增,从而实现计时功能。AT89C51有两个通用定时/计数器。两者均可配置为定时器或事件计数器。另外增加了定时器T0/T1,溢出时T0/T1脚自动翻转的功能选项。用作“定时器”功能时,每经过一个机器周期,寄存器值加1。用作“计数器”功能时,寄存器在对应的外部输入管脚T0/T1上每发生一次1到0的跳变时加1。使用该功能时,外部输入每个机器周期被采样一次。设计中采用了中断方式1作为定时中断,其定时计数初值的设置可由以下公式计算得到,图4-1定时器工作原理[1]中断服务流程图如下图4-2X:计数初值t:定时时间:机器周期[1]图4-2中断服务流程图闹钟子函数闹钟时间的判别主要是通过设定时间与实时时间对逐位对比确定是否进行闹铃。其工作流程图如下图4-3。图4-3闹铃判断流程图计时函数计时函数部分,主要是通过单片机定时中断来计时,复产生一次中断标志位flag加1,当flag加满20次为1秒,然后把flag清0把秒存储单元加1。然后再依次判断分、时。其流程图如图4-4计时流程图键盘扫描函数这些函数主要是判断是否有按键按下,并根据相应按键按下的情况调用相关函数执行,其相关流程图如下图4-5图4-5键盘扫描流程图时间和闹钟的设置此部分主要是通过判断cnt在不同值时通过调用加1、减1子函数对时间和闹钟的时、分、秒进行设置。在闹钟设置时,判断按键S4按下情况,进行闹钟的开启与关闭,相关流程图如下图4-6。图4-6时间/闹钟设置流程图5.经验总结这次对数字钟的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字钟的原理与设计理念。在此次的数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法.在调试软件的时候,我对定时闹钟的子程序很是疑惑,定时器只有2个,如何同时实现走时和定时的功能,并让在定时时间到时闹钟响铃。通过查资料,自己认真看书,发现要同时实现这些功能,必修利用中断!中断的学习是学习单片机的关键!时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器T0打开后,进入计时,满100毫秒后,重装定时。中断一次,满一秒后秒进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位。然后根据进率,得到时、分、秒存储单元的值,并经译码后,通过扫描程序送LED中显示出来,实现时钟计时功能。闹钟的响铃是分别将定时时间同走时相比较,若时间相同,则响铃。可以用按键KEY4来实现闹铃的关闭,在闹钟设置时,判断按键S4按下情况,进行闹钟的开启与关闭。另外,数码管的显示模块我也遇到了问题,在PROTUES仿真时我利用的是8个连在一起的数码管,但买的最多的也是4个连在一起的,我还以为不可以利用循环程序来扫描了,对程序进行了一些修改,但是后来才发现其实不管数码管是不是连在一起的,只要它的位选位和单片机的串行口网络标号一样,程序是不受影响的!循环程序只是针对的串行口,只要串行口的数值给的正确,就会运行合适。刚开始我利用的是8个连在一起的共阳极数码管,但是在买元件的时候买成4个连在一起的共阴极的数码管了,在修改循环程序的时候我就改成了四个的循环,程序如下:j=0x7f;//从秒到时的扫描for(i=0;i<=3;i++){P3=j;P0=table[table4[i]];//显示数值 delay(10);j=_cror_(j,1);//循环右移}j=0x7f;//从秒到时的扫描for(i=0;i<=3;i++){P3=j;P0=table[table4[i]];//显示数值 delay(10);j=_cror_(j,1);//循环右移}但我发现这样根本行不通,其实这跟数码管是几个连在一起的没有关系,而是在于数码管的位选和段选的网络标号和89C51的网络标号是否一致,只要标号一致,程序还是可以用8个连在一起的循环来实现的!所以,做实验还是在于实践,如果没有实际操作,得出来的结论就难免会有错误!而且,这也让我加深了对数码管显示程序的认识与了解。正确的程序如下所示:j=0xfb;//从秒到时的扫描for(i=0;i<=7;i++){P2=j;P0=table[table4[i]];//显示数值 delay(10);j=_cror_(j,1);//循环右移}在绘制PCB板时,我只是机械的利用了PROTEL来自动布线,没有自己手动的修改,以至于有些线自动布的很不合理。a.自动布线前,先用手工布一些重要的网络,比如高频时钟、主电源等,这些网络往往对走线距离、线宽、线间距、屏蔽等有特殊的要求;另外一些特殊封装,如BGA,自动布线很难布得有规则,也要用手工布线;b.自动布线以后,还要用手工布线对PCB的走线进行调整;c.电源线和地线尽量加粗,尽量加宽电源、地线宽度,最好是地线比电源线宽,它们的关系是:地线>电源线>信号线,通常信号线宽为:0.2~0.3mm,最细宽度可达0.05~0.07mm,电源线一般为1.2~2.5mm。对数字电路的PCB可用宽的地导线组成一个回路,即构成一个地网来使用(模拟电路的地则不能这样使用)。预先对要求比较严格的线(如高频线)进行布线,输入端与输出端的边线应避免相邻平行,以免产生反射干扰。必要时应加地线隔离,两相邻层的布线要互相垂直,平行容易产生寄生耦合。d.振荡器外壳接地,时钟线要尽量短,且不能引得到处都是。时钟振荡电路下面、特殊高速逻辑电路部分要加大地的面积,而不应该走其它信号线,以使周围电场趋近于零;e.尽可能采用45o的折线布线,不可使用90o折线,以减小高频信号的辐射;(要求高的线还要用双弧线)f.任何信号线都不要形成环路,如不可避免,环路应尽量小;信号线的过孔要尽量少;g.关键的线尽量短而粗,并在两边加上保护地。h.通过扁平电缆传送敏感信号和噪声场带信号时,要用“地线-信号-地线”的方式引出。i.关键信号应预留测试点,以方便生产和维修检测用j.原理图布线完成后,应对布线进行优化;同时,经初步网络检查和DRC检查无误后,对未布线区域进行地线填充,用大面积铜层作地线用,在印制板上把没被用上的地方都与地相连接作为地线用。或是做成多层板,电源,地线各占用一层。其实软件只是一个辅助工具,关键还是得靠我们自己来完成。比如某些绕了很多弯子的线,我们完全可以比软件布的更加合理。在自动布线完成之后,我们应当对PCB图进行检查和校对,对一些可以简化的线进行手动布线。另外,一个过孔主要由两个部分组成,一是中间的钻孔(drillhole),二是钻孔周围的焊盘区。这两部分的尺寸大小决定了过孔的大小。在高速,高密度的PCB设计时,设计者总是希望过孔越小越好,这样板上可以留有更多的布线空间。焊盘(PAD)与过渡孔(VIA)的基本要求是:盘的直径比孔的直径要大于0.6mm;例如,通用插脚式电阻、电容和集成电路等,采用盘/孔尺寸1.6mm/0.8mm(63mil/32mil),插座、插针和二极管1N4007等,采用1.8mm/1.0mm(71mil/39mil)。实际应用中,应根据实际元件的尺寸来定,有条件时,可适当加大焊盘尺寸;PCB板上设计的元件安装孔径应比元件管脚的实际尺寸大0.2~0.4mm左右。过孔(VIA)一般为1.27mm/0.7mm(50mil/28mil);当布线密度较高时,过孔尺寸可适当减小,但不宜过小,可考虑采用1.0mm/0.6mm(40mil/24mil)。但是在我们自己焊接元件的时候,就要从实际考虑,焊盘设置的太小就会导致焊接极其不方便,很容易将元件与周围的铜片区导通,以至于板子调试不通。我在设置焊盘的大小时,完全没有概念,也没有将电源线加粗,在画一些元件的封装例如三极管、电阻时,没有考虑焊接的难度,只是做了个封装,对其参数都没有进行具体的设置,以至于在板子刻出来后才发现焊接难度过大,封装不合适。所以通过这次绘制PCB板,焊接板子,我发现做事一定要从实际出发,任何一个小问题都不可以凭空想象,需要我们动手测量,只有这样我们做的东西才够严谨、够科学!不能贪图省事,就把一些小问题置之不理,这样小问题终将会造成大问题。这就是理论与实践的差距!在焊元件、接线的时候一定要细心,不要和周围的铜片接通,同时也要学会如何判别芯片的好坏,要是芯片坏了即使接线再正确也出不来结果。在判别芯片是否正常工作时,可以将芯片通电,再将晶振XTAL1和XTAL2以及EA引脚接高电平,看ALE端口输出的信号是否是1/6个时钟周期,若是,则芯片正常。接线和芯片的接触不良以及地

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论