单片机IO口扩展设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机I/O口扩展实验
摘要:本设计随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中流水灯的应用就是一个典型的例子,特别在商业广告领域有重要的应用,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
关键词:单片机,控制,8X8 LED点阵,流水灯,AT89C52,动态显示
1.引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的是单片机的一些简单的应用,最小系统的复位,INT0和INT1的一些应用来控制输出,达到控制彩灯(流水灯)。
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
本系统采用单片机AT89C52为中心器件,用8*8位LED显示元件XY1588ASR(24脚共阳管)来设计控制彩灯(流水灯),系统实用性强、操作简单、扩展性强。
也可以为我们更好地了解单片机的应用加深我们对单片机的认识,对我们以后的学习都带来很大的帮助。
2.总体设计方案
2.1设计内容与设计思路及关键技术
单片机采用用AT89C52芯片,控制彩灯(流水灯)。
8X8LED点阵流水灯设计将在8X8LED 点阵显示上移流水灯显示,然后循环显示。
P1口涉及下载线,而P3口的P3.2和P3.3作用于外部中断,所以就用P0和P2口来控制滚动显示文字,通过P0口接8*8位LED阳极,P2口接8*8位LED负极来不断扫描显示。
2.2 设计方框图
流水灯设计总体设计方框图如图1所示,控制器采用单片机AT89C52,用8*8位LED 显示元件XY1588ASR (24脚共阳管)。
图1 广告牌设计总体设计方框图
主控制器采用低功耗,高性能COMS 8位单片机AT89C52芯片;单片机复位则由最小系统决定,由电源复位产生;时钟振荡则由12MHz 的晶振产生;LED 显示则由用8*8位LED 显示元件XY1588ASR (24脚共阳管)来设计。
2.3.8X8点阵LED 工作原理说明
8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列(Y )置1电平,某一行(X )置0电平,则相应的二极管就亮。
流水灯
AT89C51
单 片 机 编写程序
图2.8X8点阵LED结构图
从图2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:
一根竖柱:对应的列置1,而行则采用扫描的方法来实现。
一根横柱:对应的行置0,而列则采用扫描的方法来实现。
2.5.流水灯设计的总电路图
流水灯设计的总电路图在最小系统的基础上加上了由9014三极管驱动的蜂鸣器、外部中断的两个开关(实现外部中断控制)、P0和P2口的跳线(实现外扩展)、还有用三极管驱
动的8*8位LED显示元件XY1588ASR(24脚共阳管)。
图4.总电路图
2.7.仿真运行效果图
最终调试仿真运行结果如下图:
图6.效果图
3.单片机I/O口扩展程序的主程序
#include <atmel\regx52.h>
#define int8 unsigned char
#define int16 unsigned int
#define int32 unsigned long
int8 code num_tab[][8]={
/*--8*8--阴码--逐行扫描--逆向(低位在前)--*/
{0x00,0x00,0x00,0x38,0x44,0x38,0x00,0x00},/*"0",0*/ {0x00,0x00,0x40,0x78,0x48,0x00,0x00,0x00},/*"1",1*/ {0x00,0x00,0x00,0x4C,0x54,0x6C,0x00,0x00},/*"2",2*/ {0x00,0x00,0x00,0x74,0x4C,0x6C,0x00,0x00},/*"3",3*/ {0x00,0x00,0x00,0x7C,0x28,0x10,0x00,0x00},/*"4",4*/ {0x00,0x00,0x00,0x74,0x54,0x7C,0x00,0x00},/*"5",5*/ {0x00,0x00,0x70,0x54,0x54,0x38,0x00,0x00},/*"6",6*/ {0x00,0x00,0x04,0x7C,0x04,0x00,0x00,0x00},/*"7",7*/ {0x00,0x00,0x00,0x6C,0x54,0x6C,0x00,0x00},/*"8",8*/ {0x00,0x00,0x00,0x3C,0x54,0x1C,0x00,0x00},/*"9",9*/ {0x00,0x00,0x00,0x38,0x44,0x38,0x00,0x00},/*"0",10*/ {0x00,0x00,0x40,0x78,0x58,0x68,0x00,0x00},/*"a",11*/
{0x00,0x00,0x78,0x48,0x7C,0x00,0x00,0x00},/*"b",12*/ {0x00,0x00,0x00,0x48,0x48,0x70,0x00,0x00},/*"c",13*/ {0x00,0x00,0x00,0x7C,0x48,0x78,0x00,0x00},/*"d",14*/ {0x00,0x00,0x58,0x58,0x70,0x00,0x00,0x00},/*"e",15*/ {0x00,0x00,0x00,0x4C,0x7C,0x48,0x00,0x00},/*"f",16*/ {0x00,0x08,0xD8,0xD8,0xF8,0x00,0x00,0x00},/*"g",17*/ {0x00,0x00,0x78,0x08,0x7C,0x00,0x00,0x00},/*"h",18*/ {0x00,0x00,0x40,0x7C,0x48,0x00,0x00,0x00},/*"i",19*/ {0x00,0x00,0x00,0xFC,0x88,0x00,0x00,0x00},/*"j",20*/ {0x00,0x00,0x48,0x78,0x7C,0x00,0x00,0x00},/*"k",21*/ {0x00,0x00,0x40,0x7C,0x44,0x00,0x00,0x00},/*"l",22*/ {0x00,0x00,0x00,0x78,0x78,0x78,0x00,0x00},/*"m",23*/ {0x00,0x00,0x78,0x08,0x78,0x00,0x00,0x00},/*"n",24*/ {0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x00},/*"o",25*/ {0x00,0x00,0x78,0xC8,0xF8,0x00,0x00,0x00},/*"p",26*/ {0x00,0x00,0x00,0xF8,0xC8,0x78,0x00,0x00},/*"q",27*/ {0x00,0x00,0x08,0x48,0x78,0x48,0x00,0x00},/*"r",28*/ {0x00,0x00,0x68,0x68,0x58,0x00,0x00,0x00},/*"s",29*/ {0x00,0x00,0x00,0x40,0x7C,0x08,0x00,0x00},/*"t",30*/ {0x00,0x00,0x78,0x40,0x78,0x00,0x00,0x00},/*"u",31*/ {0x00,0x08,0x38,0x40,0x38,0x08,0x00,0x00},/*"v",32*/ {0x00,0x08,0x78,0x18,0x68,0x18,0x00,0x00},/*"w",33*/ {0x00,0x00,0x48,0x78,0x78,0x48,0x00,0x00},/*"x",34*/ {0x00,0x00,0x08,0x38,0xD8,0x88,0x00,0x00},/*"y",35*/ {0x00,0x00,0x48,0x78,0x68,0x00,0x00,0x00}/*"z",36*/ };
void delay(void);
int8 n;
int8 delta_p;
int8 *p;
void main(void){
int8 i;
int8 j;
p=&num_tab[0][0];
TMOD=0x01;
TH0=0xfc;
TL0=0x18;
ET0=1;
EA=1;
TR0=1;
while(1)
{
for(i=0;i<8;i++){
delay();
P0=*(p+delta_p);
P2=i|0x18;
p++;
if(p>&num_tab[0][7])
p=&num_tab[0][0]; }
}
}
void delay(void){
int16 i;
for(i=0;i<500;i++);
}
void timer0() interrupt 1 using 3 {
TF0=0;
TH0=0xfc;
TL0=0x18;
if(n<200)
{
n++;
}
else
{
n=0;
if(delta_p>240)
delta_p=0;
else
delta_p+=2;
}
}
4.系统硬件电路
4.1.芯片由AT89C52的主要特性
•与MCS-51 兼容
•寿命:>1000写/擦循环ISP FLASH ROM •32可编程I/O线
•3个16位定时器/计数器
•2个外部中断源
•可编程串行通道
•低功耗的闲置和掉电模式
•片内振荡器和时钟电路
4.2.管脚说明
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0 RXD(串行输入口) P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
5.总结与体会
本系统是以单片机AT89C52芯片为核心部件,完成8X8LED点阵流水灯设计在8X8LED 点阵显示上移流水灯功能。
我上网找资料,上图书馆,尽可能的了解有关于单片机的基本原理,8X8LED点阵显示技术和动态显示等这方面的知识。
使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能有了更进一步的提高。
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,也从中学会了很多。
经过将近二周的单片机课程设计,终于完成了我的单片机I/O口扩展的设计,基本上达到实验的目的。
希望这次的经验可以对以后的学习带来更好的帮助。
6.参考文献
[1]李朝青.单片机原理及接口技术(第3版).北京航天航空大学出版社,2005年10月.
[2]求是科技.单片机典型外围器件及应用实例.北京:人民邮电出版社,2006年2月
[3]辛友顺.单片机应用系统设计与实现.2005年3月
[4]戴胜华.单片机原理与应用. 2005年4月。