实验报告课程名称单片机原理及应用学院信息工程学院实验报告一实验报告二实验名称简单I/O口扩展实验实验时间2014年月日同组人员专业班级实验类型验证性实验地点学时 2一、实验要求1、P1口做为输入口,接8个扭子开关,以实验台上74LS273做输出口,编写程序读取开关状态,将此状态,在发光二极管上显示出来。
二、实验目的1.学习在单片机系统中扩展简单I/O接口的方法。
2.学习数据输出程序的设计方法。
3.学习模拟交通灯控制的实验方法。
三、实验说明P1口为准双向口,P1的每一位都能独立地定义为输出线或输入线,作为输入的口线,必须向锁存器的相应位写入“1”,该位才能作为输入。
8031中所有口锁存器在复位时均置为“1”,如果后来在口锁存器写入过“0”,在需要时应写入一个“1”使它再成为一个输入。
可以用第二个实验做一下试验。
先按要求做好程序并调试成功后,可将P1口锁存器中置“0”,此时将P1做输入口,会有什么结果。
再来看一下延时程序的实现。
现常用的有两种方法,一是用定时器中断来实验,一是用指令循环来实现。
在系统时间允许的情况下可以采用后一种方法。
四、实验电路五、实验程序#include<reg51.h>sbit CLK=P3^0;void main(){ CLK=0;WR=1;while(1){ unsigned int temp=8;P2=P1;CLK=1;while(temp--);CLK=0;}}六、实验中遇到的问题及解决办法批阅成绩签字:年月日实验报告三实验名称交通灯控制实验实验时间2014年月日1234131024同组人员专业班级实验类型综合性实验地点学时 2一、实验要求用汇编和C51编写模拟交通灯的控制程序。
二、实验目的1.学习汇编和C51程序的编写方法。
2.学习模拟交通灯控制的实现方法。
三、实验说明要完成本实验,首先必须了解交通路灯的亮灭规律。
假设交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的红灯亮,南北路口的绿灯亮,南北方向通车,延时一段时间后,南北路口绿灯灭,黄灯开始闪烁。
闪烁若干次后,南北路口红灯亮,而同时东西路口的绿灯亮,东西方向开始通车,延时一段时间后,东西路口的绿灯灭,黄灯开始闪烁。
闪烁若干次后,再切换到南北路口方向,重复上述过程。
四、实验电路五、实验程序#include<at89x51.h>unsigned char segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char s=0,q=0;实验报告四实验名称外部中断实验实验时间2014年月日同组人员专业班级实验类型验证性实验地点学时 2一、实验要求在上一实验(交通灯控制实验)内容的基础上增加允许急救车优先通过的要求。
有急救车到达时,各方向交通灯信号为全红,以便让急救车通过,假定急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。
本实验以单脉冲为中断申请,表示有急救车通过。
二、实验目的1.学习外部中断技术的基本使用方法。
2.学习中断处理程序的编程方法。
三、实验说明本实验中断处理程序的应用,最主要的地方是如何保护进入中断前的状态,使得中断程序执行完毕后能回到交通灯中断前的状态。
要保护的地方,除了累加器ACC、PSW外,还要注意:一是主程序中的延时程序和中断处理程序中延时程序不能混用,本实验中,主程序中的延时用的寄存器和中断延时用的寄存器应不相同。
第二,主程序中往端口输出数据操作要先保存再输出。
四、实验电路五、实验程序#include<at89x51.h>unsigned char code segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char n;void delay(unsigned char k){unsigned char i,j;for(i=0;i<k;i++)for(j=0;j<110;j++);}void dxshanshuo(){unsigned char a;for(a=0;a<6;a++){P2=0x80;delay(100);P2=0x00;delay(100);}}void nbshanshuo(){unsigned char b;for(b=0;b<6;b++){实验报告五五、实验程序#include<at89x51.h>#define uchar unsigned char#define uint unsigned int uchar a;void delay(){ uchar i,j;for(i=0;i<20;i++)for(j=0;j<110;j++);}void main(){ P1=0xff;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;TR0=1;while(1)实验报告六实验名称8255A可编程并行接口实验实验时间2014年月日同组人员专业班级实验类型综合性实验地点学时 2一、实验要求利用8255A可编程并行接口芯片,B口作为输入口接8个开关,A口作为输出口接8只发光二极管,开关控制相应发光二极管。
二、实验目的1.了解8255A芯片的结构及编程方法。
2.掌握通过8255A读取开关数据的方法。
三、实验说明先根据电路设计确定各端口的地址,向控制口写入方式控制字,设置好各端口的工作方式,实验中A、B、C都应工作在方式0,B口输入,A口输出。
方式字为82H。
四、实验电路五、实验程序#include<at89x51.h>#include<absacc.h>#define COM XBYTE[0xbfff]#define PA XBYTE[0xb3ff]#define PB XBYTE[0xb7ff]void main(){ unsigned char temp;PB=0xff;COM=0x82;while(1){temp=PB;PA=temp;}}六、实验中遇到的问题及解决办法批阅成绩签字:年月日实验报告七实验名称数码显示实验实验时间2014年月日同组人员专业班级实验类型综合性实验地点学时 2一、实验要求用共阳极7段显示器显示按键的键值,要求用74LS164做为显示接口,用矩阵式键盘,至少识别16个按键,键值能在7段显示上显示。
二、实验目的1.理解LED七段数码管的显示控制原理。
2.掌握数码管与单片机的接口技术,能够编写数码管显示驱动程序。
3.熟悉接口程序调试方法。
三、实验说明用74LS164作为显示接口,单片机串行口工作在方式0。
可将共阳极7段显示器的段码放在数组中,根据键值查数组,通过串口送出段码并显示。
四、实验电路五、实验程序#include<at89x51.h>unsigned char code segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char a,key;unsigned char temp;unsigned char i,j,k;void delay(unsigned char z){ while(z--){for(i=0;i<10;i++)for(j=0;j<250;j++);}实验报告八五、实验程序#include<at89x51.h>#define uchar unsigned charuchar code lcd[]={"0123456789ABCDEF"}; sbit RS=P2^6;sbit RW=P2^5;sbit E=P2^7;void delay(uchar z){ uchar x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}void wr51(uchar j){ delay(20);E=0;RS=0;RW=0;E=1;P0=j;E=0;delay(5);}void wd51(uchar j){ delay(20);E=0;RS=1;RW=0;实验报告九实验名称串—并转换实验实验时间2014年月日同组人员专业班级实验类型综合性实验地点学时 2一、实验要求利用单片串行口和串入并出移位寄存器74LS164扩展输出口,在数码显示器上循环显示0-9这10个数字。
二、实验目的1.掌握单片机串行口方式0工作方式及编程方法。
2.掌握利用串行口扩展I/O口的方法。
三、实验说明串行口工作在方式0时,可通过外接移位寄存器实现串并转换。
在这种方式下,数据为8位,从RXD端输入/输出,TXD端用于输出移位同步时钟信号,波特率为f osc/12。
编程时,先由软件设置SCON,在CPU将数据写入SBUF后立即启动发送,待8位数据接收完后硬件将TI置1,必须由软件将其清零。
四、实验电路五、实验程序#include<reg51.h>#include<stdio.h>sbit P1_0=0x90;unsigned char code segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char a,x;void delay(unsigned int k)实验报告十五、实验程序#include<at89x51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int#define ADC0808 XBYTE[0x7ff8] sbit EOC=P3^2;void delay(){ uchar x,y;for(x=50;x>0;x--)for(y=200;y>0;y--);}void main(){ uchar a,bai,shi,ge;ADC0808=0;while(1){if(!EOC){a=ADC0808;bai=a/100;shi=a%100/10;ge=a%10;P2=bai;P1=shi<<4|ge;ADC0808=0;}。