| 
 | 
 
#include <c8051f120.h>                 // SFR declarations 
 
//----------------------------------------------------------------------------- 
// Global Constants 
//----------------------------------------------------------------------------- 
 
//#define INTCLK       24500000          // Internal oscillator frequency in Hz 
#define SYSCLK       22118400*9/2//49000000          // Output of PLL derived from (INTCLK*2) 
#define TIMER_TICKS_PER_MS SYSCLK/TIMER_PRESCALER/1000 
#define TIMER_PRESCALER 
           100 
#define LED_TOGGLE_RATE            100 
#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 
 
//----------------------------------------------------------------------------- 
// Function Prototypes 
//----------------------------------------------------------------------------- 
 
void OSCILLATOR_Init (void); 
void PORT_Init (void); 
void PCA0_Init (void); 
void Delay (int dly); 
void motorContrl (int motor1,int motor2); 
void Timer0_Init (void); 
 
//----------------------------------------------------------------------------- 
// Global Variables 
//----------------------------------------------------------------------------- 
 
unsigned int CEX0_Compare_Value; 
unsigned int CEX1_Compare_Value;       // Holds current PCA compare value 
unsigned int motor1=2200; 
unsigned int motor2=6200; 
sbit LED = P1^6; 
 
 
void OSCILLATOR_Init (void) 
{ 
   int i=0;             
 
   SFRPAGE = CONFIG_PAGE;              // Set SFR page 
   OSCXCN = 0x67; 
   for (i=0;i<3000;i++); 
   while((OSCXCN & 0x80) == 0); 
   OSCXCN = 0x83; 
   PLL0CN  = 0x04;                     // Set internal osc. as PLL source 
   CCH0CN  &= ~0x20; 
 
 
   SFRPAGE = LEGACY_PAGE; 
   FLSCL   = 0xB0;                     // Set FLASH read time for 50MHz clk 
 
   SFRPAGE = CONFIG_PAGE; 
   CCH0CN  |=0x20; 
   PLL0CN  |=0x01;                     // Enable Power to PLL 
   PLL0DIV = 0x02;                     // Set Pre-divide value to N (N = 1) 
   PLL0FLT = 0x07;                     // Set the PLL filter register for 
                                       // a reference clock from 19 - 30 MHz 
                                       // and an output clock from 45 - 80 MHz 
   PLL0MUL = 0x09;                     // Multiply SYSCLK by M (M = 2) 
 
   for (i=0; i < 15; i++);    
   // Wait at least 5us 
   PLL0CN  |= 0x02;                    // Enable the PLL 
   while(!(PLL0CN & 0x10) == 0);       // Wait until PLL frequency is locked 
   CLKSEL  = 0x02;                     // Select PLL as SYSCLK source 
   OSCICN  &=~0x80; 
} 
 
 
void PORT_Init (void) 
{ 
   char SFRPAGE_save = SFRPAGE;        // Save Current SFR page 
 
   SFRPAGE = CONFIG_PAGE;              // Set SFR Page 
 
   XBR0    = 0x98;                     // Route CEX0 to P0.0 
   XBR1    = 0x00; 
   XBR2    = 0x40;                     // Enable crossbar and weak pull-ups 
 
   P0MDOUT |= 0x03; 
   P1MDOUT |= 0xFF;                    // Set CEX0 (P0.0) to push-pull 
   SFRPAGE = SFRPAGE_save;             // Restore SFR Page 
} 
//----------------------------------------------------------------------------- 
// main() Routine 
//----------------------------------------------------------------------------- 
 
void main (void)  
{ 
   SFRPAGE = CONFIG_PAGE; 
 
   // Disable watchdog timer 
   WDTCN = 0xde; 
   WDTCN = 0xad; 
 
   PORT_Init ();                       // Initialize crossbar and GPIO 
   OSCILLATOR_Init ();                 // Initialize oscillator 
   PCA0_Init ();  
   Timer0_Init();                      // Initialize PCA0 
   EA = 1;   
   IE =0x92;                           
 
   //SFRPAGE = PCA0_PAGE; 
   while (1) 
   { 
       
motorContrl(0,0); 
 
Delay(1000); 
 
 
    motorContrl(90,90); 
 
Delay(1000); 
 
 
      
motorContrl(180,180); 
 
Delay(1000); 
} 
} 
 
void motorContrl (int Angle1 ,int Angle2) 
{ 
 
Angle1 = 4200 + Angle1 *22; 
 
Angle2 = 4200 + Angle2 *25; 
 
 
CEX0_Compare_Value = 65535 - Angle1; 
 
CEX1_Compare_Value = 65535 - Angle2; 
 
 
PCA0CPL0 = (CEX0_Compare_Value & 0x00FF); 
    PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8; 
 
 
PCA0CPL1 = (CEX1_Compare_Value & 0x00FF); 
    PCA0CPH1 = (CEX1_Compare_Value & 0xFF00)>>8; 
 
 
CR=1; 
} 
void PCA0_Init (void) 
{ 
   char SFRPAGE_save = SFRPAGE;        // Save current SFR Page 
 
   SFRPAGE = PCA0_PAGE; 
 
   // Configure PCA time base; overflow interrupt disabled 
   PCA0CN = 0x00;                      // Stop counter; clear all flags 
   PCA0MD = 0x0A;                      // Use SYSCLK as time base 
 
   PCA0CPM0 = 0xCB;                    // Module 0 = 16-bit PWM mode and 
                                       // enable Module 0 Match and Interrupt 
                                       // Flags 
   PCA0CPM1 = 0xCB;                    // Module 0 = 16-bit PWM mode and 
                                       // enable Module 0 Match and Interrupt 
                                       // Flags 
   // Configure initial PWM duty cycle = 50% 
   CEX0_Compare_Value = 65536 - motor1; 
   CEX1_Compare_Value = 65536 - motor2; 
 
   PCA0CPL0=(CEX0_Compare_Value & 0x00FF); 
   PCA0CPH0=(CEX0_Compare_Value & 0xFF00)>>8; 
 
   PCA0CPL1=(CEX1_Compare_Value & 0x00FF); 
   PCA0CPH1=(CEX1_Compare_Value & 0xFF00)>>8; 
   // Start PCA counter 
   CR = 1; 
 
   SFRPAGE = CONFIG_PAGE; 
   EIE1 |= 0x0C;                       // Enable PCA interrupts 
 
   SFRPAGE = SFRPAGE_save; 
} 
void Delay (int dly) 
{ 
 
unsigned int i; 
 
unsigned int j; 
 
for(i=0;i<dly;i++) 
 
{ 
 
  
for(j=0;j<dly;j++) 
 
{ 
 
dly=dly; 
 
} 
 
} 
} 
 
void PCA0_ISR (void) interrupt 9 
{ 
   CCF0 = 0;                           // Clear module 0 interrupt flag. 
 
   PCA0CPL0 = (CEX0_Compare_Value & 0x00FF); 
   PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8; 
 
   PCA0CPL1 = (CEX1_Compare_Value & 0x00FF); 
   PCA0CPH1 = (CEX1_Compare_Value & 0xFF00)>>8; 
} 
 
void Timer0_Init(void) 
{ 
 
char SFRPAGE_SAVE = SFRPAGE; 
 
 
SFRPAGE = TIMER01_PAGE; 
 
 
TH0=TIMER0_RELOAD_HIGH; 
    TL0=TIMER0_RELOAD_LOW; 
 
TMOD = 0x01; 
 
CKCON = 0x02; 
 
ET0=1; 
 
TCON = 0x10; 
 
 
SFRPAGE = SFRPAGE_SAVE; 
} 
 
void Timer0_ISR (void) interrupt 1 
{ 
 
LED = ~LED; 
 
TH0 = TIMER0_RELOAD_HIGH; 
 
TL0 = TIMER0_RELOAD_LOW; 
} 
 
//----------------------------------------------------------------------------- 
// End Of File 
//----------------------------------------------------------------------------- 
 
 
 
0 error 0 warning 
可以幫我看一下嗎 |   
 
 
 
 |