视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C8051F330程序定时器实例
2025-09-26 21:54:15 责编:小OO
文档
#include // SFR declarations

//-----------------------------------------------------------------------------

// Global Constants

//-----------------------------------------------------------------------------

#define SYSCLK 24500000/8 // SYSCLK in Hz (24.5 MHz internal

// oscillator / 8)

// the internal oscillator has a

// tolerance of +/- 2%

#define TIMER_PRESCALER 48 // Based on Timer CKCON settings

#define LED_TOGGLE_RATE 50 // LED toggle rate in milliseconds

// if LED_TOGGLE_RATE = 1, the LED will

// be on for 1 millisecond and off for

// 1 millisecond

// There are SYSCLK/TIMER_PRESCALER timer ticks per second, so

// SYSCLK/TIMER_PRESCALER/1000 timer ticks per millisecond.

#define TIMER_TICKS_PER_MS SYSCLK/TIMER_PRESCALER/1000

// Note: LED_TOGGLE_RATE*TIMER_TICKS_PER_MS should not exceed 65535 (0xFFFF)

// for the 16-bit timer

#define AUX1 TIMER_TICKS_PER_MS*LED_TOGGLE_RATE

#define AUX2 -AUX1

#define AUX3 AUX2&0x00FF

#define AUX4 ((AUX2&0xFF00)>>8)

#define TIMER0_RELOAD_HIGH AUX4 // Reload value for Timer0 high byte

#define TIMER0_RELOAD_LOW AUX3 // Reload value for Timer0 low byte

sbit LED = P1^3; // LED='1' means ON

//-----------------------------------------------------------------------------

// Function Prototypes

//-----------------------------------------------------------------------------

void Port_Init (void); // Port initialization routine

void Timer0_Init (void); // Timer0 initialization routine

//-----------------------------------------------------------------------------

// main() Routine

//-----------------------------------------------------------------------------

void main (void)

{

PCA0MD &= ~0x40; // Clear watchdog timer enable

Timer0_Init (); // Initialize the Timer0

Port_Init (); // Init Ports

EA = 1; // Enable global interrupts

while (1); // Loop forever

}

//-----------------------------------------------------------------------------

// Initialization Subroutines

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

// Port_Init

//-----------------------------------------------------------------------------

//

// Return Value : None

// Parameters : None

//

// This function configures the crossbar and GPIO ports.

//

// Pinout:

//

// P1.3 -> LED

//

// all other port pins unused

//

//--------------------------------

---------------------------------------------

void Port_Init (void)

{

XBR1 = 0x40; // Enable crossbar

P1MDOUT = 0x08; // Set LED to push-pull

}

//-----------------------------------------------------------------------------

// Timer0_Init

//-----------------------------------------------------------------------------

//

// Return Value : None

// Parameters : None

//

// This function configures the Timer0 as a 16-bit timer, interrupt enabled.

// Using the internal osc. at 12MHz with a prescaler of 1:8 and reloading the

// T0 registers with TIMER0_RELOAD_HIGH/LOW it will interrupt and then toggle

// the LED.

//

// Note: The Timer0 uses a 1:48 prescaler. If this setting changes, the

// TIMER_PRESCALER constant must also be changed.

//-----------------------------------------------------------------------------

void Timer0_Init(void)

{

TH0 = TIMER0_RELOAD_HIGH; // Init Timer0 High register

TL0 = TIMER0_RELOAD_LOW ; // Init Timer0 Low register

TMOD = 0x01; // Timer0 in 16-bit mode

CKCON = 0x02; // Timer0 uses a 1:48 prescaler

ET0 = 1; // Timer0 interrupt enabled

TCON = 0x10; // Timer0 ON

}

//-----------------------------------------------------------------------------

// Interrupt Service Routines

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

// Timer0_ISR

//-----------------------------------------------------------------------------

//

// Here we process the Timer0 interrupt and toggle the LED

//

//-----------------------------------------------------------------------------

void Timer0_ISR (void) interrupt 1

{

LED = ~LED; // Toggle the LED

TH0 = TIMER0_RELOAD_HIGH; // Reinit Timer0 High register

TL0 = TIMER0_RELOAD_LOW; // Reinit Timer0 Low register

}下载本文

显示全文
专题