单片机实验报告Word格式.docx
《单片机实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《单片机实验报告Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
十三、本规则由指导教师和实验技术人员督促学生严格执行。
对不遵守本规则的学生,指导教师可责令其停止实验。
实验目录
序号
实验名称
成绩
一
单片机仿真软件的使用
二
单片机I/O接口应用实验——流水灯
三
键盘扫描及显示实验
四
外部中断实验——工业顺序控制模拟
五
定时/计数器实验
实验报告一
仿真软件的使用
实验时间
2017年4月6日星期四节次3、4
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个内存单元必须先赋初值。
程序:
#include<
reg51.h>
#defineucharunsignedchar
xdataucharbuffer1[10]_at_0x2000;
dataucharbuffer2[10]_at_0x40;
voidmain(void)
{
uchari;
for(i=0;
i<
10;
i++)buffer1[i]='
A'
;
for(i=0;
i++)
buffer2[i]=buffer1[i];
while
(1);
}
2)将DATA区地址为20H的单元赋初值为05H,地址为21的单元赋初值为06H,将这两个单元的数据拼成56H,存入XDATA区地址为2000H的单元。
xdataunsignedcharbuffer1_at_0x2000;
dataunsignedcharbuffer2_at_0x20;
dataunsignedcharbuffer3_at_0x21;
main(void)
buffer2=0x05;
buffer3=0x06;
buffer1=buffer2<
<
8|buffer3;
6.实验现象
1)
2)
批改评语:
教师签名
批改日期
实验报告二
单片机I/O接口应用—流水灯
2017年4月13日星期四节次3,4
1.实验目的和要求
1)进一步掌握单片机仿真软件的使用方法。
2)掌握单片机最小系统的构成。
3)掌握单片机I/O口的使用方法,如何控制I/O口检测按键及驱动LED发光二极管。
4)熟悉C51程序编程和调试方法。
2.电路原理图(附proteus电路原理图)
图2.1proteus电路原理图
安装有KeilC51软件与Proteus仿真软件PC机1台
单片机试验箱一套
4.实验说明及实验步骤
P1口为准双向口,P1的每一位都能独立地定义为输出线或输入线,作为输入的口线,必须向锁存器相应位写入“1”,该位才能作为输入。
延时程序的实现。
现常用的有两种方法,一是用定时器中断来实现,一是用指令循环实现。
在系统时间允许的情况下可以采用后一种方法。
本实验中延时子程序采用指令循环来实现。
1)源程序设计
分析设计要求,根据任务要求,绘制源程序流程图,然后使用KeilC进行源程序文件的设计与调试,观察并分析程序调试结果。
2)硬件运行
加载目标代码至单片机中,运行,观察运行结果
1)在P1口实现流水灯。
#include<
intrins.h>
//包含移位函数的头文件
#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
//包含移位函数的头文件
#defineucharunsignedchar
#defineuintunsignedint
voiddelay(uinti)//延时函数
while(i--)
{for(t=0;
}
sbitKEY=P2^0;
//定义P2^0口作为开关
voidmain()//主程序
{P1=0xfe;
//低电平点亮第一个灯
while
(1)
{
if(KEY==0)//开关接地,低电平启动流水灯
delay(500);
//延时
P1=_crol_(P1,1);
//P1中的数据循环左移1位,实现流水
6.运行结果
实验报告三
键盘扫描及显示实验
2017年4月20日星期四节次3,4
利用用8255实现I/O口扩展,实验键盘检测及数码管显示。
4.实验说明与实验步骤
8255端口地址定义
#defineC8255_AXBYTE[0x7F00]
#defineC8255_BXBYTE[0x7F01]
#defineC8255_CXBYTE[0x7F02]
#defineC8255_CONXBYTE[0x7F03]
共阴极七段码:
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
控制8255完成键盘扫描及数码显示
键盘采用4×
4键盘,每个数码管显示值可为0~F16个数。
键盘编号为0~F,当按下其中一个按键时,将该按键对应的编号的BCD码在两个数码管上显示出来。
P0口接8255的D0-D7;
A0-A0;
A1-A1;
WR-WR;
RD-RD;
P27-CS;
8255的PB口接键盘单元的A-G,Dp,PC0-PC3-Y1-Y4;
PA0-PA5-X1-X6
8255的PB口送字段码,A口控制键盘列扫描及数码管的位驱动,C口控制键盘的行扫描
程序中请对应写出关键注释语句
实验程序:
#include"
Absacc.h"
//因为用到define编址
#defineC8255_AXBYTE[0x7F00]//51单片机的P2P0分别是高八位和低八位用来寻址64kb的内存空间
#defineC8255_BXBYTE[0x7F01]//拿PA口来说cs非在P2^7且端口有A1A0来选择A1A0在低两位
#defineC8255_CXBYTE[0x7F02]//cs非在低电平有效时才能使用8255就是0xxxxx00中间的xx可以随意填写选择地址
#defineT2MS(65536-2000)//2us进一次中断
uchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharge,shi,key_value,key_value_l;
voidmain()
TMOD=0x01;
//TMOD高四位是T1方式段T0方式段每个方式段的低两位M1M0来选择什么方式什么位的定时计数器
//这里选择的是T0方式段的方式1的16位定时计数器
TL0=T2MS;
TH0=T2MS>
>
8;
EA=1;
//总中断
ET0=1;
//定时器0的中断允许开关
TR0=1;
//定时器0的运行开关
//对以上语句做出解释:
这里用到的是对定时计数器的初始化
//①:
先通过设置TMOD设置选择定时器1还是定时器0,因为51有两个定时器并且顺便设置定时器选择哪个工作方式这里选择方式1
//②:
然后由于这里选择的是方式1的16位定时计数器高八位TH0低八位TLO这两个赋初值
//③:
设置好定时计数器因为定时器一到就要开中断先开总中断
//④:
之后开定时计数器0的中断允许也就是ET0
//⑤:
之后把启动定时器0的让定时器开始计数要打开就让TR0=1,只要计数加满就会打开中断
C8255_CON=0x89;
//8255工作模式初始化
key_value_l=key_value;
//这里是按键所对应的数假如是7按键
ge=tab[key_value_l%10];
shi=tab[key_value_l/10];
//上两部是分离个位十位
while
(1)
{
if(key_value_l!
=key_value)
key_value_l=key_value;
ge=tab[key_value_l%10];
shi=tab[key_value_l/10];
//这里就是为了两次确认
voidTm0_Isr()interrupt1//计数到2us跳到TO的中断程序为什么是1看书P173页给了中断标号
staticbitwei=0;
staticucharcnt=0,y=3;
//这里的y就是0--3
ucharC;
//需要重新定义不然第二次进中断的时候就直接填满了
C8255_A&
=0xf0;
//这边的C8255_A就相当于PA仅仅相当于赋初值
C=C8255_C;
//就相当于C=PC;
if(C!
=0xff)//这里的意思是判断有没有按键按下只有按下就会有个一位为0因为这里设置的PC为输入所以是只能设置乘高电平
if(cnt++==10)
if(y++==3)
{
y=0;
}//假如按键是第三个按键也就是数字对应的2
cnt=0;
switch(y)
case0:
C8255_A=0xfe;
break;
case1:
C8255_A=0xfd;
case2:
C8255_A=0xfb;
//是2所在的列
case3:
C8255_A=0xf7;
break;
}
C=C8255_C;
//C=0Xfe
if(0xfe==C)
key_value=y;
elseif(0xfd==C)
key_value=y+4;
elseif(0xfb==C)
key_value=y+8;
elseif(0xf7==C)
key_value=y+12;
if(wei==0)
wei=1;
C8255_A|=0x60;
//PA=11111011
C8255_A&
=0xbf;
//PA=10111111
C8255_B=ge;
//PB=0x03
else
wei=0;
=0xdf;
C8255_B=shi;
六、运行结果
实验报告四
2017年5月4日星期四节次3、4
1)掌握单片机系统中断原理和使用方法。
2)掌握中断处理程序的编写方法
2.电路原理图(附proteus电路原理图)
在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些继续生产过程,按某种顺序有规律的完成预定的动作,对这类继续生产过程的控制称顺序控制,象注塑机工艺过程大致按“合模
注射
延时
开模
产伸
产退”顺序动作,用单片机最易实现。
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次;
,INT0接KK1-(单次脉冲);
INT1接KK2-(单次脉冲)
#defineuintunsignedint
sbitswitches=P2^4;
//为什么没定义中断0和中断1的接口因为在主函数中相当于已经打开了两个接口的第二功能只要存在跳变沿的情况就会启动中断
charcodetab[]={0x01,0x02,0x04,0x08,0x1f,0x2f,0x4f,0x8f};
voiddelay(uintz)
uintx,y;
for(x=z;
x>
0;
x--)
for(y=x;
y>
y--);
}//延时函数
main()
{
//keil总中断
EX0=1;
//开外部中断0
EX1=1;
///开外部中断1
IT0=1;
IT1=1;
//都是跳边=变沿的形势
PX0=1;
//让中断0的优先级高
PX1=0;
while
(1)
{
uchari=0;
if(switches==1)//如果开关是高电平
{
for(i=0;
i++)//8个led
{
if(switches==1)//为什么这里会有一个判断呢因为如果你不判断开关状态流水灯流到一半你关了开关这时流水灯不会马上停止
//会在for循环结束后开关等于0时的语句加了这个判断条件就会杜绝这个现象
{
delay(230);
P1=tab[i];
}
}
}
elseif(switches==0)P1=0x00;
voiderror1()interrupt0
ucharj;
for(j=0;
j<
j++)
P1=0xf0;
delay(230);
P1=0xff;
}//低四位亮8次
voiderror2()interrupt2
P1=0x0f;
}//高四位亮8次
6.运行结果
实验报告五
定时计数器实验
2017年6月5日星期四节次3、4
熟悉单片机内部定时/计数器功能,掌握初始化编程方法。
设单片机的主频为12Mhz,在方式1下最大定时时间仅为毫秒数量级,所以采用定时器和软件循环结合的方法。
在计数工作中,工作方式设为方式2(可自动重赋初值),初值设为0xff,每计数一次产生一次溢出中断,所以进中断次数即为计数个数。
1)将定时器0设置为方式1,编写程序在P1.0上产生周期为1s的方波信号,可通过LED或示波器观察P1.0的输出。
1.1)如果产生占空比为4:
1的方波,程序应该如何修改。
(假设周期不变)
1.2)P3.4接K0,启动方波
P10接D0,或接示波器
2)将定时器/计数器1设定为计数方式,方式2,计数器初值设为0xff,每计数一次溢出产生一次中断。
P1口连接发光二极管,执行程序,利用按钮产生单脉冲信号,观察LED上计数脉冲个数。
例如:
00000001为1,00000010为2,00000011为3,依次显示。
(亮为1)
T1接单脉冲脉冲信号KK1-,P10-P17接D0-D7
*将统计的脉冲个数通过8255送数码管动态显示
提示:
其中abcdefg,dp为段码,X1-X6为位码,共阴极点亮,要求点亮三位数码管。
1)#include<
chari=100;
unsignedcharcnt;
sbitP1_0=P1^0;
sbitk0=P3^4;
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-1000