单片机实验讲义实验1P1口实验一一、实验目的:1.学习P1口的使用方法。2.学习延时子程序的编写和使用。二、实验设备:CPU挂箱、8031CPU模块三、实验内容:1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。2.P1口做输入口,接八个按纽开关,以实验箱上74LS273做输出口,编写程序读取开关状态,在发光二极管上显示出来。四、实验原理:P1口为准双向口,P1口的每一位都能独立地定义为输入位或输出位。作为输入位时,必须向锁存器相应位写入“1”,该位才能作为输入。8031中所有口锁存器在复位时均置为“1”,如果后来在口锁存器写过“0”,在需要时应写入一个“1”,使它成为一个输入。可以用第二个实验做一下实验。先按要求编好程序并调试成功后,可将P1口锁存器中置“0”,此时将P1做输入口,会有什么结果。再来看一下延时程序的实现。现常用的有两种方法,一是用定时器中断来实现,一是用指令循环来实现。在系统时间允许的情况下可以采用后一种方法。本实验系统晶振为6.144MHZ,则一个机器周期为12÷6.144us即1÷0.512us。现要写一个延时0.1s的程序,可大致写出如下:MOVR7,#X(1)DEL1:MOVR6,#200(2)DEL2:DJNZR6,DEL2(3)DJNZR7,DEL1(4)上面MOV、DJNZ指令均需两个机器周期,所以每执行一条指令需要1÷0.256us,现求出X值:1÷0.256+X(1÷0.256+200×1÷0.256+1÷0.256)=0.1×10⁶指令(1)指令(2)指令(3)指令(4)所需时间所需时间所需时间所需时间X=(0.1××10⁶-1÷0.256)/(1÷0.256+200×1÷0.256+1÷0.256)=127D=7FH经计算得X=127。代入上式可知实际延时时间约为0.100215s,已经很精确了。五、实验原理图:P1口输出实验P1口输入实验六、实验步骤:执行程序1(T1_1.ASM)时:P1.0~P1.7接发光二极管L1~L8。执行程序2(T1_1.ASM)时:P1.0~P1.7接平推开关K1~K8;74LS273的O0~O7接发光二极管L1~L8;74LS273的片选端CS273接CS0(由程序所选择的入口地址而定,与CSO~CS7相应的片选地址请查看第一部分系统资源,以后不赘述)。【MUT-III实验说明书.Pdf】#defineXBYTE((unsignedcharvolatilexdata*)0)定义XBYTE为指向xdata地址空间unsignedchar数据类型的指针,指针值为0这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了。(复制的)七、程序框图:程序初始化,设置P1口寄存器的初值为FEH延时0.1秒,使显示稳定将P1口寄存器的数值逐位左移1位循环点亮发光二极管程序初始化,设置P1口为输入口将P1口数值读入累加器A将累加器A的数值送到273显示通过发光二极管将P1口的状态显示八、参考程序:1、循环点亮发光二极管(T1_1.ASM)NAMET1_1;P1口输出实验CSEGAT0000HLJMPSTARTCSEGAT4100HSTART:MOVA,#0FEHLOOP:RLA;左移一位,点亮下一个发光二极管MOVP1,ALCALLDELAY;延时0.1秒JMPLOOP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY:MOVR1,#127;延时0.1秒DEL1:MOVR2,#200DEL2:DJNZR2,DEL2DJNZR1,DEL1RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;END2、通过发光二极管将P1口的状态显示(T1_2.ASM)NAMET1_2;P1口输入实验OUT_PORTEQU0CFA0HCSEGAT0000HLJMPSTARTCSEGAT4100HSTART:MOVP1,#0FFH;复位P1口为输入状态MOVA,P1;读P1口的状态值入累加器AMOVDPTR,#OUT_PORT;将输出口地址赋给地址指针DPTRMOVX@DPTR,A;将累加器A的值赋给DPTR指向的地址JMPSTART;继续循环监测端口P1的状态ENDC语言程序:#includereg51.hvoiddelay(void){unsignedinti;for(i=0;i30000;i++);}voidmain(void){unsignedchartmp=0xfe;while(1){P1=tmp;delay();tmp=((tmp1)|1);if(tmp==0xff)tmp=0xfe;}}、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、#includereg51.h#includeabsacc.h#defineOut_portXBYTE[0xcfa0]voiddelay(void){unsignedinti;for(i=0;i100;i++);}voidmain(void){while(1){P1=0xff;Out_port=P1;delay();}}实验2P1口实验二一、实验目的:1.学习P1口既做输入又做为输出的使用方法。2.学习数据输入、输出程序的设计方法。二、实验设备:CPU挂箱、8031CPU模块三、实验原理:P1口的使用方法这里不讲了。有兴趣者不妨将实验例程中的“SETBP1.0,SETBP1.1”中的“SETB”改为“CLR”看看会有什么结果。另外,例程中给出了一种N路转移的常用设计方法,该方法利用了JMP@A+DPTR的计算功能,实现转移。该方法的优点是设计简单,转移表短,但转移表大小加上各个程序长度必须小于256字节。四、实验原理图:P1口输入、输出实验五、实验步骤:平推开关的输出K1接P1.0;K2接P1.1;发光二极管的输入L1接P1.2;L2接P1.3;L5接P1.4;L6接P1.5。运行实验程序,K1做为左转弯开关,K2做为右转弯开关。L5、L6做为右转弯灯,L1、L2做为左转弯灯。结果显示:1:K1接高电平K2接低电平时,右转弯灯(L5、L6)灭,左转弯灯(L1、L2)以一定频率闪烁;2:K2接高电平K1接低电平时,左转弯灯(L1、L2)灭,右转弯灯(L5、L6)以一定频率闪烁;3:K1、K2同时接低电平时,发光二极管全灭;4:K1、K2同时接高电平时,发光二极管全亮。六、参考程序:T2.ASMNAMET2;P1口输入输出实验CSEGAT0000HLJMPSTARTCSEGAT4100HSTART:SETBP1.0SETBP1.1;用于输入时先置位口内锁存器MOVA,P1ANLA,#03H;从P1口读入开关状态,取低两位MOVDPTR,#TAB;转移表首地址送DPTRMOVCA,@A+DPTRJMP@A+DPTRTAB:DBPRG0-TABDBPRG1-TABDBPRG2-TABDBPRG3-TABPRG0:MOVP1,#0FFH;向P1口输出#0FFH,发光二极管全灭;此时K1=0,K2=0JMPSTARTPRG1:MOVP1,#0F3H;只点亮L5、L6,表示左转弯ACALLDELAY;此时K1=1,K2=0MOVP1,#0FFH;再熄灭0.5秒ACALLDELAY;延时0.5秒JMPSTARTPRG2:MOVP1,#0CFH;只点亮L7、L8,表示右转弯ACALLDELAY;此时K1=0,K2=1MOVP1,#0FFH;再熄灭0.5秒ACALLDELAYJMPSTARTPRG3:MOVP1,#00H;发光二极管全亮,此时K1=1,K2=1JMPSTART;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY:MOVR1,#5;延时0.5秒DEL1:MOVR2,#200DEL2:MOVR3,#126DEL3:DJNZR3,DEL3DJNZR2,DEL2DJNZR1,DEL1RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ENDC语言实验:#includereg51.hvoiddelay(void){unsignedinti;for(i=0;i100;i++);}voidmain(void){unsignedcharnum,i=0;while(1){P1=0xff;num=P1&3;switch(num){case0:P1=0xff;break;case1:if(i100)P1=0xf3;elseP1=0xff;break;case2:if(i100)P1=0xcf;elseP1=0xff;break;case3:P1=0;break;}delay();i++;if(i200)i=0;}}七、程序框图:上电,程序初始化,设置P1口为输入、输出双线口(P1.0、P1.1为输入口,P1.2、P1.3、P1.4、P1.5为输出口采集P1.0、P1.1输入口的值进入A累加器,根据累加器A的值调转到相应的子程序入口给P1口赋值0FFH(四个发光二极管全灭)依次给P1口赋值0F3H和0FFH,每种状态延时0.5秒给P1口赋值00H(四个发光二极管全亮)依次给P1口赋值0CFH和0FFH,每种状态延时0.5秒A=00A=01A=10A=11实验3简单I/O口扩展实验一——交通灯控制实验一、实验目的:1.学习在单片机系统中扩展简单I/O接口的方法。2.学习数据输出程序的设计方法。3.学习模拟交通灯控制的实现方法。二、实验设备:CPU挂箱、8031CPU模块三、实验内容:扩展实验箱上的74LS273做为输出口,控制八个发光二极管亮灭,模拟交通灯管理。四、实验原理:要完成本实验,首先必须了解交通路灯的亮灭规律。本实验需要用到实验箱上八个发光二极管中的六个,即红、黄、绿各两个。不妨将L1(红)、L2(绿)、L3(黄)做为东西方向的指示灯,将L5(红)、L6(绿)、L7(黄)做为南北方向的指示灯。而交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。各发光二极管的阳极通过保护电阻接到+5V的电源上,阴极接到输入端上,因此使其点亮应使相应输入端为低电平。五、实验原理图六、实验步骤:74LS273的输出O0~O7接发光二极管L1~L8,74LS273的片选CS273接片选信号CSO.运行实验程序,观察LED显示情况是否与实验内容相符。七、程序框图:八、参考程序:T3.ASMNAMET3;I/O口扩展实验一PORTEQU0CFA0H;片选地址CS0CSEGAT0000HLJMPSTARTCSEGAT4100HSTART:MOVA,#11H;两个红灯亮,黄灯、绿灯灭ACALLDISP;调用273显示单元(以下雷同)ACALLDE3S;延时3秒LLL:MOVA,#12H;东西路口绿灯亮;南北路口红灯亮ACALLDISPACALLDE10S;延时10秒MOVA,#10H;东西路口绿灯灭;南北路口红灯亮ACALLDISPMOVR2,#05H;R2中的值为黄灯闪烁次数TTT:MOVA,#14H;东西路口黄灯亮;南北路口红灯亮ACALLDISPACALLDE02S;延时0.2秒MOVA,#10H;东西路口黄灯灭;南北路口红灯亮ACALLDISPACALLDE02S;延时0.2秒DJNZR2,TTT;返回TTT,使东西路口黄灯闪烁五次MOVA,#11H;两个红灯亮,黄灯、绿灯灭ACALLDISPACALLDE02S;延时0.2秒MOVA,#21H;东西路口红灯亮;南北路口绿灯亮ACALLDISPACALLDE10S