单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
单片机实验报告
微型计算机原理与实验实验报告
王海东1201210458
一、实验目的
1.定时器的使用,了解定时器T1,T0的工作原理
2.外部中断的使用,学会使用51单片机的两个外部中断口,并掌握优先级的设定
3.了解8279的硬件电路及软件控制程序,学会利用51单片机控制8279进行显示和键盘输入。
4.了解键盘及数码管显示原理,4x4键盘的输入输出方式,8位数码管显示数字的控制方法。
5.利用51单片机编写简单电子表、日历并实现显示功能。
6.学会利用51单片机编写或改写程序,掌握综合应用的能力。
二、实验设备
1.PC一台
2.单片机仿真器一台
3.单片机实验板一块
主要器件:
AT89C51,8279,数码管,键盘等
4.Medwin仿真软件
三、实验内容要求
1.定时/计数器T0、T1互换使用,并改变时钟显示格式
2.利用外部中断,实现可调时钟
3.在时钟基础上,增加日历功能
4.外部ram0000h——00ffh256个单元写入55h。
5.将外部ram0100h——01ffh256个单元清0。
6.显示器实现1/100秒显示功能(百米赛计时器)。
7.显示器实现12分钟1/100秒倒计时功能(NBA计时器)。
8.实现年、月、日与时、分、秒交替显示。
四、实验原理
1.试验原理简介
利用51单片机控制命令,实现时钟显示,键盘输入功能,主要是靠控制8279芯片实现显示功能及键盘输入控制。
89C51有五个中断源,中断可以设置为两个优先级。
我们主要利用定时器中断和外部中断实现实验内容中的功能。
2.8279原理图
图18279
Intel8279是一种通用的可编程的键盘/显示器接口器件,可以自动扫描键盘接口,并储存相应的信息,可以向CPU请求中断,加快CPU工作效率。
图1中可以看到,RL0—RL3为扫描输出,键盘输入则通过138译码器译码后,在SL0-SL2扫描输入。
图2为键盘的电路图,
图2键盘
图3数码管
图3的8位数码显示,与8279输出OA0-OA3,OB0-OB3,相连,实现显示功能,8数码管上又有8个发光二级管,分别标号a,b,c,d,e,f,g,dp,显示原理就是控制8个发光管的亮暗,显示数字形状,达到显示目的。
3.流程图
图4流程图
4.所用的CPU资源
定时器:
用于时钟的T0和T1定时器
中断源:
定时器T0、T1中断、外部中断0、中断1。
RAM包含00H~1FH的工作寄存器区、20H~2FH的位寻址区。
5.功能介绍
1、功能:
时钟和日期显示,校准功能。
第一次按下F1键进行时钟调整。
第二次按下F1键进行日期调整,第三次按下F1显示调整好的时钟。
2、按一下F2键,显示百米秒表计时,F3键此时为暂停键,再按F2还原。
3、按下F4键,显示12分钟NBA倒计时,秒表开始显示,F3键为暂停。
4、按下F3键是时钟显示与日期交替显示,此时要确保F2和F4都没用按下。
5、#键按下是外部ram0000h——00ffh256个单元写入55h。
6、*键按下是将外部ram0100h——01ffh256个单元清0。
附件
程序代码(所用寄存器地址用符号进行了替代)
fsecequ0f0h
fmsecequ04h
fkeyequ0f1h
fl5equ05h
fl6equ06h
fl7equ07h
fl8equ08h
ff0equ10h
ff1equ11h
ff2equ12h
ff3equ13h
ff4equ14h
ff5equ15h
ff6equ16h
ff7equ17h
ff8equ18h
ff9equ19h
org0;主函数入口地址
sjmpmain
org03h;外部0中断入口地址
ljmpkey_int
org0bh;T0中断入口地址
ljmpt0_int
org13h;外部1中断入口地址
reti
org1bh;T1中断入口地址
ljmpt1_int
org23h;串行口中断入口地址
reti
org30h
main:
movsp,#60h
movtmod,#11h;定义T0、T1工作于方式1状态,即16位的定时器
movth0,#0d8h
movtl0,#0f0h;10ms
movth1,#0d8h
movtl1,#0f0h
movr0,#20h;清零ram20h-5fh
clra
lp:
mov@r0,a
incr0
cjner0,#60h,lp
mov17h,#00
lcallini8279
setbea;CPU开放中断
setbex0;允许外部0中断
setbit0;外部0中断电平触发
setbet1;T1溢出中断允许
setbtr1;允许T1中断
setbpx0;键盘中断优先级最高
lcallini8279
lcalldis8279
lpa:
jbcfsec,add_1s
jbcfkey,lpb
jbcff0,key_F1;直接寻址的位是1则转移,且位清0
jbcff1,key_F2;对应的地址见书32页
jbcff2,key_F3
jbcff4,key_F4
jbcff5,key_F5
jbcff6,key_F6
jbcfmsec,add_1ms;循环10ms后进入中断
sjmplpa
key_F1:
lcalltime_date_F1
sjmplpa
key_F2:
lcallbaimi_F2
sjmplpa
key_F3:
lcalletd_F3
sjmplpa
key_F4:
lcallnba_F4
sjmplpa
key_F5:
lcallwaibu_F5
sjmplpa
key_F6:
lcallqingling_F6
sjmplpa
add_1s:
jbfl5,lpa;直接寻址的位是1则转移,回到主循环
jbff9,lpa
LCALLxianshi
lcalldis8279
ljmplpa
add_1ms:
LCALLxianshi1
lcalldis8279
ljmplpa
lpb:
mova,60h
lcallconvert;调用键盘字符转换
part1:
cjnea,#0ah,T0_9;判断F1
setbff0
ljmpabc
part2:
cjnea,#0bh,part3;判断F2
jbff8,pingbi_1;按下一次F4后,F2被屏蔽无效
setbff1
cplfl5
cplfl7
pingbi_1:
ljmpabc
part3:
cjnea,#0ch,part4;判断F3
setbff2
ljmpabc
part4:
cjnea,#0dh,part5;判断F4
jbfl7,pingbi_2;按下一次F2后,F4被屏蔽无效
setbff4
cplff9
cplff8
pingbi_2:
ljmpabc
part5:
cjnea,#0eh,part6;判断F5
setbff5
ljmpabc
part6:
setbff6;判断F6
cplff7
ljmpabc
T0_9:
jncpart2;判断是不是数字键按下(0-9),是,则向下执行
jnbfl6,abc
jbfl8,c_date
cjner1,#78h,abcd1;判断78h位的值,只能是0,1,2
cjnea,#0,abcd0
ljmpabcd1
abcd0:
cjnea,#1,abcd
ljmpabcd1
abcd:
cjnea,#2,abc
ljmpabcd1
abcd1:
cjner1,#7ah,abc1;显示并可更改时钟模块,不等于7a,7d(时间显示的-)时直接往下运行;等于7a,7d时寄存器+1再运行
incr1
abc1:
cjner1,#7dh,c_time
incr1
c_time:
mov@r1,a
incr1
lcalldis8279
mova,78h
anla,#0fh
swapa
adda,79h
mov52h,a
mova,7bh
anla,#0fh
swapa
adda,7ch
mov51h,a
mova,7eh
anla,#0fh
swapa
adda,7fh
mov50h,a
ljmpabc
c_date:
cjner1,#7ah,abc3;显示并可更改日期,不等于7a,7d(时间显示的-)时直接往下运行;等于7a,7d时寄存器+1再运行
incr1
abc3:
cjner1,#7dh,abc4
incr1
abc4:
mov@r1,a
incr1
LCALLdis8279
mova,78h
anla,#0fh
swapa
adda,79h
mov5bh,a
mova,7bh
anla,#0fh
swapa
adda,7ch
mov5ah,a
mova,7eh
anla,#0fh
swapa
adda,7fh
mov59h,a
abc:
ljmplpa
sjmp$
time_date_F1:
incr6;F1按下一次更改时钟;第二次更改日期;第三次跳出
cjner6,#1,M_data
clrtr1;cpl取反,暂停t1中断
setbfl6;默认06h初值是0,为锁住数字键;为1时,打开数字键
movr1,#78h
ret
M_data:
cjner6,#2,M_exit
setbfl8
movr1,#78h
LCALLxianshi2
LCALLdis8279
ret
M_exit:
movr6,#0
setbtr1
clrfl6
clrfl8
ret
baimi_F2:
jnbfl7,clear_0;F2第一次按下启动,此时按下F3是暂停,二次按下F2退出,直接寻址为0转移
setbet0;开t0中断,直接寻址为1,即07H为1
setbtr0
ret
clear_0:
clret0;定时器T0中断截止
clrtr0
mov40h,#0
mov41h,#0
mov42h,#0
ret
etd_F3:
jbff9,t0_break;是否之前按下F4
jbfl5,t0_break;是否之前按下F2,都没按下循环显示时钟,有按下则暂停
loop_t_d:
;循环显示日期和时钟
jb13h,dis_date;为1转移显示日期
lcallxianshi;显示时间
lcalldis8279
sjmploop_t_d
dis_date:
lcallxianshi2;显示日期
lcalldis8279
jnbfkey,loop_t_d;判断无键按下转移
clrfkey
mova,60h
lcallconvert
cjnea,#0ch,loop_t_d;再次按下F3跳出循环显示
ret
t0_break:
cpltr0;暂停t0中断
ret
nba_F4:
jnbff8,clear_1;F4从12.00.00到计时
mov40h,#0
mov41h,#0
mov42h,#12h
setbet0
setbtr0
ret
clear_1:
clret0;再次按下跳出清零
clrtr0
mov40h,#0
mov41h,#0
mov42h,#0
ret
waibu_F5:
jnbff7,clr_0;按下f5,17h取反
pushacc
pushpsw
pushdph
pushdpl
movdptr,#0000h
movr6,#0ffh
mova,#55h
movx@dptr,a;按下#键外部ram0000h-00ffh256个单元写入55h
loop_1:
incdptr
movx@dptr,a
djnzr6,loop_1
popdpl
popdph
poppsw
popacc
ret
qingling_F6:
pushacc
pushpsw
pushdph
pushdpl
movdptr,#0100h
movr6,#0ffh
mova,#00h
movx@dptr,a;再次按下*键将外部ram0100h-01ffh256个单元清0
loop_2:
incdptr
movx@dptr,a
djnzr6,loop_2
popdpl
popdph
poppsw
popacc
ret
xianshi:
mova,50h;显示时钟
anla,#0fh
mov53H,a
mova,50h
anla,#0f0h
swapa
mov54H,a
mova,51h
anla,#0fh
mov55H,a
mova,51h
anla,#0f0h
swapa
mov56H,a
mova,52h
anla,#0fh
mov57H,a
mova,52h
anla,#0f0h
swapa
mov58H,a
mov78h,58h
mov79h,57h
mov7ah,#12h
mov7bh,56h
mov7ch,55h
mov7dh,#12h
mov7eh,54h
mov7fh,53h
ret
xianshi1:
;显示秒表
mova,40h
anla,#0fh
mov43H,a
mova,40h
anla,#0f0h
swapa
mov44H,a
mova,41h
anla,#0fh
mov45H,a
mova,41h
anla,#0f0h
swapa
mov46H,a
mova,42h
anla,#0fh
mov47H,a
mova,42h
anla,#0f0h
swapa
mov48H,a
mov78h,48h
mov79h,47h
mov7ah,#12h
mov7bh,46h
mov7ch,45h
mov7dh,#13h
mov7eh,44h
mov7fh,43h
ret
xianshi2:
;显示日期
mova,59h
anla,#0fh
mov30H,a
mova,59h
anla,#0f0h
swapa
mov31H,a
mova,5ah
anla,#0fh
mov32H,a
mova,5ah
anla,#0f0h
swapa
mov33H,a
mova,5bh
anla,#0fh
mov34H,a
mova,5bh
anla,#0f0h
swapa
mov35H,a
mov78h,35h
mov79h,34h
mov7ah,#12h
mov7bh,33h
mov7ch,32h
mov7dh,#12h
mov7eh,31h
mov7fh,30h
ret
t0_int:
pushacc;中断10ms计时,100次为1s
pushpsw
movth0,#0d8h
movtl0,#0f0h
setbfmsec;置1方便显示
jbfl7,add_1;转移到正计时
jbff8,sub_1;转移到倒计时
sjmprt0_int;结束
add_1:
mova,40h;正计时
adda,#1
daa
mov40h,a
cjnea,#100h,rt0_int;毫秒,比较跳出,04h为1后可以去显示
mov40h,#0
mova,41h
adda,#1
daa
mov41h,a
cjnea,#60h,rt0_int;秒
mov41h,#0
mova,42h
adda,#1
daa
mov42h,a
cjnea,#60h,rt0_int;分钟
mov42h,#0
sjmprt0_int
sub_1:
mova,40h;倒计时
adda,#99h
daa
mov40h,a
cjnea,#99h,rt0_int
mova,41h
cjnea,#0,sub_2
mova,#60h
sub_2:
adda,#99h
daa
mov41h,a
cjnea,#59h,rt0_int
mova,42h
cjnea,#0,sub_3
mova,#60h
sub_3:
adda,#99h
daa
mov42h,a
cjnea,#00h,rt0_int
rt0_int:
poppsw
popacc
reti
t1_int:
pushacc
pushpsw
movth1,#0d8h
movtl1,#0f0h
mova,4fh
adda,#1
daa
mov4fh,a
cjnea,#100h,rt1_int
setbfsec
cplff3
movr7,#00
mova,50h
adda,#1
daa
mov50h,a
cjnea,#60h,rt1_int
mov50h,#0
mova,51h
adda,#1
daa
mov51h,a
cjnea,#60h,rt1_int
mov51h,#0
mova,52h
adda,#1
daa
mov52h,a
cjnea,#24h,rt1_int
mov52h,#0
mova,59h
adda,#1
daa
mov59h,a
cjnea,#31h,rt1_int
mov59h,#1
mova,5ah
adda,#1
daa
mov5ah,a
cjnea,#13h,rt1_int
mov5ah,#1
mova,5bh
adda,#1
daa
mov5bh,a
cjnea,#100h,rt1_int
mov5bh,#0
mova,5ch
adda,#1
daa
mov5ch,a
cjnea,#100h,rt1_int
mov5ch,#0
rt1_int:
poppsw
popacc
reti
ini8279:
movdptr,#8001h
mova,#0d1h;清除命令6
movx@dptr,a
lp2:
movxa,@dptr
jbacc.7,lp2;等待160us清除
mova,#0;8279命令字0
movx@dptr,a
mova,#34h;100khz命令字1
movx@dptr,a
ret
dis8279:
movdptr,#8001h
mova,#90h
movx@dptr,a
movr0,#78h
movr4,#08
movdptr,#8000h
lp3:
mova,@r0
adda,#5
movca,@a+pc
movx@dptr,a
incr0
djnzr4,lp3
ret
seg1:
db3fh,06h,5bh,4fh,66h;0,1,2,3,4
db6dh,7dh,07h,7fh,6fh;5,6,7,8,9
db77h,7ch,39h,5eh,79h;A,B,C,D,E
db71h,73h,3eh,40h,80h;F,P,U,-,黑
;小系统板键盘按键ASC11码
seg2:
db06h,5bh,4fh,77h;1.2.3.A
db66h,6dh,7dh,7ch;4,5,6,B
db07h,7fh,6fh,39h;7,8,9,C
db71h,3fh,73h,5eh;F,0,P,D
DB40h,00h;-.黑
convert:
adda,#1;键号转换0、1、...
movca,@a+pc;...9键的键号是01
ret;......9
db1,2,3,0ah;F1=0ah,F2=0bh
db4,5,6,0bh;F3=0ch,F4=0dh
db7,8,9,0ch;*=0fh,#=0eh
db0fh,0,0eh,0dh;
key_int:
pushacc
pushpsw
pushdph
pushdpl
setbrs0
movdptr,#8001h
movxa,@dptr
anla,#0fh
jzkeyrtn
mova,#40h
movx@dptr,a
movdptr,#8000h
movxa,@dptr
movr2,a
anla,#18h
rra
xcha,r2
anla,#03h
adda,r2
mov60h,a
setbfkey
keyrtn:
popdpl
popdph
poppsw
popacc
reti
end