上一篇 / 下一篇 2008-03-05 16:42:43 / 个人分类:自己需要的收藏品
51系列单片机8031、8051及89c51/89s51均采用40Pin封装的双列直接DIP结构。下图是它们的引脚配置:40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明:
Pin20: Pin40:
Pin19:Pin18:时钟XTAL2脚,片内振荡电路的输出端。
8051的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。另外一种是外部时钟方式,即将XTAL1接地,外部时
Pin39-Pin32
Pin9:复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。
8051的复位方式可以是自动复位,也可以是手动复位,见下图。此外,还是一复用脚,掉电期间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
Pin30:当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。
如果单片机是EPROM,在编程其间,将用于输入编程脉冲。
Pin29:当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
Pin31:程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。
3.系统板上硬件连线
(1).把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(2).把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
(3).把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;
4.相关基本知识
(1).动态数码显示的方法
(2).独立式按键识别过程
(3).“时”,“分”,“秒”数据送出显示处理方法
5.汇编源程序
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
HOURK BIT P0.0
MINITEK BIT P0.1
SECONDK BIT P0.2
DISPBUF EQU 40H
DISPBIT EQU 48H
T2SCNTA EQU 49H
T2SCNTB EQU 4AH
TEMP EQU 4BH
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV SECOND#00H
MOV MINITE#00H
MOV HOUR#12
MOV DISPBIT#00H
MOV T2SCNTA#00H
MOV T2SCNTB#00H
MOV TEMP#0FEH
LCALL DISP
MOV TMOD#01H
MOV TH0#(65536-2000) / 256
MOV TL0#(65536-2000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: JB SECONDKNK1
LCALL DELY10MS
JB SECONDKNK1
INC SECOND
MOV ASECOND
CJNE A#60NS60
MOV SECOND#00H
NS60: LCALL DISP
JNB SECONDK$
NK1: JB MINITEKNK2
LCALL DELY10MS
JB MINITEKNK2
INC MINITE
MOV AMINITE
CJNE A#60NM60
MOV MINITE#00H
NM60: LCALL DISP
JNB MINITEK$
NK2: JB HOURKNK3
LCALL DELY10MS
JB HOURKNK3
INC HOUR
MOV AHOUR
CJNE A#24NH24
MOV HOUR#00H
NH24: LCALL DISP
JNB HOURK$
NK3: LJMP WT
DELY10MS:
MOV R6#10
D1: MOV R7#248
DJNZ R7$
DJNZ R6D1
RET
DISP:
MOV A#DISPBUF
ADD A#8
DEC A
MOV R1A
MOV AHOUR
MOV B#10
DIV AB
MOV @R1A
DEC R1
MOV AB
MOV @R1A
DEC R1
MOV A#10
MOV @R1A
DEC R1
MOV AMINITE
MOV B#10
DIV AB
MOV @R1A
DEC R1
MOV AB
MOV @R1A
DEC R1
MOV A#10
MOV @R1A
DEC R1
MOV ASECOND
MOV B#10
DIV AB
MOV @R1A
DEC R1
MOV AB
MOV @R1A
DEC R1
RET
INT_T0:
MOV TH0#(65536-2000) / 256
MOV TL0#(65536-2000) MOD 256
MOV A#DISPBUF
ADD ADISPBIT
MOV R0A
MOV A@R0
MOV DPTR#TABLE
MOVC A@A+DPTR
MOV P1A
MOV ADISPBIT
MOV DPTR#TAB
MOVC A@A+DPTR
MOV P3A
INC DISPBIT
MOV ADISPBIT
CJNE A#08HKNA
MOV DISPBIT#00H
KNA: INC T2SCNTA
MOV AT2SCNTA
CJNE A#100DONE
MOV T2SCNTA#00H
INC T2SCNTB
MOV AT2SCNTB
CJNE A#05HDONE
MOV T2SCNTB#00H
INC SECOND
MOV ASECOND
CJNE A#60NEXT
MOV SECOND#00H
INC MINITE
MOV AMINITE
CJNE A#60NEXT
MOV MINITE#00H
INC HOUR
MOV AHOUR
CJNE A#24NEXT
MOV HOUR#00H
NEXT: LCALL DISP
DONE: RETI
TABLE: DB 3FH06H5BH4FH66H6DH7DH07H7FH6FH40H
TAB: DB 0FEH0FDH0FBH0F7H0EFH0DFH0BFH07FH
END
6.C语言源程序
#include
unsigned char code dispcode[]={0x3f0x060x5b0x4f
0x660x6d0x7d0x07
0x7f0x6f0x770x7c
0x390x5e0x790x710x00};
unsigned char dispbitcode[]={0xfe0xfd0xfb0xf7
0xef0xdf0xbf0x7f};
unsigned char dispbuf[8]={0016001600};
unsigned char dispbitcnt;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char mstcnt;
unsigned char ij;
void main(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(P0_0==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second;
dispbuf=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf=minite;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==8)
{
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second;
dispbuf=second/10;
dispbuf=minite;
dispbuf[4]=minite/10;
dispbuf[6]=hour;
dispbuf[7]=hour/10;
}
}
TAG:
清空Cookie - 联系我们 - 云南博客 - 交流论坛 - 空间列表 - 站点存档 - 升级自己的空间
Powered by 3.0.5 2001-2007 Comsenz Inc.
Last update: 2008-4-24 11:3:5
引文来源 单片机资料收集 - 带上微笑让每一天都很充实很快乐! - 云南博客 - powered by X-Space
