基于AT89C51单片机的最小系统设计.docx
《基于AT89C51单片机的最小系统设计.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机的最小系统设计.docx(24页珍藏版)》请在冰豆网上搜索。
基于AT89C51单片机的最小系统设计
基于AT89C51单片机的最小系统设计
组员:
田竹、王维、袁倍明
摘要:
本次实验课题为设计一个基于AT89C51单片机的最小系统。
用P1口设计流水灯,用P2口和P0口分别作段选和位选设计了六位数码管的静动态显示和简易的电子钟,用P3口设计了一个4*4的矩阵键盘,并用蜂鸣器实现了唱歌功能和键盘按下的声响,用62256扩展部RAM,还扩展并实现了LCD1602的静动态显示,最后通过ADC0809和DAC0832分别实现了A/D、D/A转换功能。
一、系统电源
用MC7805集成稳压器将输入电压转为+5V稳压给系统供电。
二、晶振〔12MHZ〕及复位电路
采用12MHz的外部晶振,给系统提供时钟信号。
并采用了按键复位电路。
三、流水灯
功能描述:
让8个led灯循环闪烁
源程序:
流水灯
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVA,#11111110B
LOOP:
MOVP1,A;给P1口送值
LCALLDLY
RLA;循环左移
LJMPLOOP
DLY:
MOVR7,#250;延时子程序
DLY1:
MOVR6,#200
DJNZR6,$
DJNZR7,DLY1
RET
END
四、数码管
功能描述:
数码管动态显示1~6
源程序:
ORG0000H
LJMPSTART
ORG0100H
START:
MOVP0,#0
MOVP2,#0F9H
SETBP0.0
LCALLDELAY
CLRP0.0
MOVP2,#0C4H
SETBP0.1
LCALLDELAY
CLRP0.1
MOVP2,#0D0H
SETBP0.2
LCALLDELAY
CLRP0.2
MOVP2,#99H
SETBP0.3
LCALLDELAY
CLRP0.3
MOVP2,#92H
SETBP0.4
LCALLDELAY
CLRP0.4
MOVP2,#82H
SETBP0.5
LCALLDELAY
CLRP0.5
LJMPSTART
DELAY:
MOVR5,#10
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
END
五、4*4矩阵键盘和蜂鸣器
功能描述:
通过按键让数码管显示0-F,按键按下时,蜂鸣器响一下。
源程序:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVP0,#0FFH
MOVB,#4
MOVP3,#0F0H;列置0,看行电平
JNBP3.4,L1
JNBP3.5,L2
JNBP3.6,L3
JNBP3.7,L4
AJMPMAIN
L1:
MOVR1,#0
AJMPLL1
L2:
MOVR1,#1
AJMPLL1
L3:
MOVR1,#2
AJMPLL1
L4:
MOVR1,#3
AJMPLL1
LL1:
ACALLDL10MS;消抖
MOVA,P3
XRLA,#0F0H
JZMAIN
MOVP3,#0FH;行置0,看列电平
JNBP3.0,L5
JNBP3.1,L6
JNBP3.2,L7
JNBP3.3,L8
L5:
MOV20H,#0
AJMPKEY
L6:
MOV20H,#1
AJMPKEY
L7:
MOV20H,#2
AJMPKEY
L8:
MOV20H,#3
AJMPKEY
KEY:
MOVA,R1;计算键值并查表赋值
MULAB
ADDA,20H
MOVR2,A
MOVDPTR,#TABLE
MOVA,R2
MOVCA,A+DPTR
MOVP2,A
CALLBEEP_BL
LCALLDELAY
LJMPMAIN
BEEP_BL:
CLRP2.7;蜂鸣器子程序
ACALLDELAY
SETBP2.7
RET
DELAY:
MOVR5,#50;延时
D1:
MOVR6,#20
D2:
MOVR7,#50
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
DL10MS:
MOVR7,#05H
LOOP1:
MOVR6,#0F9H
LOOP2:
NOP
NOP
DJNZR6,LOOP2
DJNZR7,LOOP1
RET
TABLE:
DB0A0H,0F9H,0C4H,0D0H,99H
DB92H,82H,0F8H,80H,90H
DB88H,83H,0A6H,0C1H,86H
DB8EH
END
六、时钟
功能描述:
在数码管上实现时钟功能,并通过矩阵键盘的3个键实现复位,调时,调分。
源程序:
ORG0000H
LJMP1000H
ORG001BH
AJMP0100H
ORG0100H
MOVTH1,#0D8H
MOVTL1,#0F0H
DJNZ69H,TT1
MOV69H,#100
SETB4FH
TT1:
RETI;中断延时
ORG1000H
MOV30H,#1
MOV31H,#2
MOV32H,#0
MOV33H,#0
MOV34H,#0
MOV35H,#0
MOVTMOD,#10H
MOVTH1,#0D8H
MOVTL1,#0F0H
MOVIE,#88H
XS0:
SETBTR1
MOV69H,#100
CLR4FH
XS00:
LJMPKEYKEY;判断按键有无按下
LX1:
CJNEA,#0A0H,LX2
LJMPP100
LX2:
CJNEA,#0F9H,LX3
LJMPP1000
LX3:
CJNEA,#0C4H,XS
LJMPP10000
XS:
MOV40H,#01H
MOVDPTR,#TAB
MOVP0,40H
MOVA,30H
MOVCA,A+DPTR
MOVP2,A
LCALLYS1MS
MOVP2,#0FFH
MOVA,#42H
MOV40H,A
MOVP0,40H
MOVA,31H
ADDA,#10
MOVCA,A+DPTR
MOVP2,A
LCALLYS1MS
MOVP2,#0FFH
MOVA,#44H
MOV40H,A
MOVP0,40H
MOVA,32H
MOVCA,A+DPTR
MOVP2,A
LCALLYS1MS
MOVP2,#0FFH
MOVA,#48H
MOV40H,A
MOVP0,40H
MOVA,33H
ADDA,#10
MOVCA,A+DPTR
MOVP2,A
LCALLYS1MS
MOVP2,#0FFH
MOVA,#50H
MOV40H,A
MOVP0,40H
MOVA,34H
MOVCA,A+DPTR
MOVP2,A
LCALLYS1MS
MOVP2,#0FFH
MOVA,#60H
MOV40H,A
MOVP0,40H
MOVA,35H
MOVCA,A+DPTR
MOVP2,A
LCALLYS1MS
MOVP2,#0FFH
MOVA,#40H
MOV40H,A
JNB4FH,LLLL1
CLR4FH
LJMPJIA
LLLL1:
LJMPXS00
P100:
MOV30H,#0
MOV31H,#0
MOV32H,#0
MOV33H,#0
MOV34H,#0
MOV35H,#0
JIA:
MOVR1,#14H
MOVA,35H
CJNEA,#9,JIA1
MOV35H,#0
MOVA,34H
CJNEA,#5,JIA10
MOV34H,#0
P10000:
MOVA,33H
CJNEA,#9,JIA100
MOV33H,#0
MOVA,32H
CJNEA,#5,JIA1000
MOV32H,#0
P1000:
MOVA,31H
CJNEA,#9,JIA10000
MOV31H,#0
MOVA,30H
CJNEA,#2,JIA100000
MOV30H,#0
AJMPXS
JIA100000:
INC30H
AJMPXS0
JIA10000:
CJNEA,#3,JIAJIA
MOVA,30H
CJNEA,#02,JIAJIA
MOV30H,#0
MOV31H,#0
AJMPXS0
JIAJIA:
INC31H
AJMPXS0
JIA1000:
INC32H
AJMPXS0
JIA100:
INC33H
AJMPXS0
JIA10:
INC34H
AJMPXS0
JIA1:
INC35H
AJMPXS0
RET
YS1MS:
MOVR6,#9H
YL1:
MOVR7,#19H
DJNZR7,$
DJNZR6,YL1
RET
DL10MS:
MOVR7,#05H
LOOP1:
MOVR6,#0F9H
LOOP2:
NOP
NOP
DJNZR6,LOOP2
DJNZR7,LOOP1
RET
DELAY:
MOVR5,#50
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
;-----------矩阵键盘-----------
KEYKEY:
MOVB,#4
MOVP3,#0F0H;列置0,看行电平
JNBP3.4,L1
JNBP3.5,L2
JNBP3.6,L3
JNBP3.7,L4
AJMPXS
L1:
MOVR1,#0
AJMPLL1
L2:
MOVR1,#1
AJMPLL1
L3:
MOVR1,#2
AJMPLL1
L4:
MOVR1,#3
AJMPLL1
LL1:
ACALLDL10MS;消抖
MOVA,P3
XRLA,#0F0H
JZLLL2
MOVP3,#0FH;行置0,看列电平
JNBP3.0,L5
JNBP3.1,L6
JNBP3.2,L7
JNBP3.3,L8
L5:
JNBP3.0,L5
MOV20H,#0
AJMPKEY
L6:
JNBP3.1,L6
MOV20H,#1
AJMPKEY
L7:
JNBP3.2,L7
MOV20H,#2
AJMPKEY
L8:
JNBP3.3,L8
MOV20H,#3
AJMPKEY
LLL2:
LJMPXS
KEY:
MOVA,R1;计算键值并查表赋值
MULAB
ADDA,20H
MOVR2,A
MOVDPTR,#TABLE
MOVA,R2
MOVCA,A+DPTR
;LCALLDELAY
LJMPLX1
TAB:
DB0A0H,0F9H,0C4H,0D0H,099H,092H,082H,0F8H,080H,090H
DB020H,079H,044H,050H,019H,012H,002H,078H,000H,010H
TABLE:
DB0A0H,0F9H,0C4H,0D0H,99H
DB92H,82H,0F8H,80H,90H
DB88H,83H,0A6H,0C1H,86H
DB8EH
END
七、1602液晶显示
功能描述:
在lcd上动态逐字显示两行字符串。
源程序:
RSEQUP2.7
RWEQUP2.6
EEQUP2.5
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
ACALLDEL5MS
ACALLDEL5MS
ACALLDEL5MS
MOVP1,#38H
ACALLENABLE1
ACALLDEL5MS
MOVP1,#38H
ACALLENABLE1
ACALLDEL5MS
MOVP1,38H
ACALLENABLE1
MOVP1,#00000001B
ACALLENABLE
MOVP1,#00111000B
ACALLENABLE
MOVP1,#00001111B
ACALLENABLE
MOVP1,#00000100B
ACALLENABLE
MOVP1,#8FH
ACALLENABLE
MOVDPTR,#TABLE1
ACALLL1
MOVP1,#0CFH
ACALLENABLE
MOVDPTR,#TABLE2
ACALLL2
SJMP$
L1:
MOVR1,#00H
LL1:
MOVA,R1
MOVCA,A+DPTR
MOVP1,A
ACALLDELXXMS
ACALLWRITE_LCD
INCR1
CJNEA,#00H,LL1
RET
L2:
MOVR1,#00H
LL2:
MOVA,R1
MOVCA,A+DPTR
MOVP1,A
ACALLDELXXMS
ACALLWRITE_LCD
INCR1
CJNEA,#00H,LL1
RET
WRITE_LCD:
SETBRS
CLRRW
CLRE
ACALLDELAY
SETBE
RET
ENABLE1:
CLRRS
CLRRW
CLRE
SETBE
RET
ENABLE:
CLRRS
CLRRW
CLRE
ACALLDELAY
SETBE
RET
DELAY:
MOVP1,#0FFH
CLRRS
SETBRW
CLRE
NOP
SETBE
P1.7,DELAY
RET
DEL5MS:
MOVR7,#125
DEL1:
MOVR6,#18
NOP
DEL2:
DJNZR6,DEL2
DJNZR7,DEL1
RET
DELXXMS:
MOVR7,#250
DEL3:
MOVR6,#250
NOP
DEL4:
DJNZR6,DEL4
DJNZR7,DEL3
RET
table1:
db"UHZNAIT"
table2:
db"*********:
QQ"
END
八、外部RAM扩展
功能描述:
将片数据送到片外RAM储存,再送回片,在数码管中显示。
源程序:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVP0,#0FFH
MOVA,#0F9H
MOVDPTR,#0001H
MOVXDPTR,A
CLRA
MOVXA,DPTR
MOVP2,A
SJMP$
END
九、AD转换
功能描述:
向ADC0809输入模拟信号电压,经转换后在数码管上显示电压值。
源程序:
LED_0EQU30H
LED_1EQU31H
LED_2EQU32H
ADCEQU35H
CLOCKBITP3.1
STBITP3.0;ALE
OEBITP3.2
EOCBITP3.3
ORG0000H
LJMPSTART
ORG000BH
CPLCLOCK;给0809时钟
RETI
ORG0100H
START:
MOVLED_0,#00H
MOVLED_1,#00H
MOVLED_2,#00H
MOVTMOD,#02H
MOVTH0,#0FEH
MOVTL0,#0FEH
MOVIE,#82H
SETBTR0
WAIT:
CLRST
SETBST
CLRST
JNBEOC,$
SETBOE
MOVADC,P1
CLROE
MOVA,ADC
MOVB,#51
DIVAB
MOVLED_2,A
MOVA,B
MOVB,#5
DIVAB
MOVLED_1,A
MOVA,B
MOVB,#2
MULAB
MOVLED_0,A
LCALLDISP
SJMPWAIT
DISP:
MOVP0,#00H
MOVDPTR,#TABLE
MOVA,LED_0
MOVCA,A+DPTR
SETBP0.2
MOVP2,A
LCALLDELAY
CLRP0.2
MOVA,LED_1
MOVCA,A+DPTR
SETBP0.1
MOVP2,A
LCALLDELAY
CLRP0.1
MOVA,LED_2
MOVCA,A+DPTR
SETBP0.0
ADDA,#80H
MOVP2,A
LCALLDELAY
CLRP0.0
RET
DELAY:
MOVR6,#50
D1:
MOVR7,#15
DJNZR7,$
DJNZR6,D1
RET
TABLE:
DB0A0H,0F9H,0C4H,0D0H,99H
DB92H,82H,0F8H,80H,90H
END
十、DA转换
功能描述:
实现输出方波、三角波、梯形波。
源程序:
1.方波程序
ORG0000H
LJMPLOOP1
ORG0100H;通过上下电平地的变化来输出方波
LOOP1:
CLRP3.6
MOVP2,#00H;向选通地址送低电平地
ACALLDELAY
MOVP2,#0FFH;向选通地址送高电平
ACALLDELAY
LJMPLOOP1
DELAY:
MOVR1,#06H
D2:
MOVR2,#0FFH
D1:
DJNZR2,D1
DJNZR1,D2
RET;延时,通过改变它的大小可以改变占空比
END
2.三角波:
ORG0000H
LJMPSTR1
ORG0100H
STR1:
CLRP3.6;通过上升和下降来产生三角波
MOVR6,#00H;电压随时间上升
STR2:
MOVA,R6
MOVP2,A
INCR6
CJNER6,#0FFH,STR2;电压随时间下降
STR3:
ACALLDELAY
DECR6
MOVA,R6
MOVP2,A
CJNER6,#00H,STR3
AJMPSTR1
END
总结
一、流水灯
流水灯使用接口最好使用P1口,P1口没有第二功能也不用作为地址总线,容易控制。
最好加一跳针,以便与其他功能区分开。
二、数码管
焊接时,可将各数码管的段选分别连接起来,连线时,应该贴着板子布线。
p0口做位选时,要接上拉电阻,增大数码管驱动电流,或采用PNP来进展放大。
放射级接电源,基极接p0口,集电极接位选。
P0和P2口使用时和其他功能有重复,最好用跳针加以控制。
三、矩阵键盘
4*4矩阵键盘的消抖很关键,调用一个10ms的延时,当按键放开时,数码管显示相应的数字,并伴有蜂铃器的响声。
对键盘行列扫描时,用软件置零比用硬件置零方便。
四、电子钟
编程时,用中断定时比一般定时更为准确。
由于程序本身存在一定的缺陷,导致在按键进展控制时,程序会暂停并等待直至按键放开。
五、蜂鸣器
编程时,可在网上查找歌曲编写软件,将歌曲转化为对应的代码,用查表进展实现唱歌功能。
七、LCD1602
线路有点复杂,需要认真来进展线路检错,注意其引脚对应的P口不被用于其他功能而分流,导致液晶不能正常显示。
在其Vee引脚接一电位器进展比照度调节。
编程时,注意不要遗漏复位程序。
八、片外RAM
扩展时,可将各个P口用插槽引出,方便使用。
编程时,可通过查看XDATA窗口,看对应的数据有无送到指定的地址。
九、AD转换
ADC0809数据输出的八个引脚2-1到2-8分别接到单片机的P*.7到P*.0口,
注意不要接反了。
十、DA转换
可先用LED灯检测DAC0832是否输出的信号是否与编程写的信号一致,假设将WR1脚接地,可直接对P口送值,假设将WR1脚接P3.6,可用送地址方式赋值。
UA741的输出口与DAC0832的RFB脚之间可接电位器来调节准确度。
输出时,可以采用双极性输出电路使输出电压变为正电压
十一、检测电路
编程仿真时,可单步运行看P口及其他相应的存放器有无正确赋值,硬件检测时,最好交给另外的组员仔细检查电路板看有无短接、虚焊等问题,再用万用表进展检测,如没有问题,仿真时从P口开场到功能器件逐步用万用表检查相应的值。