华南师范大学单片机课程实验报告和程序.docx
《华南师范大学单片机课程实验报告和程序.docx》由会员分享,可在线阅读,更多相关《华南师范大学单片机课程实验报告和程序.docx(62页珍藏版)》请在冰豆网上搜索。
![华南师范大学单片机课程实验报告和程序.docx](https://file1.bdocx.com/fileroot1/2023-5/22/5dd2b58c-515a-4294-877a-addd0e5db85b/5dd2b58c-515a-4294-877a-addd0e5db85b1.gif)
华南师范大学单片机课程实验报告和程序
单片机实验报告
华南师范大学
姓名:
学号:
专业:
通信工程
班级:
09通信8班
数字量输入输出实验
一、实验目的
1.熟悉教学板电路及其结构。
2.掌握利用μVisionC51软件编辑、调试(包括仿真调试、单步调试)、运行单片机程序的步骤和方法,掌握利用STC-ISPV39软件和下载线将程序写入单片机的方法。
3.通过实验熟悉51单片机的并行I/O口,并掌握它们的应用。
4.掌握矩阵键盘、LED动态显示的工作原理。
二、实验设备
PC机一台、实验教学板一块。
三、实验准备
1.阅读实验讲义附录一、实验教学板电路图和附录二、μVision软件使用说明
2.按实验题目要求设计好硬件电路,画出电路原理图,设计出相应程序,并给程序加上较详细的注释。
四、实验内容
1.实验线路如附图所示,51单片机的P0口输出接8个发光二极管的阴极,P2.4经NPN三极管9011控制发光管的阳极。
P3口支持一个8位行列式键盘,其中P3.4~P3.7供键盘扫描输出,P3.2、P3.3作键盘扫描输入。
实验要求:
编程实现键盘对发光二极管的控制,每按一个按键,使对应的二极管点亮。
2.51单片机P0口输出同时接4个数码管的阴极,P2.0~P2.3,经NPN三极管9011接数码管的阳极,该端口用于分别控制相应数码管的导通。
实验要求:
编程实现对任意按键动作的次数进行计数(最大99次),同时将计数值实时显示。
五、实验步骤
1.将实验板与PC机通过COM口连接。
启动PC机,进入μVision软件环境,选择建立新工程文件,即可开始输入源程序。
2.完成汇编、编译、连接,若有错误,则修改源程序,直至编译、连接通过为止。
3.接上实验板上的电源。
3.运行“STC-ISPV39.EXE”,将程序代码下载到实验板的单片机中。
操作的顺序是:
1)选择单片机(MCUTYPE)型号。
如:
“STC89C51RC”要与实验板上所装单片机的型号一至。
2)打开文件(OpenFile)。
即把要下载到单片机的程序文件(已通过编译了的机器码文件——二进制(.Bin)或十六进制(.Hex)的)调到“文件缓冲区”,这时可看到右边的“文件缓冲区”有数字变化。
3)选择串行通信口。
选对时,软件上的小灯会变绿。
否则小灯是灰色。
且在左下窗口提示“出错信息”。
4)下载:
按“Download/下载”按键下载。
5)把实验板上的供电的直流电源拔掉或关掉3秒钟再插入或打开电源(为单片机上电复位)。
4.观察单片机运行情况,验证程序是否能完成题目给出的控制要求,若不能达到要求,分析原因、查找错误,修改源程序,再次汇编、连接,重新下载、运行,直至达到题目的控制要求。
六、
参考程序流程图
实验内容1流程图
实验内容2流程图
键盘处理程序流程图
七、相应的程序
1.按键点亮对应相应的二极管。
ORG0000H
MAIN:
MOVP2,#10H//二极管一段高电平,点亮准备
STA:
MOVA,#11101111B//按键测试
MOVR7,#05H
STA1:
MOVP3,A
DJNZR7,NEXT
SJMPSTA//为0时则跳回......
NEXT:
RLA
PRESS0:
JBP3.3,PRESS1//无按键等待
LCALLDELAY30MS//去抖动
JBP3.3,PRESS0//测试是哪一行接通了!
!
!
JNBP3.3,$
SJMPPRE_P33
PRESS1:
JBP3.2,STA1//无按键等待,如果P3.2为1时,则说明木有按过.....
LCALLDELAY30MS//去抖动
JBP3.2,PRESS1
JNBP3.2,$
SJMPPRE_P32
PRE_P33:
DECR7//点亮对应的LED灯
MOVA,R7
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
SJMPSTA
PRE_P32:
DECR7
MOVA,R7
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVP0,A
SJMPSTA
DELAY30MS:
MOVR4,#55
DELAY:
MOVR3,#250
DJNZR3,$//1.085us(指令周期)*2*250+2=547.5us
DJNZR4,DELAY
RET
TABLE:
DB0F7H,0FBH,0FDH,0FEH//第一行按键,对应LED左边的4个灯
TABLE1:
DB7FH,0BFH,0DFH,0EFH//第二行按键,对应LED右边的4个灯
END
2.按键让数码管从00-99计数。
ORG0000H
STA:
MOVDPTR,#TABLE
MOVP2,#0H//关闭数码管选通
MOVP3,#0FFH
MOVR0,#0H//R0作为计数
KEY:
MOVA,#0EFH//按键扫描初始化第一列
MOVR1,#4H
KEYB:
MOVP3,A
JNBP3.2,KEYC
JNBP3.3,KEYC
JMPMUY//该列无按键按下,进入下一列扫描
KEYC:
LCALLDELAY20
JNBP3.2,KEYCC
JNBP3.3,KEYCC
JMPMUY
KEYCC:
JNBP3.2,$
JNBP3.3,$
INCR0//按一次,增加R0的值
MUY:
RLA
DJNZR1,KEYB//一轮扫描结束后
MOVA,R0
CJNEA,#100,DIS//判断是否达到100,不是,转到显示区
MOVA,#0//是,重新给A赋值0
MOVR0,#0
DIS:
MOVB,#10
DIVAB//把A/10的商给A,余数给B
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#4//十位显示
LCALLDELAY1
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#8//个位显示
LCALLDELAY1
JMPKEY
DELAY1:
MOVR6,#2
DE11:
MOVR5,#248
DJNZR5,$
DJNZR6,DE11
RET
DELAY20:
MOVR7,#10
DJNZR7,DELAY1
RET
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
八、思考题
1.按键程序为什么要有去抖动功能,如何去抖动?
答:
按键由于机械弹性的作用,键在闭合与断开的瞬间均有抖动过程,所以需要去抖动功能,去抖动有软件和硬件的方法,比如采用滤波电路防抖等硬件方法,软件去抖是检测到有键按下,执行一个10-20ms的延时程序,再确认该键是否仍保持闭合状态,若仍闭合则确认为此键按下,消除抖动影响。
2.在显示时,为什么要延时1ms,这个时间过长或过短,会出现什么现象?
答:
因为人眼看事物有一个暂留效果,如果延时过短的话,可能看不到led灯或者数码管的变化,如果延时太长,则一直保持那原来的效果,没有变化。
交通灯控制实验
一、实验目的
通过实验熟悉51单片机的并行I/O口,并掌握它们的应用。
二、实验内容及原理
模拟实现一个路口交通灯管理
在路口当中,一条为“干线”,另一条为“支线”。
两个方向上各设有红、黄、绿3盏交通灯。
一般情况下(初始状态),干线亮绿灯,支线亮红灯。
当支线上有三辆车到达路口(用按键按下模拟一辆车到达),则6秒后,干线亮黄灯,持续3秒后,转为干线亮红灯,支线亮绿灯,过24秒后,支线转黄灯亮,3秒后,回到初始状态。
交通灯实验程序
ORG0000H
STA:
MOVP0,#11011011B//干线亮绿灯,支线亮红灯
MOVP2,#0001000B//选通LED
MOVP3,#11101111B//K1列线置0
MOVR7,#3
STA1:
JBP3.3,$//无按键等待
LCALLDELAY30MS//去抖动
JBP3.3,STA1
JNBP3.3,$//等键释放
DJNZR7,STA1
MOVR6,#200
STA2:
LCALLDELAY30MS//延时30MS
DJNZR6,STA2//延时6秒
MOVP0,#10111011B//干线亮黄灯,支线亮红灯
MoVR6,#100
STA3:
LCALLDELAY30MS
DJNZR6,STA3//延时3秒
MOVP0,#01111110B//干线亮红灯,支线亮绿灯
MOVR5,#4
STA4:
MOVR6,#200
STA5:
LCALLDELAY30MS
DJNZR6,STA5
DJNZR5,STA4//延时24秒
MOVP0,#01111101B//干线亮绿灯,支线亮黄灯
MOVR6,#100
STA6:
LCALLDELAY30MS
DJNZR6,STA6//延时3秒
LJMPSTA
DELAY30MS:
MOVR4,#55
DELAY:
MOVR3,#250
DJNZR3,$//1.085us(指令周期)*2*250+2=547.5us
DJNZR4,DELAY
RET
定时与中断实验
一、实验目的
1.通过实验掌握51单片机的定时/计数器的应用。
2.掌握51单片机的中断原理及应用。
3.进一步学习系统应用程序的设计和调试方法
二、实验设备
PC机一台、实验教学板一块。
图2-1
三、实验内容
实验线路如图2-1,通过定时器的定时,产生一定频率的波形信号,经P2.5输出,驱动蜂鸣器,便可发出某一频率的音调,若按乐曲的音调连续发出,并使其按节拍变化,便可演奏一首乐曲。
实验要求:
编程实现演奏一首乐曲
C调常用音频及其对应频率如下表:
音符
频率
T值
音符
频率
T值
SI
494
64603
5So
784
64948
1DO
523
64654
6La
880
65012
2Re
587
64751
7Si
987
65069
3Mi
659
64837
DO
1046
65095
4Fa
698
64875
RE
1174
65143
定时器初值计算方法:
由于软件是通过定时器溢出后对P2.5取反产生方波,故定时器溢出时间为1//2f,则计数器计数初值为:
X=65536—n=65536—(1/2f)/12/fosc=65536—fosc/24f
电路板上的晶振频率为11.0593MHZ,根据不同音调的频率值,就可以计算出上表的初值。
用乐曲最短的1/4拍为一个基本节拍时间,定为0.5秒,基本节拍时间由另一个定时器产生,设此定时器定时时间为50ms,定时时间常数(计数器初值)=65536—(50000*12/11.0593)=02C13H,可以分别通过该定时中断10、20、40、80次满足1/4拍、1/2拍、1拍、2拍的定时要求。
软件编程时,要先将乐谱转换成包含有音符和音长信息的代码,然后,以查表方式通过乐谱代码控制喇叭演奏出乐曲。
具体方法如下:
(1)乐谱代码用字节结构,字节高4位代表音符,从SI到RE分别用0到9表示;字节低4位代表该音符的节拍,用1、2、3、、、8分别表示1/4拍、1/2拍、1拍、、、4拍,按照这样的规则,将整段音乐变换成相应的代码数据表,最后一个字节内容为00H,代表数据表的结束。
(2)在程序执行时按顺序查表,从字节数据中取出音符代码和节拍代码,查频率表得该音符对应频率的定时初值,再根据节拍代码控制音长,启动两个定时器后,即可发出要求的音,这样就控制演奏出完整的乐曲。
四、实验汇编主程序:
ORG0000H
RESET:
AJMPMAIN
ORG000BH//定时器0中断入口
AJMPTT0P
ORG001BH//定时器1中断入口
AJMPTT1P
ORG0030H
MAIN:
MOVSP,#70H//设堆栈区
CLRP2.5//关声音
MOVIE,#8AH//开中断
AJMPKEY//调用键盘程序段
KEY:
MOVP3,#0F0H
MOVA,P3
ACALLDELAY
CJNEA,P3,SI//不相等时,跳到SI
AJMPKEY//相等时,循环
SI:
MOVR4,P3
ACALLDELAY
MOV51H,R4
CJNEA,51H,COUNTKEY
AJMPKEY
COUNTKEY:
MOVA,P3
ANLA,#0F0H
MOVR3,A
MOVP3,#0CH
MOVA,P3
ANLA,#0CH
ADDA,R3
MOV52H,A
MOVDPTR,#KEYZHI
MOVR1,#00H
SUAN:
MOVA,R1
MOVCA,@A+DPTR
CJNEA,52H,JIN
CJNEA,#78H,TT0PCS//按键8播音乐
AJMPBOYIN//转到播音乐程序
AJMPTT0PCS
JIN:
INCR1
AJMPSUAN
TT0PCS:
MOVIE,#8AH
MOVTMOD,#11H
MOVDPTR,#TABL2
MOVA,R1
RLA
MOVR2,A
MOVCA,@A+DPTR
MOVTH0,A
MOV41H,A
MOVA,R2
INCA
MOVCA,@A+DPTR
MOVTL0,A
MOV40H,A
SETBTR0
HERE:
MOVA,P3
ANLA,#0FH
CJNEA,#0FH,HERE
CLRP2.5
CLRTR0
AJMPMAIN//按键释放,关声音关定时器,转到主程序
BOYIN:
MOVIE,#8AH//开中断
MOVR1,#0H//乐谱数据偏移量
ACALLPTOM//调乐曲输出子程序
CLRTR0
CLRTR1
CLRP2.5
HERR:
AJMPHERR//程序结束
PTOM:
MOVTMOD,#11H//设定定时器的工作方式
PTOM1:
MOVDPTR,#MUCI//乐谱的首地址送DPTR
MOVA,R1
MOVCA,@A+DPTR//取乐谱数据
JNZPTOM2//如果数据为00H,则结束
RET
PTOM2:
MOVR2,A//在R2中暂存
ANLA,#0F0H//取得音符数据
SWAPA//把A的高四位和低四位对调
RLA//因为音符是字类型,需要两个字节,所以要乘2
MOVR3,A
MOVDPTR,#TABL//频率表
MOVCA,@A+DPTR//取得频率表的高8位
MOVTH0,A
MOV41H,A
MOVA,R3
INCA
MOVCA,@A+DPTR//取得频率表的低8位
MOVTL0,A
MOV40H,A
MOVA,R2
ANLA,#0FH//保留节拍数据
MOVB,#5//乘8得定时的中断次数
MULAB
MOVR0,A
MOVTH1,#4CH//50MS定时的初值
MOVTL1,#00H
SETBTR1//启动定时器
SETBTR0
HERE2:
CJNER0,#0H,HERE2//判断当前节拍是否已完成
INCR1//如果完成则取下一个数据
AJMPPTOM1
TT0P:
PUSHAcc//定时器0中断服务程序
PUSHPSW
CPLP2.5
MOVTL0,40H
MOVTH0,41H
POPPSW
POPAcc
RETI
TT1P:
MOVTH1,#4cH//定时器1中断服务程序,50MS定时的初值
MOVTL1,#00H
DECR0
RETI
DELAY:
MOVR7,#10//延时程序段
D1:
MOVR6,#50
DJNZR6,$
DJNZR7,D1
RET
TABL2:
DW64654,64751,64837,64875,64948,65012,65069,65095
TABL:
DW64603,64654,64751,64837,64875,64948,65012,65069,65095,65143
KEYZHI:
DB0E4H,0D4H,0B4H,74H,0E8H,0D8H,0B8H,78H
MUCI:
DB54H,32H,52H,88H,64H,82H,62H,58H,54H,12H,22H,34H
DB22H,12H,2CH,54H,32H,52H,86H,72H,64H,84H,58H,54H
DB22H,32H,46H,02H,1CH,64H,84H,88H,74H,62H,72H,88H
DB62H,72H,82H,62H,62H,52H,32H,12H,28H,28H,54H,32H
DB52H,84H,72H,64H,86H,58H,54H,22H,32H,46H,02H,1CH
DB00H
END
串行通信实验
一、实验目的
1.了解51单片机串行口的结构、串行通讯的原理。
2.掌握51单片机与PC机之间通讯的方法。
3.学习系统应用程序的设计和调试
二、实验设备
PC机一台、实验教学板一块。
三、实验原理
51单片机的串行接口是全双工的,它能做异步接收器/发送器(UART),也能做同步移位寄存器使用。
在做UART使用时,相关的寄存器有SBUF、SCON、和PCON中的波特率倍增位SMOD。
SBUF是数据发送缓冲器和接收缓冲器,逻辑上用同一个地址,物理上是分开的,用读写操作来选择。
SCON是串行口控制寄存器,用于设定串行口的工作方式;保存方式2和方式3的第9位数据;存放发送、接收的中断标志。
在串行通讯的方式1和方式3中,通信的波特率是可以设置的,满足下式:
PC机的串行通讯口是借助通用异步接收发送器8250(或16C550等)实现的,可使用comdebug.exe等提供了有关串行口的收、发操作窗口的软件实现通讯。
PC机的串行通讯采用RS232电平,因此要求单片机的实验板也要配置RS232接口,解决逻辑电平的配接。
如果通讯距离较远,则要配接调制解调器。
四、实验内容
1,自发自收
用一根短路线,将实验板中RS232插口的RXD和TXD两个插孔短路。
然后编程设定串行口为工作方式1,传送55H和0AAH两个数据。
实验要求:
程序采用查询方式。
每传送、接收一个数据,做一次检查,看是否正确,若两次都正确,则在显示器上显示“GOOD”,若不正确,则不显示,并要重新传送。
2,单片机与PC机的通信
先使用通讯电缆将单片机的RS232接口与PC机的COM1口连接,PC机起动并运行comdebug.exe软件,窗口上设置波特率为1200,8位数据、一个停止位。
单片机端也采用工作方式1,波特率为1200,完成单片机与PC机的通信。
实验要求:
编程实现先由单片机发送8个数据,01、02、03、04、05、0ABH、0CDH、0EFH。
然后进入接收状态,在PC机发送窗口上设置发送数据,点击发送按钮,单片机接收数据后将数据显示在显示器上。
五、程序参考流程图
(a)自发自收程序流程图(b)与PC机通讯程序流程图
六、汇编程序
1.自发自收
ORG0000H
MOVTMOD,#20H//设置计时器工作于方式2
MOVTL1,#0E8H//波特率为1200
MOVTH1,#0E8H
SETBTR1
MOVSCON,#50H
MOVP2,#0FH
MOVP3,#11101111B//设置按键1
START:
KEY1:
LCALLKEY_STATE//调用按键程序
TX_1:
MOVA,#55H
MOVSBUF,A
WAIT1:
JBCTI,REX_YES1//TI为1时,转移,并清零
SJMPWAIT1
REX_YES1:
JBCRI,NEXT1//测试接收中断RI是否为1,
SJMPREX_YES1
NEXT1:
MOVA,SBUF//把SBUF的值送给A
CJNEA,#55H,KEY1//判断是否相等,不相等的话就悲剧了.......
MOVP0,#92H//相等的话,数码管显示“5555”
KEY2:
LCALLKEY_STATE//同上
TX_2:
MOVA,#0AAH//同上
MOVSBUF,A
WAIT2:
JBCTI,REX_YES2
SJMPWAIT2
REX_YES2:
JBCRI,NEXT2
SJMPREX_YES2
NEXT2:
MOVA,SBUF
CJNEA,#0AAH,KEY2//判断是否相等
MOVP0,#88H//相等的话,数码管显示“AAAA”
JMPSTART
DELAY30MS:
MOVR4,#55
DELAY:
MOVR3,#250
DJNZR3,$//1.085us(指令周期)*2*250+2=547.5us
DJNZR4,DELAY
RET
KEY_STATE:
JBP3.3,$//无按键等待
LCALLDELAY30MS//去抖动
JBP3.3,KEY_STATE//JB等于1转移
JNBP3.3,$//等键释放
RET
END
2.单片机与PC机的通信
ORG0000H
MOVTMOD,#20H//设置计时器工作于方式2
MOVTL1,#0E8H//波特率为1200
MOVTH1,#0E8H
SETBTR1//设置为1
MOVSCON,#50H
MOVDPTR,#TABLE
MOV30H,#00H//存储数码管码型
MOVR0,#08H
MOVP2,#