单片机原理和应用实验报告.docx
- 文档编号:24120626
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:43
- 大小:1.75MB
单片机原理和应用实验报告.docx
《单片机原理和应用实验报告.docx》由会员分享,可在线阅读,更多相关《单片机原理和应用实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
单片机原理和应用实验报告
北航单片机原理及其应用实验报告
班级:
110323
姓名:
赵敏杰
学号:
11031064
同组者:
郑硕
学号:
11031105
实验一单片机开发环境以及I/O使用实验
一.实验目的
1.熟悉MCS-51系列单片机开发软件的使用
2.掌握单片机I/O口的使用
3.学习延时子程序的编写和使用
二.实验内容
1.验证性实验
(1)实验内容:
I/O口做输出口,I/O口接一个LED发光二极管,使其闪烁。
有关说明:
根据LED的单向导通性,可以用单片机的P1.0(也可以是其他I/O口)作为LED的控制端。
当P1.0输出为低电平时,LED灭,反之,LED亮。
本实验系统晶振为11.0592MHz,则一个机器周期为12/11.0592us=1.085us,
为方便编写延时函数,认为一个机器周期为1us。
硬件连接:
用导线将试验箱中的P1.0与L1相连。
程序:
C语言程序
#include
/*---延时子程序(有参函数),t=n*10ms---*/
voiddelay(unsignedcharn)
{
unsignedchari,j,k;
for(i=0;i for(j=0;j<14;j++) for(k=0;k<237;k++); } /*---主函数---*/ voidmain() { while (1) { P1_0=0;//P1.0赋值为0,LED灭 delay(100);//调用延时子程序,t=100*10ms P1_0=1;//P1.0赋值为1,LED亮 delay(100); } } 汇编语言程序 ORG00H AJMPSTART;在首地址处放置跳转指令 ;以免主程序占用中断入口地址 ORG30H START: CLRP1.0;P1.0赋值为0,LED灭 MOVR0,#100;R0的值决定延时时间长短 t=R0*10ms LCALLDELAY;调用延时函数 SETBP1.0;P1.0赋值为1,LED亮 MOVR0,#100 3 LCALLDELAY;调用延时函数 AJMPSTART;无条件跳转至START,继续循环执行 /*---延时子程序,t=R0*10ms---*/ DELAY: D1: MOVR1,#20 D2: MOVR2,#248 DJNZR2,$ DJNZR1,D2 DJNZR0,D1 RET END 实验现象: 可以看到LED1大致亮1s后灭1s,如此循环。 (2)实验内容: I/O口做输入口,一个I/O口接一个拨动开关,另一个I/O口接一个LED发光二极管,单片机读取开关的状态并通过LED显示出来。 有关说明: P0口是一组漏极开路型双向I/O口,也即地址/数据总线复用口。 对端口写“1”可作为高阻抗输入端用。 硬件连接: 用导线将试验箱中的P1.0与LED发光二极管L1相连,P0.0与拨动开关K1 相连。 程序: C语言程序 #include voidmain() { while (1) {P0=0xff;//对端口写"1",作为高阻抗输入端用 if(P0_0)//判断P0.0是否为高电平 {P1_0=0;} else//如果P0.0不是高电平,则执行后面的语句 {P1_0=1;} } } 汇编语言参考程序 ORG00H LJMPMAIN ORG30H MAIN: JBP0.0,DEL;识别按键是否闭合 SETBP1.0 LJMPMAIN DEL: CLRP1.0 LJMPMAIN END 实验现象: 可以看到LED1的状态和开关1的状态一致。 2.设计性实验 实验内容: 模拟舞台灯光控制实验 具体要求: P0.0和P0.1口连接两路拨动开关,P1口连接8路LED。 不同的开光状态控制LED进行流水灯、闪烁等,从而达到模拟舞台炫耀灯光控制的目的。 当P0.1和P0.0的状态为00时,8路LED从右至左流水点亮,具体循环顺序为: L1L2L3L4L5L6L7L8L1,如此重复循环; 当P0.1和P0.0的状态为01时,8路LED从左至右流水点亮,具体循环顺序为: L8L7L6L5L4L3L2L1L8,如此重复循环; 当P0.1和P0.0的状态为10时,8路LED交替闪烁,具体循环顺序为: L1、L3、L5、L7L2、L4、 L6、L8L1、L3、L5、L7,如此重复循环下去; 当P0.0和P0.1的状态为11时,8路LED一起闪烁,具体循环顺序为: 全灭全亮全灭,如此重复下去。 硬件连接: 用导线将实验箱中的P0.0与开关K1相连,P0.1与开关K2相连,P1.0~P1.7分别与LED发光二极管L1~L8相连。 程序: C语言程序 #include voiddelay(unsignedcharn) {unsignedchari,j,k; for(i=0;i for(j=0;j<14;j++) for(k=0;k<237;k++); } voidmain() { unsignedchari; P0=0xff; while (1) { if(P0_1==0&P0_0==0) { P1=0x01; for(i=1;i<=8;i++) {delay(100); P1=P1<<1; if(P0_1! =0|P0_0! =0) break; } } if(P0_1==0&P0_0==1) { P1=0x80; for(i=1;i<=8;i++) {delay(100); P1=P1>>1; if(P0_1! =0|P0_0! =1) break; } } if(P0_1==1&P0_0==0) { P1=0x01; for(i=1;i<=4;i++) {delay(100); P1=P1<<2; if(P0_1! =1|P0_0! =0) break;} P1=0x02; for(i=1;i<=4;i++) {delay(100); P1=P1<<2; if(P0_1! =1|P0_0! =0) break; } } if(P0_1==1&P0_0==1) {P1=0xff; delay(100); P1=0x00; delay(100); if(P0_1! =1|P0_0! =1) break; } } } 三.实验分析与感想 本次实验的内容是单片机的开发环境以及I/O的使用,主要要求我们熟悉MCS-51系列单片机开发软件的使用,掌握单片机I/O口和延时子程序的使用。 第一次接触编写程序的软件有些不熟练,慢慢摸索之后逐渐掌握了编写和倒入单片机的过程,但是由于电脑串口的问题,经常出现串口被占用的情况,多次检查之后仍然不能排除错误,最后重启电脑之后可以继续完成实验,但一两次使用之后又出现串口的情况,十分奇怪,最近不得不换电脑才能完成实验。 本次实验基本完成了老师要求的内容,但由于串口被占用的情况,被浪费太多时间,以至于最后一个实验没有完全完成,但整体思想及程序上已没有问题。 第二次 实验二单片机中断及定时器使用实验 一.实验目的 1.学习外部中断技术的基本使用方法及中断处理的编程方法。 2.学习单片机定时器的基本使用方法及其编程方法。 二.实验内容 1.验证性实验 (1)实验内容: 外部中断的实验,8路LED做流水灯,当接收到外部中断后,LED全部点亮一段时间,之后恢复到流水灯状态。 有关说明: 采用外部中断0负边沿产生中断信号,中断响应函数应尽量简洁。 硬件连接: 用导线将实验箱中的P1.0~P1.7分别与LED发光二极管L1~L8相连。 INT0 与负脉冲相连(硬件在实验箱的具体位置可以参照文档最后面的附图)。 程序: C语言程序 #include unsignedcharSTATE; unsignedchars0; /*---延时子程序(有参函数),t=n*10ms---*/ voiddelay(unsignedcharn) {unsignedchari,j,k; for(i=0;i for(j=0;j<14;j++) for(k=0;k<237;k++); } voidmain() { EA=1;//CPU开中断 EX0=1;//开外部中断0 IT0=1;//边沿触发方式 s0=0x01; while (1) { if(! STATE)//如果标志位STATE为0,则做流水灯 {P1=s0; s0=s0<<1; if(s0==0x00)s0=0x01; delay(30); } else//如果标志位STATE为1,则LED全亮 {STATE=0; P1=0xff; delay(100); } } } /*---中断服务函数---*/ voidint0()interrupt0 {STATE=1; }//标志位STATE置1 汇编语言程序 ORG0000H JMPSTART;在首地址处放置跳转指令 ;以免主程序占用中断入口地址 ORG0003H;外部中断0程序入口地址 JMPINT ORG0030H START: SETBEA;CPU开中断 SETBEX0;开外部中断0 SETBIT0;边沿触发方式 MOVA,#01H CALLLOOP LOOP: MOVP1,A MOVR0,#30;R0的值决定延时时间长短 ;t=R0*10ms CALLDELAY;调用延时函数 RLA;移位 JMPLOOP;无条件跳转至LOOP,继续循环执行 /*---外部中断0中断程序---*/ INT: MOVB,#0FFH MOVP1,B MOVR0,#30 CALLDELAY RETI /*---延时子程序,t=R0*10ms---*/ DELAY: D1: MOVR1,#20 D2: MOVR2,#248 DJNZR2,$ DJNZR1,D2 DJNZR0,D1 RET END 实验现象: 可以看到在没有中断的时候,8路LED从右至左流水点亮,当外部中断脉冲到来以后8路LED全部点亮一段时间,之后恢复流水点亮状态。 (2)实验内容: 定时器实验,8路LED所表示的二进制数每定时0.5s增1。 有关说明: 实验箱单片机使用的晶振频率为11.0592MHz,在计算定时器初值的时候要注意。 在汇编语言中,数据长度只支持到8位,因此在用定时器定时的时候要注意到这一点。 硬件连接: 用导线将实验箱中的P1.0~P1.7分别与LED发光二极管L1~L8相连。 程序: C语言程序 #include inttime; voidmain() {TMOD=0x01;//定时器0工作方式1 TH0=64614/256;//计算初值 TL0=64614%256; EA=1;//CPU开中断 ET0=1;//开定时器中断0 TR0=1;//开启定时器0并开始工作 while (1);//等待中断 } /*---定时器0中断服务函数---*/ voidtime0()interrupt1 {time++;//每1ms,time加1 if(time==500)//time加满500次后,0.5s时间到 {time=0;//time清零,重新计数 P1++; } TH0=64614/256;//重新装载定时器初值 TL0=64614%256; } 汇编语言参考程序 ORG0000H JMPSTART;在首地址处放置跳转指令 ;以免主程序占用中断入口地址 ORG000BH;定时器0程序入口地址 JMPET0P ORG0030H START: MOVTMOD,#01H;定时器0,工作方式1 MOVTH0,#4CH;定时器装载初值,50ms中断一次 MOVTL0,#00H;这里需要注意,前面的c程序定时时间为 ;1ms,这里汇编定时时间为50ms,因为汇编 ;数据长度只支持到8位,如果定时时间为1ms, ;500ms需要中断500次,汇编无法支持,所以 ;定时时间改为50ms SETBEA;CPU开中断 SETBET0;开定时器中断 SETBTR0;定时器开始工作 MOVA,#0AH CALLLOOP LOOP: CJNEA,#00H,LOOP;A不等于零,跳转LOOP INCB;B加1 MOVP1,B MOVA,#0AH JMPLOOP; /*---定时器0中断程序---*/ ET0P: DECA;A减1 MOVTH0,#4CH MOVTL0,#00H RETI END 实验现象: 可以看到用P1口所接的8路LED表示的二进制数每隔0.5s加1。 2.设计性实验 实验内容: 模拟救护车优先的交通灯控制实验 具体要求: 具体要求为用两组不同颜色的LED分别模仿两个路口的“红灯”、“绿灯”、“黄灯”。 平时两组交通灯按规律点亮,具体规律为: 南北路口: 绿灯(5s)黄灯(2s)红灯(5s)黄灯(2s)绿灯(5s)…… 东西路口: 红灯(5s)黄灯(2s)绿灯(5s)黄灯(2s)红灯(5s)…… 当救护车来时(用负脉冲触发外部中断表示救护车到来),两个路口马上都变成红灯让救护车优先通过,红灯保持3s,待救护车通过以后,两个路口的交通灯恢复正常的工作状态。 实验中的交通灯点亮的时间需要用定时器精确定时, 不能使用延时函数。 硬件连接: INT0与负脉冲相连,LED与单片机的连接没有固定要求,下图只是提供一种参考接法。 程序: #include unsignedcharSTATE; unsignedchars0; /*---延时子程序(有参函数),t=n*10ms---*/ voiddelay(unsignedcharn) {unsignedchari,j,k; for(i=0;i for(j=0;j<14;j++) for(k=0;k<237;k++); } voidmain() {EA=1;//CPU开中断 EX0=1;//开外部中断0 IT0=1;//边沿触发方式 s0=0x01; while (1) {if(! STATE)//如果标志位STATE为0,则做流水灯 {P1=s0; s0=s0<<1; if(s0==0x00)s0=0x01; delay(30); } else//如果标志位STATE为1,则LED全亮 {STATE=0; P1=0xff; delay(100); } } } /*---中断服务函数---*/ voidint0()interrupt0 {STATE=1; }//标志位STATE置1 #include inttime,i; unsignedcharSTATE; unsignedcharm; voiddelay(unsignedcharn) { unsignedchari,j,k; for(i=0;i for(j=0;j<14;j++) for(k=0;k<237;k++); } voidmain() {TMOD=0x01;//定时器0工作方式1 TH0=64614/256;//计算初值 TL0=64614%256; EA=1;//CPU开中断 ET0=1;//开定时器中断0 TR0=1;//开启定时器0并开始工作 EX0=1;//开外部中断0 IT0=1;//边沿触发方式 while (1); } /*---定时器0中断服务函数---*/ voidtime0()interrupt1 {time++;//每1ms,time加1 if(time<5000) P1=0x21; if(time>=5000&&time<=7000) {P1=0x12; } if(time>=7000&&time<=12000) {P1=0x0c; } if(time>=12000&&time<=14000) {P1=0x12; } if(time>14000) {time=0; } TH0=64614/256;//重新装载定时器初值 TL0=64614%256; } voidint0()interrupt0 { P1=0x24; ET1=1; TR1=1; TH1=64614/256;//重新装载定时器初值 TL1=64614%256; while(m<=3000); ET1=0; TR1=0; } voidt1()interrupt3 { m++; TH1=64614/256;//重新装载定时器初值 TL1=64614%256; } 三.实验分析与感想 本次实验是单片机中断及定时器使用实验,要求我们学习外部中断技术的基本使用方法及中断处理的编程方法,学习单片机定时器的基本使用方法及其编程方法。 前两个小实验都比较顺利,分别利用了中断和定时器的功能。 只要注意一下实验使用的LED灯是共阳的还是共阴的,应该就可以较顺利完成。 第三个设计性实验综合了前两个实验的内容,而且要求中出现了三个时间,但是51单片机没有三个定时器,故要利用软件的辅助才能完成。 但是始终没有结果,调试将近半节课还是不行,在老师的帮助下再次调试,发现单片机出现了问题。 这让我领悟到: 出现问题不要一味埋头找程序错误或者硬件连接错误,应该灵活的判断器件是否出现了故障。 这会让我们节约很多时间,少走一些弯路。 实验三单片机串口使用实验 一.实验目的 1.学习单片机与上位机串行通信的基本使用方法。 2.学习动态数码管显示的基本使用方法。 二.实验内容 1.验证性实验 (1)实验内容: 单片机串行接收数据实验: 6位数码管通过动态扫描作为显示模块,上位机通过串口调试助手以十六进制形式向单片机发送‘00’-‘ff’范围内的数据,波特率为9600,单片机接收到数据以后,在数码管的最后两位显示出来,数码管其它位熄灭。 有关说明: LED数码管显示是单片机应用系统中最常用、最基本的输出设备,用户可以利用显示器件显示各种需要输出的视觉信息,实现人机对话。 单片机对数码管的显示方式可分为静态显示与动态显示两种。 静态显示中每一个数码管需要一个独立的输出口控制,静态显示的特点是显示程序简单、亮度 高、稳定性好、占用CPU时间少,但占用的I/O口较多,所以静态显示常用在显示器数目较少的应用系统中。 当显示位数较多时,可以采用动态显示。 动态显示是指数码管轮流地显示各自的字符,每位数码管都在显示和熄灭两个状态中循环,同一时间只有一位数码管处于显示状态。 动态显示的特点是线路简单、硬件成本相对较低,但需要不断刷新、扫描I/O口,占用CPU时间较多。 动态数码管控制原理: 采用各位数码管循环轮流显示的方法,当循环显示频 率较高时,由于人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字型码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 AT89S52有UART可编程的全双工串行口用于串行通信,由TXD发送数据,RXD接收外部输入的数据。 具有两个缓冲器SBUF,一个作发送缓冲器,另一个作接收缓冲器,它们拥有相同的名字和地址空间,但不会出现冲突,因为一个只能读出数据,一个只能写入数据。 硬件连接: 首先将实验箱上的LD0——LD5与S0——S5之间的短路冒全部拔去,a——h与B0——B3、A0——A3之间的短路帽也全部拔去,将短路帽插到双排插针中的一根针上,防止丢失,做完实验再重新插回去。 之后将LD0——LD5与P2_0 ——P2_5用导线相连,a——h与P1_0——P1_7用导线相连,最后还需要将串口插到电脑上,串口线的另一端与实验箱的J13相连,注意引脚排列顺序。 程序: C语言程序 #include #defineucharunsignedchar//变量类型定义 ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//七段码0--7 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //七段码8--f,最后一码0x00作用为熄灭数码管 ucharsegment[6];//段选 ucharbyte[6];//位选 ucharplay[6]={0,0,0,0,0,0};//要显示的数字 uchark; uchard; voidDisplay_Init();//数码管显示初始化 voidUart_Init();//串口初始化 voidDisplay();//数码管显示函数 /*---数码管显示初始化---*/ voidDisplay_Init()//初始化,通过定时器,按固定频率扫描数码管 { TMOD=TMOD|0x01;//定时器0,工作方式1 TH0=0xfc;//计算初值,定时时间为1ms TL0=0x66; EA=1;//CPU开中断 ET0=1;//开定时器中断0 TR0=1;//开启定时器0并开始工作 } 5 /*---串口初始化---*/ voidUart_Init() { TMOD=TMOD|0x20;//定时器1,工作方式2 TH1=0xfd;//波特率为9600 TL1=0xfd; SCON=0x50;//设置定时器工作方式 PCON=0; EA=1;//CPU开中断 ES=1;//允许串口中断 TR1=1;//定时器1开始工作 } /*---扫描数码管数据显示函数---*/ voidDisplay() { ucharn=0; uchar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 应用 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)