基于AT89S52单片机的LED点阵显示时钟 时钟的显示由LED点阵构成。 能正确显示时间,上电显示为12点。 完成该系统的硬件和软件的设计,在Proteus软件上仿真通过
《单片机原理及应用》课程设计任务书
课题名称
LED点阵显示电子钟设计
设计内容及要求
1、课题内容:设计一种基于AT89S52单片机的LED点阵显示时钟,要求如下:
(1)、时钟的显示由LED点阵构成。
(2)、时间能够由按键调整,误差小于1S。
(3)、能正确显示时间,上电显示为12点。
2、要求:
完成该系统的硬件和软件的设计,在Proteus软件上仿真通过,最后就课程设计本身提交一篇课程设计说明书。
设计工作量
1、汇编或C51语言程序设计;
2、程序调试;
3、在Proteus上进行仿真成功,进行实验板下载调试;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。
进度安排
目录
1. 系统总体方案选择与说明
2. 各单元硬件设计说明及计算方法
3. 软件设计与说明(包括流程图)
5. 调试结果与必要的调试说明
6. 使用说明
7. 课程设计体会
8. 参考文献
本方案基于AT89S52单片机设计的,还用到13块74HC573和1块74HC138芯片,8快8*8LED点阵,原理比较简单,但所有硬件成本较高,不适应商业用途。一个是硬件结构的设计,一个是控制的总体思想。在本小节中将对这两部分内容进行简单的叙述 1.1硬件结构 根据项目的功能和要求,可采用AT89S52单片机作为核心控制器。LED点阵电子钟系统组成包括:显示电路模块、显示驱动电路模块、按键电路模块以及电源模块。框图如图1.1所示。
1.2 控制思想 LED点阵电子钟程序主要功能是屏幕显示时间稳定,精确。所以按照分块设计的方法可以把程序分为主程序、显示程序、调整程序。主程序主要是用来初始化系统和控制各个子程序之间执行的顺序。显示程序用来完成数字在LED点阵上的显示,时钟的显示是使用8块8×8点阵显示屏。 2. 各单元硬件设计说明及计算方法 74HC138 74HC138 作用原理于高性能的存贮译码或要求传输延迟时间短的数据传输系统在 高性能存贮器系统中,用这种译码器可以提高译码系统的效率。将快速赋能电路用于高速存贮器时,译码器的延迟时间和存贮器的赋能时间通常小于存贮器的典型存取时间,这就是说由肖特基钳位的系统译码器所引起的有效系统延迟可以忽略不计。HC138 按照三位二进制输入码和赋能输入条件,从8 个输出端中译出一个 低电平输出。两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器,扩展成24 线译码器不需外接门;扩展成32 线译码器,只需要接一个外接倒相器。在解调器应用中,赋能输入端可用作数据输入端。 74HC573 八进制 3 态非反转透明锁存器 138芯片主要用于控制573芯片的输入,以达到控制LED点阵显示的目的。 8*8点阵显示屏 图2.2为8×8点阵LED外观及引脚图,其等效电路如图2.3所示,只要其对应的DC、DR轴顺向偏压,即可使LED发亮。例如如果想使图2.3左上角LED点亮,则DC8=1,DR1=0即可。应用时限流电阻可以放在DC轴或DR轴。8×8点阵LED外观及引脚如图2.2。
图2.2 8×8LED点阵引脚图 图2.3为8×8点阵LED等效电路,由此可以看出点阵是用64个LED组成的。 点阵LED扫描法介绍:从图2.3中可以看出,8×8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮。 频率必须大于128赫兹,周期小于7.8毫秒即可符合视觉暂留要求。此外一次驱动一列或一行(8盏LED)时需外加驱动电路提高电流,否则LED亮度会不足。
图2.3 8×8点阵LED等效电路
- 软件设计与说明(包括流程图)
5. 调试结果与必要的调试说明 file:///Z:\TEMP\msohtmlclip1\01\clip_image002.jpg 如图,上电显示为12::00,时钟自动跳动。因为LED点阵显示不够明显,所以可以调整延时来控制。 6.使用说明 本电路设3个按键,如图 file:///Z:\TEMP\msohtmlclip1\01\clip_image003.jpg 按下K1键,电路进入调整状态,秒钟归零,时钟位可调,K2为+1,K3为-1. 再按下K1键,分钟位可调,K2为+1,K3为-1. 再按下K1键,电路返回显示状态。 时钟位、分钟位、秒钟位分别如图所示 file:///Z:\TEMP\msohtmlclip1\01\clip_image004.jpg 7.课程设计体会 本次实习历时一个星期,在这个星期里,我们一起努力,一起奋斗,一起讨论,一起欢笑。 本次实习我要感谢同学,可以说没有他的帮助,我的实习任务是完不成的。我的实习题目是做一个LED点阵电子时钟。这需要我去查阅大量的知识。作为一个学习成绩不是很好的我,这个任务对我来说还是有一定的难度。 我首先从网上想查阅一些资料,但是网上没有跟我想同的课题。所以一切还得自己搞。然后我就去图书馆借了一些书,以及自己的单片机课本,数电都拿到实验室去了,在实验室呆了一个星期,终于有了一些方向。程序方面还是弱项,又看了一些编程方面的书,自学了51C语言,当然,只是一些最基础的,很多东西都要以后继续努力学。 在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 还要感谢,两位老师的品格和气质都深深的让我们敬佩。两位老师重不迟到,对学生更是富有耐心,刘老师更是在硬件方面给了学生很大的方便,很多设备都是直接找老师借的,这让我们调试的时候很是方便。 本次实习很成功,我们都有了很大的收获,感谢老师和同学。
单片机源程序如下: - #include<reg52.h>
- void display(unsigned char,unsigned char,unsigned char);
- sbit a_138=P1^0; //138
- sbit b_138=P1^1;
- sbit c_138=P1^2;
- sbit key1=P1^3; //key1选择,key2加,key3减
- sbit key2=P1^4;
- sbit key3=P1^5;
- sbit wei1=P2^0; //六个点阵选择位 ,weix=0位选通
- sbit wei2=P2^1;
- sbit wei3=P2^2;
- sbit wei4=P2^3;
- sbit wei5=P2^4;
- sbit wei6=P2^5;
- unsigned char num_138,shi,fen,miao,num_miao,key_flag;
- unsigned char code digittab[10][8]={
- {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0
- {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1
- {0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2
- {0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3
- {0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4
- {0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5
- {0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6
- {0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7
- {0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8
- {0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00} //9
- };
- void delay(unsigned char xms)
- {
- unsigned char i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void key_scan()
- {
- if(key1==0)
- {
- delay(3);
- if(key1==0)
- {
- TR0=0;
- key_flag++;
- if(key_flag>=3)
- {
- key_flag=0;
- TR0=1;
- }
- miao=0;
- }
- }
- if(key_flag==1)
- {
- if(key2==0)
- {
- delay(3);
- if(key2==0)
- {
- shi++;
- if(shi>12)
- shi=1;
- }
- }
- else if(key3==0)
- {
- delay(3);
- if(key3==0)
- {
- shi--;
- if(shi<1)
- shi=12;
- }
- }
- }
- if(key_flag==2)
- {
- if(key2==0)
- {
- delay(3);
- if(key2==0)
- {
- fen++;
- if(fen>=60)
- {
- fen=0;
- shi++;
- if(shi>12)
- shi=1;
- }
- }
- }
- else if(key3==0)
- {
- delay(3);
- if(key3==0)
- {
- fen--;
- if(fen==0xff)
- {
- fen=59;
- shi--;
- if(shi==0)
- shi=12;
- }
- }
- }
- }
-
- }
- void main()
- {
-
- P0=0x00;
- TMOD=0x01;
- TH0=(65536-50000)/256; //50ms
- TL0=(65536-50000)%256;
- IT0=1;
- IE=0x83;
- TR0=1;
- shi=12;
- fen=0;
- miao=0;
- while(1)
- {
- display(shi,fen,miao);
- }
- }
- void display(unsigned char adate,unsigned char bdate,unsigned char cdate)
- {
- unsigned char ashi,bshi,cshi,age,bge,cge;
- ashi=adate/10;
- age=adate%10;
- bshi=bdate/10;
- bge=bdate%10;
- cshi=cdate/10;
- cge=cdate%10;
- wei1=0;
- for(num_138=0;num_138<8;num_138++)
- {
- switch(num_138)
- {
- case 0:a_138=0;b_138=0;c_138=0;break;
- case 1:a_138=1;b_138=0;c_138=0;break;
- case 2:a_138=0;b_138=1;c_138=0;break;
- case 3:a_138=1;b_138=1;c_138=0;break;
- case 4:a_138=0;b_138=0;c_138=1;break;
- case 5:a_138=1;b_138=0;c_138=1;break;
- case 6:a_138=0;b_138=1;c_138=1;break;
- case 7:a_138=1;b_138=1;c_138=1;break;
- }
- P0=~digittab[ashi][num_138];
- delay(5);
- }
- wei1=1;
- wei2=0;
- for(num_138=0;num_138<8;num_138++)
- {
- switch(num_138)
- {
- case 0:a_138=0;b_138=0;c_138=0;break;
- case 1:a_138=1;b_138=0;c_138=0;break;
- case 2:a_138=0;b_138=1;c_138=0;break;
- case 3:a_138=1;b_138=1;c_138=0;break;
- case 4:a_138=0;b_138=0;c_138=1;break;
- case 5:a_138=1;b_138=0;c_138=1;break;
- case 6:a_138=0;b_138=1;c_138=1;break;
- case 7:a_138=1;b_138=1;c_138=1;break;
- }
- P0=~digittab[age][num_138];
- delay(5);
- }
- wei2=1;
- wei3=0;
- for(num_138=0;num_138<8;num_138++)
- {
- switch(num_138)
- {
- case 0:a_138=0;b_138=0;c_138=0;break;
- case 1:a_138=1;b_138=0;c_138=0;break;
- case 2:a_138=0;b_138=1;c_138=0;break;
- case 3:a_138=1;b_138=1;c_138=0;break;
- case 4:a_138=0;b_138=0;c_138=1;break;
- case 5:a_138=1;b_138=0;c_138=1;break;
- case 6:a_138=0;b_138=1;c_138=1;break;
- case 7:a_138=1;b_138=1;c_138=1;break;
- }
- P0=~digittab[bshi][num_138];
- delay(5);
- }
- wei3=1;
- wei4=0;
- for(num_138=0;num_138<8;num_138++)
- {
- switch(num_138)
- {
- case 0:a_138=0;b_138=0;c_138=0;break;
- case 1:a_138=1;b_138=0;c_138=0;break;
- case 2:a_138=0;b_138=1;c_138=0;break;
- case 3:a_138=1;b_138=1;c_138=0;break;
- case 4:a_138=0;b_138=0;c_138=1;break;
- case 5:a_138=1;b_138=0;c_138=1;break;
- case 6:a_138=0;b_138=1;c_138=1;break;
- case 7:a_138=1;b_138=1;c_138=1;break;
- }
- P0=~digittab[bge][num_138];
- delay(5);
- }
- wei4=1;
- wei5=0;
- for(num_138=0;num_138<8;num_138++)
- {
- switch(num_138)
- {
- case 0:a_138=0;b_138=0;c_138=0;break;
- case 1:a_138=1;b_138=0;c_138=0;break;
- case 2:a_138=0;b_138=1;c_138=0;break;
- case 3:a_138=1;b_138=1;c_138=0;break;
- case 4:a_138=0;b_138=0;c_138=1;break;
- case 5:a_138=1;b_138=0;c_138=1;break;
- case 6:a_138=0;b_138=1;c_138=1;break;
- case 7:a_138=1;b_138=1;c_138=1;break;
- }
- P0=~digittab[cshi][num_138];
- delay(5);
- }
- wei5=1;
- wei6=0;
- for(num_138=0;num_138<8;num_138++)
- {
- switch(num_138)
- {
- case 0:a_138=0;b_138=0;c_138=0;break;
- case 1:a_138=1;b_138=0;c_138=0;break;
- case 2:a_138=0;b_138=1;c_138=0;break;
- case 3:a_138=1;b_138=1;c_138=0;break;
- case 4:a_138=0;b_138=0;c_138=1;break;
- case 5:a_138=1;b_138=0;c_138=1;break;
- case 6:a_138=0;b_138=1;c_138=1;break;
- case 7:a_138=1;b_138=1;c_138=1;break;
- }
- P0=~digittab[cge][num_138];
- delay(5);
- }
- wei6=1;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
|