单片机.docx
- 文档编号:26750791
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:20
- 大小:116.54KB
单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(20页珍藏版)》请在冰豆网上搜索。
单片机
实验2单片机数据区传送程序设计
1.要求:
编写程序把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的地址的RAM区。
2.框图如下,文件名为:
XXXXS2
班级学号
五、实验步骤
1.打开电源,PC机开机正常工作后,进MCS-51仿真开发系统调试平台,编译源文件S2成功。
(详细过程同实验1的步骤1~3)
2.在R2、R3中输入源地址(例如:
0000H),R4、R5中输入目的地址(例如2000H),R6、R7中输入字节数(例如:
1FFFH)。
1.查看RAM区0000~1FFFH和2000~3FFFH内容,也可自己重新赋值。
2.运行程序XXXXS2,首先单步,然后用自动单步,最后用连续运行方式。
3.记录下运行结果,检查0000~1FFFH中内容是否和2000~3FFFH内容完全一致。
六、要求
1.写出自己编写的程序,并写出原理性注释。
2.将检查程序运行的结果,分析一下是否正确。
七、思考题
如果使0000~1000H中内容与2000~3000H内容完全一致,如何来改写程序?
八、参考程序
ORG0100H
8B82SE22:
MOVDPL,R3
8A83MOVDPH,R2;建立源程序首址
E0MOVXA,@DPTR;取数
8D82MOVDPL,R5
8C83MOVDPH,R4;目的地首址
F0MOVX@DPTR.A;传送
BBFF01CJNER3,#OFFH,LO42
0AINCR2
0BLO42:
INCR3;源地址加1
BDFF01CJNER5,#0FFH,L043
OCINCR4
ODLO43:
INCR5;目的地址加1
BF0006CJNER7,#00H,LO44
BE0006CJNER6,#00H,LO45;字节数减1
80FESJMP$
00NOP
1FLO44:
DECR7
80E0SJMPSE22
1FLO45:
DECR7
1EDECR6
80DCSJMPSE22;未完继续
END
实验3数据排序实验
实验内容
1.编写并调试一个排序程序,其功能为用冒泡法(参见单片机教材84页)将RAM中几个单字节无符号的正整数,按从小到大的次序重新排列。
程序框图如下:
五、实验步骤
1.编写程序XXXXS3,满足程序要求,在CPU内部的RAM50H~5AH中放入不等的数据。
2.运行该程序后检查50H~5AH内容是否按从小到大排列,结果记录下表中:
RAM
状态
50
51
52
53
54
55
56
57
58
59
5A
运行前内容
运行后内容
六、思考题
修改程序S3,将50H~5AH中内容按从大到小排列,并且记录下程序运行前后的结果,分析是否正确。
七、参考程序
ORG0300H
7B50QUE:
MOVR3,#50H
EBQUE1:
MOVA,R3;指针送R0
F8MOVR0,A
7F0AMOVR7,#0AH;长度送R7
C200CLR00H;标志位为0
E6MOVA,@R0
08QL2:
INCR0
FAMOVR2,A
C3CLRC
8622MOV22H,@R0;取后数
B52201CJNEA,22H,QL3;相等吗?
D3SETBC
EAQL3:
MOVA,R2
4006JCQL1;大于则交换位置
D200SETB00H
C6XCHA,@R0
18DECR0
C6XCHA,@R0
08INCR0;大于则交换位置
E6QL1:
MOVA,@R0
DFEBDJNZR7,QL2
2000E1JB00H,QUE1;一次循环中有交换继续
80FESJMP$;无交换退出
END
实验4查找相同数个数
二、实验内容
在2000~200FH中查出有几个字节是零,把零的个数放在2100H中。
三、程序框图
四、实验步骤
在2000~200FH的几个单元中填入零,运行本程序后检查2100H单元中的数是否与2000~200FH中零的个数相同。
五、思考
在1000~100FH的几个单元中填入8H,检查8H的个数,并填入1100H单元中,如何来修改程序?
六、参考程序
ORG0AA0H
0AA07810L5800:
MOVR0,#10H;查找16个字节
0AA27900MOVR1,#00H
0AA4902000MOVDPTR,#2000H
0AA7E0L5811:
MOVXA,@DPTR
0AA8B40001CJNEA,#00H,L5816;取出内容与00H相等吗?
0AAB09INCR1;取出个数加1
0AACA3L5816:
INCDPTR
0AADD8F8DJNZR0,L5811;未完继续
0AAF902100MOVDPTR,#2100H
0AB2E9MOVA,R1
0AB3F0MOVX@DPTR,A;相同数个数送2100H
0AB480FEL581E:
SJMPL581E
END
实验5P1口转弯灯实验
二、实验内容
P1.0开关接5V时,右转弯灯闪亮,P1.1开关接5V时左转弯灯闪亮。
P1.0、P1.1开关同时接5V或接地时,转弯灯均不闪亮。
三、程序框图
四、实验电路
五、实验步骤
P1.0接K1,P1.1接K2,P1.4~P1.7分别接L1、L5、L9、L13,连续运行本程序,应看到转弯灯正确闪亮,在用单步方式调试本程序时需修改延时子程序,(例如可把延时程序第一个字节改成返回指令22H),以便观察。
六、参考程序
ORG0C30H
0C307590EFPX00:
MOVP1,#0FFH;初始化
0C33E590PX03:
MOVA,P1
0C35F5F0MOVB,A
0C375403ANLA,#03H
0C39B40126CJNEA,#01H,PX01;满足只是P1.0为高条件吗?
0C3C200012JB00H,PX04;闪烁标志位
0C3FC294CLRP1.4
0C41C295CLRP1.5;开右灯
0C43D296SETBP1.6
0C45D297SETBP1.7;关左灯
0C477A20MOVR2,#20H
0C49120213LCALLDELY;延时
0C4CD200SETB00H;置标志位
0C4E020C33LJMPPX03;继续查状态
0C51D294PX04:
SETBP1.4
0C53D295SETBP1.5
0C55D296SETBP1.6;关灯
0C57D297SETBP1.7
0C597A20MOVR2,#20H
0C5B120213LCALLDELY;延时
0C5EC200CLR00H;清标志位
0C608133AJMPPX03;继续查状态
0C62B40227PX01:
CJNEA,#02H,PX02;满足只是P1.1为高条件
;吗?
0C65200112JB01H,PX05;判标志位
0C68D294SETBP1.4
0C6AD295SETBP1.5;开左灯
0C6CC296CLRP1.6
0C6EC297CLRP1.7;关右灯
0C707A20MOVR2,#20H;延时
0C72120213LCALLDELY
0C75D201SETB01H;置标志位
0C77020C33LJMPPX03;继续查状态
0C7AD294PX05:
SETBP1.4
0C7CD295SETBP1.5
0C7ED296SETBP1.6;关灯
0C80D297SETBP1.7
0C827A20MOVR2,#20H
0C84120213LCALLDELY;延时
0C87C201CLR01H;清标志位
0C89020C33LJMPPX03;继续查状态
0C8CD294PX02:
SETBP1.4
0C8ED295SETBP1.5
0C90D296SETBP1.6;关灯
0C92D297SETBP1.7
0C94020C33LJMPPX03;继续
ORG0213H
0213C002DELY:
PUSH02H
0215C002DEL2:
PUSH02H
0217C002DEL3:
PUSH02H;延时
0219DAFEDEL4:
DJNZR2,DEL4
021BD002POP02H
021DDAF8DJNZR2,DEL3
021FD002POP02H
0221DAF2DJNZR2,DEL2
0223D002POP02H
0225DAECDJNZR2,DELY
022722RET
END
实验6工业顺序控制
三、实验内容
8031的P1.0~P1.6控制注塑机的七道工序,现模拟控制七只发光二极管的点亮,低电平有效,设定每道工序时间转换为延时,P3.4为开工启动开关,高电平动作。
P3.3为外部故障输入模拟开关,低电平报警,P1.7为报警声音输出,设定6道工序只有一位输出,第七道工序三位有输出。
四、程序框图
五、实验电路
六、实验步骤
按实验电路图接好连线。
执行程序,把K1接到高电平,观察发光二极管点亮情况,确定工序执行是否正常,然后把K2置为低电平,看是否有声音报警,恢复中断1,报警停,又从刚才报警时一道程序执行下去。
可以单步、单步跟踪,非全速断点、全速断点、连续执行功能调试软件,直到符合程序设计要求为止。
七、思考
修改程序,使每道工序中有多位输出。
八、参考程序
ORG0190H
019075907FPO10:
MOVP1,#7FH
019343B000ORLP3,#00H
019630B4FDPO11:
JNBP3.4,PO11;开工吗?
019943A884ORLIE,#84H
019C43B801ORLIP,#01H
019F75D000MOVPSW,#00H;初始化
01A2758153MOVSP,#53H
01A575907EPO12:
MOVP1,#7EH;第一道工序
01A831F1ACALLPO1B
01AA75907DMOVP1,#7DH;第二道工序
01AD31F1ACALLPO1B
01AF75907BMOVP1,#7BH;第三道工序
01B231F1ACALLPO1B
01B4759077MOVP1,#77H;第四道工序
01B731F1ACALLPO1B
01B975906FMOVP1,#6FH;第五道工序
01BC31F1ACALLPO1B
01BE75905FMOVP1,#5FH;第六道工序
01C131F1ACALLPO1B
01C375900FMOVP1,#0FH;第七道工序
01C631A5ACALLPO12
01C880DBSJMPPO12
01CA8AF0PO16:
MOVB,R2;保护现场
01CC75907FPO17:
MOVP1,#7FH;关输出
01CF7520A0MOV20H,#0A0H;振荡次数
01D2D297PO18:
SETBP1.7;振荡
01D431ECACALLPO1A;延时
01D6C297CLRP1.7;停振
01D831ECACALLPO1A;延时
01DAD520F5DJNZ20H,PO18;不为0转
01DDC297CLRP1.7
01DF31ECACALLPO1A;停振
01E130B3E8JNBP3.3,PO17;故障消除吗?
01E4AAF0MOVR2,B;恢复现场
01E632RETI
01E77A10PO19:
MOVR2,#10H
01E95113ACALLDELY;延时1
01EB22RET
01EC7A06PO1A:
MOVR2,#06H
01EE5113ACALLDELY;延时2
01F022RET
01F17A30P01B:
MOVR2,#30H
01F35113ACALLDELY;延时3
01F522RET
ORG0213H
0213C002DELY:
PUSH02H
0215C002DEL2:
PUSH02H
0217C002DEL3:
PUSH02H
0219DAFEDEL4:
DJNZR2,DEL4
021BD002POP02H
021DDAF8DJNZR2,DEL3
021FD002POP02H
0221DAF2DJNZR2,DEL2
0223D002POP02H
0225DAECDJNZR2,DELY
022722RET
END
简述如何用KEILC51对软件进行仿真?
写出具体操作过程。
1.keilC51windows集成开发平台介绍
2.导入需要仿真的程序
Ø建立一个工程项目芯片选择属性设置(hex文件)建立源程序文件添加文件到当前项目组中编译文件
ISP软件的使用
⏹打开下载软件,双击目录下的文件ISPgm.exe,打开软件进入软件使用界面
⏹1.芯片选择:
左击界面右面芯片选择窗口的下拉箭标,选择编程芯片的型号。
⏹2.导入hex文件到缓冲区:
左击界面上的“OpenFile”按钮,选择本目录下的hex文件。
⏹3.向芯片写入文件:
左击界面上的“Write”按钮,开始编程向芯片写入程序。
⏹4.完成写入编程。
⏹5.退出程序:
左击界面右上角的“x”按钮,退出此程序。
定时/计数器实验
(1)要求从P1口用指示灯LED0至LED7从右至左逐个低电平点亮
(2)要求采用定时计数器T1方式1,时间间隔为2秒,此过程循环往复。
(3)根据要求焊接单片机电路。
(+5V电源和单片机下载系统由实验箱提供,学生自己根据要求焊接8个LED指示灯和1K的限流电阻,并连接成实验电路)
(4)单片机程序的编制、调试及运行。
#include"reg51.h"
#include"intrins.h"
voiddelay05s(void)
{unsignedchari,j,k;
for(i=5;i>0;i--)
{for(j=200;j>0;j--)
{for(k=250;k>0;k--){;}}
}}
voidmain()
{unsignedcharOutData=0xfe;
for(;;)
{P1=OutData;
OutData=_crol_(OutData,1);//循环左移
delay05s();
}
}
1、编写程序实现8个LED指示灯从左到右,从右到左依次循环点亮。
1、#include"reg51.h"
#include"intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharj,k;
voidmDelay(unsignedintDelay)
{unsignedinti;
for(;Delay>0;Delay--)
{for(i=0;i<124;i++)
{;}}}
voidmain()
{unsignedcharOutData=0xfe;
while
(1){
for(j=0;j<7;j++)
{P1=OutData;
OutData=_crol_(OutData,1);//循环左移
mDelay(1000);/*延时1000毫秒*/}
for(k=0;k<7;k++)
{P1=OutData;
OutData=_cror_(OutData,1);//循环左移
mDelay(1000);/*延时1000毫秒*/}}}
2、编写程序实现8个LED指示灯闪亮3次并且从左到右,从右到左依次循环点亮。
2、#include"reg51.h"
#include"intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharj,k,OutData=0xfe;
voidmDelay(unsignedintDelay)
{unsignedinti;
for(;Delay>0;Delay--)
{for(i=0;i<124;i++)
{;}}}
voidFLASH()
{ucharl;
for(l=3;l>0;l--)
{P1=OutData;
mDelay(1000);
P1=0xff;
mDelay(1000);}}
voidmain()
{OutData=0xfe;
while
(1){
for(j=0;j<7;j++)
{OutData=_crol_(OutData,1);
FLASH();}
for(k=0;k<7;k++)
{OutData=_cror_(OutData,1);
FLASH();
}}}
1、第一个发光二极管以间隔500ms闪烁。
#include"reg51.h"
sbitd1=P1^0;
voiddelay05s(void)
{unsignedchari,j,k;
for(i=5;i>0;i--)
{for(j=200;j>0;j--)
{for(k=250;k>0;k--){;}}
}}
voidmain()
{for(;;)
{d1=!
d1;
delay05s();
}
}
2、8个由左至右间隔1s流动,其中每个管亮500ms,
灭500ms,一直重复下去。
⏹2、
⏹#include"reg51.h"
⏹#include"intrins.h"
⏹#defineucharunsignedchar
⏹#defineuintunsignedint
⏹ucharj,k,OutData=0xfe;
⏹voidmDelay(unsignedintDelay)
⏹{unsignedinti;
⏹for(;Delay>0;Delay--)
⏹{for(i=0;i<124;i++)
⏹{;}}}
⏹voidFLASH()
⏹{P1=OutData;
⏹mDelay(1000);
⏹P1=0xff;
⏹mDelay(1000);}
⏹voidmain()
⏹{OutData=0xfe;
⏹while
(1){
⏹{OutData=_crol_(OutData,1);
⏹FLASH();}
⏹}}
3、8个发光二极管演示出8位二进制数累加过程。
间隔300ms第一次一个管点亮,第二次2个,以此
点亮8个。
然后重复循环。
#include"reg51.h"
#defineucharunsignedchar
uchara=0;
voiddelay03s(void)
{unsignedchari,j,k;
for(i=3;i>0;i--)
{for(j=200;j>0;j--)
{for(k=250;k>0;k--){;}}
}}
voidmain()
{while
(1)
{a++;
delay03s();
P1=~a;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机