单片机实验一报告范文Word格式文档下载.docx
《单片机实验一报告范文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机实验一报告范文Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
同样可调试拼字程序。
五、实验结果及分析(附上编写的程序、执行的截屏及分析)
1、实验的源程序如下:
ORG0000H
LJMPMAIN
ORG30H
MAIN:
MOVDPTR,#7000H
MOVA,#68H
MOVX@DPTR,A
MOVXA,@DPTR
ANLA,#0F0H
SWAPA
INCDPTR
MOVDPTR,#7000H
ANLA,#0FH
MOVDPTR,#7002H
SJMP$
END
2、执行的截屏如下:
(1)新建工程:
(2)选择Atmel:
(3)选择AT89C51型号的单片机:
(4)将编写的程序添加到工程中:
(5)在keil中的编译及执行结果如下:
3.实验分析:
(3)实验分析
单片机是一门非常重视实践的技术,不能总是看书,但要学习它首先应看书,对单片机引脚、内部结构、寄存器和原理有一定地了解和感官认识,是开发工具和开发环境的选择。
在对单片机有了一定了解之后就可以学会使用它了。
但是单片机能完成的功能太多了,尤其是对外围器件的控制,综合起来能设计出许多意想不到的产品。
因此通过此次实验虽然我对单片机的编程和仿真入了门,但离精通还很远,需要不断地努力学习。
此次实验不仅让我熟练掌握和应用了单片机的编程和引脚,熟悉了单片机方面的硬件,但还是不能自己设计电路,为了能达到会自己运用单片机实现它的功能,我要不断的积累经验,不断地学习。
通过此次拆字、拼字实验我更加熟悉了汇编语言,而且让自己更有目的的学习单片机,除此之外我还知道了以后单片机实验之前都需要好好准备,这样才能打有准备之战,更好地实现学习单片机的目的。
IP口彩灯控制系统
一、实验目的
1、通过实验了解单片机最小系统
2、掌握P0口作为输入、输出方式使用时,CPU对P0口的操作方法。
二、实验器材
3、实验内容
控制要求为:
(1)正常情况下,8个发光二极管顺序点亮。
(2)按下K1时,第1个和第8个发光二极管闪烁,闪烁间隔时间为1s。
(3)按下K2时,8个发光二极管闪烁,闪烁间隔时间为0.5s。
(4)发光二极管有单片机P0口控制。
参照参考程序结构,但必须添加修改程序内容,并调试、正确运行。
(5)用proteus仿真软件运行硬件电路仿真设计。
四、实验步骤
1、打开Keil程序,执行菜单命令“Project”——“NewProject”创建“P口彩灯控制实验”项目,并选择单片机型号为AT89C51。
2、执行菜单命令“File”——“New”创建文件,输入源程序,保存为“P口彩灯控制实验.c”。
在“Project”栏的File项目管理窗口中右击文件组,选择“AddFilestoGroup'
SourceGroup1'
”将源程序“P口彩灯控制实验.c”添加到项目中。
3、执行菜单命令“Project”——“OptionsforTarget'
Target1'
”,在弹出的对话框中选择“Output”选项卡,选中“GreateHEXFile”。
4、执行菜单命令“Project”——“BiuldTarget”,编译源程序。
如果编译成功,则在“OutputWindow”窗口中显示没有错误,并创建了“P口彩灯控制实验.HEX”文件。
5、在Proteus仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行。
五、实验结果及分析(附上编写的程序、执行的截屏及分析)
1.实验程序如下:
#include"
reg51.h"
#defineunitunsignedint
#defineucharunsignedchar
//tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x80};
voiddelay(void)
{inti;
for(i=0;
i<
32780;
i++)i=0;
}
voidint0()interrupt0
{tab[0]=0x01;
tab[1]=0x02;
tab[2]=0x04;
tab[3]=0x08;
tab[4]=0x10;
tab[5]=0x20;
tab[6]=0x40;
tab[7]=0x80;
voidint1()interrupt2
{inta;
a=-100;
if(a<
0)a=0;
voidmain(void)
{ucharx;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
EA=1;
while
(1)
{for(x=0;
x<
8;
x++)
{P0=tab[x];
deplay();
}
}
2.执行时的截屏如下各图所示:
(5)在keil中程序的执行及运行如下:
(6)在proteus中仿真执行的结果如下图所示:
1.初始化程序包括定时器初始化和中断系统初始化主要是对IP、IE、TCON、TMOD的相应位进行正确的设置并将时间常数送入定时器中。
由于只有定时器中断P不必设置。
设计中断服务程序和主程序时中断服务程序除了要完成计数减一工作外还要将时间常数重新送入定时器中为下一次中断做准备。
使用定时器中断时往往在主程序中赋初值的寄存器在中断服务程序中也要重新赋初值。
例如本例中的TH1、TL1还有控制P1口的累加寄存器A。
因为在主程序中涉及全亮和全灭这两个配合使用了两次一般的延时子程序但是大部分的延时还是依靠定时器中断完成的。
虽然实验开始我只能调用老师给出的实验程序,在此基础上加以修改和理解,但整个实验还是加强了我思考问题的完整性和实际生活联系的可行性的能力,也培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识,熟悉了单片机编程和仿真的连接实验。
由于本实验是基于proteus和keil软件,所以我对这两款软件都有了更深刻的理解和更加熟悉了这些单片机模拟软件和硬件的仿真。
加深了自己对单片机功能的理解和运用能力。
数码管显示实验
2014.12.14实验成绩:
通过实验掌握数码管,显示数据的方法;
熟悉有关元器件的使用方法。
计算机、Keil软件、Proteus软件、组合实验板最小系统,16脚插座,四块数码管,+5V电源一台,仿真器一台或固化器一台。
图中,74LS47是七段译码器。
它是将BCD码翻译成七段驱动码,驱动数码管显示数据,数码管为共阴普亮数码管,型号为LTS547R,BCD码由P0口的低四位输出,P2口作为位选口,P2.0对应左(右)边那块是首显示块,P2.3对应右(左)边的那块是末显示块。
工作时,先送BCD码,再选位,使选中的数码管点亮,往复循环。
①循环显示“1”,“2”,“3”,“4”。
②右循环显示“1”,“2”,“3”,“4”。
③先四个显示块显示1,2,3,4,1秒后四个显示块同时显示5,6,7,8。
1.打开Keil程序,执行菜单命令“Project”“NewProject”创建“数码管显示”项目,并选择单片机型号为AT89C51。
2.执行菜单命令“File”“New”创建文件,输入源程序,保存为“数码管显示.c”。
3.在“Project”栏的File项目管理窗口中右击文件组,选择“AddFilestoGroup‘Source
Group1’”将源程序“数码管显示.c”添加到项目中。
4.执行菜单命令“Project”“OptionsforTarget‘Target1’”,在弹出的对话框中选择“Output”选项卡,选中“GreateHEXFile”。
5.执行菜单命令“Project”“BuildTarget”,编译源程序。
如果编译成功,则在“Output
Window”窗口中显示没有错误,并创建了“数码管显示.HEX”文件。
6.在proteus仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行,注意修改4LS47输入脚与数码管的引脚连接。
#defineuintunsignedint
codeuchartab[]={0x01,0x02,0x03,0x04};
codeuchartab1[]={0x05,0x06,0x07,0x08};
codeuchartab2[]={0x01,0x02,0x04,0x08};
{
unsignedinti;
for(i=0;
63535;
i++){}
{unsignedinti;
4;
i++){
P0=tab[i];
P2=tab2[i];
delay();
(4)在Keil中编程并保存:
(5)生成hex文件:
(6)在proteus仿真软件中运行的:
3.实验分析
运行电路时开始数码管有点乱码,不能达到设计电路的目的,但在我反复检查电路之后,发现了程序中扫描信号端口错误,于是我将扫描信号的端口顺序调换,并重新运行之后。
电路就能正常显示,并符合设计要求。
通过本次的实验在前两个实验的基础上让我复习了知识点,也让我掌握了新的知识。
在完成这次实验后让我想到可以用多个按键控制多个数码管实现加减和暂停和开始。
我觉得这次的课程实验从开始时的一次次的失败,到反复摸索不断修改,不断地去发现问题,从而解决问题,完成更深入的探索。
也让我明白理论知识的重要性并且与实际相结合,多动手,努力让自己在实践中成长。
由于本实验是基于proteus和keil软件,所以我对这两款软件都有了更深刻的理解和更加熟悉了这些单片机模拟软件和硬件的仿真,同时也加深了自己对单片机功能的理解和运用能力。
双单片机串口通信实验
掌握单片机串口通信的设计方法,了解双单片机通信的原理。
已知8051的串行口采用方式1进行通信,晶振频率为11.0592MHz,选用定时器T1作为波特率发生器,T1工作于方式2,要求通信的波特率为9600,计算T1的初值。
设SMOD=0,根据式定时方式:
X=M-要求的定时值/(12/fosc),计算T1的初值如下:
X=28-11.0592*106/9600*32*12=253=FDH
选用11.0592MHZ晶振的目的就是为了使计算得到的初值为整数,选用定时器T1工作于方式2作为波特率发生器,只需要在初始化编程的时候,将计算得到的初值写入TH1和TL1,当T1溢出时会自动重新装入初值,从而产生精确的波特率真。
如果将T1工作于方式0或方式1,则当T1溢出时需要由中断服务程序重装初值,这时中断响应时间和中断服务程序指令的执行时间将导致波特率产生一定的误差。
因此采用T1作为串行口的波特率真发生器时,通常都将T1设置为工作方式2。
1.打开Keil程序,执行菜单命令“Project”“NewProject”创建“双单片机串口通信”
项目,并选择单片机型号为AT89C51。
2.执行菜单命令“File”“New”创建文件,输入源程序,保存为“双单片机串口通信.A51”。
Group1’”将源程序“双单片机串口通信.A51”添加到项目中。
4.执行菜单命令“Project”“OptionsforTarget‘Target1’”,在弹出的对话框中
选择“Output”选项卡,选中“GreateHEXFile”。
Window”窗口中显示没有错误,并创建了“双单片机串口通信.HEX”文件。
6.在proteus仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行。
在proteus仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行。
实验结果及分析(附上编写的程序、执行的截屏及分析)
发送程序:
ORG0000H
LJMPTRS
ORG0030H
TRS:
MOVR7,#10H
MOVR0,#40H
MOVA,#0
TRS1:
MOV@R0,A
INCA
INCR0
DJNZR7,TRS1
MOVSCON,#90H;
设置串行口工作方式2
MOVPCON,#80H;
波特率为FOSC/32
MOVR0,#40H;
设置片内数据指针
MOVR2,#10H;
数据长度送R2
LOOP:
MOVA,@R0;
取数据送A
MOVC,P;
奇偶位送TB8
MOVTB8,C
MOVSBUF,A;
启动发送
MOVP1,A
LCALLDELAY
WAIT:
JBCTI,CONT;
判发送完标志
SJMPWAIT
CONT:
JBCRI,RE;
准备接收回送标志
SJMPCONT
RE:
MOVA,SBUF;
接收回送标志
CJNEA,#00H,L;
回送标志错误,结束
INCR0;
回送标志正确,继续
DJNZR2,LOOP;
发送16个数据
L:
SJMPL
DELAY:
MOVR7,#3
DD1:
MOVR6,#0FFH
DD2:
MOVR5,#0FFH
DJNZR5,$
DJNZR6,DD2
DJNZR7,DD1
RET
END
接收方程序:
LJMPREV
ORG30H
REV:
MOVSCON,#90H;
设置串行口工作方式2,允许接收
波特率为fosc/32
MOVR7,#10H
JBCRI,READ;
等待接收数据并清0标志位RI
SJMPLOOP
READ:
MOVA,SBUF;
读入一帧数据
JBPSW.0,ONE;
判接收端奇偶位
JBRB8,RIGHT;
判发送端奇偶位
SJMPRIGHT
ONE:
JBRB8,ERR
RIGHT:
SWAPA;
接收正确,高低位交换
MOVP1,A;
送往P1显示
LCALLDELAY;
延时
MOVSBUF,#00H;
回送正确标志
DJNZR7,LOOP;
接收未完,继续
ERR:
MOVP1,#0FFH;
接收出错,显示FF
MOVSBUF,#0FFH;
回送出错标志
LL:
SJMPLL
(1)新建工程‘双单片机串口通信’:
(2)在keil中编程后将文件加入到工程中:
(3)生成hex文件:
(4)在keil软件中编译并运行:
(5)在proteus软件中仿真运行:
本次实验需要完成两个程序,发送发和接受方,但是并没有要求加入奇偶校验,因此难度不大,从实验结果中可以看出,当发送方数码管显示要发送的数值时,接收方数码管也几乎同时显示出此数值,证明接收无误,实验结果正确。
两个单片机都使用串口方式1进行通信,并且必须保证两单片机通信的波特率完全一致,否则接收不到正确的数。
通过此次双单片机串口通信实验,我对单片机的各个管脚的功能也有了进一步的认识,熟悉了单片机编程和仿真的连接实验,深刻理解了单片机通信的原理。
并加深了自己对单片机功能的理解和运用能力。
A/D转换实验
2014.12.24实验成绩:
了解ADC0809/ADC0808的工作原理;
掌握单片机与ADC0809/ADC0808接口原理;
熟悉CPU中断方式和查询方式读取A/D转换结果的程序设计方法。
计算机、keil软件、proteus软件
①用中断方式编写并调试出一个程序;
②用查询方式编写并调试出一个程序;
③用调用显示子程序方法,将转换结果在显示块上显示出来。
1.打开Keil程序,执行菜单命令“Project”“NewProject”创建“0808AD转换”项目,并选择单片机型号为AT89C51。
2.执行菜单命令“File”“New”创建文件,输入源程序,保存为“0808AD转换.A51”。
3.在“Project”栏的File项目管理窗口中右击文件组,选择“AddFilestoGroup‘Source
4.Group1’”将源程序“0808AD转换.A51”添加到项目中。
5.执行菜单命令“Project”“OptionsforTarget‘Target1’”,在弹出的对话框中
6.选择“Output”选项卡,选中“GreateHEXFile”。
7.执行菜单命令“Project”“BuildTarget”,编译源程序。
8.Window”窗口中显示没有错误,并创建了“0808AD转换.HEX”文件。
9.在proteus仿真平台上建立参考图系统,并将程序上载到虚拟芯片上运行。
1.实验源程序如下所示:
ORG0000H;
主程序入口
LJMPMAIN
MOVR0,#30H
MOVR4,#08H
MOVR1,#00H
MOVR2,#7FH
MOVA,#00H
MOVX@R1,A
MOVA,30H
JNBP3.3,LP
LCALLRDAD
LP:
SJMPLOOP
RDAD:
MOVXA,@R1
MOV@R0,A
INCR1
DJNZR4,LOOP1
MOVR0,#30H
MOVR1,#00H;
LOOP1:
RET
2.执行的截屏如下:
(1)工程的新建图,选择Atmal、AT89C51,在keil中编程及运行与上各图类似,此处不再重复。
(2)在keil中编译及运行的结果是:
(2)在proteus中仿真运行的结果如下图所示:
A/D转换器大致有三类一是双积分A/D转换器优点是精度高抗干扰性好价格便宜但速度慢二是逐次逼近A/D转换器精度速度价格适中三是并行A/D转换器速度快价格也昂贵。
实验用的ADC0809属第二类是八位A/D转换器。
每采集一次一般需100us。
本程序是用延时查询方式读入A/D转换结果,也可以用中断方式读入结果,在中断方式下A/D转换结束后会自动产生EOC信号将其与CPU的外部中断相接,有兴趣的同学可以试