2024年2月4日发(作者:)
P0,P1,P2,P3口初始化为0单片机上机实验报告P0,P1,P2,P3各端口都设为1延时延时将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H; 延迟程序入口地址【实验一】 端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。实现方式:通过peripherals实现端口数据观察实验。程序流程图:
DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1; 0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET; 从延迟程序返回END; 结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。程序流程图:
给P1口赋值延时将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址 MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口 ACALL DELAY; 调用延迟,使数码管亮0持续0.33S MOV P0,#60H; show 1 ACALL DELAY;
MOV P0,#0DAH; show 2 ACALL DELAY; MOV P0,#0F2H; show 3 ACALL DELAY; MOV P0,#66H; show 4
ACALL DELAY; MOV P0,#0B6H; show 5 ACALL DELAY; MOVP0,#0BEH; show 6
ACALL DELAY; MOV P0,#0E0H; show 7 ACALL DELAY;
MOV P0,#0FEH;
ACALL DELAY; MOV P0,#0F6H;
ACALL DELAY; AJMP LOOP;
ORG 0200H;
DEL:MOV R5,#05H;
DEL1:MOV R6,#0FFH;
DEL2:MOV R7,#0FFH;
DEL3:DJNZ R7, DEL3;DJNZ R6, DEL2;DJNZ R5, DEL1;RET;
show 9
show 8 延迟程序返回 跳转到主程序入口延迟程序入口采用软件延迟,若主频为12MHz,则定时时间为256*256*5*1uS=0.33S,
人眼可分辨。【实验二】 定时器/计数器及中断实验
实验内容:1、假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9。(采用定时器实现延时并显示数字)。实验流程图:跟实验1.3差不多,只是延迟程序改成用定时器定时,定时器采用查询方式,由于定时器本身所能定时有点短,故采用寄存器进行计数以延长时间,定时器定时50ms,50ms*10=0.5s。源程序:
ORG 0000H; AJMP MAIN; 跳入主程序 ORG 0030H; 主程序地址MAIN:MOV P0,#0FCH;将1的编码值赋给
ACALL DELAY; P0并调用延迟 MOV P0,#0FCH; ACALL DELAY; MOV P0,#60H; ACALL DELAY; MOV P0,#0DAH; ACALL DELAY; MOV P0,#0F2H; ACALL DELAY; MOV P0,#66H; ACALL DELAY; MOV P0,#0B6H; ACALL DELAY; MOV P0,#0BEH; ACALL DELAY; MOV P0,#0E0H; ACALL DELAY; MOV P0,#0FEH; ACALL DELAY; MOV P0,#0F6H; 依次将1~9的值赋
ACALL DELAY; P0口,并调用延迟 AJMP MAIN; 跳回主程序入口DELAY: MOV R7,#0AH; 寄存器赋值计定时器定时值 AJMP DELAY1; 跳转DELAY1:MOV TMOD,#01H 选择方式1 MOV TH1,#3CH
MOV TL1,#0B0H 定时器赋初值 SETB TR0; 启动T0
LOOPER:JBC TF0,PE;循环查询TF0是否置位 AJMP LOOPERPE: MOV TH0,#3CH MOV TL0,#0B0H;定时器重新赋值 DJNZ R7,LOOPER; R7减1非零则跳转
CLR TR0; 软件清零 SETB EX0; RET;2、单片机晶振为12MHZ,要求利用T1,工作方式1产生周期为2ms的方波。实验流程图:
赋初值定义工作模式定时器计数使能T1运行控制位溢出重新给定时器赋初值,并翻转P1.0未溢出采用的是定时器查询方式,初值为65536-1ms/1us=65536-1000=64536=FC18H源代码: ORG 0000H;开始 AJMP START;跳到主程序 ORG 0030H;主程序地址START: MOV TMOD,#10H;使用T1 MOV TH1,#0FCH; MOV TL1,#18H;赋初值 SETB TR1;启动T1LOOPER: JBC TF1,PE ;循环查询TF1是否置位 AJMP LOOPER;PE: MOV TH1,#0FCH; MOV TL1,#18H;重新赋值 CPL P1.0;翻转P1.0 AJMP LOOPER;继续查询是否溢出 END;【实验三】 串口通信实验实验内容:假定P1口连接8个外围开关,不断读取P1口输入的开关量信息,并将读取的结果通过串口发送出去。其中P1口的输入信息通过Peripherals->P1口模拟,并通过serial window查看输出信息。1.发送:
2.接收
程序流程图:未中断P1A
A->SBUF,延时定义工作方式查询中断标志位程序流程图:DEL:MOV R5,#84H ;DEL1:MOV R6,#0FFH;DEL2:MOV R7,#0FFH;DEL3:DJNZ R7, DEL3;DJNZ R6, DEL2;DJNZ R5, DEL1;RET; END;中断源代码: ORG 0000H; AJMP START; ORG 0130H;START:MOV SCON,#80H ; 选择工作在方式2 MOV PCON,#00H ; 波特率不加倍MAIN: MOV A,P1 ;
MOV SBUF,A ; 将P1中的值传送给缓冲器 ACALL DEL; 调用延时WAIT: JBC TI,MAIN ;查询中断标志,若为1则转移到MAIN SJMP WAIT;延迟程序返回结束延时程序,若主频为12MHz,延迟为132*256*256*1us=8.65s
源代码:
ORG 0000H; AJMP START; ORG 0023H ; AJMP SERIN; ORG 0030H;START:MOV SCON,#90H ; MOV PCON,#00H ; SETB ES ; SETB EA; SJMP $ ;SERIN:CLR RI ; MOV A,SBUF; MOV P0,A; RETI; END串行口中断入口地址选择工作在方式2,允许接收波特率不加倍开串行口中断CPU开中断等待中断
串行口接收中断标志,必须由指令清零传送返回
发布者:admin,转转请注明出处:http://www.yc00.com/web/1707002065a1472799.html
评论列表(0条)