MAIN.C
#include "stddef.h"
ex_ void Init_Config (void);
EX_ ULONG AZ_CP_COUNT ; EX_ ULONG EL_CP_COUNT ; EX_ ULONG RV_CP_COUNT ; EX_ ULONG SD_CP_COUNT ;
UCHAR UART_BUFFER[14] = {0xff,0,0,0,0,0,0,0,0,0,0,0,0,0xfe};UCHAR UART_SOUT_BIT = 15;
/*********************************************************************************** * 函数名称:delay; * * 函数功能描述:定时器延时子函数; * * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/
void delay(unsigned int time){ while(time--);}
/*********************************************************************************** * 函数名称:WatchDog; * * 函数功能描述:UART_SOUT_BIT * * 输入参数:NONE; * * 返回数据:none; * * 注意: none; ************************************************************************************/ void WatchDog(){ DOG=~DOG; delay(200); DOG=~DOG; delay(200);}
/*********************************************************************************** * 函数名称:UART_SBUF0(); * * 函数功能描述:串口0发送数据; * * 输入参数:发送数据; * * 返回数据:none; * * 注意: none; ************************************************************************************/
void UART_SBUF0() { uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE ULONG pCOUNT=0; uchar pD=0; uchar i =0; uchar EndFlag=0xfe; char * pStr=UART_BUFFER; SFRPAGE=UART0_PAGE;
/**************方位***************/
if(UART_SOUT_BIT&0x01) { pCOUNT=AZ_CP_COUNT; UART_BUFFER[pD+1]=0; if(AZ_LIMIT_CW) //顺限位 UART_BUFFER[pD+1]|=0x40; if(AZ_LIMIT_CC) //逆限位 UART_BUFFER[pD+1]|=0x80; i=pCOUNT&0xff ; if(i>0xfd) { UART_BUFFER[pD+3]=0xff-i; UART_BUFFER[pD+1] |=0x10; } else UART_BUFFER[pD+3]=i; i=(pCOUNT>>8)&0xff ; if(i>0xfd) { UART_BUFFER[pD+2]=0xff-i; UART_BUFFER[pD+2]|=0x20; } else UART_BUFFER[pD+2]=i;
UART_BUFFER[pD+1]|=((pCOUNT>>16)&0x0f); pD+=3; }
/**************府仰***************/ if(UART_SOUT_BIT&0x02) { pCOUNT=EL_CP_COUNT; UART_BUFFER[pD+1]=0; if(EL_LIMIT_UP) //方位限位 UART_BUFFER[pD+1]|=0x40; if(EL_LIMIT_DN) //方位限位 UART_BUFFER[pD+1]|=0x80;
i=pCOUNT&0xff ; if(i>0xfd) { UART_BUFFER[pD+3]=0xff-i; UART_BUFFER[pD+1] |=0x10; } else UART_BUFFER[pD+3]=i; i=(pCOUNT>>8)&0xff ; if(i>0xfd) { UART_BUFFER[pD+2]=0xff-i; UART_BUFFER[pD+2]|=0x20; } else UART_BUFFER[pD+2]=i; UART_BUFFER[pD+1]|=((pCOUNT>>16)&0x0f); pD+=3; }/**************接收***************/ if(UART_SOUT_BIT&0x04) { pCOUNT=RV_CP_COUNT; UART_BUFFER[pD+1]=0; if(RV_LIMIT_CW) //方位限位 UART_BUFFER[pD+1]|=0x40; if(RV_LIMIT_CC) //方位限位 UART_BUFFER[pD+1]|=0x80;
i=pCOUNT&0xff ; if(i>0xfd) { UART_BUFFER[pD+3]=0xff-i; UART_BUFFER[pD+1] |=0x10; } else UART_BUFFER[pD+3]=i; i=(pCOUNT>>8)&0xff ; if(i>0xfd) { UART_BUFFER[pD+2]=0xff-i; UART_BUFFER[pD+2]|=0x20; } else UART_BUFFER[pD+2]=i; UART_BUFFER[pD+1]|=((pCOUNT>>16)&0x0f); pD+=3; }/**************发射***************/ if(UART_SOUT_BIT&0x08) { pCOUNT=SD_CP_COUNT;
UART_BUFFER[pD+1]=0; if(SD_LIMIT_CW) //方位限位 UART_BUFFER[pD+1]|=0x40; if(SD_LIMIT_CC) //方位限位 UART_BUFFER[pD+1]|=0x80;
i=pCOUNT&0xff ; if(i>0xfd) { UART_BUFFER[pD+3]=0xff-i; UART_BUFFER[pD+1] |=0x10; } else UART_BUFFER[pD+3]=i; i=(pCOUNT>>8)&0xff ; if(i>0xfd) { UART_BUFFER[pD+2]=0xff-i; UART_BUFFER[pD+2]|=0x20; } else UART_BUFFER[pD+2]=i; UART_BUFFER[pD+1]|=((pCOUNT>>16)&0x0f); pD+=3; } UART_BUFFER[++pD]|=0xfe;/***************************结束*******************************/ do { SBUF0=*pStr; while(TI0==0); TI0=0; } while(EndFlag!=*pStr++); SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}
void main(){
Init_Config (); // 初始化硬件
EA = 1; // 允许全局中断
while(1) {
if(UART_SOUT_BIT)UART_SBUF0(); /*向上位机发送角度*/ if(ASK)UART_SOUT_BIT=0; /*角度返回 0自动返回 1问答返回*/
delay(40000); delay(10000); delay(10000); WatchDog(); }
}
STDDEF.H
#ifndef __CONFIG_C__#define __CONFIG_C__
#include "c8051f120.h"#include "intrins.h"#include "stdio.h"#include "STRING.H"#include "math.h"#include "stdlib.h"
/************custom**********/
#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define UCHAR unsigned char#define UINT unsigned int#define ULONG unsigned long#define EX_ extern #define ex_ extern
/************SETUP 看门狗端口**********/
sbit DOG= P1^0;
/************SETUP 问答模式************/
#define ASK 1 /*角度返回 0自动返回 1问答返回*/
/************SETUP CP DR **************/
sbit CPAZ = P3^0;sbit CPEL = P3^1;sbit CPRV = P3^2;sbit CPSD = P3^3;
sbit DRAZ = P3^6;sbit DREL = P3^7;sbit DRRV = P2^0;sbit DRSD = P2^1;
/***********限位端口*********/
#define AZ_LIMIT_CC 0#define AZ_LIMIT_CW 0sbit ``` EL_LIMIT_UP = P2^4;sbit EL_LIMIT_DN = P2^5;#define RV_LIMIT_CW 0#define RV_LIMIT_CC 0#define SD_LIMIT_CC 0#define SD_LIMIT_CW 0
/***********限位端口*********/ #define DEFAULT_AZ_START_SPEED 0x0333#define DEFAULT_EL_START_SPEED 0x0333#define DEFAULT_RV_START_SPEED 0x0333#define DEFAULT_SD_START_SPEED 0x0333
/********************CMD 命令集************************/
#define CMD_CW 0x01#define CMD_CC 0x02#define CMD_STOP 0x03#define CMD_TARGET 0x04#define CMD_SOUT 0x05#define CMD_SPEED 0x06#define CMD_COUNT 0x07#endif
#include "stddef.h"
EX_ UCHAR UART_SOUT_BIT; /***************调速******************/
UINT AZ_SPEED_NEW = 0xd333; UINT EL_SPEED_NEW = 0xd333; UINT RV_SPEED_NEW = 0xd333; UINT SD_SPEED_NEW = 0xd333;
UINT AZ_SPEED_OLD = 0x0333; UINT EL_SPEED_OLD = 0xE333; UINT RV_SPEED_OLD = 0x0333; UINT SD_SPEED_OLD = 0xe333;
/*************1 定位 2 顺转 3 疙转 **********/
UCHAR AZ_CMD_FLAG = 0; UCHAR EL_CMD_FLAG = 0; UCHAR RV_CMD_FLAG = 0; UCHAR SD_CMD_FLAG = 0;
ULONG AZ_CP_TOTAL = 160000;//2000*80 ULONG EL_CP_TOTAL = 160000;// ULONG SD_CP_TOTAL = 160000;// ULONG DN_CP_TOTAL = 160000;// ULONG RV_CP_TOTAL = 160000;//
ULONG AZ_CP_COUNT = 0; ULONG EL_CP_COUNT = 0; ULONG RV_CP_COUNT = 0; ULONG SD_CP_COUNT = 0;
ULONG AZ_TARGET_COUNT = 0; ULONG EL_TARGET_COUNT = 0; ULONG RV_TARGET_COUNT = 0; ULONG SD_TARGET_COUNT = 0; void Interrupt_int0 (void) interrupt 0 using 0 /********* 外部中断INIT0 *************/{ }
void Interrupt_Int1 (void) interrupt 2 using 0 /********* 外部中断INIT1 *************/
{ }void Interrupt_Time0 (void) interrupt 1 using 1 /********* 定时器0TIME0 *************/
{ uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE=TIMER01_PAGE;
TF0=0; //是否需要调整 if(AZ_SPEED_NEW!=AZ_SPEED_OLD) (AZ_SPEED_NEW>AZ_SPEED_OLD)?AZ_SPEED_OLD++:AZ_SPEED_OLD--;
switch(AZ_CMD_FLAG) //定位 { case 1: { if(AZ_TARGET_COUNT>AZ_CP_COUNT) { if(AZ_LIMIT_CW)break; DRAZ=1; CPAZ=~CPAZ; AZ_CP_COUNT++; // if(AZ_CP_TOTAL==AZ_CP_COUNT)AZ_CP_COUNT=0; } else { if(AZ_TARGET_COUNT<AZ_CP_COUNT) { if(AZ_LIMIT_CC)break; DRAZ=0; CPAZ=~CPAZ; AZ_CP_COUNT--; // if(0==AZ_CP_COUNT)AZ_CP_COUNT=AZ_CP_TOTAL; } else AZ_CMD_FLAG&=0; } } break; case 2: //顺转 { if(AZ_LIMIT_CW)break; DRAZ=1; CPAZ=~CPAZ; AZ_CP_COUNT++; if(AZ_CP_TOTAL==AZ_CP_COUNT)AZ_CP_COUNT=0; } break; case 3: //悄转 { if(AZ_LIMIT_CC)break; DRAZ=0; CPAZ=~CPAZ; AZ_CP_COUNT--; if(0==AZ_CP_COUNT)AZ_CP_COUNT=AZ_CP_TOTAL; } break; default : break; }
TH0=AZ_SPEED_OLD>>8; TL0=AZ_SPEED_OLD&0x00ff; TR0=1; SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE }void Interrupt_Time1 (void) interrupt 3 using 1 /********* 定时器1TIME1 *************/
{ uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE=TIMER01_PAGE;
TF1=0; //是否需要调整 if(EL_SPEED_NEW!=EL_SPEED_OLD) (EL_SPEED_NEW>EL_SPEED_OLD)?EL_SPEED_OLD++:EL_SPEED_OLD--;
switch(EL_CMD_FLAG) //定位 { case 1: { if(EL_TARGET_COUNT>EL_CP_COUNT) { if(EL_LIMIT_UP)break; DREL=1; CPEL=~CPEL; EL_CP_COUNT++; // if(EL_CP_TOTAL==EL_CP_COUNT)EL_CP_COUNT=0; } else { if(EL_TARGET_COUNT<EL_CP_COUNT) { if(EL_LIMIT_DN)break; DREL=0; CPEL=~CPEL; EL_CP_COUNT--; // if(0==EL_CP_COUNT)EL_CP_COUNT=EL_CP_TOTAL; } else EL_CMD_FLAG&=0; } } break; case 2: //顺转 { if(EL_LIMIT_UP)break; DREL=1; CPEL=~CPEL; EL_CP_COUNT++; if(EL_CP_TOTAL==EL_CP_COUNT)EL_CP_COUNT=0; } break; case 3: { if(EL_LIMIT_DN)break; DREL=0; CPEL=~CPEL; EL_CP_COUNT--; if(0==EL_CP_COUNT)EL_CP_COUNT=EL_CP_TOTAL; } break; default : break; }
TH1=EL_SPEED_OLD>>8; TL1=EL_SPEED_OLD&0x00ff; TR1=1; SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}void Interrupt_Time3 (void) interrupt 14 using 1 /********* 定时器3TIME3 *************/
{ uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE=TMR3_PAGE;
TF3=0; //是否需要调整 if(RV_SPEED_NEW!=RV_SPEED_OLD) (RV_SPEED_NEW>RV_SPEED_OLD)?RV_SPEED_OLD++:RV_SPEED_OLD--;
switch(RV_CMD_FLAG) //定位 { case 1: { if(RV_TARGET_COUNT>RV_CP_COUNT) { if(RV_LIMIT_CW)break; DRRV=1; CPRV=~CPRV; RV_CP_COUNT++; // if(RV_CP_TOTAL==RV_CP_COUNT)RV_CP_COUNT=0; } else { if(RV_TARGET_COUNT<RV_CP_COUNT) { if(RV_LIMIT_CC)break; DRRV=0; CPRV=~CPRV; RV_CP_COUNT--; // if(0==RV_CP_COUNT)RV_CP_COUNT=RV_CP_TOTAL; } else RV_CMD_FLAG&=0; } }
break; case 2: //顺转 { if(RV_LIMIT_CW)break; DRRV=1; CPRV=~CPRV; RV_CP_COUNT++; if(RV_CP_TOTAL==RV_CP_COUNT)RV_CP_COUNT=0; } break; case 3: //悄转 { if(RV_LIMIT_CC)break; DRRV=0; CPRV=~CPRV; RV_CP_COUNT--; if(0==RV_CP_COUNT)RV_CP_COUNT=RV_CP_TOTAL; } break; default : break; } RCAP3H=RV_SPEED_OLD>>8; RCAP3L=RV_SPEED_OLD&0x00ff; TR3=1; SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE }void Interrupt_Time4 (void) interrupt 16 using 1 /********* 定时器4TIME4 *************/
{ uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE=TMR4_PAGE;
TF4=0; //是否需要调整 if(SD_SPEED_NEW!=SD_SPEED_OLD) (SD_SPEED_NEW>SD_SPEED_OLD)?SD_SPEED_OLD++:SD_SPEED_OLD--;
switch(SD_CMD_FLAG) //定位 { case 1: { if(SD_TARGET_COUNT>SD_CP_COUNT) { if(SD_LIMIT_CW)break; DRSD=1; CPSD=~CPSD; SD_CP_COUNT++; // if(SD_CP_TOTAL==SD_CP_COUNT)SD_CP_COUNT=0; } else { if(SD_TARGET_COUNT<SD_CP_COUNT) { if(SD_LIMIT_CC)break; DRSD=0; CPSD=~CPSD; SD_CP_COUNT--; // if(0==SD_CP_COUNT)SD_CP_COUNT=SD_CP_TOTAL; } else SD_CMD_FLAG&=0; } }
break; case 2: { if(SD_LIMIT_CW)break; DRSD=1; CPSD=~CPSD; SD_CP_COUNT++; if(SD_CP_TOTAL==SD_CP_COUNT)SD_CP_COUNT=0; } break; case 3: { if(SD_LIMIT_CC)break; DRSD=0; CPSD=~CPSD; if(0==SD_CP_COUNT)SD_CP_COUNT=SD_CP_TOTAL; SD_CP_COUNT--;
} break; default : break; } RCAP4H=SD_SPEED_OLD>>8; RCAP4L=SD_SPEED_OLD&0x00ff; TR4=1; SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE }
/*********************************************************************************** * 函数名称:UART0; UART1; * * 函数功能描述:串口0中断,接收PC机命令,并向PC机返回角度; * * 输入参数:发送数据; * * 返回数据:none; * * 注意: none; ************************************************************************************/
UCHAR UART0_BUFFER[20]={'/0'};UCHAR UART0_BUFFER_COUNT=0;UCHAR UART0_FLAG=0;
void Interrupt_UART0(void) interrupt 4 using 2 /********* 串口中断0UART0 *************/{ UCHAR SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE UCHAR rv=0; SFRPAGE=UART0_PAGE; if(RI0) { rv = SBUF0; if(rv==0xFF) { UART0_FLAG=1;UART0_BUFFER_COUNT = 0; } if(rv==0xFE) { UART0_BUFFER_COUNT=0; UART0_FLAG=0; switch(UART0_BUFFER[1]&0x0F) { case CMD_CW: switch(UART0_BUFFER[2]) { case 0x01: AZ_SPEED_OLD=DEFAULT_AZ_START_SPEED; AZ_CMD_FLAG=2; break; case 0x02: EL_SPEED_OLD=DEFAULT_EL_START_SPEED; EL_CMD_FLAG=2; break; case 0x03: RV_SPEED_OLD=DEFAULT_RV_START_SPEED; RV_CMD_FLAG=2; break; case 0x04: SD_SPEED_OLD=DEFAULT_SD_START_SPEED; SD_CMD_FLAG=2; break;
} break; case CMD_CC: switch(UART0_BUFFER[2]) { case 0x01: AZ_SPEED_OLD=DEFAULT_AZ_START_SPEED; AZ_CMD_FLAG=3; break; case 0x02: EL_SPEED_OLD=DEFAULT_EL_START_SPEED; EL_CMD_FLAG=3; break; case 0x03: RV_SPEED_OLD=DEFAULT_RV_START_SPEED; RV_CMD_FLAG=3; break; case 0x04: SD_SPEED_OLD=DEFAULT_SD_START_SPEED; SD_CMD_FLAG=3; break;
}
break; case CMD_STOP: switch(UART0_BUFFER[2]) { case 0x01: AZ_CMD_FLAG=0; break; case 0x02: EL_CMD_FLAG=0; break; case 0x03: RV_CMD_FLAG=0; break; case 0x04: SD_CMD_FLAG=0; break; default: AZ_CMD_FLAG=0; EL_CMD_FLAG=0; RV_CMD_FLAG=0; SD_CMD_FLAG=0; break; } break; case CMD_TARGET: if(UART0_BUFFER[2]&0x80) { UART0_BUFFER[3]=0xff-UART0_BUFFER[3]; } if(UART0_BUFFER[2]&0x40) { UART0_BUFFER[4]=0xff-UART0_BUFFER[4]; } switch(UART0_BUFFER[1]&0xf0) { case 0x10: AZ_TARGET_COUNT &=0x0f; AZ_TARGET_COUNT &=UART0_BUFFER[2]; AZ_TARGET_COUNT <<=8; AZ_TARGET_COUNT |=UART0_BUFFER[3]; AZ_TARGET_COUNT <<=8; AZ_TARGET_COUNT |=UART0_BUFFER[4]; AZ_SPEED_OLD=DEFAULT_AZ_START_SPEED; AZ_CMD_FLAG=1; break; case 0x20: EL_TARGET_COUNT &=0x0f; EL_TARGET_COUNT &=UART0_BUFFER[2]; EL_TARGET_COUNT <<=8; EL_TARGET_COUNT |=UART0_BUFFER[3]; EL_TARGET_COUNT <<=8; EL_TARGET_COUNT |=UART0_BUFFER[4]; EL_SPEED_OLD=DEFAULT_EL_START_SPEED; EL_CMD_FLAG=1; break; case 0x40: RV_TARGET_COUNT &=0x0f; RV_TARGET_COUNT &=UART0_BUFFER[2]; RV_TARGET_COUNT <<=8; RV_TARGET_COUNT |=UART0_BUFFER[3]; RV_TARGET_COUNT <<=8; RV_TARGET_COUNT |=UART0_BUFFER[4]; RV_SPEED_OLD=DEFAULT_RV_START_SPEED; RV_CMD_FLAG=1; break; case 0x80: SD_TARGET_COUNT &=0x0f; SD_TARGET_COUNT &=UART0_BUFFER[2]; SD_TARGET_COUNT <<=8; SD_TARGET_COUNT |=UART0_BUFFER[3]; SD_TARGET_COUNT <<=8; SD_TARGET_COUNT |=UART0_BUFFER[4]; SD_SPEED_OLD=DEFAULT_SD_START_SPEED; SD_CMD_FLAG=1; break; default:
break; } break; case CMD_SOUT: UART_SOUT_BIT= UART0_BUFFER[2];
break;
case CMD_SPEED: if(UART0_BUFFER[2]&0x80) { UART0_BUFFER[3]=0xff-UART0_BUFFER[3]; } if(UART0_BUFFER[2]&0x40) { UART0_BUFFER[4]=0xff-UART0_BUFFER[4]; } switch(UART0_BUFFER[1]&0xf0) { case 0x10: AZ_SPEED_NEW &=UART0_BUFFER[3]; AZ_SPEED_NEW <<=8; AZ_SPEED_NEW |=UART0_BUFFER[4];
break; case 0x20: EL_SPEED_NEW &=UART0_BUFFER[3]; EL_SPEED_NEW <<=8; EL_SPEED_NEW |=UART0_BUFFER[4];
break; case 0x40: RV_SPEED_NEW &=UART0_BUFFER[3]; RV_SPEED_NEW <<=8; RV_SPEED_NEW |=UART0_BUFFER[4]; break; case 0x80: SD_SPEED_NEW &=UART0_BUFFER[3]; SD_SPEED_NEW <<=8; SD_SPEED_NEW |=UART0_BUFFER[4]; break; default:
break; }
break; case CMD_COUNT: if(UART0_BUFFER[2]&0x80) { UART0_BUFFER[3]=0xff-UART0_BUFFER[3]; } if(UART0_BUFFER[2]&0x40) { UART0_BUFFER[4]=0xff-UART0_BUFFER[4]; } switch(UART0_BUFFER[1]&0xf0) { case 0x10: AZ_CP_COUNT &=0x0f; AZ_CP_COUNT &=UART0_BUFFER[2]; AZ_CP_COUNT <<=8; AZ_CP_COUNT |=UART0_BUFFER[3]; AZ_CP_COUNT <<=8; AZ_CP_COUNT |=UART0_BUFFER[4];
break; case 0x20: EL_CP_COUNT &=0x0f; EL_CP_COUNT &=UART0_BUFFER[2]; EL_CP_COUNT <<=8; EL_CP_COUNT |=UART0_BUFFER[3]; EL_CP_COUNT <<=8; EL_CP_COUNT |=UART0_BUFFER[4];
break; case 0x40: RV_CP_COUNT &=0x0f; RV_CP_COUNT &=UART0_BUFFER[2]; RV_CP_COUNT <<=8; RV_CP_COUNT |=UART0_BUFFER[3]; RV_CP_COUNT <<=8; RV_CP_COUNT |=UART0_BUFFER[4]; break; case 0x80: SD_CP_COUNT &=0x0f; SD_CP_COUNT &=UART0_BUFFER[2]; SD_CP_COUNT <<=8; SD_CP_COUNT |=UART0_BUFFER[3]; SD_CP_COUNT <<=8; SD_CP_COUNT |=UART0_BUFFER[4]; break; default:
break; } break; } }
if(UART0_FLAG) { UART0_BUFFER[UART0_BUFFER_COUNT]=rv; if(++UART0_BUFFER_COUNT>20) { UART0_FLAG=0; UART0_BUFFER_COUNT=0; } }
RI0=0;
}
SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE }
#include "stddef.h"
void SYSCLK_Init (void); void PLL_Init (void); void PORT_Init(); void Init_Config (void); void Watchdog_Init (void); void UART0_Init (void) ;/*********************************************************************************** * 函数名称:SYSCLK_Init; * * 函数功能描述:系统时钟初始化,使用外部22.1184MHz晶振作为时钟源; * * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/ void SYSCLK_Init (void) { int i; // 延时计数器 uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE = CONFIG_PAGE; // 地址页为F OSCXCN = 0x67; // 起动外部振荡器晶体为 22.1184MHz 初使为1100111 for (i=0; i < 12256; i++) ; // 等待振荡器启动(>1ms) while (!(OSCXCN & 0x80)) ; // 等待晶体振荡器稳定 CLKSEL=0x01; // 选择外部振荡器作为系统时钟源并使能 SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}/*********************************************************************************** * 函数名称:PLL_Init; * * 函数功能描述:系统锁相环倍频初始化,* * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/
void PLL_Init (void) { uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE unsigned int ui=0; SFRPAGE=PLL0_PAGE;
PLL0CN=0x04; // PLL 控制寄存器使用外部振档器
SFRPAGE=LEGACY_PAGE; FLSCL=0xf0; // FLASH 读时间禁止FLASH 写/擦除11110000 SFRPAGE=PLL0_PAGE; PLL0CN=0x05; // PLL 参考时钟源为外部振荡器。:PLL 偏置发生器被使能 PLL0DIV=0x01; // 参考时钟除于1 PLL0FLT=0x01; // 环路滤波器控制位。 PLL0MUL=0x08; // 4倍频 for(ui=0;ui<200;ui++) { _nop_(); // NOP是一个周期 所以 20M下 1S/(20M/12)=0.6US 0.011us } PLL0CN=0x07; //PPL使能// while (!(PLL0CN & 0x10)) ; CLKSEL=0x02; //使用CLKSEL 寄存器将系统时钟源切换到PLL。 SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}
/*********************************************************************************** * 函数名称:PORT_Init; * * 函数功能描述:配置端口初始化,配置交叉开关和端口; * * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/
void PORT_Init(void){ uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE = CONFIG_PAGE; // Switch to the necessary SFRPAGE
P0MDOUT=0xff; //P0口为推挽输出 P1MDOUT=0xff; //P1口为推挽输出 P2MDOUT=0xff; //P3口为推挽输出 P3MDOUT=0xff; //P3口为推挽输出
XBR0 = 0x05; //分配串口0 SDASCL XBR1 = 0x14; //分配外部中断0和1 XBR2 = 0x44; // 分配串口1,允许数据交叉开关和弱上拉 SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}/*********************************************************************************** * 函数名称:TIMER_Init; * * 函数功能描述:SPI初始化函数; 主方式 * * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/ void TIMER_Init() { uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE
// PCA0MD = 0x00; // 禁止CF中断 // PCA时基 = SYSCLK
SFRPAGE=TIMER01_PAGE;//寄存器页 CKCON=0x19;//时基为系统时钟 TMOD = 0x11; //21 TH0=0X00;//定时器0设置 TL0=0X10; TR0=1;
TH1 = 0X00; //-(SYSCLK/BAUDRATE/16/2); // 按波特率设置定时器1重装值 TL1 = 0Xa0; TR1=1; //启动定时器1 /* SFRPAGE=TMR2_PAGE;//定时器2设置 TMR2CF=0X08;//时基为系统时钟 TMR2H=0X00; TMR2L=0X10; TMR2CN=0X04; */
SFRPAGE=TMR3_PAGE;//定时器3设置 TMR3CF=0X08;//时基为系统时钟 TMR3H=0X00; //(65535-0010H)是定时器的起始数据, TMR3L=0X10;// 然后每隔一个系统时钟周期减一来完成定时计数 TMR3CN=0X04;
SFRPAGE=TMR4_PAGE;//定时器4设置 TMR4CF=0X08;//时基为系统时钟 TMR4H=0X00; TMR4L=0X05; TMR4CN=0X04;
//中断设置
ET0=1; //开定时器0中断 ET1=1; //开定时器1中断 // ET2=1; //开定时器2中断 EIE2|=0X05;//开定时器3和4中断 SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}
/*********************************************************************************** * Watchdog_Init; * * 函数功能描述:看门狗初使化。* * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/ void Watchdog_Init (void) { uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE = CONFIG_PAGE; // Switch to the necessary SFRPAGE WDTCN = 0xDE; // Disable the Watchdog Timer WDTCN = 0xAD; SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE }
/*********************************************************************************** * void UART0|1_Init(void) * * 函数功能描述:串口0|1初始化初使化。* * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/
void UART0_Init (void) { uchar SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE=UART0_PAGE; SCON0 = 0x50; SSTA0=0x05; //定时器T2作为通讯拨特率 TMR2CF=0X08; //定时器2工作在系统时钟下 TMR2L=0Xe0; //重装值b=T2/16,,,T2=TCK/Tn TMR2H=0Xfe; //
RCAP2L=0Xe0; RCAP2H=0Xfe; //重装值 TMR2CN=0X04; //启动定时器2 PCON |= 0x80; // SMOD00 = 1 IE|=0x10; //开串口0中断 SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}
/*********************************************************************************** * 函数名称:Init_Config();* * 函数功能描述:SPI初始化函数; 主方式 * * 输入参数:none; * * 返回数据:none; * * 注意: none; ************************************************************************************/void Init_Config (void) { Watchdog_Init (); // 关掉看门狗 SYSCLK_Init (); //初始化晶振 PLL_Init(); //锁相环设置 倍频 PORT_Init (); //IO端口初始化 UART0_Init(); //串口0初使化 TIMER_Init();}