当前位置:文档之家› 单片机实验报告

单片机实验报告

实验一 LED流水灯一、实验目的1. 学习单片机并口的使用方法。

2. 学习延时子程序的编写和使用。

3. 学习集成开发环境MedWin的安装与使用。

4. 学习STC单片机在线下载软件STC-ISP的使用。

二、实验内容所谓流水灯就是8个发光二极管(LED)轮流点亮,周而复始。

实验板上以P0口作输出口,经74LS244驱动,接8只发光二极管LED0-LED7。

当单片机的引脚输出为低电平时发光二极管点亮,为高电平时息灭。

编写程序,使8个发光二极管循环点亮,时间间隔约0.5秒。

三、试验器具STC89C51, 74LS244,8个限流电阻接8个LED发光管。

四、实验内容1、74LS244驱动输出串联8个限流电阻接8个LED发光管,以防止其电流过大而烧坏。

单片机的主时钟为11.0592MHz。

JMP0和JMP1都短接1-2脚。

P0口作为通用接口时是一准双向口,它作为输出口时与一般的双向口使用方法相同。

由准双向口结构可知当P0口用作输入口时必须先对它置“1”。

若不先对它置“1”,读入的数据是不正确的。

输出时需要接上拉电阻,P0口内部没有上拉电阻,若将外围电路设计为低有效,高无效,则无需再外接上拉电阻。

编写一个软件延时子程序,延时时间约0.5秒,采用三重循环实现,汇编语言程序如下:DELAY: MOV R7, #198DEL1: MOV R6, #50DEL2: MOV R5, #23DJNZ R5, $DJNZ R6, DEL2DJNZ R7, DEL1RET查指令表可知执行MOV指令需用1个机器周期,DJNZ指令需用2个机器周期,在11.0592MHz晶振时,一个机器周期时间长度为1.085μs,所以该段程序执行时间为:[1+(1+2×23)×50]×198×1.085μs ≈ 500mS流水灯的主程序(汇编语言)为:ORG 0000HLJMP MAINORG 0100HMAIN: CLR P1.5=0 ; P1.5=0,关闭蜂鸣器。

MOV A,#0FEHLOP: MOV P0,ALCALL DELAYRL ASJMP LOPEND2、代码ORG 0000HLJMP MAINORG 0100HMAIN: CLR P1.5=0MOV A,#0FEHLOP: MOV P0,ALCALL DELAYRL ASJMP LOPDELAY: MOV R7,#198DEL1: MOV R6,#50DEL2: MOV R5,#23DJNZ R5,$DJNZ R6,DEL2DJNZ R7,DEL1RETEND五、创新要求实现从左到右先一个LED灯点亮,经过四个LED灯后,再从左到右两个LED 灯点亮。

一次循环下去。

ORG 0000HLJMP MAINORG 0100HMAIN: CLR P1.5=0MOV A,#0EEHLOP: MOV P0,ALCALL DELAYRL ASJMP LOPDELAY: MOV R7,#198DEL1: MOV R6,#50DEL2: MOV R5,#23DJNZ R5,$DJNZ R6,DEL2DJNZ R7,DEL1RETEND六、思考题从中间向两边ORG 0000HLJMP MAINORG 0100HMAIN: CLR P1.5=0 MOV A,#0EEH LOP: MOV P0,ALCALL DELAY MOV A,R1RL AMOV R1,AMOV A,R2RR AMOV R2,AMOV A,R1SWAP AADD R2CPL ASJMP LOPDELAY: MOV R7,#198 DEL1: MOV R6,#50 DEL2: MOV R5,#23 DJNZ R5,$DJNZ R6,DEL2 DJNZ R7,DEL1 RETEND六、实验心得1. 学会了单片机并口的使用方法。

2. 学会了延时子程序的编写和使用。

3. 学会了集成开发环境MedWin的安装与使用。

4. 学会了STC单片机在线下载软件STC-ISP的使用。

5. 利用51单片机控制LED的亮灭,并且学会了流水灯不同花样的实现6. 对mov指令的记忆加强,学会运用。

7. 学习对延迟语句的应用。

实验二用一位数码管循环显示数字0~9一、实验目的1. 学习单片机并口的使用方法。

2. 学习延时子程序的编写和使用。

3. 学习LED数码管的驱动、编码。

二、实验内容实验板上有8个LED数码管,编写程序,使最右边的一个LED数码管循环显示0~9十个数字。

时间间隔约0.5秒,其余LED数码管关闭。

三、实验电路连线实验板上与本实验有关的硬件如下图所示。

8个共阳的LED数码管(S0-S7)上同名的引脚连接在一起,由单片机P0口通过74HC244驱动(段控制),R12-R19为限流电阻。

单片机P2口的8个引脚分别通过三极管Q0-Q7控制8个LED数码管的公共端(位控制)。

单片机的主时钟为11.0592MHz。

JMP0短接2-3脚,JMP1短接1-2脚。

四、实验说明1、P0口和P2都是准双向口,输出时需要接上拉电阻。

P0内部没有上拉电阻,P2口内部有弱上拉。

2、下表为驱动LED数码管的段代码表,1--代表对应的笔段亮,0--代表对应的笔段不亮。

若需要在最右边(S0)显示数字“5”,只要将从表中查得的段代码2CH写入P0口,再将P2.0置高,P2.1-P2.7置低即可。

数字d pe c g bf a十六进制P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0共阴共阳010110111B748 10001010014EB 210101101AD52 3100111019D62 4000111101E E1 5100110119B64 610111011BB44 70001010115EA 810111111BF40 9100111119F604、实现最右边的一个LED数码管循环显示0~9十个数字的汇编语言程序如下:ORG 0000HLJMP MAINORG 0100HMAIN: MOV P1,#0FFHMOV P2,#01HMOV R1,#00H LOOP: MOV A,R1MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,ALCALL DELAYINC R1五、创新思考题1、分别写出 ABCDEF 六个字母(用于显示十六进制数)的段代码,编写程序,在最右边数码管上实现0-F的循环显示。

ORG 0000HLJMP MAINORG 0100HMAIN:MOV P1,#0DFHMOV P2,#01HMOV R1,#00HLOOP:MOV A,R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ALCALL DELAYINC R1MOV A,R1CJNE A,#7,LOOPCLR AMOV R1,ASJMP LOOPDELAY:MOV R7,#198DEL1:MOV R6,#50DEL2:MOV R5,#23DJNZ R5,$DJNZ R6,DEL2DJNZ R7,DEL1RETTAB:DB 48H,0C0H,45H,5CH,43H,54H,0D4HEND2. 能否交替点亮点8个LED数码管?ORG 0000HLJMP MAINORG 0100HMAIN: MOV P1,#0FFHMOV P2,#01HMOV R1,#00H LOOP: MOV A,R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,ALCALL DELAYINC R1MOV A,P2RL AMOV P2,AMOV A,R1CJNE A,#10,LOOP CLR AMOV R1,ASJMP LOOPDELAY: MOV R7,#198 DEL1: MOV R6,#50 DEL2: MOV R5,#23 DJNZ R5,$DJNZ R6,DEL2DJNZ R7,DEL1RETTAB: DB 48H,0EBH,52H,62H,0E1H,64H,44H,0EAH,40H,60H END六、实验心得1. 学会了延时子程序的编写和使用2. 学会了通过语句使数码管循环点亮。

2、学会了每个数码管上每一个数字8上笔画所代表的含义以及它的代码。

3、学习了利用语句实现数码管上灯的左移、右移、延迟。

实验三 LED数码管的动态驱动一、实验目的1. 学习LED数码管的动态驱动编程。

2. 学习使用定时/计数器、中断。

3.学习汇编语言的有关运算。

二、实验内容编写程序,使实验板上的8个LED数码管稳定显示8个不同的数字,并使这四位数从00000000开始,每0.5秒钟加1。

三、实验电路连线四、实验说明1. 在实验二中,我们已经能够让某一个LED数码管显示需要的数字,比如选让第一个LED显示“1”,隔一较短的时间(如2.5毫秒)后关闭第一个LED,让第二个LED显示“2”,如此周而复始,让8个LED依次显1、2、3、4、5、6、7、8,我们就能看到8个LED上稳定地显示8个不同的数字。

当然,每个瞬间只有一个LED被点亮,大家亮的时间相同,均为2.5毫秒,8个LED数码管点亮一遍需要20毫秒,一秒钟各亮50次,所以看上去不会有闪烁感,但亮度只是实验二中LED亮度的八分之一。

要实现每隔再隔2.5毫秒变换一个LED,最好的方法是使用定时器中断。

2. 汇编语言参考程序为:LED_PORT EQU P0 ;笔划输出,低有效SCN_PORT EQU P2 ;段扫描输出,低有效(P2.4-P2.7)DSEGORG 10HDISP_BUF: DS 8 ;显示缓冲区SCN_INX: DS 1 ;扫描指针SCN_COD: DS 1 ;扫描码CNT: DS 1 ;中断计数,每2.5ms加1CSEGORG 00HLJMP MAIN ;主程序入口,转初始化程序ORG 0BH ;定时中断0入口LJMP INTP0 ;每2.5ms中断一次,用于刷新显示;-----------初------始-----化---------------------------------ORG 30HMAIN: MOV SP,#50H ;初始化堆栈指针CLR RS0 ;选用第0组通用寄存器CLR RS1CLR P1.5CLR AMOV CNT,AMOV R1,#8MOV R0,#DISP_BUFLOOP1: MOV @R0,A ;显示缓冲区清零INC R0DJNZ R1,LOOP1MOV SCN_INX,A ;扫描指针置0MOV SCN_COD,#80H ;右边LED先点亮MOV TMOD,#01H ;定时器0,方式1MOV TH0,#0F7H ;计数初值,每次2.5ms(11.0592MHz晶振)MOV TL0,#000H ;65536-(2.5ms/1.085us)=65536-2304=63232=0 F700HSETB TR0 ;启动定时器0SETB EA ;中断总允许SETB ET0 ;允许定时器0中断SJMP $ ;主程序在此循环;-----------定时器0中断服务程序,间隔2.5ms--------------INTP0: PUSH ACCPUSH PSWMOV TH0,#0F7H ;置计数初值MOV TL0,#00HSETB RS0 ;选用第1组通用寄存器CLR RS1MOV A,SCN_INX ;取扫描指针ANL A,#07H ;清除高5位ADD A,#DISP_BUF ;加显示缓冲区首地址MOV R1,AMOV A,@R1MOV DPTR,#CODE_TAB ;DPTR指向笔划代码表 ANL A,#0FHMOVC A,@A+DPTR ;取笔划代码MOV LED_PORT,A ;笔划代码送LED口MOV A,SCN_COD ;取扫描段代码MOV P2,AMOV A,SCN_CODRR A ;扫描段代码循环右移一位 MOV SCN_COD,AINC SCN_INX ;扫描指针+1INC CNTMOV A,CNTCJNE A,#200,ENMOV CNT,#0INC DISP_BUF+7 ;个位加一MOV A,DISP_BUF+7CJNE A,#10,EN ;不进位转移MOV DISP_BUF+7,#0 ;进位则个位清零 INC DISP_BUF+6 ;十位加一MOV A,DISP_BUF+6CJNE A,#10,ENMOV DISP_BUF+6,#0 ;进位则十位清零 INC DISP_BUF+5 ;百位加一MOV A,DISP_BUF+5CJNE A,#10,ENMOV DISP_BUF+5,#0 ;进位则百位清零 INC DISP_BUF+4 ;千位加一MOV A,DISP_BUF+4CJNE A,#10,ENMOV DISP_BUF+4,#0 ;进位则千位清零 INC DISP_BUF+3 ;万位加一MOV A,DISP_BUF+3CJNE A,#10,ENMOV DISP_BUF+3,#0 ;进位则万位清零 INC DISP_BUF+2 ;十万位加一MOV A,DISP_BUF+2CJNE A,#10,ENMOV DISP_BUF+2,#0 ;进位则十万位清零INC DISP_BUF+1 ;百万位加一MOV A,DISP_BUF+1CJNE A,#10,ENMOV DISP_BUF+1,#0 ;进位则百万位清零INC DISP_BUF+0 ;千万位加一MOV A,DISP_BUF+0CJNE A,#10,ENMOV DISP_BUF+0,#0 ;进位则千万位清零EN: POP PSWPOP ACCRETI;----------笔划代码表-------------------------CODE_TAB: DB 48H,0EBH,52H,62H,0E1H,64H,44H,0EAH,40H,60H END五、创新实现时钟的功能。

相关主题