单片机跑马灯实验_单片机定时器控制跑马灯实验 - CSDN
  • 使用STC89C51单片机,书写代码实现P0口演示跑马灯效果

    1.题目要求:

    编写跑马灯程序,用P0演示跑马灯的效果,效果自定。

    2.KEIL代码

    #include <reg52.h>
    #include <intrins.h>
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    void Delay100ms()		//100ms
    {
    	unsigned char i, j, k;
    	_nop_();_nop_();
    	i = 5;j = 52;k = 195;
    	do{do{while (--k);} while (--j);} 
    	while (--i);
    }
    void main()
    {
    	u8 LEDLogic = 0;	  //指示第几个灯
    	bit Dir = 1; //控制流水灯依次亮灭的方向
     
    	while(1)			  
    	{
    		if(Dir)			//正方向,灯由P0.0向P0.1亮
    			P0 = ~(0x01<<LEDLogic);	  //先将要亮灯的某一位置1,其余置0,然后取反,就变为只有指定位为0
    		else
    			P0 = ~(0x80>>LEDLogic);	
    		if(LEDLogic==7)
    			LEDLogic = !Dir;	//到了最后一个灯,改变灯的亮灭方向
    		  LEDLogic = (LEDLogic+1)%8;	 //	  每次加一,%8保证 LEDLogic	取值在0~7之间
    		Delay100ms(); //延时100ms
    	}
    }
    
    
    
    

    3.Protues仿真图

    在这里插入图片描述

    展开全文
  • 51单片机跑马灯完整程序与电路仿真图,适合对单片机开发感兴趣的爱好者。
  • 单片机实验----跑马灯

    2018-09-28 16:09:17
    单片机实验----跑马灯 实验效果: 8只LED灯轮流点亮,从左到右,再从右到左,不断循环。 知识点: RL指令 RR指令 高128位单元 代码: ORG 0000H ;主程序 MAIN: MOV A,#0FEH ;acc初始化,11111110B ...

    单片机实验----跑马灯


    实验效果:

    • 8只LED灯轮流点亮,从左到右,再从右到左,不断循环。

    知识点:

    • RL指令
    • RR指令
    • 高128位单元

    代码:

    		ORG 	0000H			;主程序
    MAIN: 	MOV 	A,#0FEH			;acc初始化,11111110B
    LOOP: 	MOV 	P1,A			;将acc的数据传送到P1口
    		LCALL 	DELAY 			;调用延迟子程序
    		RL 		A				;将acc中的数据左右一位
    		LJMP 	LOOP			;回到LOOP标记处,点亮下一盏灯
    DELAY: 	MOV 	R1,#200			;延时子程序
    D1:    	MOV 	R2,#150
    D2:    	DJNZ 	R2,D2
    		DJNZ 	R1,D1
    		RET						;返回主程序
    		END
    

    我们知道控制P1口的数值可以使得LED灯亮或者灭。
    那怎么改变P1口的数值呢?
    我们可以通过RL指令。

    原理:
    我们将11111110B传给P1口,再用RL指令将11111110B左移,改变11111110B中0的位置,来达到改变P1口8位的数值,从而控制LED的亮灭。

    1. RL指令
      格式:RL A
      功能:将acc中的数据循环左移一位,以形成新的数据

    2. RL指令
      格式:RR A
      功能:同上,循环左右移

    3. 高128单元
      如图:即80H~FFH
      内部数据存储器

    高128单元,称为特殊功能寄存器区,也称专用功能寄存器区。这个区包含22个专用寄存器。
    这个区主要存放相应功能部件的控制命令、状态或数据。

    特殊功能寄存器:
    特殊功能寄存器

    这些专用寄存器分为3类:

    累加器A(或acc)

    acc是一个8位寄存器,常用A表示。
    acc是一个很重要的寄存器,运算的时候经常会用到。
    一方面它可以做加法器,一方面也可以作为寄存器。

    累加器的常用功能:

    1. 存放操作数和运算后的结果
    2. 内部与外部RAM数据传送的中转站

    一般来说,A代表累加器,而ACC代表累加器的地址。

    程序状态字(PSW)寄存器

    PSW是一个8位寄存器,用于存放执行指令后的有关状态信息。

    如图:
    psw寄存器1

    psw寄存器2

    1. 进位标志位CY或C(PSW.7)
      标志加法与减法运算中的进位与借位状态。
      加法中:若有进位则CY=1,否则为0。
      减法中:若有借位则CY=1,否则为0。
      它是最常用到的标志,通常在位传送、位与、位或等操作中使用。

    2. 辅助进位标志位AC(PSW.6)
      用在加或减运算中,表示低四位有没有向高四位进位或借位。
      若有则AC=1,否则为0。

    3. 寄存器选择位RS1和RS0(PSW.4和PSW.3)
      用户可以通过改变他们的值,来选择当前工作寄存器区的组别。

    如图:
    当前工作寄存器选择表

    数据指针(DPTR)
    是一个16位的寄存器,本质是两个8位寄存器组合而成。
    DPTR比较灵活:

    1. 作为16位寄存器使用,此时可以对64k的外部数据存储器和I/O地址进行寻址。
    2. 作为两个8位寄存器使用,此时DPH为DPTR的高字节,DPL为DPTR的低字节。

    时间:2018年9月28日16:08:36


    -END-

    展开全文
  • 一个不错的跑马灯设计,有程序,有仿真图。
  • 基于Keil MDK环境开发。 跑马灯完整代码,在开发板上测试效果很好的。 值得收藏、下载、学习研究和参考。感谢下载~~~~~~~~~
  • 接触单片机的第一个实验就是跑马灯实验,虽然实验并不难,但开始却并不容易,跑马灯实验对于老司机来说简直小菜一碟。可这对于一个不懂硬件的新手来说,真的不容易。那段时间经常看STM32中文参考手册_V10,也看了...

    个人网站:https://chenqi.autmake.com/

    接触单片机的第一个实验就是跑马灯实验,虽然实验并不难,但开始却并不容易,跑马灯实验对于老司机来说简直小菜一碟。可这对于一个不懂硬件的新手来说,真的不容易。那段时间经常看STM32中文参考手册_V10,也看了Cortex-M3权威指南。慢慢的明白了其中的原理,也知道了为什么要配置成上拉、下拉、推挽输出、复用推挽输出。

    跑马灯实验大致可以分为三个步骤:

    1. LED初始化

    LED初始化包括时钟初始化和引脚初始化。每一个外设都有其对应的时钟,所以在使用外设之前都要先开启外设的时钟。

    引脚初始化(端口初始化),本实验是要通过引脚输出高低电平来控制LED的亮灭。端口初始化主要是配置:输出引脚、输出模式、输出速率。

    初始化代码如下:

    /*本次跑马灯实验主要用到PB6~PB9几个端口*/
    #include "LED.h"
    
    void LED_Init(void)  //自定义Led灯初始化函数
    {  
        GPIO_InitTypeDef  GPIO_InitStructure;  
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); /*使能LED灯使用的GPIO时钟*/     
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //以上为配置GPIO
        GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB 
    }

    附上头文件:

    /*头文件中主要是一些宏定义和位带操作*/
    #ifndef __LED_H
    #define __LED_H
    
    #include "stm32f10x.h"
    
    #define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_6)
    #define LED1_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_6)
    #define LED2_ON GPIO_SetBits(GPIOB, GPIO_Pin_7)
    #define LED2_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_7)
    #define LED3_ON GPIO_SetBits(GPIOB, GPIO_Pin_8)
    #define LED3_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_8)
    #define LED4_ON GPIO_SetBits(GPIOB, GPIO_Pin_9)
    #define LED4_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_9)
    	 
    //位带操作,实现51类似的GPIO控制功能
    //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
    //IO口操作宏定义
    #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
    #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
    #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
    //IO口地址映射
    #define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
    #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
    #define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
    #define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
    #define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
    #define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
    #define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    
    
    #define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
    #define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
    #define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
    #define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
    #define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
    #define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
    #define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
     
    //IO口操作,只对单一的IO口!
    //确保n的值小于16!
    #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
    #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 
    
    #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
    #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 
    
    #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
    #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 
    
    #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
    #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 
    
    #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
    #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入
    
    #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
    #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入
    
    #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
    #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入
    
    #define LED1  PBout(6)
    #define LED2  PBout(7)
    #define LED3  PBout(8)
    #define LED4  PBout(9)
    
    void LED_Init(void);
    
    #endif

    2.延时函数的编写

    跑马灯实验中需要用到延时函数,这个网上有很多例子。下面给出一个比较常用且精准的延时函数。有兴趣的也可以自己去编写属于自己的延时函数。这个函数比较常用,在后面的实验中也会经常用到。

    源文件:

    #include "delay.h"
    
    void delay_us(u32 nus)
    {
    	u32 temp;
    	SysTick->LOAD = 9*nus;
    	SysTick->VAL=0X00;//清空计数器
    	SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
    	do
    	{
    		temp=SysTick->CTRL;//读取当前倒计数值
    	}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
        SysTick->CTRL=0x00; //关闭计数器
        SysTick->VAL =0X00; //清空计数器
    }
    
    void delay_ms(u16 nms)
    {
    	u32 temp;
    	SysTick->LOAD = 9000*nms;
    	SysTick->VAL=0X00;//清空计数器
    	SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
    	do
    	{
    		temp=SysTick->CTRL;//读取当前倒计数值
    	}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
        SysTick->CTRL=0x00; //关闭计数器
        SysTick->VAL =0X00; //清空计数器
    }
    

    头文件:

    #ifndef __DELAY_H
    #define __DELAY_H
    
    #include "stm32f10x.h"
    
    void delay_us(u32 nus);
    void delay_ms(u16 nms);
    
    #endif
    

    3.主函数编写

    主函数就比较简单了,先调用LED的初始化函数,然后依次点亮LED。

    /*引用头文件是为了调用其中定义的函数*/
    #include "stm32f10x.h"
    #include "delay.h"
    #include "led.h"
    
    int main(void)
    {   
        LED_Init(); 
        while(1)
        {     
            LED1 = 1;
            delay_ms(200);
            LED1 = 0;
            delay_ms(200);
            LED2 = 1;
            delay_ms(200);
            LED2 = 0;
            delay_ms(200);
            LED3 = 1;
            delay_ms(200);
            LED3 = 0;
            delay_ms(200);
            LED4 = 1;
            delay_ms(200);
            LED4 = 0;
            delay_ms(200);
        }   
    }
    

    至此,跑马灯实验就结束了。新手切不可完全照搬,要根据自己的原理图来做相应的修改,加入自己的思考,才会真正成为自己的东西。

    完整工程下载链接:https://pan.baidu.com/s/109sOF0eroGE0bHeTTM1Fww

    展开全文
  • 单片机仿真之跑马灯

    2010-04-10 12:16:00
    1. 打开keil软件2. 新建text13. 输入程序(****见附件1)4. 保存为.c文件5. 新建工程6. 选择ATMEL->AT89C517. 右键新建工程的Source Group 1->Add File To Group 18. 右键新建工程名-〉Option-〉...

    1.  打开keil软件

    2.  新建text1

    3.  输入程序(****见附件1)

    4.  保存为.c文件

    5.  新建工程

    6.  选择ATMEL->AT89C51

    7.  右键新建工程的Source Group 1->Add File To Group 1

    8.  右键新建工程名-Option-Output-〉选择创建一个.HEX文件

    9.  编译即得到.hex文件;

     

    1.       打开protues

    2.       画图如下:







    3.       双击单片机,出现一个对话框,在Program File处添加已生成的.hex文件

    4.       Debug->Exrcute

     

     

     

    ***附件1

    #include <REG51.H> //预处理文件里面定义了特殊寄存器的名称如P1口定义为P1

    void main(void)

    {

    //定义花样数据

    const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

    0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

    0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

    0xE7,0xDB,0xBD,0x7E,0xFF};

    unsigned int a; //定义循环用的变量

    unsigned char b; //C51编程中因内存有限尽可能注意变量类型的使用

    //尽可能使用少字节的类型,在大型的程序中很受用

    do{

    for (b=0; b<32; b++)

    {

    for(a=0; a<30000; a++); //延时一段时间

    P1 = design[b]; //读已定义的花样数据并写花样数据到P1

    }

    }while(1);

    }

    展开全文
  • 通过一位 F 的16进制 转换为 2进制的 1111 然后移动一位 有三极管开关所改变。0的时候发光,1的时候变暗。所以一开始0FFH表示高8位为0; 低8位为1111 1111,表示全暗,然后右移变为1111 1110亮第一个...实现了跑马灯
  • 跑马灯实验源码
  • 跑马灯实验

    2020-07-25 23:31:59
    跑马灯实验 单片机学习教程,课程设计 联系 作业 考试
  • 注:本文主要介绍利用protues和keil软件联合仿真51单片机进行的跑马灯实例。 软件:Proteus 8 Professional 和 Keil uVision4(目前keil分为ARM的和51的,下载该软件要分清) 过程: 1. keil编写源代码 1.1 ...
  • 单片机跑马灯实验就如同 C 语言的"Hello World!"程序一样,几乎所有单片机试验课程都会介绍到跑马灯试验,简单的跑马灯只需选择P0 - P3口其中一个和8个LED灯连接即可。自动变速跑马灯通过定时器中断的控制能准确...
  • 用51单片机实现爱心跑马灯程序 本人闲来无事做,见实验室的小伙伴用LED等做了一个跑马灯,顿时引来了一大群妹子,当时就不服了,哼,不就是一个流水灯,说的跟谁不会一样 制作的是32个LED灯的爱心流水灯,...
  • 这个程序是基于stm32f103zet6的战舰版的跑马灯程序。保证可运行!
  • Stm32跑马灯实验

    2014-11-07 11:59:07
    #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "system_stm32f10x.h" void RCC_Configuration(void); void GPIO_Configuration(); void delay_ms(u16);...
  • 跑马灯又名八灯循环闪亮 是学习单片机单片机实验由汇编语言编写而成 绝对经典
  • 内容:通过寄存器方式实现跑马灯效果。 STM32的IO口可以由软件配置为如下8种模式,但必须是以32位字被访问。如:0XFFFF FFFF; 8种模式分别为: 1:输入浮空。浮空悬空,特点电压的不特定性,可能是VCC,也可能是0V...
  • 从今天开始吉格斯准备给大家带来单片机系列实验【酷玩单片机】,你可能还不知道什么是单片机,其实单片机在我们身边无处不在的,各种电器和路边红红绿绿的广告牌都用到了它。它既然这么强大,是不是很大很贵呢?这个...
1 2 3 4 5 ... 20
收藏数 401
精华内容 160
关键字:

单片机跑马灯实验