心形花样流水灯设计报告
《专业方向课程设计》课程
设计报告
题目: 心形花样流水灯与点阵显示
专业: 电子信息工程
班级: 学号:
姓名:
指导老师:
重庆交通大学信息科学与工程学院
设计时间:2013年 9 月 8 日 到 2013 年 11 月 16 号
一、 设计任务说明
随着社会的发展,单片机得到了广泛的应用,人们越来越重视单片机的应用。比如温度是和每个人息息相关的,并且在有的生产车间里还要进行温度时时测量,甚至是对温度的进一步调控等,这些都是单片机的应用之例。本设计是用单片机和点阵加一个小的流水灯电路, 这次作品的初衷是希望通过单片机学习,做个生日礼物送给朋友。
二、 总体设计
本系统主要有AT89C51单片机、5mm 彩色LED 灯、74HC245、8*8LED点阵、200欧电阻等元件组成。
1. 流水灯设计:
(1)AT89C51单片机:
AT89C51具有如下特点:
40个引脚,8k Bytes Flash 片内程序存储器,
256 bytes的随机存取数据存储器(RAM ),
32个外部双向输入/输出(I/O)口,
5个中断优先级2层中断嵌套中断,
2个16位可编程定时计数器,
2个全双工串行通信口,
看门狗(WDT )电路,片内时钟振荡器。
此外,AT89S52设计和配置了振荡频率可 AT89C51引脚图
为0Hz 并可通过软件设置省电模式。空闲模式下,CPU 暂停工作,而RAM 定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RAM 的数据,停止芯片其它功能直至外中断激活或硬件复位。
引脚图如右图所示。此次设计把51单片机的4个I/O口与32个5mm 高亮LED 灯相接,通过单片机控制各I/O引脚的高低电平控制LED 的亮灭从而形成各种不同亮灭的花样。
2. 点阵显示设计:
(1)8*8点阵原理图 :
从图中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。
一根横柱:对应的行置0,而列则采用扫描的方法来实现。
(2)74HC245:
74HC245是一种三态输出、八路信号收发器, 主要应用于大屏显示, 以及其它的消费类电子产品中增加驱动
主要特性:
☆采用CMOS 工艺
☆宽电压工作范围:3.0V —5.0V
☆双向三态输出
☆八线双向收发器
☆封装形式:SOP20、SOP20-2、TSSOP20、DIP20
此次设计采用74HC245来驱动8*8点阵,74HC245
一端与51单片机的P0口想连,另一端则与点阵的输入端相连,从而通过单片机控制驱动点阵。
三、 硬件设计
心型流水灯的硬件设计如下图:
此次设计把51单片机的4个I/O口与32个5mm 高亮LED 灯相接,通过单片机控制各I/O引脚的高低电平控制LED 的亮灭从而形成各种不同亮灭的花样。
点阵显示的硬件设计图如下:
本次设计通过74HC245来驱动8*8点阵,74HC245的输入端与51单片机的P0口想连,74HC245的输出端则与点阵的行相连,而点阵的列则与单片机的P3口相连,通过单片机控制、74HC245驱动,从而完成了点阵的显示。
四、 软件设计
心形花样流水灯的程序如下:
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // 逐个点亮0~7 uchar code table1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; // 逐个点亮7~0 uchar code table2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; // 逐个灭
0~7
uchar code table3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; // 逐个灭7~0
/***********************************************************/
void delay(uint t); //延时
void zg(uint t,uchar a);//两边逐个亮
void qs(uint t,uchar a);//全部闪烁
void zgxh(uint t,uchar a); // 逆时针逐个点亮
void djs(uint t,uchar a); //对角闪
void lbzgm(uint t,uchar a);//两边逐个灭
void nszgm(uint t,uchar a); // 逆时针逐个灭
void sztl(uint t,uchar a);//顺时逐个同步亮
void nztl(uint t,uchar a);//逆时逐个同步亮
void sztm(uint t,uchar a);//顺时逐个同步灭
void nztm(uint t,uchar a);//逆时逐个同步灭
void hwzjl(uint t,uchar a); //横往中间亮
void hwzjm(uint t,uchar a); //横往中间灭
void nzdl(uint t,uchar a); //逆时逐段亮
void nzdgl(uint t,uchar a); //逆时逐段一个点亮
void jgs(uint t,uchar a); //间隔闪
/**********************************************************/
void zg(uint t,uchar a)//两边逐个亮
{
uchar i,j;
for(j=0;j
{
P0=P1=P2=P3=0xff;
P0=0x7f;delay(t);
for(i=0;i
{
P0=table1[i+1];
P2=table1[i];
delay(t);
}
P2=0x00;P1=0xfe;
delay(t);
for(i=0;i
{
P1=table[i+1];
P3=table1[i];
delay(t);
}
P3=0x00;delay(t);
}
}
void qs(uint t,uchar a) //全部闪烁 {
uchar j;
for(j=0;j
{
P0=P1=P2=P3=0xff;
delay(t);
P0=P1=P2=P3=0x00;
delay(t);
}
}
void zgxh(uint t,uchar a) //
{
uchar i,j;
for (j=0;j
{
P0=P1=P2=P3=0xff;
for (i=0;i
{
P0=table1[i];
delay(t);
}
for(i=0;i
{
P1=table[i];
delay(t);
}
for(i=0;i
{
P3=table[i];
delay(t);
}
for(i=0;i
{
P2=table[i];
delay(t);
} 逆时针逐个点亮
}
}
void nszgm(uint t,uchar a) // 逆时针逐个灭 {
uchar i,j;
for(j=0;j
{
P0=P1=P2=P3=0x00;
for (i=0;i
{
P0=table3[i];delay(t); }
for (i=0;i
{
P1=table2[i];delay(t); }
for (i=0;i
{
P3=table2[i];delay(t); }
for (i=0;i
{
P2=table2[i];delay(t); }
}
void djs(uint t,uchar a) //对角闪 {
uchar j;
for(j=0;j
{
P0=P1=P2=P3=0xff;
P0=P3=0x00;
delay(t);
P0=P1=P2=P3=0xff;
P1=P2=0x00;
delay(t);
}
}
void lbzgm(uint t,uchar a)//两边逐个灭
{
uchar i,j;
for (j=0;j
{
P0=P2=0x00;
P3=0x01;delay(t);
for(i=7;i>1;i--)
{
P1=table[i-1];P3=table1[i-2]; delay(t);
}
P1=0xfe;P3=0xff;delay(t); P1=0xff;P2=0x01;delay(t); for(i=7;i>1;i--)
{
P0=table1[i-1];
P2=table1[i-2];
delay(t);
}
P0=0x7f;P2=0xff;delay(t); P0=0xff;delay(t);
}
}
void sztl(uint t,uchar a)//顺时逐个同步亮 {
uchar i,j;
for(j=0;j
{
P0=P1=P2=P3=0xff;
for(i=0;i
{
P0=table[i];
P1=P2=P3=table1[i]; delay(t);
}
}
}
void nztl(uint t,uchar a)//逆时逐个同步亮 {
uchar i,j;
for(j=0;j
{
P0=P1=P2=P3=0xff;
for(i=0;i
{
P0=table1[i];
P1=P2=P3=table[i];
delay(t);
}
}
}
void sztm(uint t,uchar a)//顺时逐个同步灭 {
uchar i,j;
for(j=0;j
{
P0=P1=P2=P3=0x00;
for(i=0;i
{
P0=table2[i];
P1=P2=P3=table3[i]; delay(t);
}
}
}
void nztm(uint t,uchar a)//逆时逐个同步灭 {
uchar i,j;
for(j=0;j
{
P0=P1=P2=P3=0xff;
for(i=0;i
{
P0=table3[i];
P1=P2=P3=table2[i]; delay(t);
}
}
}
void hwzjl(uint t,uchar a) //横往中间亮 {
uchar i,j;
for (j=0;j
{
P0=P1=P2=P3=0xff;
for(i=0;i
{
P0=P2=P1=table1[i];
P3=table[i];delay(t); }
}
}
void hwzjm(uint t,uchar a) //横往中间灭 {
uchar i,j;
for (j=0;j
{
P0=P1=P2=P3=0x00;
for(i=0;i
{
P0=P2=P1=table3[i];
P3=table2[i];delay(t); }
}
}
void nzdl(uint t,uchar a) //逆时逐段亮 {
uchar i,j;
for (j=0;j
{
P0=P1=P2=P3=0xff;
for(i=0;i
{
P0=table1[i];
delay(t);
}
P0=0xff;
for(i=0;i
{
P1=table[i];
delay(t);
}
P1=0xff;
for(i=0;i
{
P3=table[i];
delay(t);
}
P3=0xff;
for(i=0;i
{
P2=table[i];
delay(t);
}
P2=0xff;
}
}
void nzdgl(uint t,uchar a) //逆时逐段一个点亮
{
uchar i,j,k,l;
for (j=0;j
{
k=table1[0];
P0=k;l=table[0];
P1=P2=P3=l;delay(t);
for(i=0;i
{
k=_crol_(k,-1);
P0=k;
l=_crol_(l,1);
P1=P2=P3=l;
delay(t);
}
}
}
void jgs(uint t,uchar a) //间隔闪
{
uchar j;
for (j=0;j
{
P0=0x55;P1=P2=P3=0xaa;
delay(t);
P0=0xaa;P1=P2=P3=0x55;
delay(t);
}
}
void main()
{
uchar i;
while(1)
{
zg(100,1); //两边逐个亮
lbzgm(100,1); //两边逐个灭
jgs(300,10);
djs(100,20); //对角闪
////////////////////////////////////////////
P1=P2=P3=0xff;
for(i=0;i
{
P0=0x00;delay(800);
P0=0xff;delay(800);
}
P0=0x00;
for(i=0;i
{
P1=0x00;delay(800);
P1=0xff;delay(800);
}
P1=0x00;
for(i=0;i
{
P3=0x00;delay(800);
P3=0xff;delay(800);
}
P3=0x00;
for(i=0;i
{
P2=0x00;delay(800);
P2=0xff;delay(800);
}
qs(500,3);
/////////////////////////////////////////////
for(i=0;i
{
zgxh(50,1);
}
djs(100,20); //对角闪
for(i=0;i
{
zg(100,1); //两边逐个亮
lbzgm(100,1); //两边逐个灭
}
qs(200,10);djs(100,50);
for(i=0;i
{
sztl(200,1); //顺时逐个同步亮
nztm(200,1);
nztl(200,1);
sztm(200,1); //顺时逐个同步灭
}
djs(300,10); //对角闪
nzdgl(300,10); //逆时逐段一个点亮
jgs(300,10); //间隔闪
for(i=0;i
{
zgxh(100,1);
nszgm(100,1);
}
nzdl(200,3); //逆时逐段亮
jgs(50,100); //间隔闪
//////////////////////////////////////////////////
nzdgl(50,40); //逆时逐段一个点亮
for(i=0;i
{
zg(100,1);qs(100,10);
lbzgm(100,1);
}
for(i=0;i
{
zgxh(100,1);
nszgm(100,1);
}
for(i=0;i
{
hwzjl(200,1); //横往中间亮
hwzjm(200,1); //横往中间灭
}
djs(300,10); //对角闪
for(i=0;i
{
zgxh(100,1);
nszgm(100,1);
}
djs(100,20); //对角闪
zg(300,1);
lbzgm(300,1);
for(i=0;i
{
sztl(200,1); //顺时逐个同步亮
nztm(200,1);
nztl(200,1);
sztm(200,1); //顺时逐个同步灭
}
djs(500,20); //对角闪
djs(100,30); //对角闪
djs(50,50); //对角闪
delay(1000);
}
}
void delay(uint t)
{
uint x,y;
for (x=t;x>0;x--)
{
for (y=120;y>0;y--);
}
}
点阵显示的程序如下:
RS_CNT
NUM EQU 30H EQU 31H
TCON_T
ORG
LJMP
ORG
LJMP
START:
MOV
MOV
MOV
MOV
MOV
MOV
SETB
SJMP
INT_T0:
MOV
MOV
MOV
MOVC
MOV
MOV
MOV
MOV
MUL
ADD
MOVC
CPL
MOV
INC
MOV
CJNE
MOV
NEXT:
MOV
CJNE
MOV
INC
MOV
CJNE
MOV
RETUNE:
TABLE:
TABLE1:
DB EQU 32H 00H START 0BH INT_T0 MOV RS_CNT,#00H NUM,#00H TCON_T,#00H TMOD,#01H TH0,#(65536-5000)/256 TL0,#(65536-5000)MOD 256 IE,#82H TR0 $ MOV TH0,#(65536-5000)/256 TL0,#(65536-5000)MOD 256 DPTR,#TABLE A,RS_CNT A,@A+DPTR P3,A DPTR,#TABLE1 A,NUM B,#8 AB A,RS_CNT A,@A+DPTR A P0,A RS_CNT A,RS_CNT A,#8,NEXT RS_CNT,#00H INC TCON_T A,TCON_T A,#200,RETUNE TCON_T,#00H NUM A,NUM A,#7,RETUNE NUM,#00H RETI DB 080H,040H,020H,010H,008H,004H,002H,001H DB 00H,00H,42H,42H,7EH,42H,42H,00H 30H,48H,44H,22H,44H,48H,30H,00H
DB DB DB DB DB END 00H,00H,7EH,02H,02H,7EH,00H,00H 00H,10H,10H,10H,10H,10H,10H,00H 02H,2AH,2AH,7EH,2AH,6AH,22H,10H 00H,10H,10H,10H,10H,10H,10H,00H 00H,22H,7AH,2AH,7AH,22H,7EH,20H
五、 系统测试
点阵的测试图:
心形花样流水灯测试图:
两边逐个点亮花型 逆时针熄灭花型
顺时针逐个熄灭的花型 顺时针逐个点亮的花型
对角逐个闪花型 竖向中间灭花型
六、总结与体会
在本次设计中出现了很多问题:第一次焊接好之后,接通电源,没有任何反应。经仔细检查之后没有发现什么错误,也向老师和许多同学请教过,结果还是没一点反应,于是第一次的焊接宣告失败,无奈只好在从新开始焊。第二次焊接的时候吸取了第一次的一些经验与教训,给每个I/O口都加上了200欧的电阻,并不断的纠正了自己的焊接方法,一步一步的,经过一下午的努力终于焊接好了,接通电源,一切正常工作,真是黄土不负有心人。
通过这学期单片机的学习我学到了不少东西,学会了有的东西需要自己通过自己的努力来解决。这次单片机作品的制作学会了焊接的初步技术,
以及一些查
找问题的方法。软件方面由于本人的技术有限只是对别人的一些程序进行更改,然后通过不断的调试,一步一步实现单片机的预定功能。由于本人水平有限,扩展部分做的不是太好,希望其他人能够继续改进。