单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
单片机实验报告
南京晓庄学院
电子工程学院
实验报告册
课程名称:
单片机实验
专业名称:
电子信息科学与技术
班级:
14电信转本
学号:
14090807
姓名:
郭天庭
任课老师:
武英
2016—2017学年第二学期
学生实验守则
一、学生必须按时到指定实验室做实验,不得迟到、早退。
无故迟到十分钟以上者,不得参加本次实验。
二、实验前必须做好预习,明确实验的目的、内容和步骤,了解仪器设备的操作规程和实验物品的特性,写好预习报告,经指导教师或实验技术人员检查合格后,方可进入实验室。
三、因故不能按时上实验课的学生,必须补做,否则该次实验成绩以零分计。
具体补做时间由学生提出申请,经指导教师或实验技术人员同意后安排。
(注:
学生请事假应出具学办证明,病假应出具医院证明)。
四、进入实验室要保持实验室的科学气氛,保持实验室的安静整洁,自觉养成良好的学习风气。
五、学生独立完成实验准备工作,需经指导教师或实验技术人员检查认可后,方能启动设备,正式开始实验。
六、实验时,要严肃认真,爱护公物,正确操作,仔细观察,真实记录实验数据和结果。
不准喧闹谈笑,不做与实验无关的事,不动与实验无关的设备,不进入与实验无关的场所。
七、对实验的方法步骤及实验设备如有疑问,应向指导教师或实验技术人员提出。
仪器设备发生不正常现象时,应及时报告指导教师或实验技术人员。
八、爱护仪器设备,节约用水、用电和实验材料。
不准私自将公物带出实验室。
九、实验中,如发现仪器设备损坏,应及时报告,查明原因。
凡属违反操作规程导致设备损坏的,要照章赔偿,追究责任。
十、实验结束时,实验数据要经指导教师审阅、签字。
实验中使用的各种工具、材料、仪器等必须向指导教师或实验技术人员交代清楚,整理好实验现场后,方能离开。
十一、每次实验结束时,学生应按时送交实验报告,指导教师按章进行必要考核。
实验报告不合格者必须退回重做。
无故不做或不合格重做者,第二次的实验材料费应由学生自理。
十二、为培养学生动手能力和科学实验技能,提倡由指导教师组织或学生自己提出,在教学计划外作些探索性、研究性实验。
但均需事先向实验中心提出申请,经批准同意后,在实验室安排的时间内进行。
十三、本规则由指导教师和实验技术人员督促学生严格执行。
对不遵守本规则的学生,指导教师可责令其停止实验。
实验目录
序号
实验名称
成绩
一
单片机仿真软件的使用
二
单片机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
#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<10;i++)
buffer2[i]=buffer1[i];
while
(1);
}
2)将DATA区地址为20H的单元赋初值为05H,地址为21的单元赋初值为06H,将这两个单元的数据拼成56H,存入XDATA区地址为2000H的单元。
程序:
#include
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电路原理图
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位,实现流水
}
}
}
6.运行结果
1)
2)
批改评语:
成绩
教师签名
批改日期
实验报告三
实验名称
键盘扫描及显示实验
实验时间
2017年4月20日星期四节次3,4
1.实验目的和要求
利用用8255实现I/O口扩展,实验键盘检测及数码管显示。
2.电路原理图(附proteus电路原理图)
图2.1proteus电路原理图
3.主要仪器设备(实验用的软硬件环境)
安装有KeilC51软件与Proteus仿真软件PC机1台
单片机试验箱一套
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
1)源程序设计
分析设计要求,根据任务要求,绘制源程序流程图,然后使用KeilC进行源程序文件的设计与调试,观察并分析程序调试结果。
2)硬件运行
加载目标代码至单片机中,运行,观察运行结果
5.实验内容及程序
控制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
#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可以随意填写选择地址
#defineC8255_CONXBYTE[0x7F03]
#defineT2MS(65536-2000)//2us进一次中断
#defineucharunsignedchar
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;
TL0=T2MS;
TH0=T2MS>>8;//需要重新定义不然第二次进中断的时候就直接填满了
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;break;
case2:
C8255_A=0xfb;break;//是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;
C8255_A|=0x60;
C8255_A&=0xdf;
C8255_B=shi;
}
六、运行结果
批改评语:
成绩
教师签名
批改日期
实验报告四
实验名称
外部中断实验——工业顺序控制模拟
实验时间
2017年5月4日星期四节次3、4
1.实验目的和要求
1)掌握单片机系统中断原理和使用方法。
2)掌握中断处理程序的编写方法
2.电路原理图(附proteus电路原理图)
图2.1proteus电路原理图
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
#defineuintunsignedint
#defineucharunsignedchar
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>0;y--);
}//延时函数
main()
{
EA=1;//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;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<8;j++)
{
P1=0xf0;
delay(230);
P1=0xff;
delay(230);
}
}//低四位亮8次
voiderror2()interrupt2
{
ucharj;
for(j=0;j<8;j++)
{
P1=0x0f;
delay(230);
P1=0xff;
delay(230);
}
}//高四位亮8次
6.运行结果
批改评语:
成绩
教师签名
批改日期
实验报告五
实验名称
定时计数器实验
实验时间
2017年6月5日星期四节次3、4
1.实验目的和要求
熟悉单片机内部定时/计数器功能,掌握初始化编程方法。
2.电路原理图(附proteus电路原理图)
1)
2)
3.主要仪器设备(实验用的软硬件环境)
安装有KeilC51软件与Proteus仿真软件PC机1台
单片机试验箱一套
4.实验说明及实验步骤
设单片机的主频为12Mhz,在方式1下最大定时时间仅为毫秒数量级,所以采用定时器和软件循环结合的方法。
在计数工作中,工作方式设为方式2(可自动重赋初值),初值设为0xff,每计数一次产生一次溢出中断,所以进中断次数即为计数个数。
1)源程序设计
分析设计要求,根据任务要求,绘制源程序流程图,然后使用KeilC进行源程序文件的设计与调试,观察并分析程序调试结果。
2)硬件运行
加载目标代码至单片机中,运行,观察运行结果
5.实验内容及实验程序
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;
voidmain()
{
EA=1;
ET0=1;
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-1000