《单片机程序流程图及源代码》由会员分享,可在线阅读,更多相关《单片机程序流程图及源代码(7页珍藏版)》请在金锄头文库上搜索。
1、单片机上机实验报告【实验一】 端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。实验内容:1)输出实验:假定 4 个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。2)输入:从 P0 口输入某个数据到累加器 A,打开观察窗口观察数据是否进入累加器 A。实现方式:通过 peripherals 实现端口数据观察实验。程序流程图:将 P0 到 P3 端口先赋值为 0,调用延迟后,再赋 1,然后循环执行。源代码:ORG 0000H ; 程序入口地址LJMP MAIN ; 跳转到主程序ORG 0300H ; 主程序地址MAIN: MOV P
2、0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ; P0P3 均赋值为 0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH; P0P3 均设为 1MOV A,P0; 将 P0 口值赋给累加器ACALL DEL;AJMP MAIN; 跳转到主程序入口ORG 0200H; 延迟程序入口地址P0,P1,P2,P3 口初始化为 0延时P0,P1,P2,P3 各端口都设为 1延时DEL: MOV R5,#04H;寄存器实现延迟,F3: MOV R6,#0FFH; 若主频为
3、 12MHZ 则F2: MOV R7,#0FFH; 延时为 256*256*4F1: DJNZ R7,F1; 0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET; 从延迟程序返回END; 结束3.假设 P0 口外接一个数码管(共阴) ,如图,请在数码管上轮流显示数字09(采用软件延时) 。程序流程图: 将数码管的真值编码 09 依次赋给 P0 并调用延迟,然后循环运行程序即可。源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管 0 的编码赋给 P0 口ACALL DEL
4、AY; 调用延迟,使数码管亮 0 持续 0.33SMOV P0,#60H; show 1ACALL DELAY; MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4 ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6 ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;延时给 P1 口赋值 MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#
5、0F6H; show 9 ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL: MOV R5,#05H; 采用软件延迟,若主频为 12MHz,则DEL1: MOV R6,#0FFH; 定时时间为 256*256*5*1uS=0.33S, DEL2: MOV R7,#0FFH; 人眼可分辨。DEL3: DJNZ R7, DEL3;DJNZ R6, DEL2;DJNZ R5, DEL1;RET; 延迟程序返回【实验二】 定时器/计数器及中断实验 实验内容:1、假设 P0 口外接一个数码管(共阴) ,如图,请在数码管上轮流显示数字 09。 (采用定
6、时器实现延时并显示数字) 。实验流程图:跟实验 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;ACAL
7、L 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; 依次将 19 的值赋 ACALL DELAY; P0 口,并调用延迟AJMP MAIN; 跳回主程序入口DELAY: MOV R7,#0AH; 寄存器赋值计定时器定时值AJMP DELAY1; 跳转DELAY1:MOV TMOD,#01H 选择方式 1MOV TH1,#3CH MOV TL1,#0B0H 定
8、时器赋初值SETB TR0; 启动 T0 LOOPER:JBC TF0,PE; 循环查询 TF0 是否置位AJMP LOOPERPE: MOV TH0,#3CHMOV TL0,#0B0H; 定时器重新赋值DJNZ R7,LOOPER; R7 减 1 非零则跳转 CLR TR0; 软件清零SETB EX0;RET;2、单片机晶振为 12MHZ,要求利用 T1,工作方式 1 产生周期为 2ms 的方波。实验流程图: 采用的是定时器查询方式,初值为 65536-1ms/1us=65536-1000=64536=FC18H源代码:ORG 0000H; 开始AJMP START; 跳到主程序ORG 00
9、30H; 主程序地址START: MOV TMOD,#10H; 使用 T1MOV 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.0AJMP LOOPER; 继续查询是否溢出END;【实验三】 串口通信实验实验内容:假定 P1 口连接 8 个外围开关,不断读取 P1 口输入的开关量信息,并将读取的结果通过串口发送出去。其中 P1 口的输入信息通过 Periphera
10、ls-P1口模拟,并通过 serial window 查看输出信息。1.发送:未溢出溢出重新给定时器赋初值,并翻转 P1.0定时器计数使能 T1 运行控制位赋初值定义工作模式程序流程图:源代码:ORG 0000H;AJMP START;ORG 0130H;START:MOV SCON,#80H ; 选择工作在方式 2MOV PCON,#00H ; 波特率不加倍MAIN: MOV A,P1 ; MOV SBUF,A ; 将 P1 中的值传送给缓冲器ACALL DEL; 调用延时WAIT: JBC TI,MAIN ; 查询中断标志,若为 1 则转移到 MAINSJMP WAIT;DEL:MOV R
11、5,#84H ; 延时程序,若主频为 12MHz,延迟为DEL1:MOV R6,#0FFH; 132*256*256*1us=8.65sDEL2:MOV R7,#0FFH;DEL3:DJNZ R7, DEL3;DJNZ R6, DEL2;DJNZ R5, DEL1;RET; 延迟程序返回END; 结束2.接收 程序流程图:定义工作方式P1A A-SBUF,延时中断查询中断标志位未中断源代码: ORG 0000H;AJMP START;ORG 0023H ; 串行口中断入口地址AJMP SERIN;ORG 0030H;START:MOV SCON,#90H ; 选择工作在方式 2,允许接收MOV PCON,#00H ; 波特率不加倍SETB ES ; 开串行口中断SETB EA; CPU 开中断SJMP $ ; 等待中断 SERIN:CLR RI ; 串行口接收中断标志,必须由指令清零MOV A,SBUF;MOV P0,A; 传送RETI; 返回END