北京工业大学8051单片机实验报告.doc

举报
资源描述
,. 8051单片机实验报告 专业:电子科学与技术 姓名: 学号: 120231 指导教师: 金冬月 第一单元 单片机程序调试环境使用及并行数据传送操作训练 1-1修改例程一的源程序: 将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。 $include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令 LCALL Init_Device ;调用初始设置子程序 MOV A,#080H ;赋初始值并在发光二极管上显示该数值 CPL A MOV P3,A LOOP: CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY RR A ;A寄存器内容右移1位并送发光二极管显示 MOV P3,A AJMP LOOP ;无限循环 DELAY: MOV R5,#0H ;延时子程序 D1: MOV R6,#0H DJNZ R6,$ DJNZ R5,D1 RET $include (Init_Device.inc) ;初始设置子程序文件包含伪指令 END 将LED向左循环移位点亮改为向右循环移位点亮。 $include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令 LCALL Init_Device ;调用初始设置子程序 MOV A,#07FH ;赋初始值并在发光二极管上显示该数值 MOV P3,A LOOP: CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY RL A ;A寄存器内容右移1位并送发光二极管显示 MOV P3,A AJMP LOOP ;无限循环 DELAY: MOV R5,#0H ;延时子程序 D1: MOV R6,#0H DJNZ R6,$ DJNZ R5,D1 RET $include (Init_Device.inc) ;初始设置子程序文件包含伪指令 END 加快LED循环移位点亮的速度。(删除几个延迟指令!) $include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令 LCALL Init_Device ;调用初始设置子程序 MOV A,#07FH ;赋初始值并在发光二极管上显示该数值 MOV P3,A LOOP: CALL DELAY CALL DELAY RR A ;A寄存器内容右移1位并送发光二极管显示 MOV P3,A AJMP LOOP ;无限循环 DELAY: MOV R5,#0H ;延时子程序 D1: MOV R6,#0H DJNZ R6,$ DJNZ R5,D1 RET $include (Init_Device.inc) ;初始设置子程序文件包含伪指令 END 1-2将例程二0-F的循环显示改为0-9的循环显示。 $include (C8051F020.inc) ORG 0000H LJMP INIT TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ; 段码0-7 DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ; 段码8-F INIT: LCALL Init_Device MOV R1,#00H ;操作数据初始值 MOV A,R1 MAIN: MOV DPTR,#TAB ;读取与A中数值对应的显示段码 MOVC A,@A+DPTR MOV P5A ;段码送并行口5显示 CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY INC R1 ;操作数据(R1)增1 MOV A,R1 CJNE A,#0AH,MAIN. ;检查操作数据是否大于显示范围(F) SJMP INIT ;无限循环 DELAY: MOV R5,#0H ;延时子程序 D1: MOV R6,#0H DJNZ R6,$ DJNZ R5,D1 RET $include (Init_Device.inc) END 实验2.中断控制及定时器/计数器操作训练 2-1通过对例程5的程序进行修改和上机调试,改变原程序的功能。 (1)将KEY2,KEY4的功能对调。 (2)每次停下再启动后,更改发光二极管点亮的循环方向。 $include (C8051F020.inc) ;C8051F02x单片机信息头文件包含伪指令 ORG 0000H LJMP INITIAL ;主程序入口 ORG 0013H LJMP STAR ;外中断0服务程序入口,开始键(STAR) ORG 0003H LJMP STOP ;外中断1服务程序入口 停止键(STOP) ORG 0100H INITIAL: LCALL Init_Device ;调用初始设置子程序 MOV P3,#0FFH ;熄灭全部发光二极管 MOV A,#0FFH MOV DPTR,#7F80H MOVX @DPTR,A ;清除数码管2(NUM2)显示 MOV A,#0FEH ;点亮发光二极管的初始数据 MOV R1,#1H ;发光二极管点亮位置初值 MOV IP,#04H ;设置INT0(开始键STAR)为高优先级 MOV TCON,#05H ;外中断采用边沿触发 SETB EX1 ;INT1(停止键STOP)开中断 SETB EA ;开放中断LOOP: LOOP: CLR EA ;关闭中断 RL A MOV P3,A ;刷新发光二极管控制数据 INC R1 ;发光二极管点亮位置计数值增1 SETB EA ;开放中断 LCALL DELAY1 ;延时 LCALL DELAY1 CJNE R1,#8,LOOP ;发光二极管点亮位置计数值有效性检测 MOV R1,#0H ;发光二极管点亮位置计数值等于8则回0 SJMP LOOP ;无限次循环 ;停止键的中断服务程序 STOP: PUSH ACC ;保护A寄存器内容 MOV A,R1 ;读取发光二极管点亮位置计数值 MOV DPTR,#TAB MOVC A,@A+DPTR ;获取发光二极管点亮位置计数值的显示段码 MOV DPTR,#7F80H MOVX @DPTR,A ;发光二极管点亮位置计数值的显示数据送显示 SETB EX1 ;INT0(启动键STAR)开中断 JNZ $ ;等待重新启动条件--A=0 MOV A,#0FFH MOVX @DPTR,A ;清除数码管2(DS2)显示 CLR EX1 ;禁止INT0中断(避免程序误动作) POP ACC ;恢复A寄存器内容 CLR IE0 ;清除INT1中断标志(避免程序误动作) RETI ;中断返回 ;启动键的中断服务程序 STAR: MOV A,#00H ;设置启动条件--A=0 CLR IE1 ;清除INT0中断标志(避免程序误动作) RETI ;中断返回 TAB: DB 0C0H,0F9H,0A4H,0B0H,099H ;0--4段码 DB 092H,082H,0F8H,080H ;5--8段码 DELAY1: MOV R6,#0 ;延时子程序 D1: MOV R7,#0 DJNZ R7,$ DJNZ R6,D1 RET $include (Init_Device.inc);初始设置子程序文件包含伪指令 2-2修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)。16进制→10进制方法 Hex/10:商=10进制十位,余数=10进制个位 $include (C8051F020.inc) DP2 EQU 07F80H DP1 EQU 07F90H ;增加一个 DP_L EQU 30H DP_H EQU 31H MAIN: LCALL Init_Device MOV TMOD,#00000110B ;使计数器工作在模式2 MOV A,#0 MOV DP_L,A ;显示计数的低位 MOV DP_H,A ;显示计数高位 CALL DISPLAY MOV TL0,#0 ;使TL0的初值为0 SETB TR0 ;启用定时器0 LOOP: MOV A,TL0 CJNE A,#100,L1 ;A不等于100时,转到L1显示 MOV TL0,#0 ;当A等于100时,TL0清零 MOV A,TL0 L1: MOV B,#10 DIV AB ;将16进制数转化为10进制数 MOV DP_L,B MOV B,#10 DIV AB MOV DP_H,B ;将B显示为高位 CALL DISPLAY SJMP LOOP ;循环LOOP DISPLAY: MOV A,DP_L CALL DECODE MOV DPTR,#DP1 MOVX @DPTR,A MOV A,DP_H CALL DECODE MOV DPTR,#DP2 MOVX @DPTR,A MOV P5,A RET DECODE: MOV DPTR,#TAB MOVC A,@A+DPTR RET TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH $include (Init_Device.inc) END 实验三.串行数据传送操作程序调试练习 (1) 将发送1,2,3,4的ASC码改为发送A,B,C,D的ASC码 $include (C8051F020.inc) NUM2 EQU 07F80H ;NUM2地址 NUM3 EQU 07F90H ;NUM3地址 NUM4 EQU 07FA0H ;NUM4地址 NUM5 EQU 07FB0H ;NUM5地址 TIM_L EQU 0FDH ; T/C1低字节计数值 TIM_H EQU 0FDH ;T/C1高字节计数值 REC_BUF0 EQU 32H ;数据接收缓冲器0 REC_BUF1 EQU 33H ;数据接收缓冲器1 REC_BUF2 EQU 34H ;数据接收缓冲器2 FLAG BIT 01H ;数据发送完成标志 ORG 0000H LJMP MAIN ;转主程序 ORG 0023H LJMP RECE ;转串行通信中断程序 MAIN: lcall Init_Device MOV A,#0FFH MOV P5,A ;清除数码管NUM1的显示 MOV DPTR,#NUM2 MOVX @DPTR,A ;清除数码管NUM2的显示 MOV DPTR,#NUM3 MOVX @DPTR,A ;清除数码管NUM3的显示 MOV DPTR,#NUM4 MOVX @DPTR,A ;清除数码管NUM4的显示 MOV DPTR,#NUM5 MOVX @DPTR,A ;清除数码管NUM5的显示 MOV R6,#0 ;通信操作状态寄存器清除 MOV SP,#40H ;堆栈栈底设置 MOV TMOD,#00100000B ;T/C1方式2 MOV TH1,#TIM_H ;T/C1重装填值 MOV TL1,#TIM_L ;T/C1计数值 SETB TR1 ;启动T/C1 MOV SCON0,#01010000B ;串口方式1 SETB ES ;串口中断允许 SETB EA ;开中断 LOOP: CALL KEYBOARD ;调用案件状态分析子程序 CJNE A,#0FFH,L0 ;按键状态发生变化转L0 CLR FLAG ;按键状态无变化,清除发送完成标志 SJMP LOOP ; L0: JB FLAG,LOOP ;数据发送完成,返回主循环 MOV R7,A ;否则,键值暂存R7 MOV A,#043H ;C MOV SBUF0,A ;发送字符C的ASCII码值 CALL DELAY ; MOV A,#04FH ;O MOV SBUF0,A ;发送字符O的ASCII码值 CALL DELAY ; MOV A,#04DH ;M MOV SBUF0,A ;发送字符M的ASCII码值 CALL DELAY ; MOV A,#04BH ;K MOV SBUF0,A ;发送字符K的ASCII码值 CALL DELAY ; MOV A,#30H ;发送数字0的ASCII码值 MOV SBUF0,A CALL DELAY ; MOV A,R7 ; ADD A,#40H ;生成键值的ASCII码值 MOV SBUF0,A ;发送键值的ASCII码值 SETB FLAG ;置位发送完成标志 SJMP LOOP ;中断服务程序 RECE: JNB TI,REC1 ;非发送转接收处理 CLR TI ;否则,清除发送中断标志 RETI ;中断返回 REC1: PUSH ACC ;保护累加器A MOV A,SBUF0 ;读接收缓冲器 CJNE R6,#0,REC2 ; CJNE A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理 MOV R6,#1 ;接收状态改为1 SJMP REC6 ; REC2: CJNE R6,#1,REC3 ; CJNE A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理 MOV R6,#2 ;接收状态改为2 SJMP REC6 ; REC3: CJNE R6,#2,REC4 ; CJNE A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理 MOV R6,#3 ;接收状态改为3 MOV R5,#3 ;数据接收计数器设置为3 SJMP REC6 ; REC4: CJNE R6,#3,REC6 ; PUSH ACC ;接收状态为3,暂存接收的内容 MOV A,#REC_BUF0 ADD A,R5 MOV R0,A ;生成接收数据存放缓冲器地址 POP ACC ;恢复接收数据至A寄存器 MOV @R0,A ;保存接收的数据 DEC R5 ;接收数据计数器减1 CJNE R5,#0,REC6 ; CALL DISPLAY ;接收数据计数器减为0,进行接收结果的显示 REC5: MOV R6,#0 ;接收状态恢复为0(就绪状态) REC6: POP ACC ;恢复累加器A CLR RI ;清除接收中断标志 RETI ;中断返回 KEYBOARD: MOV A,P2 ;读按键状态输入端口 RR A RR A RRC A ;KEY1有效键值移入位累加器C JC K1 ;键值无效转KEY2键值的分析 MOV A,#1 ;否则,KEY1代码送A寄存器 SJMP K5 K1: RRC A ;KEY2有效键值移入位累加器C JC K2 ;键值无效转KEY3键值的分析 MOV A,#2 ;否则,KEY2代码送A寄存器 SJMP K5 K2: RRC A ;KEY3有效键值移入位累加器C JC K3 ;键值无效转KEY4键值的分析 MOV A,#3 ;否则,KEY3代码送A寄存器 SJMP K5 K3: RRC A ;KEY4有效键值移入位累加器C JC K4 ;键值无效转按键无效处理 MOV A,#4 ;否则,KEY4代码送A寄存器 SJMP K5 K4: MOV A,#0FFH ;按键无效代码送A寄存器 K5: RET DISPLAY: MOV A,REC_BUF1 ;读取接收的第2字节数据 SWAP A ;高、低4位交换 ANL A,#0FH ;分离高4位有效数值 CALL DECODE ;换码 MOV DPTR,#NUM2 MOVX @DPTR,A ; NUM2显示第2字节数据高4位数值 MOV A,REC_BUF1 ;读取接收的第2字节数据 ANL A,#0FH ;提取低4位有效数值 CALL DECODE ;换码 MOV DPTR,#NUM3 MOVX @DPTR,A ; NUM3显示第2字节数据低4位数值 MOV A,REC_BUF2 ;读取接收的第3字节数据 SWAP A ;高、低4位交换 ANL A,#0FH ;分离高4位有效数值 CALL DECODE ;换码 MOV DPTR,#NUM4 MOVX @DPTR,A ; NUM4显示第3字节数据高4位数值 MOV A,REC_BUF2 ;读取接收的第3字节数据 ANL A,#0FH ;提取低4位有效数值 CALL DECODE ;换码 MOV DPTR,#NUM5 MOVX @DPTR,A ; NUM5显示第3字节数据低4位数值 RET ;换码程序 DECODE: MOV DPTR,#TAB MOVC A,@A+DPTR RET ;延时程序 DELAY: MOV R5,#80H D1: MOV R6,#0H DJNZ R6,$ DJNZ R5,D1 RET TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH $include (Init_Device.inc) END (2) 将第二字节和第三字节互换位置 $include (C8051F020.inc) NUM2 EQU 07F80H ;NUM2地址 NUM3 EQU 07F90H ;NUM3地址 NUM4 EQU 07FA0H ;NUM4地址 NUM5 EQU 07FB0H ;NUM5地址 TIM_L EQU 0FDH ; T/C1低字节计数值 TIM_H EQU 0FDH ;T/C1高字节计数值 REC_BUF0 EQU 32H ;数据接收缓冲器0 REC_BUF1 EQU 33H ;数据接收缓冲器1 REC_BUF2 EQU 34H ;数据接收缓冲器2 FLAG BIT 01H ;数据发送完成标志 ORG 0000H LJMP MAIN ;转主程序 ORG 0023H LJMP RECE ;转串行通信中断程序 MAIN: lcall Init_Device MOV A,#0FFH MOV P5,A ;清除数码管NUM1的显示 MOV DPTR,#NUM2 MOVX @DPTR,A ;清除数码管NUM2的显示 MOV DPTR,#NUM3 MOVX @DPTR,A ;清除数码管NUM3的显示 MOV DPTR,#NUM4 MOVX @DPTR,A ;清除数码管NUM4的显示 MOV DPTR,#NUM5 MOVX @DPTR,A ;清除数码管NUM5的显示 MOV R6,#0 ;通信操作状态寄存器清除 MOV SP,#30H ;堆栈栈底设置 MOV TMOD,#00100000B ;T/C1方式2 MOV TH1,#TIM_H ;T/C1重装填值 MOV TL1,#TIM_L ;T/C1计数值 SETB TR1 ;启动T/C1 MOV SCON0,#01010000B ;串口方式1 SETB ES ;串口中断允许 SETB EA ;开中断 LOOP: CALL KEYBOARD ;调用案件状态分析子程序 CJNE A,#0FFH,L0 ;按键状态发生变化转L0 CLR FLAG ;按键状态无变化,清除发送完成标志 SJMP LOOP ; L0: JB FLAG,LOOP ;数据发送完成,返回主循环 MOV R7,A ;否则,键值暂存R7 MOV A,#043H ;C MOV SBUF0,A ;发送字符C的ASCII码值 CALL DELAY ; MOV A,#04FH ;O MOV SBUF0,A ;发送字符O的ASCII码值 CALL DELAY ; MOV A,#04DH ;M MOV SBUF0,A ;发送字符M的ASCII码值 CALL DELAY ; MOV A,#04BH ;K MOV SBUF0,A ;发送字符K的ASCII码值 CALL DELAY ; MOV A,#30H ;发送数字0的ASCII码值 MOV SBUF0,A CALL DELAY ; MOV A,R7 ; ADD A,#30H ;生成键值的ASCII码值 MOV SBUF0,A ;发送键值的ASCII码值 SETB FLAG ;置位发送完成标志 SJMP LOOP ;中断服务程序 RECE: JNB TI,REC1 ;非发送转接收处理 CLR TI ;否则,清除发送中断标志 RETI ;中断返回 REC1: PUSH ACC ;保护累加器A MOV A,SBUF0 ;读接收缓冲器 CJNE R6,#0,REC2 ; CJNE A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理 MOV R6,#1 ;接收状态改为1 SJMP REC6 ; REC2: CJNE R6,#1,REC3 ; CJNE A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理 MOV R6,#2 ;接收状态改为2 SJMP REC6 ; REC3: CJNE R6,#2,REC4 ; CJNE A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理 MOV R6,#3 ;接收状态改为3 MOV R5,#3 ;数据接收计数器设置为3 SJMP REC6 ; REC4: CJNE R6,#3,REC6 ; PUSH ACC ;接收状态为3,暂存接收的内容 MOV A,#REC_BUF0 ADD A,R5 MOV R0,A ;生成接收数据存放缓冲器地址 POP ACC ;恢复接收数据至A寄存器 MOV @R0,A ;保存接收的数据 DEC R5 ;接收数据计数器减1 CJNE R5,#0,REC6 ; CALL DISPLAY ;接收数据计数器减为0,进行接收结果的显示 REC5: MOV R6,#0 ;接收状态恢复为0(就绪状态) REC6: POP ACC ;恢复累加器A CLR RI ;清除接收中断标志 RETI ;中断返回 KEYBOARD: MOV A,P2 ;读按键状态输入端口 RR A RR A RRC A ;KEY1有效键值移入位累加器C JC K1 ;键值无效转KEY2键值的分析 MOV A,#1 ;否则,KEY1代码送A寄存器 SJMP K5 K1: RRC A ;KEY2有效键值移入位累加器C JC K2 ;键值无效转KEY3键值的分析 MOV A,#2 ;否则,KEY2代码送A寄存器 SJMP K5 K2: RRC A ;KEY3有效键值移入位累加器C JC K3 ;键值无效转KEY4键值的分析 MOV A,#3 ;否则,KEY3代码送A寄存器 SJMP K5 K3: RRC A ;KEY4有效键值移入位累加器C JC K4 ;键值无效转按键无效处理 MOV A,#4 ;否则,KEY4代码送A寄存器 SJMP K5 K4: MOV A,#0FFH ;按键无效代码送A寄存器 K5: RET DISPLAY: MOV A,REC_BUF1 ;读取接收的第2字节数据 SWAP A ;高、低4位交换 ANL A,#0FH ;分离高4位有效数值 CALL DECODE ;换码 MOV DPTR,#NUM4 MOVX @DPTR,A ; NUM2显示第2字节数据高4位数值 MOV A,REC_BUF1 ;读取接收的第2字节数据 ANL A,#0FH ;提取低4位有效数值 CALL DECODE ;换码 MOV DPTR,#NUM5 MOVX @DPTR,A ; NUM3显示第2字
展开阅读全文
相关搜索
温馨提示:
taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

当前位置:首页 > 教育专区 > 教案示例


本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁