《单片机实验V3.0》由会员分享,可在线阅读,更多相关《单片机实验V3.0(74页珍藏版)》请在金锄头文库上搜索。
1、P1口实验,实验题目1、P1口做输出口,接八只发光二极管,编写程序,使其循环点亮。2、P1口低四位接四只发光二极管L0-L3,P1口高四位接开关K0-K3,编写程序,将开关的状态在发光二极管上显示出来。,硬件原理图,连线方法,题目1:89C51的P1.0P1.7分别接发光二极管L0L7题目2:P1口的P1.0P1.3接L0-L3,P1口的P1.4P1.7接K0-K3,参考程序-题目1,org0000hljmpstartstart:mova,#01hloop:movp1,alcalldelrlaljmploopdel:movr1,#10;延时1秒,12MHzlp1:movr2,#200lp2:m
2、ovr3,#249djnzr3,$djnzr2,lp2djnzr1,lp1retend,参考程序-题目2,ORG0000HLJMPSTARTSTART:MOVA,P1SWAPAORLA,#0F0HMOVP1,ALJMPSTARTEND,参考程序-题目1,#include#defineucharunsignedchar#defineuintunsignedintvoiddelay(unsignedintN)inti;for(i=0;iN;i+);main()uchari,a;while(1)a=0 x01;for(i=0;i8;i+)P1=a;delay(50000);a=a1;,参考程序-题目
3、2,#include#defineucharunsignedchar#defineuintunsignedintmain()uchari;while(1)i=P1;i=i4;P1=i|0 xf0;,流程图,题目1流程图,题目2流程图,外部中断实验,实验题目P1口做输出口,接八只发光二极管,编写程序,使其循环点亮。以单脉冲输出端做为中断申请,当第一次产生外部中断时,使发光二极管全亮,延时1秒后返回中断之前的状态;当第二次产生外部中断时,使发光二极管全灭,延时1秒后返回中断之前的状态;以后如上述一直循环下去。,硬件原理图,连线方法,P1.0P1.7分别接发光二极管L0L7,P3.2接单脉冲输出端,
4、参考程序-主程序,ORG0000HLJMPSTARTORG0003HLJMPPINT0START:SETBEX0SETBIT0SETBEAMOVA,#01HMOVR4,#00HLOOP:MOVP1,ALCALLM1SRLASJMPLOOP,参考程序-中断服务程序,PINT0:PUSHACCMOVA,P1PUSHACCCJNER4,#00H,N01INCR4MOVP1,#0FFHDLAY:LCALLM2SPOPACCMOVP1,APOPACCRETIN01:MOVR4,#00HMOVP1,#00HSJMPDLAY,参考程序-延时子程序,M1S:MOVR1,#18DEL1:MOVR2,#200DE
5、L2:MOVR3,#126DEL3:DJNZR3,DEL3DJNZR2,DEL2DJNZR1,DEL1RETM2S:MOVR5,#18DEI1:MOVR6,#200DEI2:MOVR7,#126DEI3:DJNZR7,DEI3DJNZR6,DEI2DJNZR5,DEI1RETEND,外部中断-C语言-中断处理,#include#defineucharunsignedchar#defineuintunsignedintbitled=0;voiddelay(unsignedintN)inti;for(i=0;iN;i+);voidpint0(void)interrupt0using1if(led=
6、0)P1=0 xff;delay(50000);delay(50000);led=1;elseP1=0 x00;delay(50000);delay(50000);led=0;,外部中断-C语言-主函数,main()uchari,a;led=0;IT0=1;EX0=1;EA=1;while(1)a=0 x01;for(i=0;i8;i+)P1=a;delay(50000);a=a1;,定时器实验,实验题目89C51内部定时器T1,按方式1工作、即做为十六位定时器使用每0.05秒溢出一次。P1口的P1.0-P1.7分别接八只发光二极管。要求编写程序模拟一时序控制装置。开机后,第一秒钟L0、L2亮
7、,第二秒钟L1、L3亮,第三秒钟L4、L6亮,第四秒钟L5、L7亮,第五秒钟L0、L2、L4、L6亮,第六秒钟L1、L3、L5、L7亮,第七秒钟全亮,第八秒钟全灭,以后又从头开始,一直循环下去。,实验原理说明,定时常数的确定定时器/计数器的输入脉冲与机器周期一样,为振荡器频率的1/12。本实验系统中,时钟频率为12MHz。实现0.05秒的延时,要在定时器1中设置一个时间常数即计数初值,使其每隔0.05秒溢出一次,再用一个寄存器计溢出的次数,计20次即可实现1秒延时。时间常数按以下公式计算:计算出X之后,换算成十六进制数将高八位放在TH1中,低八位放在TL1中。,参考程序-查询方式,ORG000
8、0HLJMPSTARTSTART:MOVTMOD,#10HMOVTH1,#3CH;12MHz,定时50msMOVTL1,#0B0HMOVR2,#20SETBTR1LOOP:MOVDPTR,#TABMOVR7,#08HWAIT:JNBTF1,$MOVTH1,#3CHMOVTL1,#0B0HCLRTF1DJNZR2,WAITMOVR2,#20CLRAMOVCA,A+DPTRINCDPTRMOVP1,ADJNZR7,WAITSJMPLOOPTAB:DB05H,0AH,50H,0A0H,55H,0AAH,0FFH,00HEND,参考程序-中断方式,org0000h;在数码管上显示0-9;P1.0P1.
9、7接AH;G0接+5V或接一个开关;数码管右侧开关向上拨(外驱)!ljmpstartorg001bhljmppit1start:movr4,#00h;显示的数字movth1,#3CH;定时50msmovtl1,#0B0Hmovtmod,#10hsetbtr1setbet1setbeamovr5,#00h;加1计数loop:movdptr,#segmova,r4movca,a+dptrmovp1,amovr7,#00h;延时djnzr7,$movr7,#00hdjnzr7,$ljmplooppit1:movth1,#3chmovtl1,#0B0hincr5cjner5,#20,quitmovr5
10、,#00hincr4cjner4,#0ah,quitmovr4,#00hquit:retiseg:db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhend,参考程序-中断方式(C语言),#include#defineucharunsignedcharuchardatat=0,m1s=0;ucharcodeseg=0 x05,0 x0a,0 x50,0 xa0,0 x55,0 xaa,0 xff,0 x00;voidtime1(void)interrupt3TH1=0 x3C;/T150ms/12MHzTL1=0 xB0;/设定T1计数初值t+;if(t=20)t
11、=0;m1s+;if(m1s=8)m1s=0;,参考程序-中断方式(C语言),main()TMOD=0 x10;/T1方式1TH1=0 x3C;/T150ms/12MHzTL1=0 xB0;/设定T1计数初值ET1=1;/允许定时器1中断TR1=1;/允许定时器1计数EA=1;/开中断t=0;while(1)P1=segm1s;,串行口实验串并转换实验,利用8051单片机串行口,和并行输出串行移位寄存器74LS164,扩展输出口,在数码显示器上循环显示09这10个数字。,实验电路,连线方法,8051的P3.1(TXD)端接74LS164的CLK端,P3.0(RXD)端接74LS164的AB端。
12、74LS164的Q0-Q7分别接数码显示的H-A,数码显示的G0接高电平(+5V),G1-G5接低电平(GND)。数码管右侧的开关拨向“外驱”方式。,参考程序汇编语言,ORG0000HLJMPSTARTSTART:MOVR1,#00HMOVSCON,#00HLOOP:MOVDPTR,#SEGMOVA,R1MOVCA,A+DPTRMOVSBUF,AJNBTI,$CLRTILCALLM1SINCR1CJNER1,#0AH,LOOPMOVR1,#00HSJMPLOOPSEG:DB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FHEND,参考程序C语言-中断函数,#inc
13、lude#include#defineucharunsignedchar#defineuintunsignedintuchardatat=0,m1s=0;ucharcodeseg=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;bits1s=0;voidtime1(void)interrupt3TH1=0 x3C;/T150ms/12MHzTL1=0 xB0;/设定T1计数初值t+;if(t=20)s1s=1;t=0;m1s+;if(m1s=10)m1s=0;,参考程序C语言-主函数,main()SCON=0X00;TMO
14、D=0 x10;/T1方式1TH1=0 x3C;/T150ms/12MHzTL1=0 xB0;/设定T1计数初值ET1=1;TR1=1;/使用定时器1,TR1为定时器1EA=1;/CPU允许中断t=0;s1s=1;while(1)if(_testbit_(s1s)SBUF=segm1s;while(TI=0);TI=0;,数码显示实验,利用实验台上的六个数码管,同时显示16或自己的学号后六位这6个数字,并让显示的数字循环移动起来。,硬件原理图,实验原理说明,注意:当用总线方式驱动八段显示管时,请将八段的驱动方式选择开关拨到“内驱”位置;当用I/O方式驱动八段显示管时,请将开关拨到“外驱”位置。
15、本实验仪提供了6位7段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码、6位位码是由两片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相应显示位。本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。此处X是由KEY/LEDCS决定,参见地址译码。做键盘和LED实验时,需将KEY/LEDCS接到相应的地址译码上。以便用相应的地址来访问。例如,将KEY/LEDCS接到CS0上,则段码地址为8004H,位码地址为8002H。,连线方法,KEY/LED_CS-CS0,参考程序-主程序,ORG0000HL
16、JMPSTARTSTART:MOV40H,#01HMOV41H,#02HMOV42H,#03HMOV43H,#04HMOV44H,#05HMOV45H,#06HNEXT:LCALLDISPLJMPNEXT,参考程序-显示子程序,DISP:MOVR0,#40H;显示MOVR2,#01HMOVR3,#06HLOOP:MOVDPTR,#TABMOVA,R0MOVCA,A+DPTRMOVDPTR,#8004HMOVXDPTR,AINCR0MOVDPTR,#8002HMOVA,R2MOVXDPTR,ARLAMOVR2,AMOVR5,#200;延时2毫秒DJNZR5,$DJNZR3,LOOPRETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HEND,数码显示C程序-T1中断函数,#include#include#defineucharunsignedchar#defineuintunsignedintuch