南京晓庄学院电子工程学院实验报告课程名称:单片机系统设计与应用姓名:森专业:电子信息科学与技术年级:14级学号:052016年12 月1 日实验项目列表序号实验项目名称成绩指导教师1 单片机仿真软件的使用2 单片机I/O接口应用实验——流水灯3 外部中断实验——工业顺序控制模拟4 定时/计数器实验——矩形波5 定时/计数器实验——计数器6 综合实验78910注:1、实验箱端口为com6。
2、芯片选择切换到513、停止运行使用实验箱上的复位按钮实验室号:___ 实验时间:成绩:实验一仿真软件的使用1.实验目的和要求1)熟悉Keil C51软件界面,以及编辑、编译、运行程序的步骤;2)掌握单片机仿真软件使用和调试的方法。
2.实验原理Keil C51软件使用在Keil C51集成开发环境下,建立一个工程并编辑源程序,熟悉Keil C51集成开发环境下各种菜单、命令的使用。
3.主要仪器设备(实验用的软硬件环境)安装有Keil C51软件的PC机1台4.操作方法与实验步骤Keil C51软件使用(1)建立用户文件夹(2)建立工程(3)建立文件并编码。
输入以下源程序,并保存在项目所在的目录中(4)把文件加入工程中(5)编译工程。
编译时观察在界面下方的“Build”页中的到编译错误信息和使用的系统资源情况等。
(6)调试。
利用常用调试命令,如复位、运行、暂停、单步、单步跳过、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令进行调试,观察并分析调试结果。
(7)目标代码文件的生成。
运行生成相应的.HEX文件。
5.实验内容及程序1)从DATA区地址起始地址为40H的连续10个内存单元的内容传送到XDATA区起始地址为2000H的10个内存单元中。
注意:DATA区地址起始地址为40H的连续10个内存单元必须先赋初值。
P83-5源程序#include <reg51.h>#define uchar unsigned charxdata unsigned char buffer1[10]_at_ 0x2000;//在xdata区定义数组变量BUF1,首地址为2000Hdata unsigned char buffer2[10]_at_ 0x40;//在data区定义数组变量BUF2,首地址为40Hvoid main(void)uchar i;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,存入XDA TA区地址为2000H的单元。
程序(程序中请对应写出关键注释语句)P275源程序#include<reg51.h>#include<absacc.h>#define a XBYTE[0x2001]#define b XBYTE[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.主要仪器设备(实验用的软硬件环境)安装有Keil C51软件与Proteus仿真软件PC机1台单片机试验箱一套4.实验说明及实验步骤●P1口为准双向口,P1的每一位都能独立地定义为输出线或输入线,作为输入的口线,必须向锁存器相应位写入“1”,该位才能作为输入。
●延时程序的实现。
现常用的有两种方法,一是用定时器中断来实现,一是用指令循环实现。
在系统时间允许的情况下可以采用后一种方法。
本实验中延时子程序采用指令循环来实现。
1)源程序设计分析设计要求,根据任务要求,绘制源程序流程图,然后使用Keil C进行源程序文件的设计与调试,观察并分析程序调试结果。
2)硬件运行加载目标代码至单片机中,运行,观察运行结果5.实验内容及程序1)在P1口实现流水灯。
#include <reg51.h>#include <intrins.h> //包含移位函数的头文件#define uchar unsigned char#define uint unsigned intvoid delay(uint i) //延时函数{ uchar t;while (i--){ for(t=0; t<120; t++);}}void main( ) //主程序{ P1=~0xfe; //高电平点亮第一个灯while (1){delay( 500 ); //500为延时参数P1=_crol_(P1,1) ; //P1中的数据循环左移1位,实现流水灯}}2)任选某P端口接开关,控制流水灯的启动和停止。
接线:P10-P17接D0-D7;P2.x接K0#include <reg51.h>#include <intrins.h> //包含移位函数的头文件#define uchar unsigned char#define uint unsigned intvoid delay(uint i) //延时函数{ uchar t;while (i--){ for(t=0; t<120; t++);}}sbit KEY=P2^0; //定义P2^0口作为开关void main( ) //主程序{ P1=~0xfe; //高电平点亮第一个灯while (1){if(KEY==0) //开关接地,低电平启动流水灯{delay( 500 ); //延时P1=_crol_(P1,1); //P1中的数据循环左移1位,实现流水}}}*3)设计花样流水灯:自行设计两种花样流水灯,利用开关实现两种流水灯的切换,例如K0控制第一种流水灯的启动和停止;K1控制第二种流水灯的启动和停止,两种流水灯可以通过两个开关实现切换。
程序(程序中请对应写出关键注释语句)#include<reg51.h>#define uchar unsigned char //定义无符号字符型变量sbit S0=P0^0; //将S0定义为P0.0unsigned char state;void flow(void); //申明函数flowvoid key_scan(void); //申明函数key_scanvoid delay( ) //延时函数{uchar i,j;for(i=0;i<125;i++)for(j=0;j<125;j++);}void delay1ms(void) //延时消抖函数{uchar i,j;for(i=0;i<10;i++)for(j=0;j<10;j++);}void main( ){state=0;while(1){key_scan();switch(state){case 0:P1=0xff;break;case 1:flow( );break;}}}void key_scan(void) //开关检测函数{P0=0xff;if((P0&0x0f)!=0x0f) //检测到有按键按下{delay1ms( ); //延时1ms再去检测if(S0==0)state=0;elsestate=1;}}void flow(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.主要仪器设备(实验用的软硬件环境)安装有Keil C51软件与Proteus仿真软件PC机1台单片机试验箱一套4.实验说明及实验步骤在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些继续生产过程,按某种顺序有规律的完成预定的动作,对这类继续生产过程的控制称顺序控制,象注塑机工艺过程大致按“合模→注射→延时→开模→产伸→产退”顺序动作,用单片机最易实现。
1)源程序设计分析设计要求,根据任务要求,绘制源程序流程图,然后使用Keil C进行源程序文件的设计与调试,观察并分析程序调试结果。
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<reg51.h>#define uchar unsigned char //定义无符号字符变量#define uint unsigned int //定义无符号整型变量sbit K0=P2^4; //将K0定义为P2.4void delay(uint t); //申明延时函数delay()void delay(uint t) //延时函数{uchar j;for(;t>0;t--)for(j=0;j<125;j++);}void main(void){uchar display[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯显示数组int a;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口}}elseif(K0==0) //当开关为0{IE=0x00;P1=0x00; //P1口全亮delay(500); //延时}}}void int0_isr(void) interrupt 0 //外部中断0的服务函数{uchar n;for(n=0;n<8;n++){P1=0x0ff; //全灭delay(500); //延时P1=0xf0; //高4位LED灭,低4位LED亮delay(500); //延时}}void int1_isr(void) interrupt 2 //外部中断1的服务函数{uchar m;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的中断优先级如何是采用的都是低优先级。