华中科技大学单片机实验实验报告MCS51单片机_第1页
华中科技大学单片机实验实验报告MCS51单片机_第2页
华中科技大学单片机实验实验报告MCS51单片机_第3页
华中科技大学单片机实验实验报告MCS51单片机_第4页
华中科技大学单片机实验实验报告MCS51单片机_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 华中科技大学单片机实验报告MCS-51系列单片机 (单片机原理及应用实验) (根据2014年电气与电子工程学院单片机实验课程改编)专 业: 电气工程及其自动化 班 级: 气卓1301 姓 名: 廖鹏毅 学 号: ALL RIGHT RESERVED目 录实验3.1 软件仿真实验3实验2“跑马灯”实验8实验3 数码管显示功能的实现11实验5 按键功能的实现23实验7 A/D转换器件TLC1543的用29实验8 D/A转换器件TLV5617的应用34实验14指示灯的外部中断控制47实验18定时器控制继电器49自行设计实验 53实验总结 55实验3.1 软件仿真实验一 实验目的1 掌握软件仿真的方

2、法2 熟悉集成开发环境的使用3 熟悉常用指令的功能4 熟悉程序调试的方法5 学习自己编写、调试计算机程序二 实验内容1 将Keil软件设置为软件仿真的方式2 将3.1.4介绍的示例程序录入、编译、调试3 观察有关寄存器、变量的值,理解程序及指令的功能4 编译、调试、验证自己编写的子程序三 实验步骤1 先阅读课本,大致了解仿真软件的使用和注意事项2 结合课本,边看书边上机操作,逐步了解和掌握仿真软件的使用3 阅读和理解3.1.4介绍的示例程序,并将其录入、编译、调试4 赋值给示例程序时,打开各观察窗口,观察有关寄存器、变量的值,验证其功能5 自行编译、调试、验证自己编写的子程序四 实验结果1 给

3、十六进制数转换为十进制数子程序赋初值,MOV H_DAT0,#01HMOV H_DAT1,#00H则编译加载调试该子程序,打开各观察窗口观察有关变量,实验发现D_DAT0,D_DAT1,D_DAT2,D_DAT3中的值分别为00,00,00,01。则符合实际,即验证其功能。2 给双字节乘法运算子程序赋初值,MOV R4,#8MOV R5,#9MOV R6,#6MOV R7,#7然后编译加载调试该子程序,并用观察窗口观察有关变量,实验发现MUL_0,MUL_1,MUL_2,MUL_3分别为08,04,04,07.则符合实际,即验证其功能。3 给三字节数除双字节数运算子程序赋初值,MOV ODIV

4、_H,#00HMOV ODIV_M,#00HMOV ODIV_L,#01HMOV DIV_1,#00HMOV DIV_0,#01H接着编译加载调试该子程序,并用观察窗口观察有关变量,实验发现R0,R1,R3,R4,R5中的值分别为00,00,00,00,01,则实验验证其功能。五 实验小结 本次实验,我初步了解仿真软件的使用,同时掌握了编译、加载、调试程序的方法以及验证实验结果的方法附:3.1.4示例程序含 主程序十六进制数转换为十进制数子程序双字节乘法运算子程序三字节数除双字节数运算子程序D_DAT0EQU50HD_DAT1EQUD_DAT0+1D_DAT2EQUD_DAT1+1D_DAT3

5、EQUD_DAT2+1H_DAT0EQUD_DAT3+1H_DAT1EQUH_DAT0+1ODIV_LEQUH_DAT1+1ODIV_MEQUODIV_L+1ODIV_HEQUODIV_M+1DIV_0EQUODIV_H+1DIV_1EQUDIV_0+1MUL_0EQUDIV_1+1MUL_1EQUMUL_0+1MUL_2EQUMUL_1+1MUL_3EQUMUL_2+1ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;在此处给有关变量单元赋值MOVH_DAT1,#2MOVH_DAT0,#0LCALLHTD;在此处给有关变量单元赋值LCALLTMUL;在此处给

6、有关变量单元赋值LCALLSDIVLOOP:NOPAJMPLOOPHTD:MOVD_DAT3,#00H;将结果千位清0MOVD_DAT2,#00HMOVD_DAT1,#00HMOVD_DAT0,#00H;以上将各位结果存储单元清0H1000:CLRC;进位位C清0MOVA,H_DAT0;源数据低位装载到累加器A中MOVR6,A;备份源数值低位到寄存器R6中SUBBA,#0E8H;源数值低位减去1000的低位0E8HMOVH_DAT0,A;余数存回到源数值低位存储单元MOVA,H_DAT1;源数值高位装载到累加器A中MOVR7,A;备份源数值高位到寄存器R7中SUBBA,#03H;源数值高位带借

7、位减1000的高位03HMOVH_DAT1,A;余数存回到源数值低位存储单元INCD_DAT3;千位增1JNCH1000;如果没有借位则利用余数循环再减;有借位表明为最后一次无效减;程序顺序执行,应还原最后一次修改值MOVH_DAT0,R6MOVH_DAT1,R7;用备份值作为新的源数值(余数)DECD_DAT3;千位数减1,去掉最后一次无效减的影响H100:MOVA,H_DAT0;源数值低位装载到累加器A中MOVR6,A;备份源数值低位到寄存器R6中CLRC;清0进位位CSUBBA,#100;减去100MOVH_DAT0,A;存回余数低位MOVA,H_DAT1;取源数值高位SUBBA,#00

8、H;减100的高位0,实际上是减去借位位MOVH_DAT1,A;存回余数高位JCH10;有借位则跳到下一步继续运算INCD_DAT2;没有借位,百位增1AJMPH100;没有借位继续减;注意本轮循环中最后一次减时百位未增1;所以不存在还原的问题;进入下一轮时,源数值(余数)都在R6中H10:CLRCMOVA,R6;源数值(低位)装载到累加器A中;到此源数值高位已经为0,不用再参加计算MOVD_DAT0,A;存回源数值低位;如果是最后一次减,则此值即为个位SUBBA,#10;减去10MOVR6,A;保存余数JCH1;有借位,运算结束INCD_DAT1;没有借位,十位增1LJMPH10;没有借位继

9、续减H1:RET;子程序返回TMUL:MOVA,R6MOVB,R4MULAB;第一次乘法MOVMUL_0,A;第一次乘法结果低位存到MUL_0(最终结果)MOVR3,B;第一次乘法结果高位暂存在R3中MOVA,R4MOVB,R7MULAB;第二次乘法ADDA,R3;第二次乘法结果低位加第一次乘法结果的高位MOVR3,A;所得第一次加法结果低位暂存到R3中MOVA,BADDCA,#00H; 第二次乘法结果高位加进位位CMOVR2,A;所得第一次加法结果高位暂存到R2中MOVA,R6MOVB,R5MULAB;第三次乘法ADDA,R3;第三次乘法结果低位加R3MOVMUL_1,A;第二次加法结果低位

10、存到MUL_1(最终结果)MOVR1,#00H;第二次加法高位进位值清0MOVA,R2ADDCA,B;第三次乘法结果高位加R2及进位位CMOVR2,A;第二次加法结果高位暂存R2JNCLAST;没有进位则跳转(R1=0)MOVR1,#1;有进位,第二次加法高位进位值为1LAST:MOVA,R7MOVB,R5MULAB;第四次乘法ADDA,R2;第四次乘法结果低位加R2MOVMUL_2,A;第三次加法结果低位存到MUL_2(最终结果)MOVA,BADDCA,R1;第四次乘法高位加第二次加法高位进位值R1;及第三次加法低位进位位CMOVMUL_3,A;第三次加法结果高位存到MUL_3中(最终结果)

11、RETSDIV:MOVR0,#00HMOVR1,#00H;清0过渡单元MOVR2,#24;因被除数有三个字节(24位),所以循环24次SDIV0:CLRC;清0进位位CMOVA,ODIV_L;(ODIV_L)ARLCA;A中的值带进位位C左移1位MOVODIV_L,A;(A)ODIV_L,移位后存回MOVA,ODIV_MRLCAMOVODIV_M,AMOVA,ODIV_HRLCAMOVODIV_H,A;以上将被除数左移一位,最高位在进位位C中MOVA,R0RLCAMOVR0,A;R0的值带进位左移后存回MOVR6,A;备份R0的值在R6中MOVA,R1RLCAMOVR1,A;R1的值带进位左移

12、后存回MOVR7, A;备份R1的值在R7中;以上实现Z和X一起左移1位;并把Z中的值备份了一份CLRCMOVA,R0SUBBA,DIV_0MOVR0,AMOVA,R1SUBBA,DIV_1MOVR1,A;以上将Z减Y后差值写回Z中JNCSDIV1;没有借位(够减)则跳转,用差值继续计算MOVA,R6MOVR0,AMOVA,R7MOVR1,A;有借位,不够减,用备份值取代差值,即不减SDIV1:CPLC;借位C取反即为商。C为0,够减,商1MOVA,R5RLCAMOVR5,AMOVA,R4RLCAMOVR4,AMOVA,R3RLCAMOVR3,A;以上将商移入R3、R4、R5中DJNZR2,S

13、DIV0;按R2中的值,循环24次RETEND实验2 “跑马灯”实验一 实验目的1 了解发光二极管的使用方法2 熟悉串行、并行输出扩展接口的方法3 学习常用指令用法和简单程序编写技巧二 实验内容1 理解图4.3.1的电路原理和参考程序2 按图4.3.1连接电路,调试参考程序,单步执行每行指令,观察有关寄存器中值的变化,理解指令的功能和执行效果三 实验步骤1 先阅读课本,理解原理和程序2 按图接线,然后编译加载调试程序,观察实验现象,是否出现“跑马灯”四 实验结果接好线,并运行程序后,8个灯依次循环闪亮,出现“跑马灯”,验证其功能。五 实验小结理解I/O口的使用,以及发光二极管的使用和原理附:跑

14、马灯子程序:LIGHT-S跑马灯串行LIGHTEQU60H;定义指示灯数据存放地址单元SIOEQUP2.0;串行移位数据SCLKEQUP2.1;串行移位时钟信号SRCLKEQUP2.2;输出锁存信号 ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针CLRSIOCLRSCLKCLRSRCLKMOVLIGHT,#01H;初始化指示灯输出数据NOPMAIN:LCALLFLYLED;调用指示灯循环点亮子程序LCALLDELAY;延时子程序同参考例程一AJMPMAIN;循环执行主程序;*;通过595循环点亮指示灯子程序*FLYLED:MOVA,LIGHT

15、CLRCRLCA;A中最高位移到CCPLC;因低电平点亮,故取反MOVSIO,C;LIGHT中数据最高位送到SER输入端SETBSCLKNOPCLRSCLK;产生一个移位脉冲SETBSRCLKNOPCLRSRCLK;产生一个输出锁存脉冲CJNEA,#0,FLYCON;A中不为0则继续MOVA,#01H;A中为0,表明循环完一轮;重新赋初值FLYCON:MOVLIGHT,ARET;*;延时子程序;*DELAY:MOVR7,#80HDELY1:MOVR6,#0FFHDELY2:DJNZR6,$;$代表当前行;;作用与DJNZ R6,DELY2相同DJNZR7,DELY1LED-P跑马灯并行LIGH

16、TEQU60H;定义指示灯数据存放地址单元 ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针;CLRP1.0;初始化有关I/O口MOVLIGHT,#01H;初始化指示灯数据NOPMAIN:LCALLFLYLED;调用指示灯循环点亮子程序LCALLDELAY;延时子程序AJMPMAIN;死循环;*;通过374循环点亮指示灯子程序;*FLYLED:MOVA,LIGHTCPLA;因为低电平点亮,故取反MOVP0,A;LIGHT中数据送到374的输入端;(因P1口与374输入端相连)SETBP1.0NOPCLRP1.0;产生一个锁存脉冲;将数据锁存到3

17、74中输出MOVA,LIGHTCLRCRLCA;ACC中数据左移一位;(高位丢到,低位补0)CJNEA,#0,FLYCON;A中不为0则继续MOVA,#01H;A中为0,循环完一轮;重新赋初值FLYCON:MOVLIGHT,ARET;*;延时子程序;*DELAY:MOVR7,#80HDELY1:MOVR6,#0FFHDELY2:DJNZR6,$;$代表当前行;与DJNZ R6,DELY2相同DJNZR7,DELY1RETEND实验3 数码管显示功能的实现一 实验目的1 了解数码管显示器的特性和使用方法2 进一步熟悉常用指令和编程技巧3 熟悉单片机I/O口的使用方法二 实验内容1 对照图4.3.

18、3和图4.3.4、图4.3.5,理解图4.3.3所示的电路原理2 读懂参考例程一和参考例程二3 分别验证参考例程一和参考例程二4 利用试验箱通用板上的电路模块,自行设计一套4位数码管显示器的并行动态显示电路三 实验步骤1 首先阅读课本,理解相关原理和程序运行2 调试示例程序,观察现象3 根据所学知识,编写一套4位数码管显示器的并行动态显示电路四 实验结果1 调试示例程序,结果都出现6位静态显示2 自行编写一套4位数码管显示器的并行动态显示电路子程序:MOV A,R0MOV DPTR,#DISPDMOV A,A+DPTRMOV P0,ASETB P1.1NOPCLR P1.1INC R0LCAL

19、L DELAYCJNE R0,#0AH,DISPMOV R0,#00HNOPRET调试后,可以4位数码管显示器的并行动态显示电路五 实验总结 进一步了解I/O口的使用,掌握串行和并行的区别和使用,以及数码管的原理和使用附:参考程序LED-S-P数码管显示功能的实现(并行动态显示参考程序1)D_DAT0EQU6AHD_DAT1EQU6BHD_DAT2EQU6CHD_DAT3EQU6DHD_DAT4EQU6EHD_DAT5EQU6FH;定义显示数据存储单元DATA_OEQUP0;定义显示数据输出口PLED1EQUP2.0PLED2EQUP2.1PLED3EQUP2.2PLED4EQUP2.3;以上

20、定义四片574输出锁存信号 ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针MOVD_DAT0,#0MOVD_DAT1,#1MOVD_DAT2,#2MOVD_DAT3,#3MOV D_DAT4,#4MOV D_DAT5,#5;初始化显示数据CLRPLED1CLRPLED2CLRPLED3CLRPLED4NOPMAIN:LCALLDISP;调用数码管循环点亮子程序LOOP:AJMPLOOP;循环执行主程序;*;通过574显示6位数字子程序;*DISP:MOVR0,#D_DAT0MOVA,R0;取需显示的数字MOVDPTR,#DISPD;装载笔画编

21、码表首地址MOVCA,A+DPTR;取需显示数字笔画代码XRLA,#0FFHMOVDATA_O,A;笔画代码送到P0口SETBPLED1NOPCLRPLED1;产生一个锁存脉冲,锁存笔画代码INCR0;R0增1指向下一个需显示数字MOVA,R0;取需显示的数字MOVDPTR,#DISPD;装载笔画编码表首地址MOVCA,A+DPTR;取需显示数字笔画代码XRLA,#0FFHMOVDATA_O,A;笔画代码送到P0口SETBPLED2NOPCLRPLED2;产生一个锁存脉冲,锁存笔画代码INCR0;R0增1指向下一个需显示数字MOVA,R0;取需显示的数字MOVDPTR,#DISPD;装载笔画编

22、码表首地址MOVCA,A+DPTR;取需显示数字笔画代码XRLA,#0FFHMOVDATA_O,A;笔画代码送到P0口SETBPLED3NOPCLRPLED3;产生一个锁存脉冲,锁存笔画代码INCR0;R0增1指向下一个需显示数字MOVA,R0;取需显示的数字MOVDPTR,#DISPD;装载笔画编码表首地址MOVCA,A+DPTR;取需显示数字笔画代码XRLA,#0FFHMOVDATA_O,A;笔画代码送到P0口SETBPLED4NOPCLRPLED4;产生一个锁存脉冲,锁存笔画代码RET;数字笔画代码表; 0 1 2 3 4 5 6 7 8 9 熄DISPD:DB 3FH,06H,5BH,

23、4FH,66H,6DH,7DH,07H,7FH,6FH,0END并行动态显示参考程序2LIGHTEQU60H;定义指示灯数据存放地址单元SIOEQUP2.0;串行移位数据SCLKEQUP2.1;串行移位时钟信号SRCLKEQUP2.2;输出锁存信号 ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针CLRSIOCLRSCLKCLRSRCLKMOVLIGHT,#01H;初始化指示灯输出数据NOPMAIN:LCALLFLYLED;调用指示灯循环点亮子程序LCALLDELAY;延时子程序同参考例程一AJMPMAIN;循环执行主程序;*;通过595循环点

24、亮指示灯子程序;*FLYLED:MOVA,LIGHTCLRCRLCA;A中最高位移到CCPLC;因低电平点亮,故取反MOVSIO,C;LIGHT中数据最高位送到SER输入端SETBSCLKNOPCLRSCLK;产生一个移位脉冲SETBSRCLKNOPCLRSRCLK;产生一个输出锁存脉冲CJNEA,#0,FLYCON;A中不为0则继续MOVA,#01H;A中为0,表明循环完一轮;重新赋初值FLYCON:MOVLIGHT,ARET;*;延时子程序;*DELAY:MOVR7,#80HDELY1:MOVR6,#0FFHDELY2:DJNZR6,$;$代表当前行;作用与DJNZ R6,DELY2相同D

25、JNZR7,DELY1RETEND并行动态显示参考程序3:D_DAT0EQU6AHD_DAT1EQU6BHD_DAT2EQU6CHD_DAT3EQU6DHD_DAT4EQU6EHD_DAT5EQU6FH;定义显示数据单元D_DAT6 EQU 70H ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针MOVD_DAT0,#0MOVD_DAT1,#1MOVD_DAT2,#2MOVD_DAT3,#3MOV D_DAT4,#4MOV D_DAT5,#5;初始化显示数据MOVP0,#0CLRP1.1;初始化有关I/O口CLRP1.2MOVR0,#D_DAT

26、0;初始化显示指针寄存器;R0指向第一位显示数字MOVR1,#01H;初始化需点亮数码管位置代码NOPMAIN:LCALLDISP;调用数码管循环点亮子程序LCALLDELAY;延时子程序同前,应修改延时长度AJMPMAIN;循环执行主程序DISP:MOVA,R1;取位代码MOVP0,A;位代码送P0口SETBP1.2NOPCLRP1.2;产生一个锁存脉冲,锁存位代码MOVA,R0;取需显示的数字MOVDPTR,#DISPD;装载笔画编码表首地址MOVCA,A+DPTR;取需显示数字笔画代码MOVP0,A;笔画代码送到P0口SETBP1.1NOPCLRP1.1;产生一个锁存脉冲,锁存笔画代码I

27、NCR0;R0增1指向下一个需显示数字MOVA,R1CLRCRLCAMOVR1,A;R1中的值左移1位,指向下一位数码管CJNER0,#70H,DISP1;R0中不为70H则继续MOVR0,#D_DAT0;R0中为70H,循环完一轮;重新赋初值MOVR1,#1;位置代码初值DISP1:NOPRET;数字笔画代码表; 0 1 2 3 4 5 6 7 8 9 熄DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0DELAY:MOVR7,#40HDELY1:MOVR6,#0FHDELY2:DJNZR6,$;$代表当前行;与DJNZ R6,DELY2相

28、同DJNZR7,DELY1RETEND串行动态显示参考程序1:D_DAT0EQU6AHD_DAT1EQU6BHD_DAT2EQU6CHD_DAT3EQU6DHD_DAT4EQU6EHD_DAT5EQU6FH;定义显示数据单元D_DAT6 EQU 70H ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针MOVD_DAT0,#0MOVD_DAT1,#1MOVD_DAT2,#2MOVD_DAT3,#3MOV D_DAT4,#4MOV D_DAT5,#5;初始化显示数据MOVP0,#0CLRP1.1;初始化有关I/O口CLRP1.2MOVR0,#D_D

29、AT0;初始化显示指针寄存器;R0指向第一位显示数字MOVR1,#01H;初始化需点亮数码管位置代码NOPMAIN:LCALLDISP;调用数码管循环点亮子程序LCALLDELAY;延时子程序同前,应修改延时长度AJMPMAIN;循环执行主程序;*;通过574显示6位数字子程序;*DISP:MOVA,R1;取位代码MOVP0,A;位代码送P0口SETBP1.2NOPCLRP1.2;产生一个锁存脉冲,锁存位代码MOVA,R0;取需显示的数字MOVDPTR,#DISPD;装载笔画编码表首地址MOVCA,A+DPTR;取需显示数字笔画代码MOVP0,A;笔画代码送到P0口SETBP1.1串行动态显示

30、参考程序2:(本程序实验时来不及执行,不知是否正确)D_DAT0EQU6AHD_DAT1EQU6BHD_DAT2EQU6CHD_DAT3EQU6DHD_DAT4EQU6EHD_DAT5EQU6FH;定义显示数据单元D_DAT6 EQU 70H ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针MOVD_DAT0,#0MOVD_DAT1,#1MOVD_DAT2,#2MOVD_DAT3,#3;初始化显示数据MOV D_DAT4,#4MOV D_DAT5,#5CLRP1.3;SER引脚CLRP1.1;SCLK引脚CLRP1.2;SRCLK引脚;初始化有

31、关I/O口MOVR0,#D_DAT0;初始化数据指针;R0指向第一位显示数字MOVR1,#01H;初始化需点亮数码管位置代码NOPMAIN:LCALLDISP;调用指示灯循环点亮子程序;LCALLDELAY;延时子程序同前NOPAJMPMAIN;死循环;*;通过595显示4位数字子程序;*DISP:MOVA,R1;取位代码数据MOVR2,#8DISP1:CLRCRLCAMOVP1.3,C; 位代码送到SER的输入端SETBP1.1NOPCLRP1.1;产生一个输入锁存脉冲DJNZR2,DISP1;依次将8位位代码移入;实际只有6位有用MOVA,R0;取需显示的数字MOVDPTR,#DISPD;

32、笔画编码表同前MOVCA,A+DPTR;取需显示数字笔画代码MOVR2,#8DISP2:CLRCRLCAMOVP1.3,C;笔画代码送到SER的输入端SETBP1.1NOPCLRP1.1;产生一个输入锁存脉冲DJNZR2,DISP2;依次将8位笔画代码(段代码)移入INCR0;R0增1指向下一个需显示数字MOVA,R1CLR CRLC AMOVR1,A;R1中的值左移1位,指向下一位数码管CJNER0,#070H,DISP3;R0中不为70H则继续MOVR0,#D_DAT0MOVR1,#01H;R0中为70H,循环完一轮;重新赋初值DISP3:SETBP1.2CLRP1.2RET;数字笔画代码

33、表; 0 1 2 3 4 5 6 7 8 9 熄DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0DELAY:MOVR7,#80HDELY1:MOVR6,#0FFHDELY2:DJNZR6,$;$代表当前行;与DJNZ R6,DELY2相同DJNZR7,DELY1RETEND实验任务:要让低次位LED数码管显示中总带有小数点,即显示的六位数值中总带有一位小数,请编程实现:D_DAT0EQU6AHD_DAT1EQU6BHD_DAT2EQU6CHD_DAT3EQU6DHD_DAT4EQU6EHD_DAT5EQU6FH;定义显示数据单元D_DAT6

34、 EQU 70H ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针MOVD_DAT0,#0MOVD_DAT1,#1MOVD_DAT2,#2MOVD_DAT3,#3MOV D_DAT4,#4MOV D_DAT5,#5;初始化显示数据MOVP0,#0CLRP1.1;初始化有关I/O口CLRP1.2MOVR0,#D_DAT0;初始化显示指针寄存器;R0指向第一位显示数字MOVR1,#01H;初始化需点亮数码管位置代码mov R3,#0HMOV R4,#0HNOPMAIN:LCALLDISP;调用数码管循环点亮子程序LCALLDELAY;延时子程序同前

35、,应修改延时长度AJMPMAIN;循环执行主程序;*;通过574显示6位数字子程序;*DISP:CJNE R4,#0FEH,NEXTMOV A,R3ADD A,#01HMOV R3,ACJNE R3,#07H,NEXTMOV R3,#0HNEXT:MOVA,R1;取位代码MOVP0,A;位代码送P0口SETBP1.2NOPCLRP1.2;产生一个锁存脉冲,锁存位代码MOVA,R0;取需显示的数字MOVDPTR,#DISPD;装载笔画编码表首地址MOVCA,A+DPTR;取需显示数字笔画代码CJNE R3,#01H ,POT1CJNE R1,#01H,DISP2ADD A,#80HPOT1:CJ

36、NE R3,#02H ,POT2CJNE R1,#02H,DISP2ADD A,#80HPOT2:CJNE R3,#03H ,POT3CJNE R1,#04H,DISP2ADD A,#80HPOT3:CJNE R3,#04H ,POT4CJNE R1,#08H,DISP2ADD A,#80HPOT4:CJNE R3,#05H ,POT5CJNE R1,#10H,DISP2ADD A,#80HPOT5:CJNE R3,#06H ,DISP2CJNE R1,#20H,DISP2ADD A,#80HDISP2:MOVP0,A;笔画代码送到P0口SETBP1.1NOPCLRP1.1;产生一个锁存脉冲,

37、锁存笔画代码INCR0;R0增1指向下一个需显示数字MOVA,R1CLRCRLCAMOVR1,A;R1中的值左移1位,指向下一位数码管MOV A,R4ADD A,#01H MOV R4,ACJNE R4,#0FFH,NEXT2MOV R4,#0HNEXT2:CJNER0,#70H,DISP1;R0中不为70H则继续MOVR0,#D_DAT0;R0中为70H,循环完一轮;重新赋初值MOVR1,#1;位置代码初值DISP1:NOPRET;数字笔画代码表; 0 1 2 3 4 5 6 7 8 9 熄DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0

38、;*;延时子程序;*DELAY:MOVR7,#40HDELY1:MOVR6,#0FHDELY2:DJNZR6,$;$代表当前行;与DJNZ R6,DELY2相同DJNZR7,DELY1RETEND实验5 按键功能的实现一 实验目的1 理解按键电路的作用2 学习按键功能的编程方法二 实验内容1 进一步理解单片机I/O口的使用方法2 看懂图4.3.6所示的电路,读懂参考程序3 自行设计4位按键分别操控四个数码管显示四个不同的数字三 实验步骤1 先阅读课本,理解程序和按键原理2 调试示例程序,观察现象3 自行设计4位按键分别操控四个数码管显示四个不同的数字四 实验结果1 调试示例程序,发现其可以静态

39、显示,且按键能改变数值2 自行设计4位按键分别操控四个数码管显示四个不同的数字子程序:START: MOV P1,#0F0HMOV P0,#0INTR : JNB P1.4,K1JNB P1.5,K2JNB P1.6,K3JNB P1.7,K4JMP INTRK1:MOV R0,#06HMOV R1,#01H,LJMP DISPK2:MOV R0,#:5BHMOV R1,#02H,LJMP DISPK3:MOV R0,#4FHMOV R1,#04H,LJMP DISPK4:MOV R0,#66HMOV R1,#08H,LJMP DISPDISP: MOV A,R1MOV P0,ASETB P1

40、.2NOPCLR P1.2MOV A,R0MOV P0,ASETB P1.1NOP CLR P1.1LCALL DELAYLJMP START 调试结果:4位按键分别操控四个数码管显示四个不同的数字五 实验小结 进一步了解I/O口和数码管使用和原理,掌握按键的使用和原理附:示例程序KEYUSE按键功能的实现D_DAT0EQU60HD_DAT1EQUD_DAT0+1D_DAT2EQUD_DAT1+1D_DAT3EQUD_DAT2+1D_DAT4EQUD_DAT3+1D_DAT5EQUD_DAT4+1;定义显示数据单元LIGHTEQUD_DAT5+1H_DAT0EQULIGHT+1H_DAT1EQ

41、UH_DAT0+1KBMEQUH_DAT1+1;定义按键功能号存放单元D_MAXEQUKBM+1;定义上限值存放单元D_MINEQUD_MAX+1;定义下限值存放单元T_DAT0EQUD_MIN+1T_DAT1EQUT_DAT0+1;定义测量值存放单元ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#30H;初始化堆栈指针MOVD_DAT0,#0MOVD_DAT1,#0MOVD_DAT2,#0MOVD_DAT3,#0MOV D_DAT4,#0MOV D_DAT5,#0;初始化显示数据MOVLIGHT,#80HCLRP1.0CLRP1.1CLRP1.2CLRP1.3;初始化有关I/O口MOVR0,#D_DAT0;初始化数据指针;R0指向第一位显示数字MOVR1,#01H;初始化需点亮数码管位置代码MOVKBM,#0;初始化功能号MOVD_MAX,#80MOVD_MIN,#70;初始化上、下限值MOVT_DAT0,#66MOVT_DAT1,#0;目前人为赋给测量值一个值;将来有实际测量值就存放在此MOVH_DAT0,T_DAT0MOVH

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论