单片机原理及应用实验教程文档格式.docx
《单片机原理及应用实验教程文档格式.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用实验教程文档格式.docx(51页珍藏版)》请在冰豆网上搜索。
DJNZR0,RIGHT1
;
*****************************************************************************
/*延时子程序*/
*****************************************************************************
DELAY:
MOVR5,#10
DELAY1:
MOVR6,#50
DELAY2:
MOVR7,#250
DJNZR7,$
DJNZR6,DELAY2
DJNZR5,DELAY1
RET
END
C51语言程序CP1.C:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharrrc(uchara,n);
ucharrrc(uchara,n)//循环右移子程序
{
ucharb,c;
b=a<
<
(8-n);
c=a>
>
n;
a=c|b;
return(a);
}
voidmain()
uchari,temp;
uintj;
P1=0xff;
loop:
temp=0x7f;
for(i=0;
i<
8;
i++)
{
P1=rrc(temp,i);
for(j=0;
j<
30000;
j++);
//延时
}
gotoloop;
【连机调试】
主要步骤如下:
(以项目文件CP1.HPJ和文件CP1.C为例)
1.将微机的串口和单片机的串口连接(单片机的串口在单片机的仿真主机部件区最右边)。
2.连接实验导线。
3.连接单片机电源线并打开单片机电源。
4.在桌面上找图标
,启动。
如果出现
说明单片机电源未开。
5.在“项目菜单”中打开项目文件CP1.HPJ。
6.在“文件菜单”中打开源程序文件CP1.C。
7.在“项目菜单”中编译连接装载。
8.选择“!
”执行,观察发光二极管的变化。
9.关闭项目。
【思考题】
1分析CP2.C,比较CP2.C和CP1.C的差别。
②打开p1.DSN,在仿真软件PROTEUS中观察此实验。
实验二P1P3口输入输出实验
(参考QTH-2008XS系列单片机实验仪说明书1.3节)
P1P3口输入输出实验。
P3口作为输入口读取开关状态,P1口作为输出口,设计电路和程序,使得发光二极管显示开关状态。
学习P1、P3口的使用方法。
①P10~P17分别接L1~L8。
2P30~P33分别接K01~K03,P36~P37分别接K07~K08。
P34(P3.4),P35(P3.5)不接开关,原因见调试部分的说明,也就是说,只使用上图中的6个开关。
P30(P3.0),P31(P3.1),P32(P3.2),P33(P3.3),P34(P3.4),P35(P3.5),P36(P3.6),P37(P3.7)8根线在仿真主机部件区。
K01~K08在手动高低电平输出区。
P1P3.HPJ/CP1P3.HPJ,源程序文件:
P1P3.ASM/CP1P3.C。
汇编语言程序P1P3.ASM:
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVP1,#00H
MOVP1,P3;
把P3口的状态送到P1口
LOOP:
CALLDELAY
/*延时子程序*/
MOVR5,#10
MOVR6,#50
MOVR7,#250
DJNZR7,$
DJNZR6,DELAY2
DJNZR5,DELAY1
RET
END
C51语言程序CP1P3.C:
//P1=0XFF;
P1=P3;
//读取P3口状态送P1口
for(j=0;
5000;
//延时
(以项目文件CP1P3.HPJ和文件CP1P3.C为例)
5.在“项目菜单”中打开项目文件CP1P3.HPJ。
6.在“文件菜单”中打开源程序文件CP1P3.C。
”执行,拨动开关,观察发光二极管的变化。
P34(P3.4)和P35(P3.5)不能接开关,这两个脚悬空,否则下载程序失败,会出现下面的对话框:
1.修改实验程序,当输入为全0或全1时退出程序。
2.修改实验连线和程序,改为以P1口作输入,P3口作输出,测试是否可行。
3.打开p1p3.DSN,在仿真软件PROTEUS中观察此实验。
实验三外部中断实验
(参考QTH-2008XS系列单片机实验仪说明书1.5节)
(方案一)
外部中断实验。
设计电路和程序,利用开关发出中断请求信号,当开关为高电平发光二极管常亮,为低电平时中断处理程序控制发光二极管依此左移变亮。
掌握外部中断技术的基本使用方法及中断程序的编程方法。
K01接P34(P3.4)对应单片机CPU上的INT0。
L1-L8在LED显示区
K01在手动高低电平输出区
P34(P3.4)在仿真主机部件区。
IINT0.HPJ/CIINT0.HPJ,源程序文件:
IINT0.ASM/CIINT0.C
汇编语言文件IINT0.ASM:
ORG0000H
AJMPMAIN
ORG0003H
AJMPIINT0
ORG0030H
MOVIE,#10000001B;
允许中断
CLRIT0;
IT=00低电平触发方式
MOVP1,#00H
AJMPLOOP
IINT0:
MOVR0,#08H;
中断服务程序
IINT01:
RLCA
DJNZR0,IINT01
RETI
C51语言文件CIINT0.C:
#defineucharunsignedchar
#defineuintunsignedint
voidmain()
IE=0x81;
//允许外部中断0
IT0=0;
//电平方式,低电平有效.当IT0或IT1为1时边沿方式
P1=0x00;
//全亮
/*中断服务子程序*/
voidiint0()interrupt0using0
//interrupt0表示使用外部中断0的输入信号,usingn表示向量地址8n+3
ucharb,c,i,temp;
i++)//右移一位
{
b=temp<
(8-i);
c=temp>
i;
P1=c|b;
(以项目文件CIINT0.HPJ和文件CIINT0.C为例)
5.在“项目菜单”中打开项目文件CIINT0.HPJ。
6.在“文件菜单”中打开源程序文件CIINT0.C。
1.打开Iint0.DSN,在仿真软件PROTEUS中观察此实验。
(方案二)
设计电路和程序,利用两个开关发出中断请求信号,当开关1为高电平发光二极管常亮,为低电平时中断处理程序控制发光二极管依此左移变亮。
当开关2为高电平发光二极管常亮,为低电平时中断处理程序控制发光二极管依此右移变亮。
掌握多个外部中断源技术的基本使用方法及中断程序的编程方法。
在方案一连线的基础上加一跟线:
K02接P3.5(P35)对应单片机CPU上的INT1。
K02在手动高低电平输出区。
P3.5(P35)在仿真主机部件区。
INT01.HPJ/CINT01.HPJ,源程序文件:
INT01.ASM/CINT01.C
汇编语言文件INT01.ASM:
ORG0000H
ORG0013H
AJMPIINT1
MOVIE,#10000101B;
允许中断,开放INT0、INT1
CLRIT0;
低电平触发
CLRIT1;
MOVP1,#00H;
发光二极管常亮
外部中断0
RLCA;
左移
IINT1:
外部中断1
IINT11:
RRCA;
右移
DJNZR0,IINT11
END
C51语言文件CINT01.C:
IE=0x85;
//允许外部中断0和外部中断1,当两个信号都有输入时,外部中断0优先
//电平方式,低电平有效.当IT0或IT1为1时边沿方式
IT1=0;
voidiint1()interrupt2using2
//interrupt2表示使用外部中断1的输入信号,usingn表示向量地址8n+3
i++)//右移一位
voidiint0()interrupt0using0
temp=0xfe;
i++)//左移一位
b=temp>
c=temp<
(以项目文件CINT01.HPJ和文件CINT01.C为例)
5.在“项目菜单”中打开项目文件CINT01.HPJ。
6.在“文件菜单”中打开源程序文件CINT01.C。
1.打开Iint01.DSN,在仿真软件PROTEUS中观察此实验。
实验四定时器/计数器实验
(参考QTH-2008XS系列单片机实验仪说明书1.6节)
(方案一定时器实验)
定时器实验
利用单片机定时器T2进行倒计时,并在双位数码管上显示倒计时间。
掌握单片机定时和中断的编程方法。
1DIN-P3.0(P30)
2CLK接P3.1(P31)
DIN和CLK在液晶显示器下方的串并转换电路,P3.0(P30)和P3.0(P31)在仿真主机部件区。
time.HPJ/Ctime.HPJ,源程序文件:
time.ASM/Ctime.C
汇编语言文件time.ASM:
$NOMOD51
NAMETIME
$NOLIST
$INCLUDE(REG52.INC)
$LIST
BUFFDATA50H;
计数值,每100个10MS即1S
SSBUFDATA51H;
秒缓冲区
ORG002BH;
定时器2中断程序入口
AJMPTIME
;
RCAP2H和RCAP2L重装计数初值0D8F0H=55536D,时钟频率12MHZ,10MS定时
MOVRCAP2H,#0D8H;
RCAP2H→TH2
MOVRCAP2L,#0F0H;
RCAP2L→TL2
MOVTH2,#0D8H;
定时时间=(2^16-T0初值)*时钟周期*12
MOVTL2,#0F0H;
(2^16-OD8F0H)*1/(12*10^6)*12=10MS
MOVIE,#10100000B;
MOVT2CON,#00001000B;
允许重新装入(外部允许标志)
MOVSSBUF,#00H;
两个数码管显示的初值
MOVBUFF,#100;
SETBTR2;
启动定时计数器2
ACALLDSUP
DSUP:
MOVA,SSBUF;
取秒的低位
ANLA,#0FH
ACALLSEND;
显示
MOVA,SSBUF
SWAPA
ANLA,#0FH;
取秒的高位
SEND:
MOVDPTR,#SGTB1
MOVCA,@A+DPTR;
取字符
MOVSBUF,A
JNBTI,$
CLRTI;
发送字符
TIME:
CLREA;
关中断
PUSHPSW;
保护工作寄存器
PUSHACC
PUSH01H
CLRTF2
MOVA,BUFF;
取1%秒BUFF缓冲区的内容
DECA;
1%秒BUFF缓冲区内容减1
MOVBUFF,A;
1%秒BUFF缓冲区内容保存
CJNEA,#00H,TIME2;
是否等于0秒?
不等于转出
MOVA,#64H;
1%秒BUFF缓冲区送100
MOVBUFF,A
MOVA,SSBUF;
取秒SSBUF缓冲区的内容
SUBBA,#01H;
秒单元内容减1
JNBPSW.6,TIME1;
是否有辅助借位,若有CF=1
SUBBA,#06H;
有借位进行十进制调整,#00H-1=#0FFH,#0FFH-6-1=0F8H,CF=1
TIME1:
MOVSSBUF,A
CJNEA,#0F8H,TIME2;
是否等于60秒?
MOVA,#59H;
秒缓冲区送59
MOVSSBUF,A
AJMPTIME2
TIME2:
POP01H;
恢复断点
POPACC
POPPSW
SETBEA;
开中断
/*延时子程序*/
MOVR4,#250;
延时
MOVR5,#250
DJNZR5,$
DJNZR4,DELAY1
/*字符编码*/
SGTB1:
DB03H;
DB9FH;
1
DB25H;
2
DB0DH;
3
DB99H;
4
DB49H;
5
DB41H;
6
DB1FH;
7
DB01H;
8
DB09H;
9
DB0FFH;
灭
C51语言文件Ctime.C:
#inclu