单片机实例之跑马灯
跑马灯实验报告

电子系统综合设计报告学号 201009120229 姓名李文海年级专业 2010级电子信息工程(二) 指导教师刘怀强学院理学院走马灯实验论文--《嵌入式系统技术》1、实验目的1、学会dp-51pro实验仪监控程序下载、动态调试等联机调试功能的使用;2、理解和学会单片机并口的作为通用i/o的使用;3、理解和学会单片机外部中断的使用;4、了解单片机定时器/计数器的应用。
2、实验设备z pc 机、arm 仿真器、2440 实验箱、串口线。
3、实验内容z 熟悉 arm 开发环境的建立。
z 使用 arm 汇编和 c 语言设置 gpio 口的相应寄存器。
z 编写跑马灯程序。
5、实验原理走马灯实验是一个硬件实验,因此要求使用dp-51pro 单片机综合仿真实验仪进行硬件仿真,首先要求先进行软件仿真,排除软件语法错误,保证关键程序段的正确。
然后连接仿真仪,下载监控程序,进行主机与实验箱联机仿真。
为了使单独编译的 c 语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。
atpcs ,即 arm , thumb 过程调用标准(arm/thumb procedure callstandard),是 arm 程序和 thumb 程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
下面结合实际介绍几种 atpcs 规则,如果读者想了解更多的规则,可以查看相关的书籍。
1.基本 atpcs 基本 atpcs 规定了在子程序调用时的一些基本规则,包括下面 3 方面的内容:(1)各寄存器的使用规则及其相应的名称。
(2)数据栈的使用规则。
(3)参数传递的规则。
相对于其它类型的 atpcs,满足基本 atpcs 的程序的执行速度更快,所占用的内存更少。
但是它不能提供以下的支持: arm 程序和 thumb 程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。
单片机跑马灯实训报告

4、彩灯仿真图,如图4-4所示。
图4-4彩灯仿真图
5、彩灯布局图,如图4-5所示。
图4-5彩灯布局图
五、焊接电路
按电路装配图,如图5-1。按顺序将元器件焊接到万能板上,并用导线对其进行连接,然后对其进行检测。
图5-1电路装配图
六、程序流程:
实现小灯随开关闭合亮的程流程图,如图6-1所示。
P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口, 口缓冲器嫩接收输出 4TTL 门电流。 P1口管脚写入 1 后,被内部上拉高,可用作输入,P1 口被外部下拉为低电平时,将输出电 流,这是由于内部上拉的缘故。在 FLASH 编程和校验时,P1 口作为第八位地址接收。
P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 缓冲器可接收,输出 4 个 TTL 门电流, 当 P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入是,“1”P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存 储器或 16 位地址外部数据存储器进行存取时,P2 口输出地址高八位。在给出地址“1”时它利用内部上位优势,当对外部八位地址数据存储器进行续写时,P2 口输出其特殊功能 寄存器的内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。
图6-1流程图
七、跑马灯程序:
ORG 00H
LJMP START
ORG 30H
START:MOV A,#0FEH
LOOP:MOV P1,A
LCALL DELAY
RL A
LJMPLOOP
DELAY:MOV R5,#5
D1: MOV R6,#200
D2: MOV R7,#250
单片机用595串入并出点亮跑马灯

uint code table1[]={
0x7fff,0xbfff,0xdfff,
0xefff,0xf7ff,0xfbff,
0xfdff,0xfeff,0xff7f,
0xffbf,0xffdf,0xffef,
0xfff7,0xfffb,0xfffd,
0xfffe,0xfffd,0xfffb,
STCP存储寄存器时钟输入
OE输出有效(低电平)
DS串行数据输入
VCC电源
时序图
写程序时候要注意时序问题,注意延时。
串转并16位接法
程序:#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
{
for(i=0;i<14;i++)
{
temp=table[i];
input_595();
output_595();
delay(50);
}
}
for(j=3;j>0;j--)
{
for(i=0;i<30;i++)
{
temp=table1[i];
input_595();
output_595();
delay(50);
sbit shcp=P2^0;
sbit ds=P2^1;
sbit stcp=P2^2;
uint temp;
uint code table[]={
0x7ff7ef,0xfbdf,
0xfdbf,0xfe7f,0xfdbf,
任务9 用自制的跑马灯电路实现8只LED循环点亮

• 出栈指令格式为:POP direct ;(direct)←(SP) • • ;SP←SP-1 该指令执行时先将SP所指单元数据弹出至direct所指的地址单元, 然后SP减1指向新的栈顶单元地址。
• •
4)子程序调用指令 ) 子程序调用指令的功能调用子程序,执行时先将断点地址(调用 指令的下一条指令的首地址)压入堆栈区,然后将子程序的首地址送 PC,执行子程序。 (1)长调用指令LCALL addr16 ;PC←PC+3 ;SP←SP+1 ;(SP)←PC7-0 ;SP←SP+1 ;(SP)←PC15-8 ; PC←addr16
执行该指令时,先将PC+2得到下一条指令的16位首地址,并将其压入堆栈, 最后子程序标号所在的子程序入口地址送给PC,CPU转入子程序执行。由于短 调用指令中的PC高5位地址不变,所以其转移的范围为2KB。
任务9 用自制的跑马灯电路实现8只 任务 用自制的跑马灯电路实现 只LED循环点亮 循环点亮 程序分析讲解
任务9 用自制的跑马灯电路实现8只 任务 用自制的跑马灯电路实现 只LED循环点亮 循环点亮
9.1.3 跟我学 1)减1不为零循环转移指令 ) 不为零循环转移指令DJNZ 不为零循环转移指令 DJNZ Rn,rel ;PC←PC+2,Rn←(Rn)-1,若(Rn)≠0,则PC←PC+rel DJNZ direct,rel ;PC←PC+2, direct←(direct)-1,若(direct)≠0,则 PC←PC+rel; 每执行一次循环转移指令,第一操作数(Rn或direct中的数)减1,并 保存,若减1后结果不为零,则转移至目的地(标号处);若减1后结果为零, 则程序按顺序执行下一条指令。
实验三:跑马灯实验

微控制器综合设计与实训实验名称:实验三跑马灯实验实验三:跑马灯实验1 实训任务(1) 编写程序,实现对LED1~LED8的轮流点亮;(2) 仿真调试,调整延时时间,利用仿真示波器观察延时时间长短;(3) 下载程序,观察跑马灯运行状况。
1.1 实验说明本实验将要实现的是控制实训平台上的8个LED灯实现一个类似跑马灯的效果,LED通过控制IO口的高低电平工作,因此实验的关键在于如何控制STM32的IO口输出。
1.2 实验步骤(1) 在实训平台上将IO口与LED(LED1~LED8)连接;(2) 复制工程模板文件夹,新建led.c和led.h文件,并将新建文件加入工程中;(3) 编写led.h文件,声明void LED_Init(void)初始化函数,宏定义LED1~LED8;(4) 编写led.c文件,建立void LED_Init(void)初始化函数,实现对LED灯用到的IO端口的配置,配置为推挽输出,速度为50MHZ;(5) 编写main()函数,实现对LED1~LED8的轮流点亮;(6) 软件仿真,调整延时时间,利用仿真示波器观察延时时间长短;(7) 下载程序,观察跑马灯的运行状况。
2 程序设计2.1 通过数组实现流水灯:2.2 通过宏定义实现流水灯:2.3 通过函数实现流水灯:2.4 通过SYSTICK中断实现流水灯:3硬件原理图设计4 总结通过数组实现流水灯:通过宏定义实现流水灯:通过函数实现流水灯:通过SYSTICK中断实现流水灯:实验心得:本次实验通过四种方法来实现流水灯,分别是通过数组实现流水灯,通过宏定义实现流水灯,通过函数实现流水灯,通过SYSTICK中断实现流水灯。
让我体会到单片机代码的多样性及强大的拓展功能。
MCU通过控制IO口的高低电平来直接控制LED的亮灭,所以本实验的关键是如何控制STM32的IO口输出,来达到我们想要的效果。
就比如灯光秀。
可控跑马灯的设计与实现 2

摘要本设计使用AT89C51单片机作为微控制器,利用P0口连接8个发光二极管,通过两个按键KEY1和KEY2输入外部中断INT0和INT1来控制“跑马灯”的运停和选项,从而实现多种跑马的形式,以达到停止、继续,并要求有多种亮暗组合的实现。
关键词:MCS51 跑马灯独立按键目录摘要 (I)1设计概述 (1)2 AT89C51概述 (2)2.1 AT89C51的硬件结构 (2)2.2 AT89C51的工作模式 (6)2.3 AT89C51程序存储器的加密 (8)3硬件电路设计 (9)4 可控跑马灯的软件设计 (11)4.1程序流程图 (11)4.2 程序代码 (12)5 心得体会 (17)参考文献 (18)1设计概述整个设计过程是先通过了解任务要求和功能指标,查阅书籍、资料,确定硬件和软件方案,到实现硬件电路和软件程序,最后到系统板的运行实验以及修改调试,最终成功完成。
在众多的微控制器中,我选择了较为熟悉的AT89C51单片机,由于按键软件去抖效果逊色于硬件去抖,所以我选用硬件去抖。
根据任务书中描述的功能,设计的外围资源较少,所以采用了两个外部中断来作为按键的输入,这样可以减少软件设计的负担。
而LED电路采用常用的上拉电阻,接到IO口的方法。
总体下来软、硬件都较为简易,这样设计时,成功率可大大提高。
2 AT89C51概述AT89C51是一个低电压,高性能CMOS 8位单片机带有4K字节的可反复擦写的程序存储器(PENROM)。
和128字节的存取数据存储器(RAM),这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。
片内含有8位中央处理器和闪烁存储单元,有较强的功能的AT89C51单片机能够被应用到控制领域中。
AT89C51提供以下的功能标准:4K字节闪烁存储器,128字节随机存取数据存储器,32个I/O口,2个16位定时/计数器,1个5向量两级中断结构,1个串行通信口,片内震荡器和时钟电路。
单片机整套实验及程序(交通灯_跑马灯等)

实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。
二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定的方式点亮。
如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。
●基于Proteus ISIS仿真环境完成上述功能的仿真。
●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。
四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。
五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//打开总中断ET0=1;//打开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。
单片机实训报告跑马灯

一、实训背景随着科技的发展,单片机作为一种重要的嵌入式系统控制单元,在工业控制、智能家居、物联网等领域得到了广泛的应用。
为了提高学生对单片机程序设计的理解和实践能力,本次实训选择了跑马灯程序设计作为实训项目。
二、实训目的1. 熟悉单片机的基本结构和编程方法。
2. 掌握Keil C51集成开发环境的使用。
3. 学习跑马灯程序的设计与实现。
4. 培养动手实践能力和团队协作精神。
三、实训内容本次实训主要分为以下几个部分:1. 电路设计:设计跑马灯的电路,包括单片机、LED灯、电阻、按键等元件。
2. 程序设计:编写跑马灯的程序,实现LED灯的正序、倒序、闪烁等功能。
3. 程序调试:在Keil C51集成开发环境中进行程序调试,确保程序正常运行。
4. 实验报告撰写:总结实训过程中的经验和收获,撰写实验报告。
四、电路设计跑马灯电路主要包括以下元件:1. 单片机:选用AT89C51单片机作为控制核心。
2. LED灯:使用8个LED灯作为显示元件。
3. 电阻:用于限流,防止LED灯烧毁。
4. 按键:用于控制跑马灯的运行模式。
电路连接方式如下:1. 将8个LED灯的正极依次连接到单片机的P1口。
2. 将8个LED灯的负极依次连接到地线。
3. 将按键的一端连接到单片机的P3.0口,另一端连接到地线。
五、程序设计跑马灯的程序采用C语言编写,主要功能包括:1. 正序跑马灯:LED灯依次点亮,从D1到D8。
2. 倒序跑马灯:LED灯依次点亮,从D8到D1。
3. 闪烁跑马灯:LED灯快速闪烁。
程序流程如下:1. 初始化单片机P1口为输出模式。
2. 根据按键输入选择跑马灯的运行模式。
3. 根据选择的模式,依次点亮LED灯。
4. 延时一段时间,然后继续点亮下一个LED灯。
5. 重复步骤3和4,直到所有LED灯点亮完毕。
程序代码如下:```c#include <reg51.h>#define LED P1void delay(unsigned int t) {unsigned int i, j;for (i = 0; i < t; i++)for (j = 0; j < 120; j++);}void main() {unsigned char i;LED = 0x01; // 正序跑马灯while (1) {for (i = 0; i < 8; i++) {delay(500); // 延时LED = (0x01 << i); // 点亮下一个LED灯}}}```六、程序调试在Keil C51集成开发环境中,将程序代码编译生成HEX文件,然后将HEX文件烧录到单片机中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在P1.0引脚上输出0,应使用的命令是: light=0;(汇编:CLR P1.0)
同理,让LED熄灭,应使用的命令是: light=1; (汇编:SETB P1.0)
单片机实例之跑马灯
4、延时程序的编写
单片机执行一条指令的执行时间,称为指令周期。 指令周期是以机器周期为单位的,为1~4个机器周期,多 数指令都是单周期指令,也就是执行一条指令的时间为一 个机器周期。在MCS-51单片机规定一个机器周期为单片 机振荡器的12个振荡周期。如果晶振频率为12MHz,则 一个机器周期为1μs。
程序开始 输出低电平
在本任务的程序设计框图 就是图3-4。从框图中可看出两 点,一是程序是一个循环结构, 即程序开始后就反复地循环执 行,二是程序包含了端口输出 控制和0.5秒的延时程序。
延时0.5秒 输出高电平 延时0.5秒
图3-4 1Hz的闪烁程序设计框图
单片机实例之跑马灯
在本任务中的引脚定义使用如下命令: sbit light=P1^0;
单片机实例之跑马灯
图3-2 八路发光二极管控制电路演示图
单片机实例之跑马灯
三、程序设计
P1.0端口的LED闪亮
AT89S51
单片机的 I/O端口
P1.0
+Vcc
图3-3 单片机驱动一只发光二极管的原理电路
单片机实例之跑马灯
0.5秒延时的汇编程序:
MOV R6,#5
SS:
MOV R7, #200
单片机的指令运行是很快的,要在端口获得一定时间 长度的脉冲信号,就要通过编写程序,使单片运行设计程 序产生时间延迟,实现从单片机输出端口上获得需要频率 的电脉冲信号。
单片机实例之跑马灯
任务中要求获得0.5s的时间长度,当单片机的指令周 期是1μs时,可计算出0.5s是1μs的倍,在程序编写中常用 循环语句来完成计数和时间延迟,从而获得需要的延时时 间。
delay: mov R6,#5
SS: MOV R7, #200
loop: mov R1,#245
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。
单片机实例之跑马灯
在程序命令中使用命令“sfr P1 = 0x90;”这 样定义后,P1就代表了P1口,程序中就可以对单 片机的P1口进行读写操作了,如使用“Y=P1;”的 命令将单片机P1口的状态读入并存入变量Y中, 而“P1=0x02”则是P1口的P1.1置1。
课题三(实例) 之跑马灯
任务一 一只LED的闪烁 任务二 跑马灯 任务三 任意变化的彩灯控制
单片机实例之跑马灯
学习目标
知识目标: Keil uVision2 软件的使用和调试
方法。 掌握汇编语言与C语言的编写方法
和技巧。 技能目标: 能根据实际电路要求编写闪烁LED
程序。
单片机实例之跑马灯
为了便于计算和控制,常采用无符号变量的循环来实 现。因为程序执行时,对应的每次循环所需要的时间是两 个机器周期,当单片机所使用的晶振为12MHz,每次循环 就延时2μs。
无符号数最大值为255,也就是说,使用无符号类型 的变量的单个的循环最多为255次,即用一个循环不能完 成所需要的0.5s延时。为了达到0.5s延时,可采用多重循 环的方式完成。为了方便,将其中的每重循环的循环次数 取为0.5s/2μs=25000的因数200、250和5。
同样的方式,也可以定义其他端口。为了方便, 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输出低电平。
单片机实例之跑马灯
3、程序设计分析
单片机实例之跑马灯
近似值,不准确
按图3-5所对应的主程序: sbit light=P1^0;
程序开始
void main(void)
输出低电平
{
while(1)
延时0.5秒
{ light=0;
输出高电平
delay05s(); light=1;
延时0.5秒
LOOP: MOV R5, #249
DJNZ R5, $
DJNZ R7,LOOP
DJNZ R6,SS
整个子程序延时为: {[2μs×249+1+2]×200+2}×5=501010μs
单片机实例之跑马灯
汇编语言程序:
org 0000h LS:
setb p1.0 Lcall delay clr P1.0 Lcall delay sjmp $
单片机实例之跑马灯
下面就是一个完成0.5秒延时的程序。
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。
任务一 一只LED的闪烁
一、课题目标
本课题就是以发光二极管为例,用单片机控制8只发 光二极管,实现逐个点亮、全亮、闪烁等花样显示。
为了便于理解,采用从简单的单只发光二极管的点亮 和熄灭控制开始,到实现八只发光二极管组成的各种样式 闪亮彩灯控制。
单片机实例之跑马灯
二、电路原理
图3-1 LED显示电路原理图