f330dc_featuresdemo.c
来自「8051试验程序 基础教材」· C语言 代码 · 共 667 行 · 第 1/2 页
C
667 行
else
{
if (ADC_result == 0x03FF) // Assume max reading indicates VDD
{ // and not (VDD - 1 LSB)
percentage = 255;
PWM_Duty_Cycle = 100;
}
else
{
percentage = (long) ADC_result * (long) 256;
percentage = (long) percentage / (long) ADC_COUNTS;
PWM_Duty_Cycle = (int) ( ((long)ADC_result * (long)100) / (long)ADC_COUNTS );
}
if (PWM_Duty_Cycle != PWM_Duty_Cycle_Old) {
update = 1; }
PWM_Duty_Cycle_Old = PWM_Duty_Cycle;
// Set new PCA0 Module0 PWM duty cycle
PCA0CPH0 = (char) percentage;
}
}
//-----------------------------------------------------------------------------
// TIMER3_ISR
//-----------------------------------------------------------------------------
//
// This ISR is triggered upon a Timer3 overflow. The ISR simply toggles
// the state of the LED and keeps track of the number of times the LED blinks.
//
//-----------------------------------------------------------------------------
#pragma vector = TF3L_int
__interrupt void TIMER3_ISR (void)
{
TMR3CN &= ~0x80; // Clear Timer3 Flags
LED = !LED;
Num_LED_Flashes++;
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function initializes the system clock to use the internal 24.5/8 MHz
// oscillator as its clock source. Also enables missing clock detector reset.
//
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void)
{
OSCICN = 0x80; // Configure internal oscillator for
// its lowest frequency
RSTSRC = 0x04; // Enable missing clock detector
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function configures the crossbar and GPIO ports.
//
//
// P0.4 digital push-pull UART TX
// P0.5 digital open-drain UART RX
// P0.6 digital open-drain /INT0
// P1.3 digital push-pull LED (and CEX0 depending on Blink_State)
// P1.6 analog Potentiometer (ADC input)
//
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
P1MDIN = 0xBF; // P1.6 is analog, rest of P1 digital
P0MDOUT = 0x10; // P0.4 is push-pull
P1MDOUT = 0x08; // P1.3 is push-pull
P0SKIP = 0xCF; // Skip all of P0 except for UART0 pins
P1SKIP = 0x47; // Skip P1.6 and push CEX0 to P1.3
P0 |= 0x60; // Set port latch for pins RX and /INT0
// to configure as inputs
XBR0 = 0x01; // Enable UART
XBR1 = 0x40; // Enable Crossbar; pull-ups enabled
}
//-----------------------------------------------------------------------------
// TIMER0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Initializes the Timer in 16-bit reload mode using SYSCLK as the time base.
//
//-----------------------------------------------------------------------------
void TIMER0_Init (void)
{
// Initialize Timer0; set global variable for number overflows to reach
// interrupt rate set by <PRINT_RATE>
TMOD |= 0x01; // Mode 1 - 16-bit counter
CKCON |= 0x04; // Use SYSCLK as timebase
TL0 = 0; // Clear Timer0 low byte
TH0 = 0; // Clear Timer0 high byte
IE |= 0x02; // Enable Timer0 Interrupts
TCON_bit.TR0 = 1; // Enable Timer 0
}
//-----------------------------------------------------------------------------
// TIMER2_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters :
// 1) int counts - number of milliseconds of delay
// range is postive range of integer: 0 to 32767
//
// Configure Timer2 to 16-bit auto-reload and generate an interrupt at
// interval specified by <counts> using SYSCLK/12 as its time base.
//
//-----------------------------------------------------------------------------
void TIMER2_Init (int counts)
{
TMR2CN = 0x00; // Stop Timer2; Clear TF2;
// use SYSCLK/12 as timebase
CKCON &= ~0x30; // Timer2 clocked based on T2XCLK;
TMR2RL = -counts; // Init reload values
TMR2 = 0xffff; // Set to reload immediately
IE_bit.ET2 = 0; // 0 Disable Timer2 interrupts
TMR2CN_bit.TR2 = 1; // Start Timer2
}
//-----------------------------------------------------------------------------
// TIMER3_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure Timer3 to 16-bit auto-reload and generate an interrupt at
// interval specified by <counts> using SYSCLK/12 as its time base.
//
// Initially sets Timer3 to overflow at the maximum blink rate. The Timer3 ISR
// is used to toggle the LED.
//
//-----------------------------------------------------------------------------
void TIMER3_Init (void)
{
TMR3CN = 0x00; // Stop Timer3; Clear flags;
// use SYSCLK/12 as timebase
CKCON &= ~0xC0; // Timer3 clocked based on T3XCLK;
TMR3RL = -(SYSCLK / 12 / MIN_BLINK_RATE); // Init reload values
TMR3 = 0xffff; // Set to reload immediately
EIE1 |= 0x80; // Enable Timer3 interrupts
TMR3CN |= 0x04; // Start Timer3
}
//-----------------------------------------------------------------------------
// ADC0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function initializes the ADC to measure potetiometer connected
// to P1.6 in single-ended mode. Also enables the internal voltage reference.
//
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
ADC0CN = 0x02; // Disable ADC0
// Normal Track Mode
// Enable conversion on Timer2 overflow
AMX0P = 0x0E; // P1.6 is the positive input
AMX0N = 0x11; // GND is the negative input
ADC0CF = (SYSCLK/ADC_CLOCK) << 3; // ADC conversion clock <= 3MHz
ADC0CF &= ~0x04; // Make ADC0 right-justified
EIE1 |= 0x08; // Enable ADC0 conversion-complete
// interrupts
REF0CN = 0x0A; // VREF = VDD, bias generator is on.
ADC0CN_bit.AD0EN = 1; // Enable ADC0
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the UART1 using Timer1, for <baudrate> and 8-N-1.
//
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = (0xFF-(SYSCLK/BAUDRATE/2))+1;
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = (0xFF-(SYSCLK/BAUDRATE/2/4))+1;
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = (0xFF-(SYSCLK/BAUDRATE/2/12))+1;
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else {
TH1 = (0xFF-(SYSCLK/BAUDRATE/2/48))+1;
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}
TL1 = TH1; // Init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TCON_bit.TR1 = 1; // START Timer1
SCON0_bit.TI0 = 1; // Indicate TX0 ready
}
//-----------------------------------------------------------------------------
// PCA0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure Module0 to 8-bit PWM. The duty cycle is initially set to 50%. The
// duty cycle will actually be determined by the value of the potentiometer.
//
// The PCA counter isn't started until the user switches to PWM mode.
//
//-----------------------------------------------------------------------------
void PCA0_Init (void)
{
// Configure PCA time base; overflow interrupt disabled
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0MD = 0x08; // Use SYSCLK as time base
PCA0CPM0 = 0x42; // Module 0 = 8-bit PWM mode
// Configure initial PWM duty cycle = 50%
PCA0CPH0 = 256 - (256 * 0.5);
}
//-----------------------------------------------------------------------------
// INT0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure /INT0 (P0.6) to be a level-sensitive interrupt pin.
// Starts active-low, but the INT0 ISR will switch this back and forth.
//
//-----------------------------------------------------------------------------
void INT0_Init (void)
{
IT01CF = 0x06; // Configure /INT0 to P0.6
// Active High
TCON_bit.IT0 = 0; // /INT0 is level sensitive
IE_bit.EX0 = 1; // Enable /INT0 interrupts
}
//-----------------------------------------------------------------------------
// Support Functions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Print_String
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters :
// 1) char pstring[] - null terminated character string
//
// Prints the strings stored in pstring to the UART.
//
//-----------------------------------------------------------------------------
void Print_String (char pstring[])
{
unsigned char i = 0;
while (pstring[i])
{
putchar(pstring[i++]);
}
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?