单片机实例之跑马灯
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=5;i>0;i--) for(j=200;j>0;j--)
for(k=250;k>0;k--) ; }
void main(void) { while(1) {
light=0; delay05s(); light=1; delay05s(); } }
(一)keil C51 windows集成开发平台的使用
根据前面的分析,实现任务的思路是:程序 开始时,给某一变量赋初始值0xFE,然后每次将 数据左移后送入P1口直到所有循环次数输出完毕, 再次重复整个过程。根据思路得出的程序框图如 图3-29所示。
图3-29 程序流程图
(1)C语言程序:
#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int void mDelay(unsigned int Delay) { unsigned int i;
1.芯片选择:左击界面右面芯片选择窗口的 下拉箭标,选择编程芯片的型号。
2.导入hex文件到缓冲区:左击界面上的 “Open File”按钮,选择本目录下的hex文件。
3.向芯片写入文件:左击界面上的“Write” 按钮,开始编程向芯片写入程序。
4.完成写入编程。
5.退出程序:左击界面右上角的“x”按钮, 退出此程序。
依次类推,逐次点亮LED所对应的数据为:
1111 1110、1111 1101、1111 1011、1111 0111、
1110 1111、1101 1111、1011 1111、0111 1111。
从这些数据上,可以看出一个规律,就是这些 数据中的二进制数0的位置依次往左移动了一位。 在C51中,要直接实现数据的这种计算是不容易 的。
KEIL 软件开发平台
图3-8 新建工程窗口
KEIL 软件开发平台
图3-9 单片机选择窗口
KEIL 软件开发平台
图3-10 目标1属性设置窗口
KEIL 软件开发平台
图3-11 目标1输出窗口设置
KEIL 软件开发平台Fra Baidu bibliotek
图3-13 软件输入窗口
KEIL 软件开发平台
图3-14 目标1添加窗口
一、课题目标
本课题就是以发光二极管为例,用单片机控制8只发 光二极管,实现逐个点亮、全亮、闪烁等花样显示。
为了便于理解,采用从简单的单只发光二极管的点亮 和熄灭控制开始,到实现八只发光二极管组成的各种样式 闪亮彩灯控制。
二、电路原理
图3-1 LED显示电路原理图
图3-2 八路发光二极管控制电路演示图
按图3-5所对应的主程序: sbit light=P1^0;
程序开始
void main(void)
输出低电平
{
while(1)
延时0.5秒
{ light=0;
输出高电平
delay05s(); light=1;
延时0.5秒
delay05s();
}
图3-5 1Hz的闪烁程序设计框图
}
C语言程序:
#include <reg51.H> sbit light=P1^0; void delay05s(void) { unsigned char i,j,k;
KEIL 软件开发平台
图3-15 目标1添加文件窗口
(二) Keil 程序调试 1.程序调试时的常用窗口 编译文件界面
KEIL 软件开发平台
图3-16 编辑文件界面
调试程序窗口
KEIL 软件开发平台
字母C:代码存储空间 D:直接寻址的片内存储空间 I:间接寻址的片内存储空间 X:扩展的外部RAM空间 “数字”:想要查看的地址。
END
思考题:
1、编写程序实现8个LED指示灯从左到右, 从右到左依次循环点亮。
1.keil C51 windows集成开发平台介绍
菜单栏
工具栏
工程窗口
源文件编辑窗口
输出窗口
图3-6 软件窗口介绍
2.导入需要仿真的程序
➢ 建立一个工程项目 ➢芯片选择 ➢属性设置 ➢建立源程序文件 ➢添加文件到当前项目组中 ➢编译文件
KEIL 软件开发平台
KEIL 软件开发平台
图3-7 新建工程窗口
无符号数最大值为255,也就是说,使用无符号类型 的变量的单个的循环最多为255次,即用一个循环不能完 成所需要的0.5s延时。为了达到0.5s延时,可采用多重循 环的方式完成。为了方便,将其中的每重循环的循环次数 取为0.5s/2μs=25000的因数200、250和5。
下面就是一个完成0.5秒延时的程序。
单片机执行一条指令的执行时间,称为指令周期。 指令周期是以机器周期为单位的,为1~4个机器周期,多 数指令都是单周期指令,也就是执行一条指令的时间为一 个机器周期。在MCS-51单片机规定一个机器周期为单片 机振荡器的12个振荡周期。如果晶振频率为12MHz,则 一个机器周期为1μs。
单片机的指令运行是很快的,要在端口获得一定时间 长度的脉冲信号,就要通过编写程序,使单片运行设计程 序产生时间延迟,实现从单片机输出端口上获得需要频率 的电脉冲信号。
3、程序设计分析
程序开始 输出低电平
在本任务的程序设计框图 就是图3-4。从框图中可看出两 点,一是程序是一个循环结构, 即程序开始后就反复地循环执 行,二是程序包含了端口输出 控制和0.5秒的延时程序。
延时0.5秒 输出高电平 延时0.5秒
图3-4 1Hz的闪烁程序设计框图
在本任务中的引脚定义使用如下命令:
sbit light=P1^0; 命令定义了light表示P1口的P1.0端。
让LED点亮,需要在引脚上输出低电平,就是 在P1.0引脚上输出0,应使用的命令是:
light=0;(汇编:CLR P1.0) 同理,让LED熄灭,应使用的命令是:
light=1; (汇编:SETB P1.0)
4、延时程序的编写
课题三(实例) 之跑马灯
任务一 一只LED的闪烁 任务二 跑马灯 任务三 任意变化的彩灯控制
学习目标
知识目标: Keil uVision2 软件的使用和调试
方法。
掌握汇编语言与C语言的编写方法 和技巧。
技能目标: 能根据实际电路要求编写闪烁LED
程序。
任务一 一只LED的闪烁
整个子程序延时为: {[2μs×249+1+2]×200+2}×5=501010μs
汇编语言程序:
org 0000h LS:
setb p1.0 Lcall delay clr P1.0 Lcall delay sjmp $
delay: mov R6,#5
SS: MOV R7, #200
loop: mov R1,#245
常用的调试按钮
KEIL 软件开发平台
复位按钮全,速按停运止全进速入跳循运跳过环行出循并单环步并执执单行行到断点处
下后,所行有的
系统状态将变
单步执行步执过行程
成初始状态。
图3-27 调试按钮
KEIL 软件开发平台
二、ISP软件的使用
打开下载软件,双击目录下的文件 ISPgm.exe,打开软件进入软件使用界面
任务中要求获得0.5s的时间长度,当单片机的指令周 期是1μs时,可计算出0.5s是1μs的5000000倍,在程序编 写中常用循环语句来完成计数和时间延迟,从而获得需要 的延时时间。
为了便于计算和控制,常采用无符号变量的循环来实 现。因为程序执行时,对应的每次循环所需要的时间是两 个机器周期,当单片机所使用的晶振为12MHz,每次循环 就延时2μs。
在程序命令中使用命令“sfr P1 = 0x90;” 这样定义后,P1就代表了P1口,程序中就可以对 单片机的P1口进行读写操作了,如使用 “Y=P1;”的命令将单片机P1口的状态读入并 存入变量Y中,而“P1=0x02”则是P1口的P1.1置 1。
同样的方式,也可以定义其他端口。为了方便,
C51将各个厂商生产的单片机的各个特殊功能寄 存器的定义放在一个特殊的文件中,如AT89S51、 AT89C51对应的文件是AT89X51.H。作为通用的 MCS-51系列单片机,在编写C程序,首先调用这 些通用的REG51.H头文件。
2、位定义
针对特殊功能寄存器的某一位进行操作, 则需要使用sbit命令定义特殊功能寄存器中 的可寻址位。如要对AT89S51端口P1的 P1.0进行操作,则可以使用下面的命令进 行定义:
sbit P10=P1^0;
然后就能使用“P10=1;”控制P1.0输出 高电平,“P10=0;”控制P1.0输出低电 平。
打开后的Interrupt窗口
KEIL 软件开发平台
图3-22 P3口查询窗口
串口设置
KEIL 软件开发平台
图3-23 串口查询窗口
打开后的串口窗口
KEIL 软件开发平台
图3-24 串口窗口
定时器设置
KEIL 软件开发平台
图3-25 定时器窗口
打开后的定时器1窗口
KEIL 软件开发平台
图3-26 硬件I/0口查询窗口
图3-17 代码查询窗口
工程窗口寄存器页
KEIL 软件开发平台
图3-18 工程寄存器窗口
2.各种窗口在程序调试中的用途 程序调试界面
KEIL 软件开发平台
图3-19 程序调试窗口
I/O端口界面
KEIL 软件开发平台
图3-20 硬件查询窗口
I/O口全部打开界面
KEIL 软件开发平台
图3-21 硬件I/0口查询窗口
任务二 跑马灯
本任务让图3-28中的LED依次点亮
图3-28 LED硬件图
程序设计分析
为了让图3-28所示的LED依次点亮,就是要求从P1口从 P1.0至P1.7依次输出低电平,其余引脚都输出高电平,就 能让被接在端口的彩灯依次点亮。
从输出的具体的数据来看,第一个LED点亮需要的输 出数据,是对应于P1.0的位为0,其余位为1,组合为一个 字节时对应的二进制位从高到低为:1111 1110,即十六 进制数0xFE;同理,第二个LED点亮对应的数为:1111 1101,化为十六进制数为0xFD。
void delay05s(void) {
unsigned char i,j,k; for(i=5;i>0;i--)
{ for(j=200;j>0;j--) { for(k=250;k>0;k--) {;} }
} }
整个子程序延时为:2μs×250×200×5=500000μs=0.5s。
近似值,不准确
for(;Delay>0;Delay--) { for(i=0;i<124;i++)
{;} } } void main() { unsigned char OutData=0xfe; for(;;) { P1=OutData;
OutData=_crol_(OutData,1); //循环左移 mDelay(1000); /*延时1000 毫秒*/ } }
指令)
ORG 0000H START:
MOV R2,#8 MOV A,#0FEH LOOP: MOV P1,A LCALL DELAY RL A DJNZ R2, LOOP SJMP START
delay: mov R6,#5
SS: MOV R7, #200
lp: mov R1,#245
SD: DJNZ R1, SD DJNZ R7,lp DJNZ R6,SS RET
三、程序设计
P1.0端口的LED闪亮
AT89S51
单片机的 I/O端口
P1.0
+Vcc
图3-3 单片机驱动一只发光二极管的原理电路
0.5秒延时的汇编程序:
MOV R6,#5
SS:
MOV R7, #200
LOOP: MOV R5, #249
DJNZ R5, $
DJNZ R7,LOOP
DJNZ R6,SS
SD: DJNZ R1, SD DJNZ R7,loop DJNZ R6,SS ret
end
1、端口的定义
C51使用sfr命令来对单片机这些端口进行定义, 如:
sfr P1 = 0x90;
这条命令的作用就是定义了P1这个名称(也可叫 变量)代表了地址为90H的特殊功能寄存器。
汇编程序直接使用P1就可以,并且不分大小 写。例:MOV P1,#0FFH;MOV P1,#00H。
_crol_ 字符循环左移 _cror_ 字符循环右移 _irol_ 整数循环左移 _iror_ 整数循环右移 _lrol_ 长整数循环左移 _lror_ 长整数循环右移 _nop_ 空操作 (相当于8051 NOP 指令) _testbit_ 测试并清零位 (相当于8051 JBC
for(k=250;k>0;k--) ; }
void main(void) { while(1) {
light=0; delay05s(); light=1; delay05s(); } }
(一)keil C51 windows集成开发平台的使用
根据前面的分析,实现任务的思路是:程序 开始时,给某一变量赋初始值0xFE,然后每次将 数据左移后送入P1口直到所有循环次数输出完毕, 再次重复整个过程。根据思路得出的程序框图如 图3-29所示。
图3-29 程序流程图
(1)C语言程序:
#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int void mDelay(unsigned int Delay) { unsigned int i;
1.芯片选择:左击界面右面芯片选择窗口的 下拉箭标,选择编程芯片的型号。
2.导入hex文件到缓冲区:左击界面上的 “Open File”按钮,选择本目录下的hex文件。
3.向芯片写入文件:左击界面上的“Write” 按钮,开始编程向芯片写入程序。
4.完成写入编程。
5.退出程序:左击界面右上角的“x”按钮, 退出此程序。
依次类推,逐次点亮LED所对应的数据为:
1111 1110、1111 1101、1111 1011、1111 0111、
1110 1111、1101 1111、1011 1111、0111 1111。
从这些数据上,可以看出一个规律,就是这些 数据中的二进制数0的位置依次往左移动了一位。 在C51中,要直接实现数据的这种计算是不容易 的。
KEIL 软件开发平台
图3-8 新建工程窗口
KEIL 软件开发平台
图3-9 单片机选择窗口
KEIL 软件开发平台
图3-10 目标1属性设置窗口
KEIL 软件开发平台
图3-11 目标1输出窗口设置
KEIL 软件开发平台Fra Baidu bibliotek
图3-13 软件输入窗口
KEIL 软件开发平台
图3-14 目标1添加窗口
一、课题目标
本课题就是以发光二极管为例,用单片机控制8只发 光二极管,实现逐个点亮、全亮、闪烁等花样显示。
为了便于理解,采用从简单的单只发光二极管的点亮 和熄灭控制开始,到实现八只发光二极管组成的各种样式 闪亮彩灯控制。
二、电路原理
图3-1 LED显示电路原理图
图3-2 八路发光二极管控制电路演示图
按图3-5所对应的主程序: sbit light=P1^0;
程序开始
void main(void)
输出低电平
{
while(1)
延时0.5秒
{ light=0;
输出高电平
delay05s(); light=1;
延时0.5秒
delay05s();
}
图3-5 1Hz的闪烁程序设计框图
}
C语言程序:
#include <reg51.H> sbit light=P1^0; void delay05s(void) { unsigned char i,j,k;
KEIL 软件开发平台
图3-15 目标1添加文件窗口
(二) Keil 程序调试 1.程序调试时的常用窗口 编译文件界面
KEIL 软件开发平台
图3-16 编辑文件界面
调试程序窗口
KEIL 软件开发平台
字母C:代码存储空间 D:直接寻址的片内存储空间 I:间接寻址的片内存储空间 X:扩展的外部RAM空间 “数字”:想要查看的地址。
END
思考题:
1、编写程序实现8个LED指示灯从左到右, 从右到左依次循环点亮。
1.keil C51 windows集成开发平台介绍
菜单栏
工具栏
工程窗口
源文件编辑窗口
输出窗口
图3-6 软件窗口介绍
2.导入需要仿真的程序
➢ 建立一个工程项目 ➢芯片选择 ➢属性设置 ➢建立源程序文件 ➢添加文件到当前项目组中 ➢编译文件
KEIL 软件开发平台
KEIL 软件开发平台
图3-7 新建工程窗口
无符号数最大值为255,也就是说,使用无符号类型 的变量的单个的循环最多为255次,即用一个循环不能完 成所需要的0.5s延时。为了达到0.5s延时,可采用多重循 环的方式完成。为了方便,将其中的每重循环的循环次数 取为0.5s/2μs=25000的因数200、250和5。
下面就是一个完成0.5秒延时的程序。
单片机执行一条指令的执行时间,称为指令周期。 指令周期是以机器周期为单位的,为1~4个机器周期,多 数指令都是单周期指令,也就是执行一条指令的时间为一 个机器周期。在MCS-51单片机规定一个机器周期为单片 机振荡器的12个振荡周期。如果晶振频率为12MHz,则 一个机器周期为1μs。
单片机的指令运行是很快的,要在端口获得一定时间 长度的脉冲信号,就要通过编写程序,使单片运行设计程 序产生时间延迟,实现从单片机输出端口上获得需要频率 的电脉冲信号。
3、程序设计分析
程序开始 输出低电平
在本任务的程序设计框图 就是图3-4。从框图中可看出两 点,一是程序是一个循环结构, 即程序开始后就反复地循环执 行,二是程序包含了端口输出 控制和0.5秒的延时程序。
延时0.5秒 输出高电平 延时0.5秒
图3-4 1Hz的闪烁程序设计框图
在本任务中的引脚定义使用如下命令:
sbit light=P1^0; 命令定义了light表示P1口的P1.0端。
让LED点亮,需要在引脚上输出低电平,就是 在P1.0引脚上输出0,应使用的命令是:
light=0;(汇编:CLR P1.0) 同理,让LED熄灭,应使用的命令是:
light=1; (汇编:SETB P1.0)
4、延时程序的编写
课题三(实例) 之跑马灯
任务一 一只LED的闪烁 任务二 跑马灯 任务三 任意变化的彩灯控制
学习目标
知识目标: Keil uVision2 软件的使用和调试
方法。
掌握汇编语言与C语言的编写方法 和技巧。
技能目标: 能根据实际电路要求编写闪烁LED
程序。
任务一 一只LED的闪烁
整个子程序延时为: {[2μs×249+1+2]×200+2}×5=501010μs
汇编语言程序:
org 0000h LS:
setb p1.0 Lcall delay clr P1.0 Lcall delay sjmp $
delay: mov R6,#5
SS: MOV R7, #200
loop: mov R1,#245
常用的调试按钮
KEIL 软件开发平台
复位按钮全,速按停运止全进速入跳循运跳过环行出循并单环步并执执单行行到断点处
下后,所行有的
系统状态将变
单步执行步执过行程
成初始状态。
图3-27 调试按钮
KEIL 软件开发平台
二、ISP软件的使用
打开下载软件,双击目录下的文件 ISPgm.exe,打开软件进入软件使用界面
任务中要求获得0.5s的时间长度,当单片机的指令周 期是1μs时,可计算出0.5s是1μs的5000000倍,在程序编 写中常用循环语句来完成计数和时间延迟,从而获得需要 的延时时间。
为了便于计算和控制,常采用无符号变量的循环来实 现。因为程序执行时,对应的每次循环所需要的时间是两 个机器周期,当单片机所使用的晶振为12MHz,每次循环 就延时2μs。
在程序命令中使用命令“sfr P1 = 0x90;” 这样定义后,P1就代表了P1口,程序中就可以对 单片机的P1口进行读写操作了,如使用 “Y=P1;”的命令将单片机P1口的状态读入并 存入变量Y中,而“P1=0x02”则是P1口的P1.1置 1。
同样的方式,也可以定义其他端口。为了方便,
C51将各个厂商生产的单片机的各个特殊功能寄 存器的定义放在一个特殊的文件中,如AT89S51、 AT89C51对应的文件是AT89X51.H。作为通用的 MCS-51系列单片机,在编写C程序,首先调用这 些通用的REG51.H头文件。
2、位定义
针对特殊功能寄存器的某一位进行操作, 则需要使用sbit命令定义特殊功能寄存器中 的可寻址位。如要对AT89S51端口P1的 P1.0进行操作,则可以使用下面的命令进 行定义:
sbit P10=P1^0;
然后就能使用“P10=1;”控制P1.0输出 高电平,“P10=0;”控制P1.0输出低电 平。
打开后的Interrupt窗口
KEIL 软件开发平台
图3-22 P3口查询窗口
串口设置
KEIL 软件开发平台
图3-23 串口查询窗口
打开后的串口窗口
KEIL 软件开发平台
图3-24 串口窗口
定时器设置
KEIL 软件开发平台
图3-25 定时器窗口
打开后的定时器1窗口
KEIL 软件开发平台
图3-26 硬件I/0口查询窗口
图3-17 代码查询窗口
工程窗口寄存器页
KEIL 软件开发平台
图3-18 工程寄存器窗口
2.各种窗口在程序调试中的用途 程序调试界面
KEIL 软件开发平台
图3-19 程序调试窗口
I/O端口界面
KEIL 软件开发平台
图3-20 硬件查询窗口
I/O口全部打开界面
KEIL 软件开发平台
图3-21 硬件I/0口查询窗口
任务二 跑马灯
本任务让图3-28中的LED依次点亮
图3-28 LED硬件图
程序设计分析
为了让图3-28所示的LED依次点亮,就是要求从P1口从 P1.0至P1.7依次输出低电平,其余引脚都输出高电平,就 能让被接在端口的彩灯依次点亮。
从输出的具体的数据来看,第一个LED点亮需要的输 出数据,是对应于P1.0的位为0,其余位为1,组合为一个 字节时对应的二进制位从高到低为:1111 1110,即十六 进制数0xFE;同理,第二个LED点亮对应的数为:1111 1101,化为十六进制数为0xFD。
void delay05s(void) {
unsigned char i,j,k; for(i=5;i>0;i--)
{ for(j=200;j>0;j--) { for(k=250;k>0;k--) {;} }
} }
整个子程序延时为:2μs×250×200×5=500000μs=0.5s。
近似值,不准确
for(;Delay>0;Delay--) { for(i=0;i<124;i++)
{;} } } void main() { unsigned char OutData=0xfe; for(;;) { P1=OutData;
OutData=_crol_(OutData,1); //循环左移 mDelay(1000); /*延时1000 毫秒*/ } }
指令)
ORG 0000H START:
MOV R2,#8 MOV A,#0FEH LOOP: MOV P1,A LCALL DELAY RL A DJNZ R2, LOOP SJMP START
delay: mov R6,#5
SS: MOV R7, #200
lp: mov R1,#245
SD: DJNZ R1, SD DJNZ R7,lp DJNZ R6,SS RET
三、程序设计
P1.0端口的LED闪亮
AT89S51
单片机的 I/O端口
P1.0
+Vcc
图3-3 单片机驱动一只发光二极管的原理电路
0.5秒延时的汇编程序:
MOV R6,#5
SS:
MOV R7, #200
LOOP: MOV R5, #249
DJNZ R5, $
DJNZ R7,LOOP
DJNZ R6,SS
SD: DJNZ R1, SD DJNZ R7,loop DJNZ R6,SS ret
end
1、端口的定义
C51使用sfr命令来对单片机这些端口进行定义, 如:
sfr P1 = 0x90;
这条命令的作用就是定义了P1这个名称(也可叫 变量)代表了地址为90H的特殊功能寄存器。
汇编程序直接使用P1就可以,并且不分大小 写。例:MOV P1,#0FFH;MOV P1,#00H。
_crol_ 字符循环左移 _cror_ 字符循环右移 _irol_ 整数循环左移 _iror_ 整数循环右移 _lrol_ 长整数循环左移 _lror_ 长整数循环右移 _nop_ 空操作 (相当于8051 NOP 指令) _testbit_ 测试并清零位 (相当于8051 JBC