我的源码库:

来源:互联网 发布:河南云和数据 编辑:程序博客网 时间:2024/06/01 09:39

Isetbusclock

 

// PLL初始化子程序   BUS Clock=16M

void setbusclock(void)

{  

   CLKSEL=0X00;    // disengage PLL to system

    PLLCTL_PLLON=1;   // turn on PLL

    SYNR=0x00 | 0x01;  // VCOFRQ[7:6];SYNDIV[5:0]

                        // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)

                        // fPLL= fVCO/(2 × POSTDIV)

                        // fBUS= fPLL/2

                        // VCOCLK Frequency Ranges  VCOFRQ[7:6]

                        // 32MHz <= fVCO <= 48MHz    00

                        // 48MHz <  fVCO <= 80MHz    01

                        // Reserved                  10

                        // 80MHz <  fVCO <= 120MHz   11   

    REFDV=0x80 | 0x01;  // REFFRQ[7:6];REFDIV[5:0]

                        // fREF=fOSC/(REFDIV + 1)

                        // REFCLK Frequency Ranges  REFFRQ[7:6]

                        // 1MHz <= fREF <=  2MHz       00

                        // 2MHz <  fREF <=  6MHz       01

                        // 6MHz <  fREF <= 12MHz       10

                        // fREF >  12MHz               11                        

                        // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;

    POSTDIV=0x00;       // 4:0, fPLL= fVCO/(2xPOSTDIV)

                        // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).

    _asm(nop);          // BUS CLOCK=16M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;          //engage PLL to system;

}

 

IIsetbusclock

void Dly_ms(int ms)

{

   int ii,jj;

   if (ms<1) ms=1;

   for(ii=0;ii<ms;ii++)

     for(jj=0;jj<2670;jj++);    //busclk:16MHz--1ms

}

 

III SCI查询

static void SCI_Init(void)

{

    SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable

    SCI0BDH=0x00; //busclk  8MHz,19200bps,SCI0BDL=0x1a

    SCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)                  

                  //busclk 16MHz, 9600bps,SCI0BDL=0x68                  

}                

void uart_putchar(unsigned char ch)

{

  if (ch == '/n') 

  {

      while(!(SCI0SR1&0x80)) ;    

      SCI0DRL= 0x0d;            //output'CR'

     return;

  }

  while(!(SCI0SR1&0x80)) ;       //keep waiting when not empty 

  SCI0DRL=ch;

}

 

void putstr(char ch[])

{

  unsigned char ptr=0;

  while(ch[ptr]){

      uart_putchar((unsigned char)ch[ptr++]);

  }

 

//putstr("/nLongQiu s.&t. Co. Ltd.");   

//  putstr("/nhttp://shop36265907.taobao.com"); 

 

 //接收为中断模式

unsigned char uart_getkey(void)

{ 

   byte res=0;

   while(!(SCI0SR1&0x80)) ;    //keep waiting when not empty 

   return (SCI0DRL);

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 20  SCI0_ISR(void)

{    

  SCI0CR2_RIE=0;

  //此处为串口中断需要处理的事情

  uart_putchar(uart_getkey());

  PORTA_PA0=~PORTA_PA0;

  SCI0CR2_RIE = 1;   

}

IVRTI

    static void RTI_Init(void)

{              

    RTICTL=0x77;   //8x2^16 =>32,75ms,30.5175Hz                    

    //CRGINT=0X80;   //enable RTI Interrupt

    CRGINT=0X80;   //enable RTI Interrupt

}

 

void interrupt 7 RTI_ISR(void) {   // 32.75ms timer overflow  

  ++u32_time_cnt;        

  PORTB_PB2=~PORTB_PB2;

  CRGFLG|=0X80;//Write 1 to clear RTIF bit  

}

 

VPort_Init

static void Port_Init(void)

{ 

    DDRA = 0xff; 

    PORTA= 0x00;         

    DDRB = 0xff;  //LED  PTB0--7,

    PORTB= 0xff;  //LEDs off 

}

 

VIAD

void AD_Init(void)

{ 

 

  ATD0CTL1=0x00;   //7:1-外部触发,65:00-8位精度,4:放电,3210:ch

  ATD0CTL2=0x40;   //禁止外部触发, 中断禁止   

  ATD0CTL3=0xa0;   //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转   

  ATD0CTL4=0x01;   //765:采样时间为4AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]

  ATD0CTL5=0x30;   //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样

  ATD0DIEN=0x00;   //禁止数字输入

}

 

byte ReadATD(byte ch)

{

  byte ad=0; 

  while(!ATD0STAT0_SCF);

  switch(ch)

  {

    default:

    case 0:

      ad= ATD0DR0L;

    break;

    case 1:

      ad= ATD0DR1L;

    break;

    case 2:

      ad= ATD0DR2L;

    break;

    case 3:

      ad= ATD0DR3L;

    break;

    case 4:

      ad= ATD0DR4L;

    break;

    case 5:

      ad= ATD0DR5L;

    break;

    case 6:

      ad= ATD0DR6L;

    break;

    case 7:

      ad= ATD0DR7L;

    break;  

  }

  return ad;

}

 

////

value=ReadATD(0) *100/51;//参考电压5V, 500/255