单片机实验报告.docx

上传人:b****5 文档编号:27972872 上传时间:2023-07-07 格式:DOCX 页数:30 大小:24.41KB
下载 相关 举报
单片机实验报告.docx_第1页
第1页 / 共30页
单片机实验报告.docx_第2页
第2页 / 共30页
单片机实验报告.docx_第3页
第3页 / 共30页
单片机实验报告.docx_第4页
第4页 / 共30页
单片机实验报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

单片机实验报告.docx

《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(30页珍藏版)》请在冰豆网上搜索。

单片机实验报告.docx

单片机实验报告

南京晓庄学院电子工程学院

实验报告

课程名称:

单片机系统设计与应用

姓名:

专业:

电子信息科学与技术

年级:

14级

学号:

05

2016年12月1日

实验项目列表

序号

实验项目名称

成绩

指导教师

1

单片机仿真软件的使用

2

单片机I/O接口应用实验——流水灯

3

外部中断实验——工业顺序控制模拟

4

定时/计数器实验——矩形波

5

定时/计数器实验——计数器

6

综合实验

7

8

9

10

注:

1、实验箱端口为com6。

2、芯片选择切换到51

3、停止运行使用实验箱上的复位按钮

实验室号:

___实验时间:

成绩:

实验一仿真软件的使用

1.实验目的和要求

1)熟悉KeilC51软件界面,以及编辑、编译、运行程序的步骤;

2)掌握单片机仿真软件使用和调试的方法。

2.实验原理

KeilC51软件使用

在KeilC51集成开发环境下,建立一个工程并编辑源程序,熟悉KeilC51集成开发环境下各种菜单、命令的使用。

3.主要仪器设备(实验用的软硬件环境)

安装有KeilC51软件的PC机1台

4.操作方法与实验步骤

KeilC51软件使用

(1)建立用户文件夹

(2)建立工程

(3)建立文件并编码。

输入以下源程序,并保存在项目所在的目录中

(4)把文件加入工程中

(5)编译工程。

编译时观察在界面下方的“Build”页中的到编译错误信息和使用的系统资源情况等。

(6)调试。

利用常用调试命令,如复位、运行、暂停、单步、单步跳过、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令进行调试,观察并分析调试结果。

(7)目标代码文件的生成。

运行生成相应的.HEX文件。

5.实验内容及程序

1)从DATA区地址起始地址为40H的连续10个内存单元的内容传送到XDATA区起始地址为2000H的10个内存单元中。

注意:

DATA区地址起始地址为40H的连续10个内存单元必须先赋初值。

P83-5源程序

#include

#defineucharunsignedchar

xdataunsignedcharbuffer1[10]_at_0x2000;

//在xdata区定义数组变量BUF1,首地址为2000H

dataunsignedcharbuffer2[10]_at_0x40;

//在data区定义数组变量BUF2,首地址为40H

voidmain(void)

{

uchari;

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

buffer1[i]='A';

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

buffer2[i]=buffer1[i];//把data区中的内容传送给xdata区

while

(1);

}

6.实验现象

P83-5运行效果图

2)将DATA区地址为20H的单元赋初值为05H,地址为21的单元赋初值为06H,将这两个单元的数据拼成56H,存入XDATA区地址为2000H的单元。

程序(程序中请对应写出关键注释语句)

P275源程序

#include

#include

#defineaXBYTE[0x2001]

#definebXBYTE[0x2002]

main(void)

{

a=0x05;

b=0x06;

a=a<<4;

b=a|b;

}

P275运行效果图

实验室号:

___实验时间:

成绩:

实验二单片机I/O接口应用—流水灯

1.实验目的和要求

1)进一步掌握单片机仿真软件的使用方法。

2)掌握单片机最小系统的构成。

3)掌握单片机I/O口的使用方法,如何控制I/O口检测按键及驱动LED发光二极管。

4)熟悉C51程序编程和调试方法。

2.电路原理图(附proteus电路原理图)

3.主要仪器设备(实验用的软硬件环境)

安装有KeilC51软件与Proteus仿真软件PC机1台

单片机试验箱一套

4.实验说明及实验步骤

●P1口为准双向口,P1的每一位都能独立地定义为输出线或输入线,作为输入的口线,必须向锁存器相应位写入“1”,该位才能作为输入。

●延时程序的实现。

现常用的有两种方法,一是用定时器中断来实现,一是用指令循环实现。

在系统时间允许的情况下可以采用后一种方法。

本实验中延时子程序采用指令循环来实现。

1)源程序设计

分析设计要求,根据任务要求,绘制源程序流程图,然后使用KeilC进行源程序文件的设计与调试,观察并分析程序调试结果。

2)硬件运行

加载目标代码至单片机中,运行,观察运行结果

5.实验内容及程序

1)在P1口实现流水灯。

#include

#include//包含移位函数的头文件

#defineucharunsignedchar

#defineuintunsignedint

voiddelay(uinti)//延时函数

{uchart;

while(i--)

{for(t=0;t<120;t++);

}

}

voidmain()//主程序

{P1=~0xfe;//高电平点亮第一个灯

while

(1)

{

delay(500);//500为延时参数

P1=_crol_(P1,1);//P1中的数据循环左移1位,实现流水灯

}

}

2)任选某P端口接开关,控制流水灯的启动和停止。

接线:

P10-P17接D0-D7;P2.x接K0

#include

#include//包含移位函数的头文件

#defineucharunsignedchar

#defineuintunsignedint

voiddelay(uinti)//延时函数

{uchart;

while(i--)

{for(t=0;t<120;t++);

}

}

sbitKEY=P2^0;//定义P2^0口作为开关

voidmain()//主程序

{P1=~0xfe;//高电平点亮第一个灯

while

(1)

{

if(KEY==0)//开关接地,低电平启动流水灯

{

delay(500);//延时

P1=_crol_(P1,1);//P1中的数据循环左移1位,实现流水

}

}

}

*3)设计花样流水灯:

自行设计两种花样流水灯,利用开关实现两种流水灯的切换,例如K0控制第一种流水灯的启动和停止;K1控制第二种流水灯的启动和停止,两种流水灯可以通过两个开关实现切换。

程序(程序中请对应写出关键注释语句)

#include

#defineucharunsignedchar//定义无符号字符型变量

sbitS0=P0^0;//将S0定义为P0.0

unsignedcharstate;

voidflow(void);//申明函数flow

voidkey_scan(void);//申明函数key_scan

voiddelay()//延时函数

{

uchari,j;

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

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

}

voiddelay1ms(void)//延时消抖函数

{

uchari,j;

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

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

}

voidmain()

{

state=0;

while

(1)

{

key_scan();

switch(state)

{

case0:

P1=0xff;break;

case1:

flow();break;

}

}

}

voidkey_scan(void)//开关检测函数

{

P0=0xff;

if((P0&0x0f)!

=0x0f)//检测到有按键按下

{

delay1ms();//延时1ms再去检测

if(S0==0)

state=0;

else

state=1;

}

}

voidflow(void)//流水灯点亮函数

{

P1=0xfe;

delay();

P1=0xfd;

delay();

P1=0xfb;

delay();

P1=0xf7;

delay();

P1=0xef;

delay();

P1=0xdf;

delay();

P1=0xbf;

delay();

P1=0x7f;

delay();

}

6.实验讨论及分析

如果将P1口高4位定义为输入,低4位定义为输出,将高4位输入的值在低4位显示出来,请写出对应程序。

实验室号:

___实验时间:

成绩:

实验三外部中断实验——工业顺序控制模拟

1.实验目的和要求

1)掌握单片机系统中断原理和使用方法。

2)掌握中断处理程序的编写方法

2.电路原理图(附proteus电路原理图)

3.主要仪器设备(实验用的软硬件环境)

安装有KeilC51软件与Proteus仿真软件PC机1台

单片机试验箱一套

4.实验说明及实验步骤

在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些继续生产过程,按某种顺序有规律的完成预定的动作,对这类继续生产过程的控制称顺序控制,象注塑机工艺过程大致按“合模

注射

延时

开模

产伸

产退”顺序动作,用单片机最易实现。

1)源程序设计

分析设计要求,根据任务要求,绘制源程序流程图,然后使用KeilC进行源程序文件的设计与调试,观察并分析程序调试结果。

2)硬件运行

加载目标代码至单片机中,运行,观察运行结果

5.实验内容及实验程序

P1口控制注塑机的八道工序,现模拟控制八只发光二极管的点亮,即正常情况下P1口走亮流水(低电平点亮LED)。

P2.4为开工启动开关,高电平启动。

未启动及开关停止时LED全灭。

INT0为外部故障1输入模拟开关,产生故障1使P1.0~P1.3口接的LED闪烁8次;INT1为外部故障2输入模拟开关,产生故障2使P1.4~P1.7口接的LED闪烁8次;

接线:

P10-P17接D0-D7;,INT0接KK1-(单次脉冲);INT1接KK2-(单次脉冲)

附程序(程序中请对应写出关键注释语句)

#include

#defineucharunsignedchar//定义无符号字符变量

#defineuintunsignedint//定义无符号整型变量

sbitK0=P2^4;//将K0定义为P2.4

voiddelay(uintt);//申明延时函数delay()

voiddelay(uintt)//延时函数

{

ucharj;

for(;t>0;t--)

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

;

}

voidmain(void)

{

uchardisplay[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯显示数组

inta;

while

(1)

{

if(K0==1)//当开关为1

{

IE=0x85;

IT0=1;//选择外部中断0为跳沿触发方式

IT1=1;//选择外部中断1为跳沿触发方式

PX0=0;//外部中断0为低优先级

PX1=1;//外部中断1为高优先级

for(a=0;a<9;a++)

{

delay(500);//延时

P1=display[a];//将已经定义的流水灯显示数据送入P1口

}

}

else

if(K0==0)//当开关为0

{

IE=0x00;

P1=0x00;//P1口全亮

delay(500);//延时

}

}

}

voidint0_isr(void)interrupt0//外部中断0的服务函数

{

ucharn;

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

{

P1=0x0ff;//全灭

delay(500);//延时

P1=0xf0;//高4位LED灭,低4位LED亮

delay(500);//延时

}

}

voidint1_isr(void)interrupt2//外部中断1的服务函数

{

ucharm;

for(m=0;m<8;m++)

{

P1=0x0ff;//全灭

delay(500);//延时

P1=0x0f;//低4位LED灭,高4位LED亮

delay(500);//延时

}

}

开关未启动LED全灭

启动开关正常走流水

中断T0使P1.0~P1.3口接的LED闪烁8次

使P1.4~P1.7口接的LED闪烁8次

中断结束回到主程序又开始正常走流水

运行效果图

6.实验讨论及分析

1)INT0和INT1的中断优先级如何?

在什么样的情况下会出现中断嵌套?

如果要使INT1的中断优先级为高,该如何修改程序?

答:

INT0和INT1的中断优先级如何是采用的都是低优先级。

在什么样的情况下会出现中断嵌套是T0和T1有一个优先级高。

如果要使INT1的中断优先级为高,该如何修改程序是IP=0;改为PX0=0;PX1=1

实验室号:

___实验时间:

成绩:

实验四/五定时计数器实验

1.实验目的和要求

熟悉单片机内部定时/计数器功能,掌握初始化编程方法。

2.电路原理图(附proteus电路原理图)

3.主要仪器设备(实验用的软硬件环境)

安装有KeilC51软件与Proteus仿真软件PC机1台

单片机试验箱一套

4.实验说明及实验步骤

●设单片机的主频为12Mhz,在方式1下最大定时时间仅为毫秒数量级,所以采用定时器和软件循环结合的方法。

●在计数工作中,工作方式设为方式2(可自动重赋初值),初值设为0xff,每计数一次产生一次溢出中断,所以进中断次数即为计数个数。

1)源程序设计

分析设计要求,根据任务要求,绘制源程序流程图,然后使用KeilC进行源程序文件的设计与调试,观察并分析程序调试结果。

2)硬件运行

加载目标代码至单片机中,运行,观察运行结果

5.实验内容及实验程序

1)将定时器0设置为方式1,编写程序在P1.0上产生周期为1s的方波信号,可通过LED或示波器观察P1.0的输出。

*如果产生占空比为4:

1的方波,程序应该如何修改。

(假设周期不变)

接线:

P10接D0,或接示波器

附程序(程序中请对应写出关键注释语句)

#include

sbitP1_0=P2^4;//定义特殊功能寄存器P1的为变量P2_4

unsignedintcounter=1000;//定义循环次数

voidmain()

{

TMOD=0x01;//定时器T0为方式1

EA=1;//开总中断

ET0=1;//开定时器TO中断

TH0=(65536-500)/256;//置T0高8位初值

TL0=(65536-500)%256;//置T0低8位初值

TR0=1;//启动定时器T0

while

(1)//循环等待

{;}

}

voidTIM0(void)interrupt1using0//T0中断函数

{

TH0=(65536-500)/256;//重新赋值

TL0=(65536-500)%256;

counter--;//循环次数减一

if(counter<=0)

{

P1_0=~P1_0;//P1口按位取反

counter=1000;//重置循环次数

}

}

运行效果图

#include

#defineucharunsignedchar//定义无符号字符变量

uchartime;

//定义time

ucharcounter=100;//定义周期

ucharhigh=80;//定义高电平时长

sbitp1_0=P2^4;//定义特殊功能寄存器P1的为变量P2_4

voidmain()

{

TMOD=0x01;//定时器T0为方式1

TH0=(65536-5000)/256;//置T0高8位初值

TL0=(65536-5000)%256;//置T0低8位初值

EA=1;//开总中断

ET0=1;//开定时器T0中断

TR0=1;//启动定时器T0

time=0;

while

(1)

{;}

}

voidtimer0()interrupt1//T0中断程序

{

TH0=(65536-5000)/256;//重新赋值

TL0=(65536-5000)%256;

time++;

if(time==high)

p1_0=0;

if(time==counter)

{

time=0;p1_0=1;

}

}

运行效果图

2)将定时器/计数器1设定为计数方式,方式2,计数器初值设为0xff,每计数一次溢出产生一次中断。

P1口连接发光二极管,执行程序,利用按钮产生单脉冲信号,观察LED上计数脉冲个数。

例如:

00000001为1,00000010为2,00000011为3,依次显示。

(亮为1)

接线:

T1接单脉冲脉冲信号KK1-,P10-P17接D0-D7

#include

sbitP1_0=P2^4;//定义特殊功能寄存器P1的为变量P2_4

unsignedcharcounter=100;//定义循环次数

intf;

voidmain()

{

TMOD=0x51;

TL0=(65536-5000)%256;//置T0低8位初值

TH0=(65536-5000)/256;//置T0高8位初值

EA=1;//开总中断

ET0=1;//

ET1=1;

TH1=0xff;

TL1=0xff;

f=0;

TR1=1;

while(f==0);

TR0=1;

while

(1)

{;}

}

voidtimer0()interrupt1using0//外部中断1的服务函数

{

TL0=(65536-5000)%256;//重新赋值

TH0=(65536-5000)/256;

counter--;//循环次数减一

if(counter<=0)

{

P1_0=~P1_0;//P1口按位取反

counter=100;//重新定义循环次数

}

}

voidtimer1()interrupt3using0//外部中断2的服务函数

{

TH1=0xff;//重新赋值

TL1=0xff;

TR1=0;

f=1;

}

运行效果图

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineC8255_AXBYTE[0x7f00]//A

#defineC8255_BXBYTE[0x7f01]//B

#defineC8255_CXBYTE[0x7f02]//C

#defineC8255_CONXBYTE[0x7f03]//Control

ucharcodetube[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选

ucharcodechos[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选

ucharcounter=0;

voidinit_8255();//初始化8255

voidinit_timer1();//初始化计数器1

voiddisplay(uchari);//显示函数

voiddelay(uintz);//延时函数

voidmain()

{

init_8255();

init_timer1();

while

(1)

{

display(counter);

P1=counter;

}

}

voiddisplay(ucharcounter)

{

uchari,j;

ucharge,shi,bai;

bai=counter/100;

shi=counter/10%10;

ge=counter%10;

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

{

if(i==0)j=bai;

if(i==1)j=shi;

if(i==2)j=ge;

C8255_B=chos[i];//PB口位码

C8255_A=tube[j];

delay

(1);

}

/*C8255_B=chos[0]

C8255_A=tube[bai];

delay

(1);

C8255_B=chos[1]

C8255_A=tube[shi];

delay

(1);

C8255_B=chos[3]

C8255_A=tube[ge];

delay

(1);

*/

}

voidinit_8255()

{

C8255_CON=0x80;

}

voidinit_timer1()

{

TMOD=0x60;//01100000计数、八位自动重装

EA=1;

ET1=1;

TR1=1;

TH1=0xff;

TL1=0xff;

}

voidtimer1()interrupt3

{

if(counter>255)

counter=0;

counter++;

}

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--);

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

}

运行效果图

6.实验讨论及分析

实验室号:

___实验时间:

成绩:

实验六综合实验

1.实验目的和要求

利用用8255实现I/O口扩展,实验键盘检测及

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1