本帖最后由 gk320830 于 2015-3-4 17:15 编辑
LED点阵心形流水灯礼品
目 录
0 前言......................................................................................................................... 1
1 系统组成与功能...................................................................................................1
1.1 系统组成............................................................................................................ 1
1.1.1
AT89C51单片机...................................................................................... 1
1.1.2 16乘16点阵.......................................................................................... 2
1.2 系统功能............................................................................................................ 3
2 系统原理................................................................................................................ 3
2.1
系统仿真图......................................................................................................... 3
2.2 实物照片............................................................................................................ 4
3 程序流程图............................................................................................................6
4 程序代码.................................................................................................................7
5 结论....................................................................................................................... 14
参考文献..................................................................................................................... 14
基于单片机控制心形流水灯跟点阵
0前言 随着社会的发展,单片机得到了广泛的应用,人们越来越重视单片机的应用。比如温度是和每个人息息相关的,并且在有的生产车间里还要进行温度时时测量,甚至是对温度的进一步调控等,这些都是单片机的应用之例。本设计是用单片机和点阵加一个小的流水灯
电路,作为玩具挺有趣的。
这次的作品,初衷是希望通过单片机学习,做个生日礼物送给朋友。由于时间紧迫,做的有些仓促,望原谅。
1系统组成与功能1.1 系统组成
本系统主要有AT89C51单片机、18b20、1602、蜂鸣器、四位一体七段数码管等
元件组成。
1.1.1 AT89C51单片机
AT89S51具有如下特点:40个引脚,8k BytesFlash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行
通信口,看门狗(WDT)
电路,片内时钟振荡器。
此外,AT89S52设计和配置了振荡频率可
为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
引脚图如图1-1所示。
1.1.2 16乘16点阵显示模块
本点阵屏采用4块8*8点阵组合,形成一个16*16的点阵,加驱动集成电路SN74HC164和74HC595组成。通过软件控制,本屏以动态扫描的显示方式,可显示文字、图形、动画等多种花样。
1、 SN74HC164是串行移位寄存器,串行输入并行输出,当清零端CLR为高电平时,每来一个时钟脉冲CLK寄存器中的数据就会从Qa向Qh方向移动一位,即Qa→Qb、Qb→Qc、Qc→Qd、Qd→Qe、Qe→Qf、Qf→Qg、Qg→Qh,同时两个输入端A和B与非的结果进入Qa,SN74HC164的逻辑功能如图1-2所示。
图1-2 SN74HC164的逻辑功能图
2、 74HC595有一个8位串行输入,并行输出的移位寄存器,该寄存器向一个8位D型存储寄存器提供数据。74HC595N的存储寄存器具备三态输出。移位寄存器和存储寄存器分别有独立的时钟。74HC595N的移位寄存器带有最高优先级的直接清零端(SRCLR)、串行输入端(SER)和用于级联的串行输出端。当输出使能端(OE)为高时,74HC595的输出将处于高阻态。
不管是移位寄存器时钟(SRCLK)还是存储寄存器时钟(RCLK),都是上升沿触发。如果当两个时钟绑定在一起时,则移位寄存器将一直领先存储寄存器一个时钟脉冲。
SN74HC595特性:8位串行输入,并行输出移位;宽工作电压范围:2.0~6.0 V高强度电流三态输出,最多可驱动高达15个LSTTL负载;低功耗,最大ICC=80μA;典型tpd=13 ns;5V下驱动电流为±6 mA;移位寄存器可直接清零低输入电流,最大1μA;8位移位寄存器,具有三态输出锁存。
最后,集成了74HC595、74HC154的点阵实物图见图1-3所示。
3、点阵主要技术参数:
显示容量:16*16个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
4、引脚功能说明
GND 接地
DS 串行数据输入
STcp 并行数据输出时钟 SHcp 串行数据输入时钟
CS 选择器使能 A0--A3 16位数据选择器输入
不算电源线,共8线,算电源为10线。本点阵已将驱动集成电路74HC595、74HC154等放在点阵后面了,引入10线及信号即可显示。
2系统设计 2.1 系统设计方案 利用TC89C52RC单片机,16*16点阵LED,74HC164N 和74HC595N芯片,
tiP127三极管组成的汉字点阵显示系统。本系统主要分成屏体和控制器两大部分。屏体的主要部分是LED点阵,还有行列驱动电路。LED点阵屏采用16*16LED显示模块连接而成。一块16行16列显示屏,其LED发光器件数量相当大,不适合使用静态驱动电路,而采用动态扫描驱动电路。扫描驱动电路采用多行的同名列共用一套驱动器,行驱动器一行的行线连接到电源的一端,列驱动器一列的列连接到电源的另一端。控制电路负责有序地选通各行,选通每一行之前还要把该行该列的数据准备好,一旦该行选通,这一行上的LED发光器件就可以根据列数据进行显示。
本系统的控制电路采用单片机方法,由于单片机的I/O口数量少,驱动能力不强,则要扩展一定的硬件电路,才能满足显示屏的需要。硬件电路大体上可分为单片机控制器、LED显示屏行列驱动电路、LED点阵屏三部分,LED显示屏驱动电路使用通用的数字电路并尽量减少外围硬件,做到电路简单、适应性强、成本不高、维护方便等要求。
为了增强汉字点阵的显示效果,LED汉字点阵显示系统也可以有多种显示模式。最简单的显示模式是静态显示。同静态显示模式相对应有多种动态显示模式,它们所显示的文字是动态的。按照文字运动的特点可以分为平移、闪烁、旋转、缩放等多种显示模式。产生不同显示模式的方法可以通过一定的算法从原来的显示数据产生。不过当算法太复杂时就会太浪费时间,也可以考虑预先生成刷新数据,存储备用。
本系统采用动态显示的模式,所谓的动态显示模式是指逐行轮流点亮。我们把所有的同一行发光管的阳极连接在一起,把所有第一列发光管的阴极连接一起,先送出对应第一行的发光管亮灭的数据并且锁存,然后选通第一行使其点亮一定的时间然后熄灭;再送出第二行的数据并且锁存,然后宣统第二行使其点亮同样的时间,然后熄灭;直到第第十六行显示完后再重新点亮第一行,这样反复轮回。如图2所示。
图2 系统的整体结构图
2.2 点阵部分程序流程图
2.3 流水灯部分
基于单片机的流水灯是一个小设计,其原理就不详细说明。
单片机1(左)控制流水灯,单片机2(右)控制点阵。
下面是系统连线图:
图2—1 系统电路连线图
2.2实物照片
具体的实物照片如下图
实物图一
实物图二
图2—3 实物照片图三
3 合并程序流程图
4 部分程序源代码点阵单片机程序
/**********************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
uchar N=7; // N 表示有多少个汉字, 如要加多个字,只需改动N的值即可
***it DS=P1^0; //74HC595串行数据
***it STcp=P1^1; //74HC595并行输出时钟
***it SHcp=P1^2; //74HC595串行时钟
***it CS=P1^3; //74HC154输出有效信号
//=============P2口作为74HC154的选择控制数据输入=================
//=============P2口整体控制A0--A4,所以无需单独控制每个信号===========
//***it A0=P3^0;
//***it A1=P3^1;
//***it A2=P3^2;
//***it A3=P3^3;
//===========================字模表==============================
//================取模方法:阴码,逆向,逐行========================
//==============================================================
uchar code Hanzi[]=
{
/*
0x60,0x02,0x1C,0x0A,0x10,0x12,0x10,0x12,0x10,0x02,0xFF,0x7F,0x10,0x02,0x10,0x12,
0x70,0x14,0x1C,0x0C,0x13,0x04,0x10,0x0A,0x90,0x49,0x10,0x50,0x14,0x60,0x08,0x40,//*"我",0
0x00,0x1F,0xFC,0x09,0x48,0x08,0x90,0x04,0xFC,0x7F,0x44,0x40,0x42,0x00,0xFC,0x3F,
0x20,0x00,0xE0,0x0F,0x30,0x04,0xD0,0x02,0x08,0x03,0xC6,0x0C,0x31,0x70,0x0C,0x20,//*"爱",1
0x90,0x00,0x90,0x01,0x88,0x20,0xC8,0x7F,0x44,0x20,0x2C,0x12,0x16,0x02,0x45,0x0A,
0xC4,0x12,0x44,0x12,0x24,0x22,0x24,0x62,0x14,0x22,0x84,0x02,0x04,0x01,0x00,0x00,//*"你",2
*/
0x60,0x02,0x1C,0x0A,0x10,0x12,0x10,0x12,0x10,0x02,0xFF,0x7F,0x10,0x02,0x10,0x12,
0x70,0x14,0x1C,0x0C,0x13,0x04,0x10,0x0A,0x90,0x49,0x10,0x50,0x14,0x60,0x08,0x40,/*"我",3*/
/* (16 X 16 , 宋体 )*/
0x00,0x1F,0xFC,0x09,0x48,0x08,0x90,0x04,0xFC,0x7F,0x44,0x40,0x42,0x00,0xFC,0x3F,
0x20,0x00,0xE0,0x0F,0x30,0x04,0xD0,0x02,0x08,0x03,0xC6,0x0C,0x31,0x70,0x0C,0x20,/*"爱",4*/
/* (16 X 16 , 宋体 )*/
0x90,0x00,0x90,0x01,0x88,0x20,0xC8,0x7F,0x44,0x20,0x2C,0x12,0x16,0x02,0x45,0x0A,
0xC4,0x12,0x44,0x12,0x24,0x22,0x24,0x62,0x14,0x22,0x84,0x02,0x04,0x01,0x00,0x00,/*"你",5*/
/* (16 X 16 , 宋体 )*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,
0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,/*"!",6*/
//一定要在字模后加一个清屏的字模,否则移动显示时出现乱麻
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//清屏
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//====================延时程序==========================
void delay(uint N)
{
uchar i;
uint j;
for(j=0;j
for(i=125;i>0;i--);
}
//=====================逐行测试==============================
//=================目的:查看有无坏点========================
void display_test(uchar N)
{
uchar i,j;
for(j=0;j<100;j++)
{
DS=0; //整行显示
for(i=0;i<16;i++)
{
SHcp=0;
SHcp=1;
}
STcp=0;
STcp=1;
P3=N;
CS=0;
delay(10); //本程序太长,省去部分,需要完整程序请
CS=1; //联系QQ154401855(或154401856)下载
}
}
//++++++++++++++++++++++++++++++静态显示+++++++++++++++++++++++++++++++
//====================++++++++++显示程序===============================
// N表示传递过来的第几个文字,一个文字占32个字节,所以M为32的倍数
//=====================================================================
void display_state(uchar M)
{
uchar i,j,n,cont=0;
uchar temp;
for(n=0;n<50;n++) //重复显示50次,以便能清楚显示
{
for(i=0;i<16;i=i+2)
{
temp=~Hanzi[M+i+16]; //取一字模数据存放于temp,高8位
//进行8次转换,使8位并行数据转换为串行数据
for(j=0;j<8;j++)
{
if(temp&0x80)//并行数据转为串行数据,高位在前
DS=1;
else
DS=0;
SHcp=0;
SHcp=1; //SHcp上升沿锁存一位数据
temp=temp<<1;//左移一位,进行下一次转换
}
temp=~Hanzi[M+i]; //取一字模数据存放于temp,低8位
//进行8次转换,使8位并行数据转换为串行数据
for(j=0;j<8;j++)
{
if(temp&0x80)//并行数据转为串行数据,高位在前
DS=1;
else
DS=0;
SHcp=0;
SHcp=1; //SHcp上升沿锁存一位数据
temp=temp<<1;//左移一位,进行下一次转换
}
STcp=0;
STcp=1; //STcp上升沿使8位数据并行输入
P3=cont; //cont计数器作为74HC154的选择信号,由P2口输出
CS=0; //74HC154 使能,开启显示
delay(2); //延时一下,以便有足够的点亮时间
CS=1; //关显示,不关显示会出现花屏现象
cont++; //cont计数器加一
}
for(i=1;i<16;i=i+2)
{
temp=~Hanzi[M+i+16];
for(j=0;j<8;j++)
{
if(temp&0x80)
DS=1;
else
DS=0;
SHcp=0;
SHcp=1;
temp=temp<<1;
}
temp=~Hanzi[M+i];
for(j=0;j<8;j++)
{
if(temp&0x80)
DS=1;
else
DS=0;
SHcp=0;
SHcp=1;
temp=temp<<1;
}
STcp=0;
STcp=1;
P3=cont;
CS=0;
delay(2);
CS=1;
cont++;
}
for(i=0;i<16;i++)
{
DS=0;
SHcp=0;
SHcp=1; //SHcp上升沿锁存一位数据
}
cont=0;
CS=1;
}
}
//+++++++++++++++++++动态显示文字++++++++++++++++++++++++
void display_move(void)
{
uchar i,j,n,cont=0;
uchar temp,hang;
for(hang=0;hang<32*N;hang=hang+2) //每次上移一行,即实现动态移动显示效果
{
for(n=0;n<10;n++)
{
…… //程序太长,省略一部分,需要完整程序请
} //联系QQ154401855(或154401856)下载
}
}
}
//=========================主函数===============================
void main(void)
{
uchar i;
P1=0xFF;
P2=0xFF;
while(1)
{
/*
for(i=0;i<16;i++) //16行点阵测试
{
display_test(i);
delay(100);
}
*/
for(i=0;i<32*N;i=i+32) //静态汉字显示
{
display_state(i);
delay(1000);
}
display_move(); //动态汉字显示
}
}
}
}
流水灯阵程序
/**********************************************************************/
#include
//************8位将流水灯编码存于单片机程序存储中******************
unsigned char codeLED1_shun[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //顺时针点亮数据
unsigned char code LED2_ni[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //逆时针点亮数据
unsigned int N=300;
void delay(unsigned int n)
{
unsignedint i;
unsignedchar j;
for(i=0;i
for(j=100;j>0;j--);
}
…… //程序实在太长,省略一部分
void main(void)
{
unsignedchar i;
unsigned char LED_temp;
while(1)
{
Display_One();
delay(N+N+N);
Display_Two();
delay(N+N+N);
Display_Three();
delay(N+N+N);
Display_Four();
delay(N+N+N);
Display_Five();
delay(N+N+N);
Display_Six();
delay(N+N+N);
Display_Seven();
delay(N+N+N);
Display_Eight();
delay(N+N+N);
Display_Nine();
delay(N+N+N);
Display_Ten();
// Display_Eleven();
Display_Twelve();
delay(N+N+N);
}
}
5 结论通过这学期单片机的学习我学到了不少东西,学会了有的东西需要自己通过自己的努力来解决。这次单片机作品的制作学会了焊接的初步技术,以及一些查找问题的方法。软件方面由于本人的技术有限只是对别人的一些程序进行更改,然后通过不断的调试,一步一步实现单片机的预定功能。
由于本人水平有限,扩展部分做的不是太好,希望其他人能够继续改进。老师说本文文字写的较乱,建议下一次做这个实验的人能把文字再写得好点。要出实验室了没有时间了,可能下一批进开放实验室的学弟会弄得更好的。
参考文献[1] 何立民.单片机应用技术选编[M],北京:北京航空大学出版社,1998;
[2] 何立民.单片机中级教程[M],北京:北京航空大学出版社,1998;
[3]郭天祥.51单片机C语言教程[M],北京:机械工业出版社,2008;
[4] 阎石主.数字
电子技术基础[M],北京:高等教育出版社,1998。
3