您好,欢迎来到易榕旅网。
搜索
您的当前位置:首页单片机程序流程图及源代码

单片机程序流程图及源代码

来源:易榕旅网


单片机上机实验报告

【实验一】 端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。

实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。 实现方式:通过peripherals实现端口数据观察实验。 程序流程图:

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均赋值为0 ACALL DEL;调用延迟 MOV P0 ,#0FFH; MOV P1 ,#0FFH; MOV P2 ,#0FFH;

MOV P3 ,#0FFH; P0~P3均设为1 MOV A,P0; 将P0口值赋给累加器 ACALL DEL; AJMP MAIN; 跳转到主程序入口 ORG 0200H; 延迟程序入口地址

1 / 7

DEL: MOV R5,#04H;寄存器实现延迟, F3: MOV R6,#0FFH; 若主频为12MHZ则 F2: MOV R7,#0FFH; 延时为256*256*4 F1: 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; show 8 ACALL DELAY; MOV P0,#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口外接一个数码管(共阴),如图,请在数码管上轮流显示数字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 LOOPER PE: 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; 启动T1 LOOPER: 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.发送:

程序流程图:

定义工作方式

P1A

A->SBUF,延时

中断

查询中断标志位 未中断

源代码:

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;

DEL:MOV R5,#84H ; 延时程序,若主频为12MHz,延迟为 DEL1:MOV R6,#0FFH; 132*256*256*1us=8.65s DEL2:MOV R7,#0FFH; DEL3:DJNZ R7, DEL3; DJNZ R6, DEL2; DJNZ R5, DEL1; RET; 延迟程序返回 END; 结束

2.接收

程序流程图:

源代码:

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

友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrd.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务