《单片机实验程序...docx》由会员分享,可在线阅读,更多相关《单片机实验程序...docx(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机实验程序.一1修改例程一的源程序1将A寄存器的初值改为80H正逻辑,数据位为1表示发光二极管点亮,再对源程序进行简单修改,使程序运行后发光二极管情况与修改前一样。2将LED向左循环移位点亮改为向右循环移位点亮3加快LED循环移位点亮的速度$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令INIT:LCALLInit_Device调用初始设置子程序1MOVA,#080H;赋初始值并在发光二极管上显示该数值CPLAMOVP3,ALOOP:CALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYC
2、ALLDELAY2RLA;A寄存器内容右移1位并送1发光二极管显示MOVP3,AAJMPLOOP;无限循环DELAY:MOVR5,#0H;延时子程序D1:MOVR6,#00HDJNZR6,$DJNZR5,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令END3可删除几个CALLDELAY语句即可加快循环速度2将例程二0F的循环显示改为09的循环显示$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令ORG0000HLJMPINITTAB:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H
3、,0F8H;字符段码表0-7DB080H,090H;字符段码表8-FINIT:lcallInit_Device;调用初始设置子程序INIT1:MOVR1,#00H;操作数据初始值MOVA,R1MAIN:MOVDPTR,#TAB;读取与A中数值对应的显示段码MOVCA,A+DPTRMOVP5,A;段码送并行口1显示CALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYINCR1;操作数据(R1)增1M
4、OVA,R1CJNEA,#0AH,MAIN;检查操作数据能否大于显示范围FSJMPINIT1;无限循环DELAY:MOVR5,#0H;延时子程序D1:MOVR6,#0HDJNZR6,$DJNZR5,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令END二1.例程5程序修改1将KEY2、KEY4的功能对调2每次停下再启动以后,更改发光二极管点亮的循环方向$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令ORG0000HLJMPINITIAL;主程序入口ORG0003HLJMPSTOP;外中断0服务程序入口,开
5、场键STARORG0013HLJMPSTAR;外中断1服务程序入口停止键STOPORG0100HINITIAL:LCALLInit_Device;调用初始设置子程序MOVP3,#0FFH;熄灭全部发光二极管MOVA,#0FFHMOVDPTR,#7F80HMOVXDPTR,A;去除数码管2NUM2显示MOVA,#0FEH;点亮发光二极管的初始数据MOVR1,#1H;发光二极管点亮位置初值MOVR4,#0FHMOVIP,#04H;设置INT0开场键STAR为高优先级MOVTCON,#05H;外中断采用边沿触发SETBEX0;INT1停止键STOP开中断SETBEA;开放中断LOOP:CLREA;关
6、闭中断CJNER4,#0FH,LPRLACJNER4,#0FH,LPMOVP3,ACJNER4,#0FH,LPINCR1CJNER4,#0FH,LPSETBEALCALLDELAY1LCALLDELAY1LCALLDELAY1LCALLDELAY1CJNER1,#8H,LOOPMOVR1,#0HSJMPLOOPLP:CLREACJNER4,#0F0H,LOOPRRACJNER4,#0F0H,LOOPMOVP3,ACJNER4,#0F0H,LOOPDECR1CJNER4,#0F0H,LOOPSETBEALCALLDELAY1LCALLDELAY1LCALLDELAY1LCALLDELAY1CJN
7、ER1,#0H,LPMOVR1,#8HSJMPLP;停止键的中断服务程序STOP:PUSHACC;保护A寄存器内容MOVA,R1;读取发光二极管点亮位置计数值MOVDPTR,#TABMOVCA,A+DPTR;获取发光二极管点亮位置计数值的显示段码MOVDPTR,#7F80HMOVXDPTR,A;发光二极管点亮位置计数值的显示数据送显示SETBEX1;INT0启动键STAR开中断JNZ$;等待重新启动条件-A=0MOVA,#0FFHMOVXDPTR,A;去除数码管2NUM2显示CLREX1;禁止INT0中断避免程序误动作POPACC;恢复A寄存器内容CLRIE1;去除INT1停止键STOP中断标
8、志避免程序误动作RETI;中断返回;启动键的中断服务程序STAR:MOVA,#00H;设置启动条件-A=0CLRIE0;去除INT0启动键STOP中断标志避免程序误动作PUSHACCMOVA,R4CPLAMOVR4,APOPACCRETI;中断返回TAB:DB0C0H,0F9H,0A4H,0B0H,099H;0-4段码DB092H,082H,0F8H,080H;5-8段码DELAY1:MOVR6,#0;延时子程序D1:MOVR7,#0DJNZR7,$DJNZR6,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令END2.修改例程6,将计数范围由0-F扩
9、展至00-FF使用定时器/计时器0,并在2位数码管上用10进制数显示计数结果00-99$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令DP2EQU07F80HDP_LEQU30H;低位数值暂存器DP_HEQU31H;高位数值暂存器MAIN:LCALLInit_Device;调用初始设置子程序MOVTMOD,#00000101B;C/T0工作于方式2MOVA,#0;显示初值为0MOVDP_L,AMOVDP_H,ACALLDISPLAY;调用显示子程序显示初值0MOVTL0,#0;C/T0置初值0SETBTR0;启动计数器0LOOP:MOVA,TL0
10、;读计数器0的计数值CJNEA,#0AH,L1MOVTL0,#0MOVA,#0INCDP_HMOVA,DP_HCJNEA,#0AH,MMMOVDP_H,#0MM:MOVA,#0L1:MOVDP_L,A;在NUM2显示计数器0的计数值CALLDISPLAY;调用显示子程序显示计数值SJMPLOOP;无限次循环;显示子程序DISPLAY:MOVA,DP_L;读低位显示值CALLDECODE;调用换码子程序MOVDPTR,#DP2;显示段码送NUM2MOVXDPTR,AMOVA,DP_H;读高位显示值CALLDECODE;调用换码子程序MOVP5,ARET;换码子程序DECODE:MOVDPTR,#
11、TABMOVCA,A+DPTRRETTAB:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H;显示段码0-7DB080H,090H,088H,083H,0C6H,0A1H,086H,08EH;显示段码8-F$include(Init_Device.inc);初始设置子程序文件包含伪指令END三通过对例程8的程序进行修改和上机调试,改变源程序的功能1将发送1、2、3、4的ASCII码改为发送A、B、C、D的ASCII码2将接收的第2、第3字节数据的显示位置交换$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令NUM2
12、EQU07F80H;NUM2地址NUM3EQU07F90H;NUM3地址NUM4EQU07FA0H;NUM4地址NUM5EQU07FB0H;NUM5地址TIM_LEQU0FDH;T/C1低字节计数值TIM_HEQU0FDH;T/C1高字节计数值REC_BUF0EQU32H;数据接收缓冲器0REC_BUF1EQU34H;数据接收缓冲器1REC_BUF2EQU33H;数据接收缓冲器2FLAGBIT01H;数据发送完成标志ORG0000HLJMPMAIN;转主程序ORG0023HLJMPRECE;转串行通信中断程序;主程序MAIN:lcallInit_Device;C8051F02x系列单片机信息头
13、文件包含伪指令MOVA,#0FFHMOVP5,AMOVDPTR,#NUM2MOVXDPTR,A;去除数码管NUM1的显示MOVDPTR,#NUM3MOVXDPTR,A;去除数码管NUM2的显示MOVDPTR,#NUM4MOVXDPTR,A;去除数码管NUM3的显示MOVDPTR,#NUM5MOVXDPTR,A;去除数码管NUM4的显示MOVR6,#0;通信操作状态寄存器去除MOVSP,#40H;堆栈栈底设置MOVTMOD,#00100000B;T/C1方式2MOVTH1,#TIM_H;T/C1重装填值MOVTL1,#TIM_L;T/C1计数值SETBTR1;启动T/C1MOVSCON0,#01
14、010000B;串口方式1SETBES;串口中断允许SETBEA;开中断;主循环LOOP:CALLKEYBOARD;调用案件状态分析子程序CJNEA,#0FFH,L0;按键状态发生变化转L0CLRFLAG;按键状态无变化,去除发送完成标志SJMPLOOPL0:JBFLAG,LOOP;数据发送完成,返回主循环MOVR7,A;否则,键值暂存R7MOVA,#043H;CMOVSBUF0,A;发送字符C的ASCII码值CALLDELAYMOVA,#04FH;OMOVSBUF0,A;发送字符O的ASCII码值CALLDELAYMOVA,#04DH;MMOVSBUF0,A;发送字符M的ASCII码值CAL
15、LDELAYMOVA,#04BH;KMOVSBUF0,A;发送字符K的ASCII码值CALLDELAYMOVA,#40H;发送数字0的ASCII码值MOVSBUF0,ACALLDELAYMOVA,R7ADDA,#40H;生成键值的ASCII码值MOVSBUF0,A;发送键值的ASCII码值SETBFLAG;置位发送完成标志SJMPLOOP;中断服务程序RECE:JNBTI,REC1;非发送转接收处理CLRTI;否则,去除发送中断标志RETI;中断返回REC1:PUSHACC;保护累加器AMOVA,SBUF0;读接收缓冲器CJNER6,#0,REC2CJNEA,#43H,REC6;接收状态为0,
16、进行字符C的过滤处理MOVR6,#1;接收状态改为1SJMPREC6REC2:CJNER6,#1,REC3CJNEA,#4FH,REC5;接收状态为1,进行字符O的过滤处理MOVR6,#2;接收状态改为2SJMPREC6REC3:CJNER6,#2,REC4CJNEA,#4DH,REC5;接收状态为2,进行字符M的过滤处理MOVR6,#3;接收状态改为3MOVR5,#3;数据接收计数器设置为3SJMPREC6REC4:CJNER6,#3,REC6PUSHACC;接收状态为3,暂存接收的内容MOVA,#REC_BUF0ADDA,R5MOVR0,A;生成接收数据存放缓冲器地址POPACC;恢复接收
17、数据至A寄存器MOVR0,A;保存接收的数据DECR5;接收数据计数器减1CJNER5,#0,REC6CALLDISPLAY;接收数据计数器减为0,进行接收结果的显示REC5:MOVR6,#0;接收状态恢复为0就绪状态REC6:POPACC;恢复累加器ACLRRI;去除接收中断标志RETI;中断返回KEYBOARD:MOVA,P2;读按键状态输入端口RRARRARRCA;KEY1有效键值移入位累加器CJCK1;键值无效转KEY2键值的分析MOVA,#1;否则,KEY1代码送A寄存器SJMPK5K1:RRCA;KEY2有效键值移入位累加器CJCK2;键值无效转KEY3键值的分析MOVA,#2;否
18、则,KEY2代码送A寄存器SJMPK5K2:RRCA;KEY3有效键值移入位累加器CJCK3;键值无效转KEY4键值的分析MOVA,#3;否则,KEY3代码送A寄存器SJMPK5K3:RRCA;KEY4有效键值移入位累加器CJCK4;键值无效转按键无效处理MOVA,#4;否则,KEY4代码送A寄存器SJMPK5K4:MOVA,#0FFH;按键无效代码送A寄存器K5:RETDISPLAY:MOVA,REC_BUF2;读取接收的第2字节数据SWAPA;高、低4位交换ANLA,#0FH;分离高4位有效数值CALLDECODE;换码MOVDPTR,#NUM2MOVXDPTR,A;在数码管NUM2显示第
19、2字节数据高4位数值MOVA,REC_BUF2;读取接收的第2字节数据ANLA,#0FH;提取低4位有效数值CALLDECODE;换码MOVDPTR,#NUM3MOVXDPTR,A;在数码管NUM3显示第2字节数据低4位数值MOVA,REC_BUF1;读取接收的第3字节数据SWAPA;高、低4位交换ANLA,#0FH;分离高4位有效数值CALLDECODE;换码MOVDPTR,#NUM4MOVXDPTR,A;在数码管NUM4显示第3字节数据高4位数值MOVA,REC_BUF1;读取接收的第3字节数据ANLA,#0FH;提取低4位有效数值CALLDECODE;换码MOVDPTR,#NUM5MOVXDPTR,A;在数码管NUM5显示第3字节数据低4位数值RET;-DECODEPROGRAM-DECODE:MOVDPTR,#TABMOVCA,A+DPTRRET;-DELAYPROGRAM-DELAY:MOVR5,#80HD1:MOVR6,#0HDJNZR6,$DJNZR5,D1RETTAB:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8HDB080H,090H,088H,083H,0C6H,0A1H,086H,08EH$include(Init_Device.inc);初始设置子程序文件包含伪指令END