红外遥控与点阵显示器件的应用.docx
《红外遥控与点阵显示器件的应用.docx》由会员分享,可在线阅读,更多相关《红外遥控与点阵显示器件的应用.docx(27页珍藏版)》请在冰豆网上搜索。
红外遥控与点阵显示器件的应用
1软件及原理介绍
1.1Protuse软件简介
Proteus具有和其他EDA工具一样的原理图编辑、印刷电路板(PCB)设计及电路仿真功能,最大的特色是其电路仿真的交互化和可视化,如图2-1所示。
通过Proteus软件的VSM(虚拟仿真模式),用户可以对模拟电路、数字电路、模数混合电路、单片机及外围元器件等电子线路进行系统仿真。
Proteus软件由ISIS和ARES两部分构成,其中ISIS是一款便捷的电子系统原理设计和仿真平台软件,ARES是一款高级的PCB布线编辑软件。
ProteusISIS是一种操作简便而又功能强大的原理图编辑工具,它运行于Windows操作系统上,可以仿真、分析各种模拟器件和集成电路,该软件的特点有:
●实现了单片机仿真和SPICE电路仿真的结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真等功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
●支持主流单片机系统的仿真。
目前支持的单片机类型有68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
●提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeilC51uVision2等软件。
●具有强大的原理图绘制功能。
总之,该软件是一款集单片机和SPICE分析于一身的电路设计和仿真软件,功能极其强大。
PROTEUS还有使用极方便的印刷电路板高级布线编辑软件(PCB)。
特别指出,PROTEUS库中数千种仿真模型是依据生产企业提供的数据来建模的。
因此,PROTEUS设计与仿真极其接近实际。
目前,PROTEUS已成为流行的单片机系统设计与仿真平台,应用于各种领域。
实践证明:
PROTEUS是单片机应用产品研发的灵活、高效、正确的设计与仿真平台,它明显提高了研发效率、缩短了研发周期,节约了研发成本。
PROTEUS的问世,刷新了单片机应用产品的研发过程。
1.2Keil软件简介
KEIL是德国开发的一个51单片机开发软件平台,最开始只是一个支持C语言和汇编语言的编译器软件。
后来随着开发人员的不断努力以及版本的不断升级,使它已经成为了一个重要的单片机开发平台,不过KEIL的界面并不是非常复杂,操作也不是非常困难,很多工程师的开发的优秀程序都是在KEIL的平台上编写出来的。
可以说它是一个比较重要的软件,熟悉他的人很多很多,用户群极为庞大,要远远超过伟福等厂家软件用户群,操作有不懂的地方只要找相关的书看看,到相关的单片机技术论坛问问,很快就可以掌握它的基本使用了。
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。
机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。
掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
我们将通过一些实例来学习Keil软件的使用,在这一部份我们将学习如何输入源程序,建立工程、对工程进行详细的设置,以及如何将源程序变为目标代码。
1.3单片机介绍
单片机也被称为微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。
单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
早期的单片机都是8位或4位的。
其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。
此后在8031上发展出了MCS51系列单片机系统。
基于这一系统的单片机系统直到现在还在广泛使用。
随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。
90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。
随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。
而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。
当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。
而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。
事实上单片机是世界上数量最多的计算机。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
而个人电脑中也会有为数不少的单片机在工作。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!
单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。
只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
2设计原理或方法
2.1主要模块介绍
2.1.1MCS-51单片机的结构及编程方法
51单片机内包含下列几个部件:
一个8位CPU;
一个片内振荡器及时钟电路;
4KBROM程序存储器;
128BRAM数据存储器;
可寻址64KB外部数据存储器和64KB外部程序存储器空间的控制电路;
32条可编程的I/O线(4个8位并行I/O端口);
两个16位的定时/计数器;
一个可编程全双工串行口;
5个中断源、两个优先级嵌套中断结构。
图18051单片机的组成框图
(1)cpu中央处理器
运算器
运算器的功能是进行算数、逻辑运算。
它可以对半字、单字节等数据进行操作。
运算器还包含有一个布尔处理器,用来处理位操作。
程序计数器PC
程序计数器PC是一个自动加1的16位寄存器,用来存放即将要取出的指令码的地址,可对64KB程序存储器直接寻址。
指令寄存器
指令寄存器用于存放指令代码。
CPU执行指令时,由程序存储器中读出的指令代码送入指令寄存器,经指令译码器后由定时与控制电路发出相应的控制信号,完成指令功能。
(2)
存储器
MCS-51单片机按程序存储器可分为内部无ROM
型(如8031)和内部有ROM型(如8051)两种,
连接时引脚有区别。
如右图所示:
程序存储器:
一般将只读存储器(ROM)用做程序
存储器。
(3)特殊功能寄存器(SFR)
MCS-51有21个特殊功能寄存器(也称为专用寄存器),包括算术运算寄存器、指针寄存器、I/O口锁存器、定时器/计数器、串行口、中断、状态、控制寄存器等。
图280C51内部结构
(4)I/O接口
I/O接口是MCS-51单片机对外部实现控制和信息交换的必经之路,用于信息传送过程中的速度匹配和增加它的负载能力。
8051内部有4个8位并行接口P0,P1,P2,P3,有1个全双工的可编程串行I/O接口。
(5)定时器/计数器
8051内部有两个16位可编程序的定时器/计数器,均为二进制加1计数器,分别命名为T0和T1。
(6)中断系统
8051可处理5个中断源(2个外部,3个内部)发出的中断请求,并可对其进行优先权处理。
外部中断的请求信号可以从P3.2,P3.3引脚上输入,有电平或边沿两种触发方式;内部中断源有3个,2个定时器/计数器中断源和1个串行口中断源。
8051的中断系统主要由中断允许控制器IE和中断优先级控制器IP等电路组成。
2.1.216*16点阵LED
8×8单色点阵共需要64个发光二极管组成,且每个二极管是放置在行线与列线的叉点上。
下图为8×8点阵LED外观及引脚图,其等效电路如下图所示,只要其对应的X、Y轴顺向偏压,即可使LED发亮。
图38×8点阵外观及引脚图图48X8LED点阵等效电路
LED驱动显示采用动态扫描方法,动态扫描方式是逐行轮流点亮,这样扫描驱动电路就可以实现多行的同名列共用一套列驱动器。
以16×16点阵为例,把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第1行发光管亮灭的数据并锁存,然后选通第1行使其燃亮一定的时间,然后熄灭;再送出第2行的数据并锁存,然后选通第2行使其燃亮相同的时间,然后熄灭;….第16行之后,又重新燃亮第1行,反复轮回。
当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形。
该方法能驱动较多的LED,控制方式较灵活,而且节省单片机的资源。
显示数据传输采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。
但串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。
对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下,留给行显示的时间就太少了,以致影响到LED的亮度。
采用串行传输中列数据准备和列数据显示的时间矛盾,可以采用重叠处理的方法。
即在显示本行各列数据的同时,传送下一行的列数据。
为了达到重叠处理的目的,列数据的显示就需要有锁存功能。
对于列数据准备来说,它应能实现串入并出的移位功能。
这样,本行已准备好的数据打入并行锁存器进行显示时,串行移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。
(1)水平方向(X方向)扫描,即逐列扫描的方式(简称列扫描方式):
此时用一个P口输出列码决定哪一列能亮(相当于位码),用另一个P口输出行码(列数据),决定该行上那哪个LED亮(相当于段码)。
能亮的列从左到右扫描完16列(相当于位码循环移动16次)即显示出一个完整的图像。
LED点阵显示模块进行的方法有两种:
(2)竖直方向(Y方向)扫描,即逐行扫描方式(简称行扫描方式):
此时用一个P口输出决定哪一行能亮(相当于位码),另一个P口输出列码(行数据,行数据为将列数据的点阵旋转90度的数据)决定该行上哪些LED灯亮(相当于段码)。
能亮的行从上向下扫描完16行(相当于位码循环移位16次)即显示一帧完整的图像。
2.1.3红外控制相关介绍
红外遥控系统由发射和接收两大部份组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部份包括键盘矩阵、编码调制、LED红外发送器;接收部份包括光、电转换放大器、解调、解码电路。
图5红外遥控系统框图
HT6221键码的形成:
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。
2.2设计方案介绍
2.2.1设计总体思路
本次课程设计的要求是利用红外遥控器控制,在16×16点阵的显示器件上循环显示“武汉理工大学”6个汉字,控制项目:
循环显示的速度可调,循环显示进入方向(从左至右、从右至左、从上到下、从下往上)。
由于要用16*16点阵显示汉字,而80C51的I/O接口是8位的,我们可以用4个8*8点阵来组成。
由于80C51的I/O口不多(只有4组,32个),为了节约I/O口,我们用74HC154(4线-16译码器)作为点阵的列驱动,P2口和P0口作为数据线。
为了显示16*16的点阵汉字,我们需建一个表先将要显示的汉字的点阵码存起来,然后编写一个合适的查表程序就可以按给定要求显示汉字。
至于改变汉字移动的速度,可以通过用按键改变汉字在LED上的显示时间来改变,通过改变的数值大小就可以改变汉字的移动速度。
2.2.2与题目相关的具体设计
汉字的显示:
可以采用扫描的方式,先使一个I/O口产生一个选行(列)信号(通过74HC154),先选中一行,对选中的行进行扫描,然后用另外2组I/O口输送数据,这样一个字的1/16就送到LED点阵上了,接着选下一行,这样经过16次就可以显示一个字了,再适当延时使显示的字清晰。
汉字的移动:
在LED上显示一个汉字并延时后,可以通过增加所取表的地址(加2);这样下一次LED上显示的字就移动了一个点阵,可以通过适当的设计来控制汉字移动循环的的次数。
汉字的左右上下移动:
可以通过建立不同的表,来实现汉字的各种移动,或者改变查表的方式来实现。
3系统硬件线路设计图
4程序框图
系统初始化
选点阵行号并增一
是
否
是
否
是
否显示驱动程序流程图
是
否
是
否
是
否
否
是
否
系统主程序流程图
5资源分配
P1.0到P1.3接74HC154(4-16译码器)给16*16点阵提供选行信号。
P0.0到P0.7接16*16点阵的上半块作为数据线,给16*16点阵上部提供数据,点亮相应的LED,P2.0到P2.7接16*16点阵的下半块作为数据线,给16*16点阵下部提供数据,点亮相应的LED。
P1.4接开关,用于控制移动速度(减慢移动速度),P1.5接开关,用于控制移动速度(加快移动速度),P1.6接开关,用于控制系统的显示是否开始。
P1.0-P1.3
接译码器
P0.0-P0.7
接16*16点阵的上半块作为数据线
P2.0-P2.7
接16*16点阵的下半块作为数据线
P3.7
接红外
6源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey0=P3^7;
sbitkey1=P3^2;
ucharzt,z,speed,flag;
ucharcodehanzi[]={
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
//"武",
0xfb,0x0fb,0xfb,0xf9,0xdb,0x03,0xdb,0xfb,
0xdb,0xfb,0xd8,0x07,0x9b,0x77,0xdb,0x77,
0xfb,0xf7,0x00,0x3f,0xfb,0xc7,0xbb,0xfb,
0xcb,0xfd,0xfb,0xfe,0xfb,0xf8,0xff,0xff,
//"汉",
0xf7,0xdf,0xbb,0xdf,0xd9,0x81,0xcf,0x7f,
0xfe,0xfe,0xdf,0xfd,0xd1,0xfb,0xde,0x77,
0xdf,0xaf,0xdf,0xdf,0xdf,0x2f,0xdc,0xf7,
0x83,0xf9,0xdf,0xfc,0xff,0xfd,0xff,0xff,
//"理",
0xdd,0xf7,0xdd,0xf3,0xc0,0x07,0x9d,0xef,
0xdd,0xed,0xff,0xed,0x80,0xdd,0xb6,0xdd,
0xb6,0xdd,0x80,0x01,0xb6,0xdd,0xb6,0x9d,
0x00,0xdd,0xbf,0xf9,0xff,0xfd,0xff,0xff,
//"工",
0xff,0xfb,0xdf,0xfb,0xdf,0xfb,0xdf,0xfb,
0xdf,0xfb,0xdf,0xfb,0xdf,0xfb,0xc0,0x03,
0xdf,0xfb,0xdf,0xfb,0xdf,0xfb,0xdf,0xfb,
0x9f,0xfb,0xdf,0xf3,0xff,0xfb,0xff,0xff,
//"大",
0xfb,0xff,0xfb,0xfd,0xfb,0xfd,0xfb,0xfb,
0xfb,0xf7,0xfb,0xcf,0xfa,0x3f,0x01,0xff,
0xfa,0x7f,0xfb,0x9f,0xfb,0xef,0xfb,0xf7,
0xfb,0xfb,0xf3,0xf9,0xfb,0xfb,0xff,0xff,
//"学",
0xfd,0xdf,0xf3,0xdf,0x77,0xdf,0x96,0xdf,
0xf6,0xdf,0xf6,0xdd,0x76,0xde,0x96,0x81,
0xf6,0x9f,0xf6,0x5f,0xe6,0xdf,0xd7,0xd7,
0x37,0xdf,0xf5,0x9f,0xf3,0xdf,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
};
ucharcodelie[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
voiddelay(ucharx)//延时函数
{
uchari,j;
for(i=0;ifor(j=0;j<120;j++);
}
voidscanf_dir()//判断按键
{
if(key0==0)
{
delay(3);
if(key0==0)
{
zt++;
while(!
key0);
if(zt==4)
zt=0;
}
}
}
//显示汉字将编号为c的汉字从第b条开始显示n条到屏幕的l条开始
voidleft()//左移动
{
uchari,zishu,x;
P1=0x00;
for(zishu=0;zishu<6;zishu++)//6个字
{
P0=0xff;
P2=0xff;
for(x=0;x<16;x++)//从左向右移动16次,(第一屏、第二屏。
。
。
。
)
{
if(zt!
=0)
break;
for(z=0;zfor(i=0;i<16;i++)//16列循环显示
{
scanf_dir();
if(zt!
=0)
break;
P1=lie[i];
P0=~hanzi[2*i+zishu*32+x*2];
P2=~hanzi[2*i+zishu*32+x*2+1];
/*例:
开始显示第一列,显示数组的P0第一个数据和P1第二个数据
第二列,显示数组的P0第三个P1第四个数据.当显示第二屏时,第一列显示的为数组的
第五个和第六个数据,第二列为第7和第8个数据,当显示第十六屏的时候,第一列显示的数据
为第33和第34个,第二列为第35个和36个,即加了32*zishu个*/
delay(3);
P0=0xff;
P2=0xff;
}
}
}
}
voidshowc(ucharc,ucharb,ucharn,ucharl)//右移动辅助函数
{
uchari;
for(i=0;i{
scanf_dir();
if(zt!
=1)
break;
P1=lie[i+l];
P0=~hanzi[c*32+i*2+b*2];
P2=~hanzi[c*32+i*2+1+b*2];
delay(3);
P0=0xff;
P2=0xff;
}
}
voidright()//右移动
{
uchari,zishu;
P1=0x00;
for(zishu=0;zishu<6;zishu++)
{
for(i=0;i<16;i++)
{
if(zt!
=1)
break;
for(z=0;z{
showc(zishu,0,16-i,i);
showc(zishu+1,15-i,i,0);
}
}
}
}
voidup()//上移动
{
uchari,zishu,y,n;
uchart1,t2,t3;
P1=0x00;
for(zishu=0;zishu<6;zishu++)
{
P0=0xff;P2=0xff;
for(n=0;n<2;n++)
for(y=0;y<8;y++)
{
if(zt!
=2)
break;
for(z=0;zfor(i=0;i<16;i++)
{
scanf_dir();
if(zt!
=2)
break;
if(n==0)
{
t1=~hanzi[2*i+zishu*32];
t2=~hanz