#include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12xdp512" #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) {/*对sci初始化时要最少以以下的三步构成*/ /*第一步定义波特率Bt:在定义的时候先低位(SCI0BDL)后高位(SCI0BDH)*/ /*第二步写控制字到sci控制寄存器1sci0cr1,若取值为0000000,表示允许sci、正常输出、8位数据、无校验 */ /*写控制字到寄存器2(SCI0CR2)若值是00001100,表示允许发送(TE=1)、允许接收(RE=1)、查询方式收发*/ /* put your own code here */ MCU_CLK_Init(); SCI0CR2=SCI_Enable;//接收中断允许 SCI0BD=Baud9600; DDRB=0XFF; PORTB=0XFF; asm cli asm bra * EnableInterrupts; for(;;) { } } void put_char (char c) {//发送数据是通过判断状态寄存器SCI0SR1的第7位(TDRE) //接收数据是通过判断状态寄存器SCI0SR1的第5位(RDRF) while((SCI0SR1 & 0X80)==0);//SCI0SR1的loops置0,正常模式,即当SCI0SR1.7=0时,等待 SCI0DRL=c;// SCI0SR1.7=1时,发送数据将c一字节输入数据缓冲区SCI0DRL(先低后 //高) } interrupt void get_char(void){ asm LDAA SCI0SR1 //读状态寄存器 put_char(SCI0DRL);//把数据寄存器的值字符做为实参 PORTB=SCI0DRL; //读数据寄存器 put_char(0x20);//输出完一个字符后跟着输出一个空格 } typedef void (*near tLsrFunc)(void); const tLsrFunc _vect[] @0xFFD6={ get_char };