中级会员
- 积分
- 283
- 威望
- 163
- 贡献
- 80
- 兑换币
- 98
- 注册时间
- 2013-10-16
- 在线时间
- 20 小时
- 毕业学校
- 中山大学
|
2#
楼主 |
发表于 2014-3-25 19:26:45
|
只看该作者
#include "derivative.h"
#include "LQprintp.h"
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 20 SCI0_ISR(void) // 中断程序
{
SCI0CR2_RIE=0;
//此处为串口中断需要处理的事情
uart_putchar(uart_getkey());
PORTB_PB2=~PORTB_PB2;
SCI0CR2_RIE = 1; //接收器完全中断使能位,等于1时,可以产生中断
}
//-----------------------------------------------------
void setbusclock(void)
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL(PLL通过REFDV(CRG参考分频寄存器? 和SYNR(CRG合成寄存器)来设置)
SYNR=0x40 | 0x09; // 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=0x40 | 0x00; // 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;
}
//-----------------------------------------------------
static void SCI_Init(void)
{
SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable
SCI0BDH=0x01; //出口波特率为9600
SCI0BDL=0x04; //SCI0BDL=busclk/(16*SCI0BDL)
//busclk 8MHz, 9600bps,SCI0BDL=0x34(3*16+4=52) 8*1000000/(16*52)=9600
//busclk 16MHz, 9600bps,SCI0BDL=0x68
//busclk 24MHz, 9600bps,SCI0BDL=0x9C
} //busclk 32MHz, 9600bps,SCI0BDL=0xD0
//-----------------------------------------------------
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主要是为了延时1ms
}
void main(void){
byte LedCnt=0;
setbusclock();
SCI_Init();
DDRB=0xFF;
PUCR_PUPBE=1; // 使能B端口上拉电阻
EnableInterrupts;
for(;;)
{
LedCnt=(LedCnt>0XFE?0:++LedCnt);
Dly_ms(1000); //修改延时以修改数据发送频率
//低电平灯亮用这句,注释掉下面那句
PORTB=~LedCnt;
//高电平灯亮用这句,注释掉上面那句
//PORTB=LedCnt;
putstr("\n http:/ /shop36265907.taobao.com");
printp("\n Minute elapsed: %03ds",LedCnt);
}
}这个是SCI部分 |
|