此程序是基于51i單片機開發(fā)板上面寫的,如需要移植到自己的電路上,修改相應(yīng)的端口即可,開發(fā)板完整的電路圖下載: 點這里
/**
***************************************************************************
* @file : led.h
* @author : xr
* @date : 2014年5月15日10:33:21
* @brief : LED頭文件
***************************************************************************
* @ttention
* 實驗平臺 : 51開發(fā)板
*
*
***************************************************************************
*/
#ifndef _LED_H_
#define _LED_H_
#include <reg52.h>
/* 138譯碼器配置及LED數(shù)據(jù)口配置 */
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開發(fā)板
* 單片機 : STC89C52RC MCU
* 晶振頻率 : 11.0592 MHZ
***************************************************************************
*/
#include "led.h"
/* 定義跑馬燈數(shù)組 */
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++]; /* 送入要求的數(shù)據(jù)到LED顯示數(shù)據(jù)口 */
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開發(fā)板
* 單片機 : STC89C52RC MCU
* 晶振頻率 : 11.0592 MHZ
***********************************************************************
*/
#include <reg52.h>
#include "led.h"
/* 定義系統(tǒng)時鐘 */
#define SYS_XTAL (11059200/12)
/* 定時器T0高低字節(jié)重載值 */
unsigned char thr0, tlr0;
/* 200ms到標志 */
bit flag200ms = 0;
/***********************Local function defines***************************/
void ConfigTimer0(unsigned int xms);
/************************************************************************/
/**
* @brief : 主函數(shù)
* @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需要的計數(shù)值 */
tmp = 65536 - tmp + 13; /* 定時xms需要裝入的初值 */
thr0 = (unsigned char)(tmp >> 8);
tlr0 = (unsigned char)tmp;
TMOD &= 0xF0; /* 清零T0控制位 */
TMOD |= 0x01; /* 設(shè)定T0工作方式1 */
TH0 = thr0;
TL0 = tlr0;
ET0 = 1; /* 開定時器0中斷 */
TR0 = 1; /* 開啟定時器T0 */
EA = 1; /* 開總中斷 */
}
/**
* @brief : 定時器T0中斷服務(wù)函數(shù)
* @param : 無
* @retval : 無
*/
void Timer0_ISP() interrupt 1
{
static unsigned int counter = 0; /* 計數(shù)器 */
TH0 = thr0;
TL0 = tlr0;
counter++;
if ( counter >= 50 )
{
counter = 0;
flag200ms = 1; /* 置位200ms標志位 */
}
}
/******************************************************END OF FILE********/