#include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12xdp512" void SCI_Int(void); //SCI初始化 void ECT_Init(void);//定时器初始化 unsigned char i; unsigned int j; #define SCI_Enable 0x2c #define Baud9600 0x009c void MCU_CLK_Init(void){ SYNR = 0x02; //时钟合成寄存器 REFDV = 0x01; //时钟分频寄存器 //锁相环产生的时钟频率f=2*foscclk*(SYNR+1)/(REFDV+1) //对于S12dg128 16MHz外部晶体振荡器,总线时钟为24MHz //片内系统时钟为48MHz /*等待锁相环频率锁定*/ while((CRGFLG & 0x08) !=0x08); CLKSEL |= 0x80; //时钟选择寄存器 } void main(void) { asm sei MCU_CLK_Init(); SCI_Int(); ECT_Init(); DDRB=0xff ; PORTB=0x00; i=0; ICSYS=0X03;//启动输入捕捉和脉冲累加保持寄存器 TIOS=0X00; //输入捕捉 PACTL=0X55; //累加模式,脉冲允脚输入为高电平时,允许ECLK/64时钟 //脉冲计入累加器,在下降沿置位PAIF标志,且PAIF置位时申请中断 PAFLG_PAIF=1; //清脉冲累加标志寄存器 asm cli for(;;) { } } void ECT_Init(void){ TSCR2_PR=7; //(111)定时器时钟=总线时钟/128 TFLG2_TOF=1;//清除定时器溢出中断 TSCR2_TOI=0; //禁止溢出中断 TSCR1_TEN=1;//允许定时器正常工作 } void SCI_Int(void){ SCI0CR2=SCI_Enable;//接收和发送允许,接收满中断请求全能 SCI0BD=Baud9600; //波特率设置为9600 } void put_char (char c) //在超级终端上输出 { while (( SCI0SR1 & 0X80) == 0);//发送数据寄存器是否为空 SCI0DRL=c; } __interrupt void get_char(void) //get_char做为中断向量函数 { unsigned char i; while ((SCI0SR1 & 0X20) == 0); //数据寄存器接收的数据是否有效 asm LDAA SCI0SR1 i=SCI0DRL ; put_char(i); put_char(' '); } typedef void (*near tIsrFunc)(void); const tIsrFunc _vect11[] @0xEFD6 = {//串口SCI的向量地址为函数get_char的地址 get_char }; unsigned char htoa(unsigned char ch)//字符转换成ASCII { if(ch<=9) { return(ch+0x30); //0~9 } else { return(ch+0x37); //A~F } } void interrupt yc_ISR(void) { asm sei PAFLG_PAIF=1;//PT7检测到有效边沿时被置位 j=PACN32;//将脉冲累加器A的值赋给j i=j/256; //取出其高位 put_char(htoa(i/16));//将高位的前半部分化成ASCII输出 put_char(htoa(i%16));//将高位的后半部分化成ASCII输出 i=j%256; //取出其低位 put_char(htoa(i/16));//将低位的前半部分化成ASCII输出 put_char(htoa(i%16));//将低位的后半部分化成ASCII输出 put_char(' '); asm cli } const tIsrFunc _vect1[] @0xFFDA = { // 脉冲累加器有效沿中断向量为函数yc_ISR的地址 yc_ISR };