📄 hardware_delay_50ms.c
字号:
/*------------------------------------------------------------------*-
Hardware_Delay_50ms.C (v1.00)
------------------------------------------------------------------
A test program for hardware-based delays.
COPYRIGHT
---------
This code is associated with the book:
EMBEDDED C by Michael J. Pont
[Pearson Education, 2002: ISBN: 0-201-79523-X].
This code is copyright (c) 2001 by Michael J. Pont.
See book for copyright details and other information.
-*------------------------------------------------------------------*/
#include <reg52.h>
sbit LED_pin = P1^5;
bit LED_state_G;
void LED_FLASH_Init(void);
void LED_FLASH_Change_State(void);
void DELAY_HARDWARE_One_Second(void);
void DELAY_HARDWARE_50ms(void);
/*..................................................................*/
void main(void)
{
LED_FLASH_Init();
while(1)
{
// Change the LED state (OFF to ON, or vice versa)
LED_FLASH_Change_State();
// Delay for approx 1000 ms
DELAY_HARDWARE_One_Second();
}
}
/*------------------------------------------------------------------*-
LED_FLASH_Init()
Prepare for LED_Change_State() function - see below.
-*------------------------------------------------------------------*/
void LED_FLASH_Init(void)
{
LED_state_G = 0;
}
/*------------------------------------------------------------------*-
LED_FLASH_Change_State()
Changes the state of an LED (or pulses a buzzer, etc) on a
specified port pin.
Must call at twice the required flash rate: thus, for 1 Hz
flash (on for 0.5 seconds, off for 0.5 seconds) must call
every 0.5 seconds.
-*------------------------------------------------------------------*/
void LED_FLASH_Change_State(void)
{
// Change the LED from OFF to ON (or vice versa)
if (LED_state_G == 1)
{
LED_state_G = 0;
LED_pin = 0;
}
else
{
LED_state_G = 1;
LED_pin = 1;
}
}
/*------------------------------------------------------------------*-
DELAY_HARDWARE_One_Second()
Hardware delay of 1000 ms.
*** Assumes 12MHz 8051 (12 osc cycles) ***
-*------------------------------------------------------------------*/
void DELAY_HARDWARE_One_Second(void)
{
unsigned char d;
// Call DELAY_HARDWARE_50ms() twenty times
for (d = 0; d < 20; d++)
{
DELAY_HARDWARE_50ms();
}
}
/*------------------------------------------------------------------*-
DELAY_HARDWARE_50ms()
Hardware delay of 50ms.
*** Assumes 12MHz 8051 (12 osc cycles) ***
-*------------------------------------------------------------------*/
void DELAY_HARDWARE_50ms(void)
{
// Configure Timer 0 as a 16-bit timer
TMOD &= 0xF0; // Clear all T0 bits (T1 left unchanged)
TMOD |= 0x01; // Set required T0 bits (T1 left unchanged)
ET0 = 0; // No interupts
// Values for 50 ms delay
TH0 = 0x3C; // Timer 0 initial value (High Byte)
TL0 = 0xB0; // Timer 0 initial value (Low Byte)
TF0 = 0; // Clear overflow flag
TR0 = 1; // Start timer 0
while (TF0 == 0); // Loop until Timer 0 overflows (TF0 == 1)
TR0 = 0; // Stop Timer 0
}
/*------------------------------------------------------------------*-
---- END OF FILE -------------------------------------------------
-*------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -