《51单片机实验代码.doc》由会员分享,可在线阅读,更多相关《51单片机实验代码.doc(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验二 清零程序一、 实验目的 掌握汇编语言设计和调试方法,熟悉键盘操作。二、 实验内容 把2000H20FFH的内容清零。三、 实验程序框图四、 实验步骤 用连续或单步的方式运行程序,检查200020FF中执行程序前后的内容变化。五、 思考 假使把2000H20FFH中的内容改成FF,如何修改程序。六、 程序清单 文件名: SW01.ASMORG 0000HLJMP SE01ORG 0640HSE01: MOV R0,#00HMOV DPTR,#2000H ;(0000H)送DPTRLOO1: CLR AMOVX DPTR,A ;0送(DPTR)INC DPTR ;
2、DPTR+1 INC R0 ;字节数加1CJNE R0,#00H,LOO1 ;不到FF个字节再清LOOP: SJMP LOOPEND实验三 拆字程序一、实验目的 掌握汇编语言设计和调试方法二、实验内容 把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。三、实验程序框图开 始2000H内容送A 高地位交换屏蔽高位后送2001H2000H内容送A屏蔽高位后送2002H结束四、实验步骤 用连续或单步方式运行程序,检查2000H2002H中内容变化情况。五、思考 如何用断点方式调试本程序六、程序清单 文件名:SW0
3、2.ASMORG 0000HLJMP SE02ORG 0660HSE02: MOV DPTR,#2000HMOVX A,DPTRMOV B,A ;(2000)ABSWAP A ;交换ANL A,#0FH ;屏蔽高位INC DPTRMOVX DPTR,A ;送2001HINC DPTRMOV A,BANL A,#0FH ;(2000)内容屏蔽高位MOVX DPTR,A ;送2002HLOOP: JMP LOOPEND实验四 数据区传送子程序一、 实验目的 掌握RAM中的数据操作二、 实验内容 把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的RAM区。三、 实验程序框图开 始
4、源地址内容送A(A)送目的地址源地址加1目的地址加1字节数到么?结 束N 四、 实验步骤 在R2、R3中输入源首址(例如0000H),R4、R5中输入的目的地址(例如2000H),R6、R7中输入字节数(例如1FFFH),运行程序,检查0000H1FFFH中内容是否和2000H3FFFH中内容完全一致。五、 程序清单 文件名 SW04.ASMORG 0000HLJMP SE22ORG 07B0HSE22: MOV DPL,R3 MOV DPH,R2 ;建立源程序首址MOVX A,DPTR ;取数MOV DPL,R5MOV DPH,R4 ;目的地首址MOVX DPTR,A ;传送CNE R3,#
5、0FFH,LO42INC R2LO42: INC R3 ;源地址加1CJNE R5,#0FFH,LO43INC R4LO43: INC R5 ;目的地址加1CJNE R7,#00H,LO44CJNE R6,#00H,LO45 ;字节数减1LOOP: SJMP LOOPNOPLO44: DEC R7SJMP SE22LO45: DEC R7DEC R6SJMP SE22 ;未完继续END实验五 简单I/O口应用一、 实验目的 掌握P1口作为I/O口的使用方法,理解读引脚和读锁存器的区别。二、 实验要求 运行不同的程序,观察发光二极管的亮灭状态,比较程序的特点,了解汇编语言设计的基本思路和指令应用
6、。三、 思想描述流程图:结束开始读P3.4的脚P3.4接地点亮8个LED8个LED交叉亮灭程序流程图开始立即数00H送P1口,点亮8个发光二极管延时立即数0FFH送P1口,熄灭8个发光二极管延时结束;-;程序:所有发光二极管不停地闪动;- -LED_PORTEQUP1ORG0000H;程序从地址0000H开始存放LJMPSTARTORG0100HSTART:CLREA;关闭所有中断MOVLED_PORT,#00H;点亮所有发光二极管LCALLDELAY;延时MOVLED_PORT,#0FFH;灭掉所有发光二极管LCALLDELAYSJMPSTART;重复闪动DELAY:MOVR3,#7FH;延
7、时子程序DEL2:MOVR4,#0FFHDEL1:NOPDJNZR4,DEL1DJNZR3,DEL2RETEND;-;程序:用于关控制发二极管的显示方式;-LED_PORTEQUP1ORG0000HLJMPSTARTORG0100HSTART:CLREA;关闭所有中断MOVP3,#B;使P3口锁存器置位MOVA,P3;读P3口引脚线信号ANLA,#B;逻辑与操作,屏蔽掉无关位JZDDPING;判断P3.4是否接地,若是,跳转到DDPING执行MOVLED_PORT,#00H;否则,P3.4高电平,点亮所有发光二极管SJMPSTARTDDPING:MOVLED_PORT,#55H;P3.4接地,
8、发光二极管交叉亮灭SJMPSTARTEND专心-专注-专业实验六 P3口输入P1口输出实验一、 实验目的 P3口输入P1口输出,实现I/O控制。二、 实验要求 撰写实验报告,给出输入输出实现方式,画出实验原理图,给出程序流程及实现的全部代码。三、 思想描述:系统板上硬件连线(1 把“单片机系统”区域中的P0.0P0.7端口用8芯排线连接到“动态静态数码显示模块”区域中的ah端口上;要求:P0.0对应着a,P0.1对应着b,P0.7对应着h。(2 把“单片机系统”区域中的P2.0端口用8芯排线连接到“动态数码显示模块”区域中的任一个公共端上。实验原理AT89S51单片机的内部16位定时/计数器是
9、一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。因此,我们设定TMODB,即TMOD01H下面我们要给T0定时/计数器的TH0,TL0装入预置初
10、值,通过下面的公式可以计算出TH0(21650000)/256TL0(21650000)MOD256当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF01表示定时时间已到。实验结果汇编源程序(查询法)SECONDEQU 30HTCOUNTEQU 31HORG 00HSTART:SETB P2.0MOV SECOND,#00HMOV TCOUNT,#00HMOV TMOD,#01HMOV TH0,#(65536-50000) / 256MOV TL0,#(65536-50000) MOD 256SETB TR0DISP:MOV
11、 A,SECONDANL A,#0FHMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AWAIT:JNB TF0,WAITCLR TF0MOV TH0,#(65536-50000) / 256MOV TL0,#(65536-50000) MOD 256INC TCOUNTMOV A,TCOUNTCJNE A,#20,NEXTMOV TCOUNT,#00HINC SECONDMOV A,SECONDCJNE A,#60,NEXMOV SECOND,#00HNEX: LJMP DISPNEXT:LJMP WAITTABLE:DB 3FH,06H,5BH,4FH,66H,6DH
12、,7DH,07H,7FH,6FHEND汇编源程序(中断法)SECONDEQU 30HTCOUNTEQU 31HORG 00HLJMP STARTORG 0BHLJMP INT0XSTART:SETB P2.0MOV SECOND,#00HMOV A,SECONDANL A,#0FHMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AMOV TCOUNT,#00HMOV TMOD,#01HMOV TH0,#(65536-50000) / 256MOV TL0,#(65536-50000) MOD 256SETB TR0SETB ET0SETB EASJMP $INT0X:MO
13、V TH0,#(65536-50000) / 256MOV TL0,#(65536-50000) MOD 256INC TCOUNTMOV A,TCOUNTCJNE A,#20,NEXTMOV TCOUNT,#00HINC SECONDMOV A,SECONDANL A,#0FHMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ANEXT:RETITABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND实验7外部中断实验一、 实验目的 中断实验输出控制,学习中断程序设计方法,理解中断机制理解下降沿中断和低电平中断的区别。二、 实
14、验要求 编写主程序 实现系统的初始化,若有不同的初始化方式,应有状态指示;编写中断服务程序,服务程序操作以能明确判断发生一次中断为准,且有声光指示作为人机界面。实验前必须认真复习中断相关内容,并在实验报告上写出预习报告,给出实验方案,经过实验指导教师检查合格后,方可进行实验。实验结束后撰写实验报告画出实验原理图,给出程序流程及实现的全部代码。实验原理用8051单片机设计一交通信号灯模拟控制系统,能够完成正常情况下的轮流放行以及特殊情况和紧急情况下的红绿灯控制1掌握单片机中断系统、定时/计数器的编程应用。2通过对交通灯控制程序的编写与调试,掌握中断程序的结构。3正常情况下A、B道(A、B道交叉组
15、成十字路口,A是主道,B是支道)轮流放行,A道放行1分钟(其中5秒用于警告),B道放行30秒(其中5秒用于警告)。4一道有车而另一道无车时,使有车车道放行,K5键按下表示A道有车,K1键按下表示B道有车。5K9键按下表示有紧急车辆通过时,A、B道均为红灯。控制码表P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0控制码(P1口数据)状态说明(空)(空)B线绿灯B线黄灯B线红灯A线绿灯A线黄灯A线红灯11111111110111100011011110111100F3HF5HDEHEEHA线放行,B线禁止A线警告,B线禁止A线禁止,B线放行A线禁止,B线警告(二) 实验连线表单片机
16、发光二极管按键连接1P1.0-P1.5L0-L5连接2INT0KR1连接3T0KR2连接4T1KR3连接5INT1(三)实验结果交通信号灯模拟控制系统程序流程图程序:BANK0_REGEQU00H;选择第0组寄存器BANK1_REGEQU08H;选择第1组寄存器BANK2_REGEQU10H;选择第2组寄存器BANK3_REGEQU18H;选择第3组寄存器ORG0000HLJMPMAIN;指向主程序ORG0003HLJMPEMERG;指向紧急车辆出现中断程序 外部中断0ORG0013HLJMPONEBUSY;指向一道有车另一道无车中断程序 外部中断1ORG0100HMAIN:MOVPSW,#B
17、ANK0_REGMOVSP,#0DFHSETB PX0;置外部中断0为高优先级中断MOVTCON,#00H;置外部中断0,1为电平触发MOVTMOD,#10H;置定时器1为方式1MOVIE,#85H;开CPU中断,开外中断0,1中断DISP:MOV P1,#0F3H ;A绿灯放行,B红灯禁止MOVR2,#6EH ;置0.5秒循环次数DISP1:LCALL DELAY;调用0.5秒延时子程序DJNZ R2,DISP1 ;55秒不到继续循环MOV R2,#06;置A绿灯闪烁循环次数WARN1:CPLP1.2;A绿灯闪烁LCALL DELAYDJNZ R2,WARN1 ;闪烁次数未到继续循环MOV
18、P1,#0F5H ;A黄灯警告,B红灯禁止MOVR2,#04HYEL1:LCALL DELAYDJNZ R2,YEL1 ;2秒未到继续循环MOVP1,#0DEH;A红灯,B绿灯MOVR2,#32HDISP2:LCALL DELAYDJNZ R2,DISP2 ;25秒未到继续循环MOVR2,#06HWARN2: CPLP1.5;B绿灯闪烁LCALL DELAYDJNZ R2,WARN2MOVP1,#0EEH ;A红灯,B黄灯MOVR2,#04HYEL2:LCALLDELAYDJNZR2,YEL2LJMP DISP;循环执行主程序;-;紧急情况中断子程序;-EMERG:PUSHP1;P1口数据压栈
19、PUSH03H;R3寄存器压栈PUSHTH1 ;TH1压栈PUSHTL1;TL1压栈MOVP1,#0F6H ;A,B道均为红灯MOVR5,#28H ;置0.5秒循环初值DELAY0:LCALLDELAYDJNZ R5,DELAY0;20秒未到继续循环POPTL1;弹栈恢复现场POPTH1POP03HPOPP1RETI;返回主程序;-;路有车一路无车中断子程序ONEBUSY;-ONEBUSY:CLREA;关中断PUSHP1;压栈PUSH03HPUSHTH1PUSHTL1SETB EA;开中断JNBP3.4,BP;A道无车转向MOVP1,#0F3H;A绿灯,B红灯SJMP DELAY1;转向5秒延
20、时BP:JNBP3.5,EXIT;B道无车退出中断MOVP1,#0DEH;A红灯,B绿灯DELAY1:MOVR6,#0AH;置0.5秒循环初值NEXT:LCALL DELAYDJNZ R6,NEXT;5秒未到继续循环EXIT:CLREAPOPTL1;弹栈恢复现场POPTH1POP03HPOPP1SETBEARETI;-;0.5S延时子程序;-DELAY: MOVR3,#0AHMOVTH1,#3CHMOVTL1,#0B0HSETB TR1LP1:JBCTF1,LP2SJMPLP1LP2:MOVTH1,#3CHMOVTL1,#0B0HDJNZR3,LP1RETEND实验八 定时器/计数器应用试验一
21、、 实验目的 掌握定时器/计数器编程方法,掌握相关寄存器的初始化及其意义;理解定时器/计数器的本质,掌握定时器/计数器应用的两种方法:查询和中断。二、 实验要求 利用定时器实现一秒定时,或计数外部脉冲,分别采用查询和中断两种方式实现,加深对中断的理解加强对相关寄存器各个位的灵活应用能力。人机界面方案自行设计。实验前必须认真复习定时计数器相关内容,并在实验报告上写出定时计数器的初始化步骤,给出人机界面实现方案,经过实验指导教师检查合格后,方可进行试验。实验结束后撰写实验报告画出实验原理图,给出程序流程及实现的全部代码。实验连线表单片机MC8按键+5V/GND+5V/GND+5V/GNDP1.0S
22、CLP1.1SDAGNDKC1P1.2KR1P1.3KR2P1.4KR3P1.5(三)程序流程图闹钟修改功能子程序FTION1流程框图主程序MAIN流程框图时钟修改功能子程序FTION0流程框图时钟修正中断服务子程序CLOCK流程框图加1键修改子程序CUM流程框图程序清单:;-;-数字时钟制作-;-BANK0_REGEQU00H;选择第0组寄存器BANK1_REGEQU08H;选择第1组寄存器BANK2_REGEQU10H;选择第2组寄存器BANK3_REGEQU18H;选择第3组寄存器LED_MAX_BITSEQU06H;LED最大位数LED_SCLEQUP1.0LED_SDAEQUP1.1
23、HD_K0EQUP1.2HD_K1EQUP1.3HD_K2EQUP1.4HD_CBPEQUP1.5K0_FLAGEQU00HK1_FLAGEQU01HK2_FLAGEQU02HSEC_FLAGEQU03H;定义各标识位符号地址MIN_FLAGEQU04HHOUR_FLAGEQU05HRMIN_FLAGEQU06HRHOUR_FLAGEQU07HRTIM_FLAGEQU08HARM_FLAGEQU09H;是否设定闹钟标识TIMDATAEQU30H;时钟修改记忆单元RTIMDATAEQU31H ;闹钟修改记忆单元清零MSEC1EQU32HMSEC2EQU33HHOUREQU34HMINEQU35H
24、SECEQU36HRHOUREQU37HRMINEQU38HRSECEQU39HCOUNTEQU3AHLED_DIS_PTREQU3BHORG0000HLJMPMAINORG000BHLJMPTIMER_INT;定时器中断服务程序ORG0100HMAIN:CLREAMOVPSW,#BANK0_REGMOVSP,#0DFHMOVR0,#20HMOVR7,#80H-20HLCALLPUB_CLEAR_RAM1;清0RAM单元 LCALLLED_CLR MOVLED_DIS_PTR,#HOURLCALLLED_DISP_DATA MOVTMOD,#02H;定时器T0方式2, MOVTL0,#06H;
25、定时250us初始值 MOVTH0,#06H SETBEA;中断允许 SETBET0 SETBTR0;启动定时器BEGIN:LCALLKEY_TEST;调用判别键入测试程序 JCRETEST;有键输入则转去抖程序 JNBARM_FLAG,BEGIN;判别闹钟设定标识位,未设定则返回 LCALLALARM;调闹钟程序LJMPBEGIN;返回 RETEST:LCALLKEY_SCANJBK0_FLAG,PRO_K0; 判别是否时钟修改功能键JBK1_FLAG,PRO_K1; 判别是否闹钟修改功能键JBK2_FLAG,PRO_K2; 判别是否加1功能键SJMPBEGINPRO_K0:LCALLFTI
26、ON0; 是时钟参数修改功能键则调用时钟修改程序SJMPBEGINPRO_K1:LCALLFTION1; 是闹钟参数修改功能键则调用闹钟设定程序SJMPBEGINPRO_K2:LCALLCUM; 是加1功能键则调用加1修改程序 SJMPBEGIN;-;时钟参数修改子程序FTION0;功能:根据时钟修改功能键按下的次数;分别将时钟修改标识位SECBIT, MIN_FLAG,HOURBIT置1;入口:TIMDAT;出口:TIMDAT;-FTION0:JBRMIN_FLAG,BACK_BJBRHOUR_FLAG,BACK_B;当正在设置闹钟不能设置时间,需先结束闹钟设置状态CLRTR0;关定时器CL
27、RSEC_FLAG;时钟秒标识位清零CLRMIN_FLAG;时钟分标识位清零CLRHOUR_FLAG;时钟小时标识位清零MOVLED_DIS_PTR,#HOUR;将时钟小时单元设为显示首地址MOVRTIMDATA,#00H;清闹钟修改位置标识记录INCTIMDATA;将时钟修改记录值加1MOVA,TIMDATACJNEA,#01H,TW0;若记录值为1则将时钟秒修改标识置1SETBSEC_FLAG;时钟秒标识位置1SJMP BACK_CTW0:CJNEA,#02H,THREE0;若记录值为2则将时钟分修改标识置1SETBMIN_FLAG;时钟分标识位置1SJMPBACK_CTHREE0:CJN
28、EA,#03H,BACK_A;若记录值为3则将时钟小时修改标识置1SETBHOUR_FLAG;时钟小时标识位置1SJMPBACK_CBACK_A:MOVTIMDATA,#00H;若按4次则清时钟单元修改位置记录SETBTR0;定时器重新启动BACK_B:RETBACK_C:LCALLLED_DISP_DATARET;-;闹钟参数修改功能键设定子程序FTION1;功能:根据闹钟修改功能键按下的次数;分别将闹钟修改标识位RMINBIT ,RHOURBIT置1;入口:RTIMDAT;出口:RTIMDAT,ARM_FLAG,B;-FTION1:JBSEC_FLAG,FTION1_AJBMIN_FLAG
29、,FTION1_AJBHOUR_FLAG,FTION1_A;当处于设置时间状态时不能设置闹钟,需先结束时间设置状态CLRRMIN_FLAG;将闹钟分单元修改标识位CLRRHOUR_FLAG;将闹钟小时单元修改标识位清零MOVLED_DIS_PTR,#RHOUR;将闹钟单元地址设为显示首地址MOVTIMDATA,#00HINCRTIMDATA;将闹钟修改记录值加1MOVA,RTIMDATACJNEA,#01H,TOW1SETBRMIN_FLAG;若记录值为1则将闹钟分单元修改标识位LJMPFTION1_B;置1TOW1:CJNEA,#02H,THREE1SETBRHOUR_FLAG; 若记录值为
30、2,将闹钟小时单元修改标识位置1LJMPFTION1_BTHREE1:SETBARM_FLAG;F0标识位为1表示闹钟已设定MOVLED_DIS_PTR,#HOUR;恢复时钟显示单元首地址MOVRTIMDATA,#00H;将闹钟修改记录值清零FTION1_A:RETFTION1_B:LCALLLED_DISP_DATARET;-;加1键修改子程序CUM;功能:根据时钟和闹钟修改标识位的状态,将时钟或闹钟对应RAM内容+1;入口:SEC_FLAG, MIN_FLAG ,HOUR_FLAG,RSECBIT, RMIN_FLAG ,RHOUR_FLAG;-CUM:JNBSEC_FLAG,CUM0;若
31、时钟秒修改标识位为1则秒单元内MOVA,SEC;容加1ADDA,#01HDAAMOVSEC,ACJNEA,#60H,CUMENDMOVSEC,#00HLJMPCUMENDCUM0:JNBMIN_FLAG,CUM1;若时钟分修改标识位为1,则分单元MOVA,MIN;内容加1ADDA,#01HDAAMOVMIN,ACJNEA,#60H,CUMENDMOVMIN,#00HLJMPCUMENDCUM1:JNBHOUR_FLAG,CUM2;若时钟小时修改标识位为1,则小时MOVA,HOUR;单元内容加1ADD A,#01HDA AMOVHOUR,ACJNEA,#24H,CUMENDMOVHOUR,#00
32、HLJMPCUMENDCUM2:JNBRMIN_FLAG,CUM3;若闹钟分修改标识位为1,则分单元MOVA,RMIN;内容加1ADDA,#01HDAAMOVRMIN,ACJNEA,#60H,CUMENDMOVRMIN,#00HLJMPCUMENDCUM3:JNBRHOUR_FLAG,CUMEND;若闹钟小时修改标识位为1,则小MOVA,RHOUR;时单元内容加1ADDA,#01HDAAMOVRHOUR,ACJNEA,#24H,CUMENDMOVRHOUR,#00H CUMEND:LCALLLED_DISP_DATARET;-;闹钟判断与启动子程序ALARM;功能:判断闹钟是否设定,控制闹钟的
33、启,停;入口:MIN ,RMIN ,HOUR ,RHOUR ;出口:HD_BP,ARM_FLAG;-ALARM:MOVA,RMINCJNEA,MIN,DONT0;比较分单元内容,若相同则继续比较小时单MOVA,RHOUR;元内容,否则返回CJNEA,HOUR,DONT0CLRHD_CBP;启动闹钟SETBRTIM_FLAG;设置闹钟计时标时,时钟开始10秒计时DONT0:MOVA,COUNT;取闹钟保持计时时间CJNEA,#10,DONT;判断闹钟保持10秒时间到否MOVCOUNT,#00H;清除闹钟保持10秒计时SETBHD_CBP;清除闹钟CLRARM_FLAG;清闹钟标识,取消闹钟设置CLRRTIM_FLAG;清闹钟计时标识,DONT:RET;-;时钟修正中断服务子程序;功能:通过定时器中断,自动修改时钟参数;入口:MSEC1 ,MSEC2,SEC,MIN,HOUR;出口:MSEC1 ,MSEC2,SEC,MIN,HOUR ;-TIMER_INT:CLREA
限制150内