专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

规范编程——走马灯

作者:寒竹子   来源:用户上传   点击数:  更新时间:2014年05月18日   【字体:

 此程序是基于51i单片机开发板上面写的,如需要移植到自己的电路上,修改相应的端口即可,开发板完整的电路图下载:  点这里  

/**

  ***************************************************************************
  * @file    :  led.h
  * @author  :  xr
  * @date    :  2014年5月15日10:33:21
  * @brief   :  LED头文件
  ***************************************************************************
  * @ttention
  * 实验平台 :  51开发板
  *
  *
  ***************************************************************************
  */
#ifndef _LED_H_
#define _LED_H_
 
#include <reg52.h>
 
/* 138译码器配置及LED数据口配置 */
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
 
#define LED_DB P0
 
void ConfigHC138( void );
void LED_Scan( void );
 
#endif /* _LED_H_ */
 
/*************************************************END OF FILE******************/
 
/**
  ***************************************************************************
  * @file    :  led.c
  * @author  :  xr
  * @date    :  2014年5月15日10:33:21
  * @brief   :  LED功能文件
  ***************************************************************************
  * @ttention
  *     实验平台 :  Kingst51开发板
  *     单片机   :  STC89C52RC MCU
  *     晶振频率 :  11.0592 MHZ
  ***************************************************************************
  */
#include "led.h"
 
/* 定义跑马灯数组 */
unsigned char code LedTable[] = {
                                    0xE0,    // 11100000
                                    0xC1,    // 11000001
                                    0x83,    // 10000011
                                    0x07,    // 00000111
                                    0x0E,    // 00001110
                                    0x1C,    // 00011100
                                    0x38,    // 00111000
                                    0x70     // 11100000
                                  };
 
 
/**
  * @brief   :  138译码器配置
  * @param   :  无
  * @retval  :  无
  */
void ConfigHC138( void )
{
    /* 配置138译码器选择LEDS6 */
    ADDR3 = 1;
    ENLED = 0;                 /* 选择U3 */
    
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;                 /* 选择LEDS6 */
}
 
/**
  * @brief  :  Led小灯扫描
  * @param  :  无
  * @retval :  无
  */
void LED_Scan( void )
{
    static unsigned char j = 0;
    LED_DB = 0xFF;              /* 消隐 */
    
    LED_DB = LedTable[j++];    /* 送入要求的数据到LED显示数据口 */
    j &= 0x07;                 /* 到8归零 */
}
 
/*******************************************END OF FILE***********/
 
/**
  ***********************************************************************
  * @file    :  main.c
  * @author  :  xr
  * @date    :  2014年5月15日10:27:27
  * @version :  V1.2.3
  * @brief   :  跑马灯  
  ***********************************************************************
  * @attention
  *     实验平台 :  Kingst51开发板
  *     单片机   :  STC89C52RC MCU
  *     晶振频率 :  11.0592 MHZ
  ***********************************************************************
  */
#include <reg52.h>
#include "led.h"
 
/* 定义系统时钟 */
#define SYS_XTAL (11059200/12)
 
/* 定时器T0高低字节重载值 */
unsigned char thr0, tlr0;
 
/* 200ms到标志 */
bit flag200ms = 0;
 
/***********************Local function defines***************************/
 
void ConfigTimer0(unsigned int xms);
 
/************************************************************************/
 
 
/**
  * @brief   :  主函数
  * @param   :  无
  * @retval  :  无
  */
void main(void)
{
    ConfigHC138();                      /* 配置HC138译码器选择LED小灯 */
    ConfigTimer0(4);                    /* 定时器T0配置定时4ms */
    
    while (1)
    {
        if ( flag200ms )
        {
            flag200ms = 0;
            LED_Scan();                    /* 扫描LED小灯 */
        }
    }
}
 
/**
  * @brief  :  配置定时器T0
  * @param  :  无
  * @retval :  无
  */
void ConfigTimer0(unsigned int xms)
{
    unsigned long tmp;
    
    tmp = (SYS_XTAL * xms) / 1000;   /* 定时xms需要的计数值 */
    tmp = 65536 - tmp + 13;               /* 定时xms需要装入的初值 */
    thr0 = (unsigned char)(tmp >> 8);
    tlr0 = (unsigned char)tmp;
    
    TMOD &= 0xF0;                    /* 清零T0控制位 */
    TMOD |= 0x01;                    /* 设定T0工作方式1 */
    TH0  = thr0;
    TL0  = tlr0;
    ET0  = 1;                        /* 开定时器0中断 */
    TR0  = 1;                        /* 开启定时器T0 */
    
    EA   = 1;                        /* 开总中断 */
}
 
/**
  * @brief  :  定时器T0中断服务函数
  * @param  :  无
  * @retval :  无
  */
void Timer0_ISP() interrupt 1
{
    static unsigned int counter = 0;   /* 计数器 */
    
    TH0 = thr0;
    TL0 = tlr0;
    
    counter++;
    
    if ( counter >= 50 )
    {
        counter = 0;
        flag200ms = 1;                 /* 置位200ms标志位 */
    }
}
 
/******************************************************END OF FILE********/
关闭窗口