www.pudn.com > 485bus.zip > main.c, change:2011-04-26,size:5989b


/*---------------------------------------------------------*/ 
/************************************************************ 
飞翔科技MC9S12XS128汽车电子综合开发平台  
E-mail:bhfengchong@gmail.com 
       2008f.d@163.com 
淘宝店:http://fxfreefly.taobao.com 
        http://fxfreefly2.taobao.com 
************************************************************/ 
/*---------------------------------------------------------*/ 
#include <hidef.h>      /* common defines and macros */ 
#include "derivative.h"      /* derivative-specific definitions */ 
#include "LCD.h"       
 
#define LEDCPU PORTK_PK4 
#define LEDCPU_dir DDRK_DDRK4 
#define RD1 PTM_PTM5 
#define RD2 PTM_PTM4 
#define RD1_dir DDRM_DDRM5 
#define RD2_dir DDRM_DDRM4 
#define  BUS_CLOCK		   32000000	   //总线频率 
#define  OSC_CLOCK		   16000000	   //晶振频率 
#define BAUD 9600                    //串口波特率 
 
char *xianshi[3] = { 
"飞翔科技开发板", 
"接收到的数据为:", 
}; 
 
unsigned char k; 
unsigned char dat_send[8]={'F','R','E','E','F','L','Y','\r'}; 
unsigned char data_r[10]; 
unsigned char number=0; 
unsigned char datasp=0; 
unsigned char data_receive; 
 
/*************************************************************/ 
/*                      初始化锁相环                         */ 
/*************************************************************/ 
void INIT_PLL(void)  
{ 
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk 
    PLLCTL &= 0x8F;       //Disable PLL circuit 
    CRGINT &= 0xDF; 
     
    #if(BUS_CLOCK == 40000000)  
      SYNR = 0x44; 
    #elif(BUS_CLOCK == 32000000) 
      SYNR = 0x43;      
    #elif(BUS_CLOCK == 24000000) 
      SYNR = 0x42; 
    #endif  
 
    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M 
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit 
    asm NOP; 
    asm NOP; 
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already 
    CLKSEL |= 0x80;        //set PLLCLK as sysclk 
} 
 
/************************************************************/ 
/*                    初始化ECT模块                         */ 
/************************************************************/ 
void initialize_ect(void){ 
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除 
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器) 
  TIOS  = 0xff;      //指定所有通道为输出比较方式 
  TCTL1 = 0x00;	    // 后四个通道设置为定时器与输出引脚断开 
  TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开 
  TIE   = 0x00;     // 禁止所有通道定时中断 
  TSCR2 = 0x07;	    // 预分频系数pr2-pr0:111,,时钟周期为4us, 
  TFLG1 = 0xff;	    // 清除各IC/OC中断标志位 
  TFLG2 = 0xff;     // 清除自由定时器中断标志位 
} 
 
/*************************************************************/ 
/*                        初始化SCI0                         */ 
/*************************************************************/ 
void INIT_SCI0(void)  
{ 
 
  SCI0BD = BUS_CLOCK/16/BAUD;   //设置SCI0波特率为9600 
  SCI0CR1 = 0x00;       //设置SCI0为正常模式,八位数据位,无奇偶校验 
  SCI0CR2 = 0x08;       //允许发送数据,禁止中断功能  
} 
 
/*************************************************************/ 
/*                        初始化SCI1                         */ 
/*************************************************************/ 
void INIT_SCI1(void)  
{ 
  SCI1BD = BUS_CLOCK/16/BAUD;   //设置SCI1波特率为9600 
  SCI1CR1 = 0x00;        //设置SCI1为正常模式,八位数据位,无奇偶校验 
  SCI1CR2 = 0x2c;        //允许接收和发送数据,允许接收中断功能  
} 
 
/*************************************************************/ 
/*                      初始化485总线                        */ 
/*************************************************************/ 
void INIT_485(void)  
{ 
    RD1_dir=1; 
    RD2_dir=1; 
    RD1=1; 
    RD2=0; 
} 
 
/*************************************************************/ 
/*                       串口0发送函数                       */ 
/*************************************************************/ 
void SCI0_send(unsigned char data)  
{ 
  while(!SCI0SR1_TDRE);         //等待发送数据寄存器(缓冲器)为空 
  SCI0DRL = data; 
} 
 
/*************************************************************/ 
/*                       串口1接收函数                       */ 
/*************************************************************/ 
unsigned char SCI1_receive(void)  
{ 
  while(!SCI1SR1_RDRF);          //等待发送数据寄存器满 
  return(SCI1DRL); 
} 
 
/************************************************************/ 
/*                在液晶上显示接收到的数据                  */ 
/************************************************************/ 
void play_data(void)  
{ 
    unsigned char l; 
    write_command(0x8A); 
    for(l=0;l<number;l++) 
       write_Data(data_r[l]); 
} 
 
/*************************************************************/ 
/*                     串口中断接收函数                      */ 
/*************************************************************/ 
#pragma CODE_SEG __NEAR_SEG NON_BANKED 
interrupt void receivedata(void)  
{ 
    data_receive = SCI1_receive(); 
    if(data_receive!='\r') 
    { 
        data_r[datasp]=data_receive; 
        datasp+=1;                  //记录已经接收到的数据的个数 
    }  
    else  
    { 
        number=datasp; 
        datasp=0; 
    } 
     
} 
#pragma CODE_SEG DEFAULT 
 
 
/*************************************************************/ 
/*                         主函数                            */ 
/*************************************************************/ 
void main(void) { 
  DisableInterrupts; 
  INIT_PLL(); 
  initialize_ect(); 
  INIT_PORT(); 
  INIT_SCI0(); 
  INIT_SCI1(); 
  INIT_485(); 
  LEDCPU_dir=1; 
  LEDCPU=0; 
  EnableInterrupts; 
   
 
  for(;;)  
  { 
     delay1ms(1000); 
     for(k=0;k<8;k++) 
         SCI0_send(dat_send[k]); 
     if(number!=0)  
     { 
         lcd_clear(); 
         lcd_string(0,0,xianshi[0]); 
         lcd_string(1,0,xianshi[1]); 
         play_data(); 
         number=0; 
     } 
  }  
}