分享自己做得16x16点阵广告牌
目次
1绪论 1
1.1 MCS-51系列单片机简介 1
1.2 单片机的应用模式和应用领域 2
1.3 主要工作任务 3
2硬件设计 3
2.1 单片机系统的基本模块 3
2.2 16*16点阵滚动显示的硬件设计 4
3软件设计 6
3.1 16*16点阵滚动显示的软件设计 6
4软件仿真结果 8
4.1 16*16点阵滚动显示仿真结果 8
结 论 9
参考文献 10
致谢 11
附录相关源程序 12
所谓16*16点阵,就是行列各位16个长度的点阵,现实中我们可以通过4个8*8点阵进行拼凑来实现一个16*16的点阵。如图3所示。图中的16*16点阵由U6,U7,U8,U9四个单点阵组成,所有的行(X0-X7)都通过排阻接到单片机的P0口上,所有的列(Y00-Y07、Y10-Y17、Y20-Y27、Y30-Y37)接到不同的74ls138(U2,U3,U4,U5)上,U2控制U6,U3控制U7,U4控制U8,U5控制U9。74ls138直接由单片机的P2口进行驱动,这样就形成了一个完整的电路。
其显示原理与单个点阵的显示原理类似,但是这里需要先把代码写入U6,然后短暂延时后写入U7,直到U9。时间段控制合理的话,我们就可以看到显示屏上将显示稳定的字符。这里涉及到一个滚动显示的问题,所谓滚动显示,即字符是从屏幕右端慢慢往左边移动,好像是一个拉幕的效果,那么滚动显示在程序上如何实现呢?这里我们就要用到单片机的定时中断,中断一次,字符往左移动一次,如此循环,即实现了字符的滚动显示。这与上面单个点阵的静态显示是有区别的。
关于74hc138的使用,74hc138是3-8线译码器,当E1=1,E2,E3=0时,该译码器被选中,此时如果数据输入端ABC输入000-111八个数据,输出端Y0-Y7将依次输出0。所以,我们可以依次选中四个译码器,向数据输入端写入数据来直接控制某个点阵的显示。
以上就是16*16点阵的滚动显示原理。
2.2.3 16*16点阵滚动显示的硬件设计
如图5就是本次设计的全部硬件电路图:
在设计16*16滚动显示的软件部分时,我们必须要明白其中的原理。本次设计中我们需要注意以下几个问题:第一,怎么样让点阵显示我们需要的字符,即我们如何获得字符显示的代码。第二,如何实现字符的滚动显示。第三,如何使画面保持稳定。 第一,如何取得代码。现在针对点阵的取字模软件很多,我们只需要打开软件,写入需要取字模的字,然后注意取字模的顺序,是横向还是纵向就行了。我们这里采用纵向取模,设置字模为C51格式。这样当写入的字确定后,我们就可以直接复制字模到程序中来实现相应功能。如“老”的字模就为:{0x02,0x10,0x22,0x10,0x22,0x20,0x22,0x20,0x22,0x40,0x22,0x7C,0xFE,0x92,0x23,0x12,0x23,0x22,0x22,0x22,0x26,0x42,0x2A,0x42,0x72,0x02,0x22,0x0E,0x02,0x00,0x00,0x00,/*"老",2*/}。 第二,如何实现滚动显示。为了实现字符的滚动显示,我们加入了定时中断函数,如下: - void timer1() interrupt 3
- {
- alt++;
- if(alt==10) //到一定的时间加以实现左移
- {
- alt=0;
- if(fangxiang==0) //如果是正向 正向移动
- {
- net=net+2;
- if(net>sl) //字移动数量
- net=0;
- }
- else //否则反向移动
- {
- net=net-2;
- if(net<2)
- net=sl; //字移动数量
- }
- }
- }
复制代码
电路原理图如下:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define data1 P0
- #define data2 P2
- sbit s1=P3^6;
- sbit s2=P3^7;
- bit fangxiang;
- uint alt=0,net=0,sl=128;
- bit mode;
- uchar code tab[]={
- //
- 0x20,0x08,0x24,0x10,0x22,0x60,0x21,0x80,0x26,0x41,0x39,0x32,0x02,0x04,0x0C,0x18,
- 0xF0,0x60,0x13,0x80,0x10,0x60,0x10,0x18,0x14,0x04,0x18,0x02,0x00,0x01,0x00,0x00,/*"欢",2*/
- 0x02,0x00,0x02,0x02,0x42,0x04,0x33,0xF8,0x00,0x04,0x00,0x02,0x3F,0xF2,0x20,0x22,
- 0x40,0x42,0x00,0x02,0x3F,0xFE,0x20,0x42,0x20,0x22,0x3F,0xC2,0x00,0x02,0x00,0x00,/*"迎",3*/
- 0x00,0x80,0x01,0x00,0x06,0x00,0x1F,0xFF,0xE0,0x00,0x02,0x08,0x04,0x30,0x18,0xC0,
- 0xF0,0x02,0x10,0x01,0x13,0xFE,0x10,0x00,0x10,0x80,0x14,0x60,0x18,0x18,0x00,0x00,/*"你",4*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",5*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/
- };
- void delay(uint z) //延时子函数
- {
- uchar x;
- for(;z>0;z--)
- for(x=110;x>0;x--);
- }
- void xianshi() //显示
- {
- uchar aa,i;
- for(i=0;i<16;i++)
- {
- P1=i; //列扫描
- data1=tab[net+aa]; //取出上8行数据输出
- aa++;
- data2=tab[net+aa]; //取出下8行数据输出
- aa++;
- delay(5); //延时
- data1=0; //清屏
- data2=0; //清屏
- P1=0x00; //消除余辉
- if(aa>30) aa=0; //字模地址
- }
-
- }
- void main() //主函数
- {
- ET1=1; //使能定时器0
- EA=1; //开启总中断
- TR1=1; //开始计数
- while(1) //无限循环
- {
- xianshi(); //显示
- if(s1==0) //检测按键
- {
- delay(30); //延时消抖
- TR1=~TR1; //按下暂停 ,暂按继续
- while(!s1)xianshi();
- delay(30);
- }
- if(s2==0) //检测按键
- {
- delay(30); //延时消抖
- fangxiang=~fangxiang; //方向取反
- while(!s2)xianshi();
- delay(30);
- }
- }
- }
-
- void timer1() interrupt 3
- {
- alt++;
- if(alt==10) //到一定的时间加以实现左移
- {
- alt=0;
- if(fangxiang==0) //如果是正向 正向移动
- {
- net=net+2;
- if(net>sl) //字移动数量
- net=0;
- }
- else //否则反向移动
- {
- net=net-2;
- if(net<2)
- net=sl; //字移动数量…………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载(含仿真+源码+论文+原理图):
111.zip
(525.24 KB, 下载次数: 806)
|