51单片机实验一实验报告[5篇模版]

时间:2020-11-05 12:20:47下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《51单片机实验一实验报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《51单片机实验一实验报告》。

第一篇:51单片机实验一实验报告

实验报告

班级:

姓名:

学号:

组别:

课程名称:单片机原理及应用

实验室:

实验时间:

实验项目名称:

实验一

MCS-51单片机及其开发系统(仿真器)的认识 一、实验目的:

学习并掌握单片机仿真系统的操作方法,熟悉系统功能及用法。

(1)了解MCS-51单片机开发常用工具。

(2)了解仿真器构成、功能及连接。

(3)掌握MCS-51开发软件(汇编器)安装、功能及基本操作。

(4)掌握源程序的编辑、汇编、运行(包括连续执行、单步执行和跟踪执行)。

(5)掌握汇编语言指令与机器语言指令之间的对应关系。

(6)掌握ORG、DATA、BIT等伪指令的作用。

(7)掌握在仿真开发系统下浏览、修改特殊功能寄存器、内部RAM、外部RAM单元的方法。

(8)理解MCS-51单片机在复位期间及复位后有关引脚的状态、特殊功能寄存器的初值。

二、实验内容及原理:

MdeWin单片机仿真系统的安装、设置、主要功能操作练习。

三、实验器材:

MdeWin单片机仿真系统一套、PC机一台。

四、实验步骤及实验结果分析:

一、程序输入练习

首先在Medwin下新建一项目,并新建一后缀名为asm的文件(汇编源文件),并添加入项目中。

按规定的格式输入以上程序(只输源程序部分)。

二、程序运行和控制:

1.程序的编译、产生代码并装入: 输入源程序完毕后,可在“项目管理”窗口中点击“编译/汇编”选项,如程序无输入错误、语法错误等,编译完成。在消息窗口中,产生编译成功信息。如有错误,则消息窗口中指出错误所在行及错误类型,请重新修改源程序。

编译成功后,在“项目管理”窗口中点击“产生代码并装入”选项,对编译无误后产生的OBJ文件进行连接,并把代码装入仿真器。代码装入仿真器后,即可实行仿真。

可在反汇编窗口中查看编译产生的机器码,并与上述程序中对照。

记录你认为能说明问题的检查结果。

2.程序的全速、断点、单步等执行方式: 为提高调试程序的运行速度,程序采用全速断点运行方式。

练习设置及取消设置程序断点。

比较单步及跟踪两种程序运行方式的不同。

3.查看单片机各种资源状态及内容:

在“察看”窗口中可以查看单片机内部及程序变量等各种资源,在单步或程序断点运行中可以实时观察单片机SFR、内外RAM、程序变量等内容,可以很方便的观测程序的运行状况。

将观测的结果记录下来以便和程序分析结果相比较。

三.程序输入补充练习1.汇编语言源程序编辑、运行及调试,输入、编辑、汇编、运行(连续、单步执行)如下程序段:

;变量定义区

XVAR DATA

30H

;定义变量 X,Y地址

YVAR DATA

38H

P10 BIT

P1.0

;位定义P1.0定义为P10

ORG

0000H

;伪指令 定义PC开始位置

LJMP

MAIN

;长跳转到主程序位置

ORG

0100H

;伪指令 主程序开始位置 MAIN: MOV SP, #9FH

;设置堆栈地址

MOV A, #55H

;A=55H

MOV XVAR, A

;XVAR(30H)=55H

MOV R0, #XVAR

;R0=30H

MOV @R0, #01H

;(30H)=01H

INC R0

;R0=31H

MOV @R0, #02H

;(31H)=02H

MOV R1, #YVAR

;R1=38H

MOV A, @R0

;A=02H

MOV @R1, A

;(38H)=02H

PUSH Acc

;压栈操作A0,A1存储acc和psw

PUSH PSW

;

MOV A, #0AAH

;A=AAH

SETB RS0

;01 选用第一区寄存器

CLR RS1

MOV R0, #5AH

;R0=5AH

MOV R1, #0A5H

;R1=A5H

POP PSW

;出栈操作释放acc和psw

POP ACC

INC R1

;R1=39H

DEC R0

;R0=30H

MOV A, @R0

;A=01H

MOV @R1, A

;(39H)=01H

CLR P1.0

SETB P1.0

;置位P1.0

MOV 90H, #00H

;(90H)=00H

MOV 90H, #55H

;(90H)=55H

MOV 90H, #0FFH

;(90H)=FFH

MOV P1, #00H

;P1=00H

MOV P1, #55H

;P1=55H

MOV P1, #0FFH

;P1=FFH

SJMP $

END(1)找出每条指令的机器码,并与第3章指令码表对照,指出每一指令的功能、寻址方式、操作数书写形式。

地址

机器码

指令

目的操作数/ / 源操作数

MOV SP, #9FH

目的操作数:直接寻址;源操作数:立即寻址 MOV A, #55H

目的操作数:寄存器寻址;源操作数:立即寻址; MOV XVAR, A

目的操作数:直接寻址;源操作数:寄存器寻址; MOV R0, #XVAR

目的操作数:寄存器寻址;源操作数:立即寻址;

MOV @R0, #01H

目的操作数:寄存器间接寻址;源操作数:立即寻址; INC R0

寄存器寻址 MOV @R0, #02H

目的操作数:寄存器间接寻址;源操作数:立即寻址; MOV R1, #YVAR

目的操作数:寄存器寻址;源操作数:立即寻址; MOV A, @R0

目的操作数:寄存器寻址;源操作数:寄存器间接寻址; MOV @R1, A

目的操作数:寄存器间接寻址;源操作数:寄存器寻址; PUSH Acc;

将Acc中的内容压入堆栈;直接寻址 PUSH PSW

将PSW压入堆栈;直接寻址 MOV A, #0AAH

目的操作数:寄存器寻址;源操作数:立即寻址; SETB RS0

位寻址 CLR RS1

位寻址 MOV R0, #5AH

目的操作数:寄存器寻址;源操作数:立即寻址; MOV R1, #0A5H

目的操作数:寄存器寻址;源操作数:立即寻址; POP PSW

按压栈顺序放入PSW; 直接寻址 POP ACC

按压栈顺序放入Acc;直接寻址 INC R1

寄存器寻址 DEC R0

寄存器寻址

MOV A, @R0

目的操作数:寄存器寻址;源操作数:寄存器间接寻址; MOV @R1, A

机器码:F7;R1=A;

目的操作数:寄存器间接寻址;源操作数:立即寻址; CLR P1.0

将p10口清零 SETB P1.0

将P10口置一; 位寻址 MOV 90H, #00H

机器码:759000;(90H)=00H;目的操作数:直接寻址;源操作数:立即寻址; MOV 90H, #55H

目的操作数:直接寻址;源操作数:立即寻址; MOV 90H, #0FFH

目的操作数:直接寻址;源操作数:立即寻址; MOV P1, #00H

目的操作数:直接寻址;源操作数:立即寻址;

MOV P1, #55H

目的操作数:直接寻址;源操作数:立即寻址; MOV 90H, #0FFH

目的操作数:直接寻址;源操作数:立即寻址; SJMP $

(2)在单步执行过程中,每执行一条命令后,观察并记录有关寄存器、内存单元的变化情况。设置断点后,再连续执行,记录30H、31H、38H单元内容,与复位后的内容进行比较,由此得出什么结论?

全速执行

全速执行后复位

执行至断点处

全速执行到结束 由上图可见,全速执行后并不会输出结果,只有当程序复位之后才会将结果显示出来,但是设置断点后,运行至断点就会显示已运行的结果,由此我得出结论:当全速运行到最后时,系统处于原地跳转状态,只要系统不停下就不显示结果,而设置断点后,到达断点就会停止运行,从而显示运算结果。而单步执行在每一步执行之后,对应地址的数值就会立刻改改变。

(3)修改ORG 100H指令后的地址,重新汇编,观察程序代码在程序存储器中存放位置的变化情况。记录你认为能说明问题的检查结果。

ORG 300H

ORG 1000H 五、在实验过程中遇到的问题及解决方法(1)

软件安装出错

解决:删除注册表,在注册表的删除过程中,必须要删干净,然后换安装包重装。

(2)

出栈时,寄存器的数值改编 解决:psw 出栈时,改变了 rs0,rs1 的值,也就是换回了 0 区寄存器。因此个寄存器的数值均为压栈前的数值。

六、实验结论

本次实验,较为简单,基本上是验证性实验,在学习了理论知识后,通过实践,简单明了的看到了各个地址的数值,并了解到程序的运行过程,单步运行更容易让我们了解到每一步指令的操作效果。另外,在实验过程中,调用各个查看窗口进行实验过程跟踪,能更加直观的认识到指令的作用

第二篇:单片机实验二实验报告

实验报告

课程名称:微机原理与接口技术

指导老师:李素敏

学生姓名:

学号:

专业: 自动化

日期:2014-04-10 地点:理工楼603

实验二

1.实验目的和要求

① 掌握keil软件和STC-ISP 软件的使用方法 ② 熟悉发光管的工作原理 ③ 通过编程体验发光管的延时闪烁及移位等功能

2.主要仪器设备

PC机

单片机学习开发套件(型号:89C52RC)

3.实验内容

①实验内容1:第一个发光管以间隔200ms闪烁

源程序:

#include #define uint unsigned int

//宏定义

main(){

while(1){ P1=0xfe;delay(200);P1=0xff;delay(200);} } void delay(uint z)//延时函数,z的取值为这个函数的延时ms数 {

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);

一台一件

}

实验结果说明:要使发光管闪烁,只需设置合适的时间延时即可。

②实验内容2 : 8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。

源程序:

#include

#include //后面要用到它里面的_crol_(k,l)函数 //这个函数的意思是把一个字符变量k 循环左移l 位 #define uint unsigned int

//宏定义

unsigned char a,b,k,j;

//定义五个字符变量 sbit beep=P2^3;// 定义蜂鸣器的接口

void delay(uint z)//延时函数,z的取值为这个函数的延时ms数 {

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);}

void main(){

k=0xfe;//先给k一个初值11111110等待移位 while(1){

delay500ms();

beep=0;//打开蜂鸣器

delay500ms();//让它响500ms

beep=1;//关闭蜂鸣器

j=_crol_(k,1);//把k循环左移一位

k=j;//把移完的值再送给k

P1=j;//同时把值送到P1口点亮发光二极管 } //再次循环 }

实验结果说明:在此程序中用到了_crol_(k,l)函数,此函数的功能在于循环移位,在每次发光管闪烁相应时间后左移一位,把移完的值再送到P口,点亮对应的发光管。这样循环往复,达到发光管流动的效果。

③实验内容3 :用8个发光管演示出8位二进制数累加过程,即用8个二极管表示8个二进制位(亮为1,灭为0),依次以二进制形式显示0,1,2,……255。

源程序: #include

#include //包含有左右循环移位子函数的库 #define uint unsigned int

//宏定义 #define uchar unsigned char //宏定义

void delay(uint z)//延时函数,z的取值为这个函数的延时ms数,{

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);} void main()

//主函数 {

} uchar a;while(1)

//大循环 {

} a++;P1=~a;delay(200);

实验结果说明:在此定义一个无符号字符变量a,a的值进行累加,但是由于表示的二进制数要求亮为1,灭为0,与发光管的0亮1灭正好相反,所以将a的计数取反并设置相应延时,重复此过程就得到了在发光管上显示八位二进制数的累加过程。

④实验内容4 :间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。

源程序:

#include //52单片机头文件

#include //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义

void delay(uint z)//延时函数,z的取值为这个函数的延时ms数 {

uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);} void main()//主函数 { uchar a,i,j;while(1)//大循环

} {

} a=0xfe;//赋初值

for(j=0;j<8;j++){ for(i=0;i<8-j;i++)//左移

} {

P1=a;//点亮小灯

delay(300);//延时300毫秒

a=_crol_(a,1);//将a变量循环左移一位

} a=_crol_(a,j);//补齐,方便下面的左移一位 P1=0xff;//全部关闭

a=a<<1;//左移一位让多一个灯点亮

4.心得体会:此次实验中练习较多的就是闪烁和移位,在编程过程中,设置闪烁的时间必须达到人眼正常观察的要求,这就需要计算合适的闪烁时间,不停的尝试,最终选择适宜观察的时间间隔。发光管的循环移位时调用_crol_(k,l)函数

可以大大简化编程的行数。所以熟悉单片机的函数库,可以方便我们编程。所以在以后的实验中还得继续学习这个函数库,从而更轻松的完成实验内容。

第三篇:实验一 实验报告

网 络 程 序 设 实验报告

实验名称:Winsock编程接口实验 实验类型: 验 证 型

一、实验目的

 掌握Winsock的启动和初始化;

 掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。

二、实验设计

实验内容:

1、编写程序能同时实现对多个域名的解析。比如在控制台输入:getip www.xiexiebang.com对应的IP地址列表。

2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址。

根据实验内容编写程序:

1、对相关域名进行解析,利用gethostbyname()完成解析,用到的结构体为:

struct hostent{ char FAR*

h_name;char FAR* FAR* h_aliases;short

h_addrtype;short

h_length;char FAR* FAR* h_addr_list;}

得到的IP地址列表由h_addr_list存储;

2、利用GetAdaptersInfo()函数获得本地主机的相关信息,通过IP_ADAPTER_INFO结构体返回所需信息。

IP_ADAPTER_INFO的定义如下: typedef struct _IP_ADAPTER_INFO {

struct _IP_ADAPTER_INFO* Next;

DWORD ComboIndex;

char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];

char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];

UINT AddressLength;

BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];

DWORD Index;

UINT Type;

UINT DhcpEnabled;

PIP_ADDR_STRING CurrentIpAddress;

IP_ADDR_STRING IpAddressList;

IP_ADDR_STRING GatewayList;

IP_ADDR_STRING DhcpServer;

BOOL HaveWins;

IP_ADDR_STRING PrimaryWinsServer;

IP_ADDR_STRING SecondaryWinsServer;

time_t LeaseObtained;

time_t LeaseExpires;

} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

三、实验过程(包含实验结果)

1、分析题目,编写程序;

2、将编写的程序进行编译、运行,输入题目给定的内容,完成题目要求; 结果如下:

第1题:

第2题:

四、讨论与分析

思考题:

1、Winsock初始化的作用:只有调用了WSAStartup()进行初始化之后,应用程 序才能调用其他Windows Sockets API函数,实现网络通信;

2、函数原型为:

DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo,//接受数据的缓冲区

PULONG pOutBufLen

// 数据的长度大小);

3、域名解析时出现域名对应多个IP,原因:该域名存在于多个服务器。

五、实验者自评

通过本次实验,我掌握了Winsock的启动和初始化以及gethostname(),gethostbyname(),GetAdaptersInfo()等函数查询的使用,加深了以前对课本知识的认识程度。

六、附录:关键代码(给出适当注释,可读性高)

第1题代码:

////////////////////////////////////////////////// // GetAllIps.cpp文件

//#include “../common/InitSock.h” #include #include #include

using namespace std;

#pragma comment(lib, “WS2_32”)// 链接到WS2_32.lib //CInitSock initSock;// 初始化Winsock库

void main(){

char szMessage[256];// 取得本地主机名称

// 初始化

WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2), &wsaData)!= 0){

exit(0);}

// 通过主机名得到地址信息

printf(“ Get IP::”);gets(szMessage);

// 获取主机信息

hostent *pHost = ::gethostbyname(szMessage);

// 打印出所有IP地址

in_addr addr;for(int i = 0;;i++){

char *p = pHost->h_addr_list[i];

if(p == NULL)

break;

memcpy(&addr.S_un.S_addr, p, pHost->h_length);

char *szIp = ::inet_ntoa(addr);

printf(“ 服务器 %s IP地址:%s n ”,szMessage, szIp);

printf(“服务器名字: %s n”,pHost->h_name);}

/////////////////////////// ::WSACleanup();

}

第2题代码:

// 获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址

#include #include using namespace std;#include #pragma comment(lib, “IPHLPAPI.lib”)

void main(){ // 定义变量

IP_ADAPTER_INFO *pAdapterInfo;ULONG ulOutBufLen;DWORD dwRetVal;PIP_ADAPTER_INFO pAdapter;

pAdapterInfo =(IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));ulOutBufLen = sizeof(IP_ADAPTER_INFO);// 第一次获取适配器信息,得到ulOutBufLen的实际大小

if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){

free(pAdapterInfo);

pAdapterInfo =(IP_ADAPTER_INFO *)malloc(ulOutBufLen);} // 第二次获取适配器信息,获得了pAdapterInfo信息

if(dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){

cout<<“GetAdapterInfo Error!”<

// 打印MAC地址信息、子网掩码以及网关

pAdapter = pAdapterInfo;while(pAdapter){

cout<<“MAC Address:

”;

for(int i=0;i

AddressLength;i++)

{

if(i ==(pAdapter->AddressLength-1))

{

cout<Address[i];

}

else

{

cout<Address[i]<<“-”;

}

}

cout<

cout<<“IP 地址:”<

IpAddressList.IpAddress.String<

cout<<“子网掩码 :”<

IpAddressList.IpMask.String<

cout<<“网关 :”<

IpAddressList.IpAddress.String<

cout<<“****************************************”<

pAdapter = pAdapter->Next;}

// 释放资源

if(pAdapterInfo){

free(pAdapterInfo);} cout<

}

第四篇:杭电单片机实验报告一

单片机原理与应用技术实验报告

实验题目:

Keil软件使用及汇编语言编程

姓名:

*

*

*

学号:

********

实验日期:

2017

指导教师:

1.Keil软件的简介和使用

1.1

Keil

uVision4的简介

最新的Keil

uVision4

IDE,旨在提高开发人员的生产力,实现更快,更有效的程序开发。

uVision4引入了灵活的窗口管理系统,能够拖放到视图内的任何地方,包括支持多显示器窗口。

uVision4在μVision3

IDE的基础上,增加了更多大众化的功能:

·

多显示器和灵活的窗口管理系统

·

系统浏览器窗口的显示设备外设寄存器信息

·

调试还原视图创建并保存多个调试窗口布局

·

多项目工作区简化与众多的项目

1.2

Keil

uVision4的使用

①,打开Keil

4应用软件,其初始界面如下:

②、点击菜单项“Project”下的“New

uVisionProject”,如下图所示。

③、选择文件夹,并输入工程名。

④、输入工程名并保存后会弹出选择芯片界面

⑤、这里我们选择Atmel公司的AT89S51单片机,选择后,点击“OK”,即创建完工程。

⑥、单击点击下图所示圆圈圈起的部分建立一个文件。也可以点击菜单“File”下面的“NEW”来新建一个文件。

⑦、之后输入程序的代码后,单击File—Save

as,根据代码语言的格类型,可保存为后缀为.asm(汇编语言)和.c(C语言)的文件。

⑧、单击“Target1”前面的“+”号,并用鼠标右键点击“SourceGroup1”,界面如图10所示。在用鼠标左键点击“Add

Files

to

Group

Source

Group1...”即可把刚刚的代码文件添加到工程。最后点击左上角的编译按钮即可完成编译。之后即可进行程序的调试了。

2.实验内容

使用汇编语言完成课本P95的(2)、(5)、(8)三道题以及一个跑马灯程序。

2.1

P95-(2)

设内部RAM

5AH单元中有一个变量X,请编写计算下述函数式的程序,结果存入5BH。

设计思路:显然本题要使用分支语句,不妨使用JZ,JNB等,并通过X-10,X-15综合判断X处于哪个区间。

代码如下:

ORG

0000H

JMP

START

ORG

1000H

START:

MOV

A,5AH

;直接寻址,将5AH地址上的数据X存入寄存器A

MOV

B,5AH

;直接寻址,将5AH地址上的数据X再一次存入寄存器B

SUBB

A,#0FH

;将A中数据X先减去15,初步判断X所属区间

JNB

ACC.7,DO3

;若A的第7位不为1(X>=15)则程序跳到DO3,否则顺序执行

MOV

A,5AH

;若X比15小,再次将X存入累加器A中

CLR

C

;清零进位C

SUBB

A,#0AH

;将X减去10

JNB

ACC.7,DO1

;若A的第7位不为1,(X>=10),跳到DO1

JMP

DO2

;剩下的情况就是:X<10,跳到DO2

DO1:MOV

A,5AH

;10<=X<=15

MUL

AB

;相当于X*X,结果的低八位存入A

ADD

A,#08H

;即X*X+8→A

MOV

5BH,A

;即X*X+8→B

JMP

DONE

;跳到程序结束段

DO2:MOV

A,5AH

;X<10

MUL

AB

;X*X→A

CLR

C

;进位C清零

SUBB

A,#01H

;

X*X-1→A

MOV

5BH,A

;

X*X-1→B

JMP

DONE

;跳到程序结束段

DO3:MOV

A,#29H

;41→A

MOV

5BH,A

;41→B

JMP

DONE

;跳到程序结束段

DONE:SJMP

$

END

程序截图:

程序结果:

①、当X=12时,Y=12*12+8=152

②、当X=8时,Y=8*8-1=63

③、当X=18时,Y=41

2.2

P95-(5)

设有两个长度均为15的数组,分别存放在以2000H和2100H为首的存储区中,试编程求其对应项之和,结果存放到以2200H为首的存储区中。

设计思路:本题需要用到LOOP进行15次的求和及存放。并且由于地址过高,应采用DPTR进行访问。

代码如下:

ORG

0000H

JMP

START

ORG

1000H

START:

MOV

R1,#00H

;求和寄存器,初始清零

MOV

R2,#0FH

;循环次数为15次

MOV

DPL,#00H

;类似段内偏移地址地址

LOOP:

MOV

DPH,#20H

;DPTR的高八位,可理解为段地址,这里先指向第一个数组的首

;地址2000H

MOVX

A,@DPTR

;A←((DPTR))

MOV

R1,A

;R1←(A)

INC

DPH

;DPH改成指向高8位是21H的存储区

MOVX

A,@DPTR

;A←((DPTR))

ADD

A,R1

;两数组对应项求和

INC

DPH

;DPH改成指向高8位是22H的存储区

MOVX

@DPTR,A

;求和结果送入上述地址区

INC

DPL

;低8位地址自增

DJNZ

R2,LOOP

;若循环次数-1后不为0,则跳转到LOOP处进行循环

END

程序截图:

程序结果:

首先分别在2000H和2100H存入15数,这里我都存入了1,2,3,…,14,15。

结果得到:

2.3

P95-(8)

将片外数据存储器地址为1000H~1030H的数据块,全部搬迁到片内RAM

30H~60H中,并将原数据块区域全部清零。

设计思路:显然还是得用LOOP进行搬迁,且每搬完一个就得清零原地址数据,并用DPTR访问片外存储器。

代码如下:

ORG

0000H

JMP

START

ORG

1000H

START:

MOV

R1,#30

;用R1保存循环次数

30次

MOV

R0,#30H

;将地址30H存入R0中

MOV

DPTR,#1000H

;将1000H这个地址存入DPTR中

LOOP:

MOVX

A,@DPTR

;寄存器间接寻址。A←((DPTR))

MOV

@R0,A

;(R0)←A

CLR

A

;A←0

MOVX

@DPTR,A

;原地址数据清零

INC

R0

;数据的写入地址

自增

INC

DPTR

;数据的读取地址

自增

DJNZ

R1,LOOP

;若循环次数-1不为0,则跳转到LOOP处进行循环

END

程序截图:

程序结果:

先在片外存储器1000H开始存入数据

接下来开始将数据搬迁到片内30H开始的区域中

且原地址数据依次被清零

2.4

P95-(8)

题目:设计一个6+50=56ms跑马灯,并在P1端口显示。

设计思路:首先我得设计一个56ms的延迟。这里已知当单片机系统的振荡频率为fosc=12MHz时,一个机器周期为1T=1us;执行一条DJNZ指令需要2个机器周期,执行一条NOP需要一个机器周期,执行一条MOV也是一个机器周期。

接着,再通过循环左移指令RL

A实现跑马等效果。

代码如下:

ORG

0000H

JMP

START

ORG

0800H

START:MOV

A,#01H

;即将0000

0001存入A,后面会将最右边1循环左移。

SJMP

DELAY

;进入延时段起点

LOOP:

RL

A

;从此处开始跑马灯模块。先将A循环左移

MOV

P1,A

;将A的值赋给端口P1的8位

SJMP

DELAY

;从56ms的延迟程序段再跑一遍

DELAY:

MOV

R7,#224

;设置外循环次数224次

DLY1:

MOV

R6,#123

;设置内循环次数123次

DLY2:

DJNZ

R6,DLY2

NOP

DJNZ

R7,DLY1

;延时程序段结束,总用时(123*2+2+1+1)T*224T+2T+1T=56ms

SJMP

LOOP

SJMP

END

程序截图:

程序结果:

初始状态

执行一次56ms延迟后左移

再一次56ms延迟后左移

Proteus仿真截图:

3.实验心得

通过以上4个实验,我学会了KEIL软件的使用,即创建工程,创建并添加项目,编译与调试等等。更重要的是学习了很多单片机编程方面的只是。比如用汇编语言实现数据的传送、运算、移位等,同时还有一些简单的程序设计,如分支程序、循环程序等等。

这些实验使我更好的从底层了解单片机系统的运行机制,尤其的汇编语言的使用更是提高了我对各类端口、存储器的运用水平。另一方面我也感受到汇编语言虽然十分直接,但面对大型的程序项目就显得力不从心,所以这就体现了后期实验使用C语言编写的简便性。

我想,通过更多的运用各类指令及对更多端口、元件的综合使用,我会对变得越来越熟练,且能不断地提升自己的逻辑思维。

第五篇:单片机实验报告

目录

第一章单片机简介....................................................2 第二章

实验要求..................................................3 第三章实验设备......................................................3 第四章实验安排......................................................4 第五章实验内容......................................................4

LED灯实验.......................................................4 步进马达试验....................................................5 独立按键控制LED实验............................................7 矩阵键盘实验....................................................9 静态数码管实验.................................................12 动态数码管实验.................................................14 NE555脉冲发生器实验(定时/计数器).............................16 RS232串口通信实验(接收与发送)..................................21 第六章收获体会.....................................................25

单片机实验报告

第一章单片机简介

单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!

单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。

1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。

2.MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。

Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。

3.单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求

单片机实验报告

应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。

MCS51系列微控制器应用广泛,在家电、汽车甚至航空等领域都有其活跃的身影。然而,普通51系列微控制器内部资源有限,像我用Proteus构建微控制器虚拟实验室选用的AT89C52只有三个定时器、一个全双工的串行口和中断控制,并且其数据处理能力有限,不适合对大量数据进行复杂分析和运算。

因此,在不重新选型(可选用SoC)的前提下,为实现我们所需要的功能,就需要进行外围扩展。针对微控制器的特点,我们首先考虑串行扩展,因为微控制器的I/O引脚有限,并行扩展一则外围芯片面积比较大,二则对抑制EMI不利。

第二章 实验要求

1.学习Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试与脱机运行间的切换方法

2.熟悉TD-51单片机系统板及实验系统的结构及使用

3.进行MCS51单片机指令系统软件编程设计与硬件接口功能设

4. 学习并掌握Keil C51软件联机进行单片机接口电路的设计与编程调试

5.完成指定MCS51单片机综合设计题

第三章实验设备

1.HC600S-51单片机开发板 2.Keil C51 3.普中自动下载软件

第四章 实验安排

1.LED灯实验

单片机实验报告

2.步进马达试验

3.独立按键控制LED实验 4.矩阵键盘实验 5.静态数码管实验 6.动态数码管实验

7.NE555脉冲发生器实验(定时/计数器)8.RS232串口通信实验(接收与发送)

第五章 实验内容

一、LED灯实验

1.基本要求

利用位移循环指令实现LED灯的闪烁 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图

4.电路原理图

单片机实验报告

5.程序

#include #define uint unsigned int void d(uint x){uint n;for(;x>0;x--){for(n=0;n<123;n++){;} }}

main(){unsigned int i;while(1)

{for(i=0,P0=1;i<4;i++){d(500);P0=(P0<<2);}}}

二、步进马达试验

1.基本要求

编程实现马达的正反转,调速等功能 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)

单片机实验报告

图一 图二

4.电路原理图

上图图二 5.程序

#include “reg52.h” #define speed 2 sbit PH1 = P1^0;

//定义管脚 sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;

void delay(int time);

void Go(){ //A

PH1 = 0;//PH1为0 则A线圈为反向电流

I01 = 0;I11 = 0;

//以最大电流输出

PH2 = 0;//PH2为0 则B线圈为反向电流

I02 = 1;I12 = 1;

//输出0 delay(speed);//圈为反向电流

I01 = 1;//输出0 I11 = 1;

PH2 = 1;//PH2为1 则B线圈为正向电流

I02 = 0;//以最大电流输出

I12 = 0;

delay(speed);//B PH1 = 1;

//PH1为1 则A线圈为

正向电流

I01 = 0;

//以最大电流输出

I11 = 0;

PH2 = 1;//PH2为1 则B线圈为正

向电流

I02 = 1;//输出0 I12 = 1;

delay(speed);

PH1 = 1;

//PH1为1 则A线圈为正向电流

I01 = 1;I11 = 1;

PH2 = 0;

//PH2为0 则B线圈为反向电流

I02 = 0;I12 = 0;delay(speed);}

void delay(int time){

int i,j;

for(j=0;j <= time;j++)

for(i =0;i <= 120;i++);}

void main(){

while(1)

{

Go();//步进电机运行

} }

单片机实验报告

三、独立按键控制LED实验

1.基本要求

通过编程控制8个独立按键分别控制8个LED灯的开关 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)

图一 图二

4.电路原理图 上图图二 5.程序

#include #include #define GPIO_KEY P1 //独立键盘用

P1口

#define uchar unsigned char #define uint unsigned int

void Delayms(unsigned int c);

//延时10ms uchar Key_Scan();void main(void){

unsigned char ledValue, keyNum;

ledValue = 0x01;

while(1)

{

keyNum = Key_Scan();//扫描键

switch(keyNum)

{

case(0xFE):

//返回按

键K1的数据

ledValue = 0x01;

break;

单片机实验报告

case(0xFD):

ledValue = 0x02;

break;case(0xFB):

ledValue = 0x04;

break;case(0xF7):

ledValue = 0x08;

break;case(0xEF):

ledValue = 0x10;

break;case(0xDF):

ledValue = 0x20;

break;case(0xBF):

ledValue = 0x40;

break;case(0x7F):

ledValue = 0x80;

//返回按键K2的数据

//返回按键K3的数据

//返回按键K4的数据

//返回按键K5的数据

//返回按键K6的数据

//返回按键K7的数据

//返回按键K8的数据

break;default:

break;

}

GPIO_LED = ledValue;//点亮LED灯

}

}

uchar Key_Scan(void)//键盘扫描函数 { uchar i,n=0xff;

if(P1==0xff)goto Scan_r;//无键按

下,返回

goto Scan_r;Scan_1:

while(P1!=0xff);//等待键释放

Delayms(10);Scan_r:

return n;}

void Delayms(uint x){

uint n;

for(;x>0;x--)

{

for(n=0;n<123;n++)

{;}

} }

四、矩阵键盘实验

1.基本要求

编程由16个矩阵按键控制数码管显示相应的数值 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。

3.接线图

单片机实验报告

见下图图一

图一 图二

4.电路原理图

见上图图二 5.程序

#include #define uchar unsigned char #define uint unsigned int #define uint unsigned int #define GPIO_LED P0

uchar ScanKey(void);void Delayms(uint x);main(){ unsigned char ledValue;uchar i;ledValue = 0x01;loop: i = ScanKey();

switch(i)

{ case 0xee:

ledValue = ~0x3F;

break;

case 0xde:

ledValue = ~0x06;

break;

case 0xbe:

ledValue = ~0x5B;

break;

case 0x7e:

ledValue = ~0x4F;

break;

case 0xed:

ledValue = ~0x66;

break;

case 0xdd:

ledValue = ~0x6D;

break;

单片机实验报告

case 0xbd:

ledValue = ~0x7D;

break;

case 0x7d:

ledValue = ~0x07;

break;

case 0xeb:

ledValue = ~0x7F;

break;

case 0xdb:

ledValue = ~0x6F;

break;

case 0xbb:

ledValue = ~0x77;

break;

case 0x7b:

ledValue = ~0x7C;

break;

case 0xe7:

ledValue = ~0x39;

break;

case 0xd7:

ledValue = ~0x5E;

break;

case 0xb7:

ledValue = ~0x79;

break;

case 0x77:

ledValue = ~0x71;

break;

}

GPIO_LED = ledValue;i=0;goto loop;}

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

uchar ScanKey(void)//键盘扫描函数 { uchar i,n=0xff;

P1=0xf0;

if(P1==0xf0)goto Scan_r;//无键按下,返回

for(i=0,P1=0xfe;i<4;i++)

{ if((P1&0xf0)!=0xf0)

{ Delayms(10);

if((P1&0xf0)!=0xf0)

{ n=

P1;

goto

Scan_1;}

}

P1=(P1<<1)+1;

//扫描下

一行

} goto Scan_r;Scan_1:

单片机实验报告

P1=0xf0;while((P1&0xf0)!=0xf0);//等待键

释放

Delayms(10);

Scan_r:

P1=0xff;return n;} }

五、静态数码管实验

1.基本要求

编程使数码管显示字符0-F 2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线框图(图一)

图一

单片机实验报告

图二

4.电路原理图

见上图图二 5.程序

#include #define uchar unsigned char #define uint unsigned int void Delayms(uint x);uchar code LED7Code[]=

{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D, ~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){

unsigned int LedNumVal;//定义变量 while(1)

{

// 将字模送到P0口显示

LedNumVal++;

P0 = LED7Code[LedNumVal%16];

Delayms(1000);

//调用延时程序

}

}

单片机实验报告

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

六、动态数码管实验

1.基本要求

编程实现8个数码管的动态扫描。通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)

图一 图二

单片机实验报告

图三

4.电路原理图

见上图图

二、图三 5.程序

#define uint unsigned int void Dsplay();void Delayms(uint x);uchar mDS[6];uchar code cDsCode[]=

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};

void main(){ uchar i;

for(i=0;i<6;i++)mDS[i]=i+1;

loop:

Dsplay();

goto loop;}

void Dsplay()//动态扫描显示

{uchar i;

for(i=0,P2=0x01;i<6;i++)

{ P1=cDsCode[mDS[i]];//输出段

Delayms(1000);

P2=P2<<1;

//选通下一位

}

P2=0x00;

//关闭位选通 }

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

七、NE555脉冲发生器实验(定时/计数器)

1.基本要求

2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图

4.电路原理图

5.程序

#include #include“lcd.h” #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar code EN_CHAR1[16]={“

CYMOMETER

”};uchar code EN_CHAR2[16]={“FREQ:

HZ”};

单片机实验报告

void TIMER_Configuration();//初始化定时器 ulong Freq;

//用来存放要显示的频率值 ulong TimeCount;//用于计算1S钟的

void main(){ uchar i, freqValue[6];

LcdInit();TIMER_Configuration();for(i=0;i<16;i++){

LcdWriteData(EN_CHAR1[i]);}

LcdWriteCom(0xc0);//第二行显示

for(i=0;i<16;i++){

LcdWriteData(EN_CHAR2[i]);}

while(1){

if(TR0==0)

//当计数器停下的时候,表明计数完毕

{

Freq = Freq + TL1;

//读取TL的值

Freq = Freq +(TH1 * 256);//读取TH的值

LcdWriteCom(0xc8);

//--求频率的个十百千万十万位--//

freqValue[0]='0'+Freq%1000000/100000;

freqValue[1]='0'+Freq%100000/10000;

freqValue[2]='0'+Freq%10000/1000;

freqValue[3]='0'+Freq%1000/100;

freqValue[4]='0'+Freq%100/10;

freqValue[5]='0'+Freq%10;

for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示(最低位为0显示0)

{

if(freqValue[i]==0x30)

{

freqValue[i]=0x20;//若为0则赋值空格键

}

else

单片机实验报告

{

break;

}

}

for(i=0;i<6;i++)

{

LcdWriteData(freqValue[i]);

}

Freq=0;//将计算的频率清零

TH1=0;//将计数器的值清零

TL1=0;

TR0=1;//开启定时器

TR1=1;//开启计数器

} } }

void TIMER_Configuration(){ TMOD=0x51;TH0=0x3C;TL0=0xB0;ET0=1;ET1=1;EA=1;TR0=1;TR1=1;} void Timer0()interrupt 1 { TimeCount++;if(TimeCount==20)//计时到1S {

TR0=0;

TR1=0;

TimeCount=0;

}

//--12MHZ设置定时50ms的初值--// TH0=0x3C;TL0=0xB0;} void Timer1()interrupt 3 {

单片机实验报告

//--进入一次中断,表明计数到了65536--// Freq=Freq+65536;

}

#include“lcd.h”

void Lcd1602_Delay1ms(uint c)

//误差 0us {

uchar a,b;for(;c>0;c--){

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;

//使能

LCD1602_RS = 0;

//选择发送命令

LCD1602_RW = 0;

//选择写入

LCD1602_DATAPINS = com;

//放入命令

Lcd1602_Delay1ms(1);//等待数据稳定

LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else

void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;//使能清零

LCD1602_RS = 0;//选择写入命令

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = com;// Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);

单片机实验报告

LCD1602_DATAPINS = com << 4;//发送低四位

Lcd1602_Delay1ms(1);

LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS

void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;//选择输入数据

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = dat;//写入数据

Lcd1602_Delay1ms(1);

LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;

//选择写入数据

LCD1602_RW = 0;

//选择写入

LCD1602_DATAPINS = dat;

Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x38);//开显示

单片机实验报告

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线

LcdWriteCom(0x28);//在四位线下的初始化

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #endif

八、RS232串口通信实验(接收与发送)

1.基本要求

a.通过实验了解串口的基本原理及使用,理解并掌握对串口进行初始化; b.使用串口调试助手(Baud 9600、数据位

8、停止位

1、效验位无)做为上位机来做收发试验;

c.利用串口调试助手中字符串输入进行数据发送,接受窗口显示收到的数据。2.实验内容

在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图

单片机实验报告

4.电路原理图

5.程序

#include #include“lcd.h” unsigned char ChCode[14] = “Received data:”;void UsartConfiguration();void main(){ unsigned char i, receiveData;LcdInit();for(i=0;i<14;i++){

LcdWriteData(ChCode[i]);} UsartConfiguration();while(1){

if(RI == 1)

//查看是否接收到数据

{

receiveData = SBUF;//读取数据

单片机实验报告

RI = 0;

//清除标志位

LcdWriteCom(0xC0);

LcdWriteData('0' +(receiveData / 100));

// 百位

LcdWriteData('0' +(receiveData % 100 / 10));// 十位

LcdWriteData('0' +(receiveData % 10));

// 个位

} } } void UsartConfiguration(){ SCON=0X50;

//设置为工作方式1 TMOD=0X20;//设置计数器工作方式2 PCON=0X80;

//波特率加倍

TH1=0XF3;

//计数器初始值设置,注意波特率是4800的TL1=0XF3;TR1=1;

//打开计数器 }

#include“lcd.h”

void Lcd1602_Delay1ms(uint c)

//误差 0us {

uchar a,b;for(;c>0;c--){

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;

//使能

LCD1602_RS = 0;

//选择发送命令

LCD1602_RW = 0;

//选择写入

LCD1602_DATAPINS = com;

//放入命令

Lcd1602_Delay1ms(1);//等待数据稳定

LCD1602_E = 1;

//写入时序

单片机实验报告

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else

void LcdWriteCom(uchar com)

//写入命令 { LCD1602_E = 0;//使能清零

LCD1602_RS = 0;//选择写入命令

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4;//发送低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif

#ifndef LCD1602_4PINS

void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;//选择输入数据

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = dat;//写入数据

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

//保持时间

LCD1602_E = 0;} #else void LcdWriteData(uchar dat)

//写入数据 { LCD1602_E = 0;

//使能清零

LCD1602_RS = 1;

//选择写入数据

LCD1602_RW = 0;//选择写入

LCD1602_DATAPINS = dat;

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);

单片机实验报告

LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//写入时序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif

#ifndef LCD1602_4PINS void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x38);//开显示

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线

LcdWriteCom(0x28);//在四位线下的初始化

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点 } #endif

单片机实验报告

第六章 收获体会

本次微控制器综合设计基本上使用了所选微控制器的所有资源,进一步熟悉和加深了对中断、定时器和串行通信的理解和使用。我觉得软件实验就是让我们初学者熟悉keil的使用,然后复习下汇编的思想和掌握程序的流程,所以软件实验可以很快的完成,并且慢慢熟悉调试的强大功能。硬件设计中,仿真让我很有感触,感觉蛮好玩的,可以摒弃麻烦的实验硬件自己在寝室玩而且不受硬件状态的限制,即便出错了也不会损坏。当然更重要的是这种好习惯,仿真完后再去在实验板上验证会比直接要来的确切而且便捷,至少不要老是去插拔线。在做实验中在同学指导下我试用C语言来编写程序,确实发现比汇编语言容易编写也容易理解,以前的实验还是有参考资料的习惯,现在什么都开始自己写感觉还是很有成就感的,当然这是基于程序本身就那么几行很容易编写,也不是说参考不好。总而言之,这学期的单片机实验还是收获颇丰的。相信在以后的实验学习实践工作中都会有个潜移默化的作用的。

下载51单片机实验一实验报告[5篇模版]word格式文档
下载51单片机实验一实验报告[5篇模版].doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机实验报告

    单片机实验报告 一、实验目的 1.熟练使用Keil、Protues两款软件 2.通过上机操作,增强个人动手实践能力 3.加深对理论知识的理解 4.培养运用汇编语言进行初步编写程序的能力......

    单片机实验报告

    实验四、中断交通灯实验 林立强1000850116 一、实验目的 1、了解MCS-51单片机的组成、中断原理,中断处理过程、外部中断的中断方式。 2、掌握中断响应及处理的编程方法。 二......

    单片机实验报告

    单片机实验一 实验报告 课程名称: 姓名: 系别: 专业: 年级: 学号: 指导教师: 单片机原理及应用实验 陈璐 信息系 电气工程及其自动化 2012级 120712041 李莉 2015 年6 月 25 日......

    单片机实验报告

    51单片机控制流水灯 目录 (1)51精简开发板简介 (2)实验目的 (3)实验内容 (4)元件 (5)原理图 (6)实验步骤 (7)主要功能介绍(8)实验错误及分析 (9)调试及程序 (10)系统测试 (11)实验心得 一、51精简......

    单片机实验报告

    实验一 uVision2 集成开发环境的使用 一、 实验目的和要求二、实验设备与仪器三、实验内容四、实验原理、方法与步骤 五、实验小结:1.简述生成应用程序的过程。2.记录程序调试......

    单片机实验报告

    《单片机原理及应用》 实 验 报 告 2017—2018学年第一学期 班级: 152 专业: 电子科学与技术 姓名: 子路 学号: 教师: 实验一:Keil C51 一、实验目的 1、熟悉Keil C51单片机应用......

    单片机实验报告一(精选多篇)

    南昌大学实验报告 学生姓名:曾华兆学号: 6110116078 专业班级:电子163班 实验类型:⃞验证 ⃞综合 ⃞设计⃞创新 实验日期:2018.4.17 实验成绩: 实验一 单片机软件实验 (一) 实验目......

    单片机实验一(精选五篇)

    实验一 Keil的使用及基本指令练习 一、实验目的和要求: 熟悉KEIL单片机编程软件使用环境,掌握利用KEIL调试指令的方法。 二、实验设备: 安装了KEIL的计算机。 二、实验内容和步......