51单片机最小系统
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
制作训练
单片机最小系统电路板硬件设计
单片机最小系统电路板可选用AT89C51、AT89C52等DIP-40封装的单片机作为MCU。系统包括时钟电路,复位电路,扩展了片外数据存储器和地址锁存器。系统还设置了8个并行键盘S1~S4,S6~S9,6个共阳极LED数码管LED1~LED6。系统无需扩展程序存储器,用户可根据系统程序大小选择片内带不同容量闪存的单片机,例如PHILIPS半导体公司推出的P89C66X Flash单片机,其片内Flash ROM容量最大可达64KB。系统还提供基于8279的通用键盘显示电路、液晶显示模块、A/D及D/A转换等众多外围器件和设备接口。单片机最小系统原理框图如图4.1.1所示。最小系统电路原理图如图4.1.2所示。LED数码管和并行键盘电路原理图如图4.1.3所示。
图4.1.1单片机最小系统原理框图
图4.1.2 单片机最小系统电原理图
图4.1.3 LED数码管和并行键盘电路原理图
单片机时钟信电路原理图如图4.1.4所示。在引脚XTAL1和XTAL2跨接晶振Y1和微调电容C5,C6就构成了内部振荡方式,由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。其中Y1是可插拔更换的,默认值是12MHz。
图4.1.4 时钟源
系统板采用上电自动复位和按键手动复位方式。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。其电路原理图如图4.1.5所示。上电自动复位通过外部复位电容C4充电来实现。按键手动复位是通过复位端经电阻和Vcc接通而实现的。二极管用来防止反相放电。
图4.1.5 复位电路原理图
系统板扩展了一片32K的数据存储器62256,如图4.1.6所示。数据线D0~D7直接与单片机的数据地址复用口P0相连,地址的低8位A0~A7则由U15锁存器74LS373获得,地址的高7位则直接与单片机的P2.0~P2.6相连。片选信号则由地址线A15(P2.7引脚)获得,低电平有效。这样数据存储器占用了系统从0X0000H~0X7FFFH的XDATA空间。
图4.1.6数据存储器的扩展
系统板设置了8个并行键盘S1~S4,S6~S9,6个共阳极LED数码管LED1~LED6。其电路原理图如图4.1.2所示。可以看出为了节省单片机的I/O口,在此采用了两片74LS373锁存器U15和U16扩展了8个I/O口。U15用来锁存P0口送出的地址信号,它的片选信号
接地,
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示一直有效,其控制端C接ALE信号。U16的输出端通过限流电阻R8~R15与数码管的段码数据线和并行键盘相连,用来送出LED数码管的段码数据信号和并行键盘的扫描信号,它的片选信号
接地,表示一直有效,其数据锁存允许信号C由CS0~CS6和WR信号经一个或非门74LS02得到(其中CS0~CS5控制LED数码管,CS6控制键盘),这样只有当CS0~CS6中的某一个和WR同时有效且由低电平跳变到高电平时,输入的数据D0~D7即被输出到输出端Q0~Q7。U17为3-8译码器74LS138,通过它将高位地址A15~A12译成8个片选信号CS0~CS7。它的G2,G3端接地,G1接A15,所以A15应始终为高电平,这样CS0~CS7的地址就分别为8000H,9000H,0A000H,0B000H,0C000H,0D000H,0E000H,0F000H。CS0~CS5和WR信号经过一个或非门控制三极管9012的导通,从而控制LED数码管的导通,并且三极管9012用来增强信号的驱动能力。
主要器件如表4.1.1所示:
表4.1.1单片机最小系统主要器件
标号
型号
功能说明
U7
DIP-40
CPU主器件
U15,U16
74LS373
数据,地址锁存器
U17
74LS138
138译码器
U18
62265
32K RAM
U3A,U3B,U3C,U3D,U4C,U4D
74LS02
TTL或非门
U5A,U5B,U5C,U5D
74LS00
TTL与非门
LED2,LED3
7SEG-3
3位8段共阳极数码管
Q1~Q6
9012
三极管
D1~D16
IN4148
开关二极管
Y1
12MHz石英晶振
单片机时钟晶振
主要应用接口如表4.1.2所示:
表4.1.2单片机最小系统主要应用接口
标号
功能说明
连接目标
U1
输入电源插座
主电源
J2
8279的通用键盘显示电路接口
8279芯片
J4
MDLS字符型液晶显示器接口
MDLS字符型液晶显示模块
J5
LMA97S005AD点阵液晶显示器接口
LMA97S005AD点阵型液晶显示模块
单片机最小系统电路板测试程序设计
编写测试程序,一是可对最小系统电路板各资源进行测试,二是为用户提供了使用LED显示及访问键盘等各种资源的子程序。
1. 键盘扫描及数码管显示的汇编语言程序
键盘扫描及数码管显示的汇编语言程序如下:
;************************* **********************************
;键盘及数码管显示程序,功能为按下一键,则对应键的数码管亮并显示该键代表的数字
;编写:cgq
;最后修改日期:2003/11/16
;************************************************************
org 0000h
ajmp main
org 0100h
main: mov sp,#30h
mov r3,#0
mov r4,#0
kon: lcall ks1 ;调用读键盘程序
cjne a,#0ffh,show1 ;有键按下
lcall dir ;调用显示子程序
ajmp kon
show1:lcall dir ;去抖动
lcall dir
lcall ks1
cjne a,#0ffh,show2 ;键有效
ajmp kon
show2:cjne a,#0feh,l1 ;以下为判别键值程序
mov r4,#0 ;第一个键赋其代码0
ajmp lkp
l1:cjne a,#0fdh,l2
mov r4,#1
ajmp lkp
l2: cjne a,#0fbh,l3
mov r4,#2
ajmp lkp
l3:cjne a,#0f7h,l4
mov r4,#3
ajmp lkp
l4:cjne a,#0efh,l5
mov r4,#4
ajmp lkp
l5:cjne a,#0dfh,lkp
mov r4,#5
ajmp lkp
lkp:lcall dir
ljmp kon ;返回
dir: mov dptr,#table ;显示子程序
mov a,r4
movc a,@a+dptr ;取7段码
mov r3,a
mov a,r4
led1:cjne a,#0,led2 ;根据键值选择数码管1
mov dptr,#8000h
ajmp ss
led2:cjne a,#1,led3 ;根据键值选择数码管2
mov dptr,#9000h
ajmp ss
led3:cjne a,#2,led4 ;根据键值选择数码管3
mov dptr,#0a000h
ajmp ss
led4: cjne a,#3,led5 ;根据键值选择数码管4
mov dptr,#0b000h
ajmp ss
led5:cjne a,#4,led6 ;根据键值选择数码管5
mov dptr,#0c000h
ajmp ss
led6:cjne a,#5,ss ;根据键值选择数码管6
mov dptr,#0d000h
ajmp ss
ss: mov a,r3
movx @dptr,a
lcall delay
ret
ks1:clr p1.7
mov dptr,#0e000h ;键盘地址
movx a,@dptr
ret
delay: mov r6,#10 ;延时子程序
lpp: mov r7,#100
djnz r7,$
djnz r6,lpp
ret
table: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
db 88h,83h,0c6h,0a1h,86h,8eh,0ffh,0f7h
end
2. 键盘扫描及数码管显示的C语言程序
键盘扫描及数码管显示的C语言程序如下:
/**************************************************/
/*键盘及数码管程序,每一键代表一个数字,在其数字代表的数码管中显示*/
/*最后修改日期:2003/11/16 */
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define LED1 XBYTE [0x8000] /*定义各数码管地址*/
#define LED2 XBYTE [0x9000]
#define LED3 XBYTE [0xA000]
#define LED4 XBYTE [0xB000]
#define LED5 XBYTE [0xC000]
#define LED6 XBYTE [0xD000]
#define KEY XBYTE [0xE000]/*定义键盘地址*/
void delay(uint v) /*延时函数*/
{
while(v!=0)v--;
}
uchar keynum=0;
sbit P1_7=P1^7; /*扫描端口*/
/*数字段码表*/
uchar code segtab[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xf7};
void dir(uchar); /*声明显示函数*/
void readkey(void) /*读键盘函数*/
{
uchar M_key=0;
uchar i;
P1_7=0;
M_key=KEY; /*取键盘数据*/
if(M_key!=0xff)
{
for(i=0;i<20;i++) /*去抖动*/
dir(keynum);
M_key=KEY;
if(M_key!=0xff) /*读键*/
switch(M_key)
{
case 0xfe: /*第1个键按下*/
keynum=0;
break;
case 0xfd: /*第2个键按下*/
keynum=1;
break;
case 0xfb: /*第3个键按下*/
keynum=2;
break;
case 0xf7: /*第4个键按下*/
keynum=3;
break;
case 0xef: /*第5个键按下*/
keynum=4;
break;
case 0xdf: /*第6个键按下*/
keynum=5;
break;
}
}
}
void dir(keynum) /*显示函数*/
{
switch(keynum)
{
case 0:
LED1=segtab[0];delay(100);
break;
case 1:
LED2=segtab[1];delay(100);
break;
case 2:
LED3=segtab[2];delay(100);
break;
case 3:
LED4=segtab[3];delay(100);
break;
case 4:
LED5=segtab[4];delay(100);
break;
case 5:
LED6=segtab[5];delay(100);
break;
}
}
void main() /*主函数*/
{
while(1)
{
dir(keynum); /*调用显示函数*/
readkey(); /*调用键盘函数*/
}
}