1 #include<p18f6393.h>
2
3 #define uchar unsigned char
4 #define uint unsigned int
5
6 //函数声明
7 void osc_init();//时钟初始化
8 void uart_inter_init();//串口初始化
9 void InterruptHandlerHigh();//中断函数
10
11
12 //时钟初始化,选择内部时钟
13 void osc_init()
14 {
15 OSCTUNE = 0x8f;//选择内部振荡器来源为8M INTOSC,最高频率8M
16 OSCCON = 0xff;//内部8M时钟,OSC2输出Fosc/4
17 }
18
19
20 //串口初始化
21 void uart_inter_init()
22 {
23 //发送部分初始化
24 TRISCbits.RC6=1;
25 TRISCbits.RC7=1;
26 RCSTA1bits.SPEN=1;//此位置1,将TX1和RX1设置为CK1(时钟)和DT1(数据)线
27
28 TXSTA1bits.CSRC=1;//主控模式
29 TXSTA1bits.SYNC=1;//同步模式
30
31 //PIE1bits.TXIE=1;//如需要,则将此位置1
32
33 BAUDCON1bits.SCKP=0;//空闲状态时钟为低电平
34 BAUDCON1bits.BRG16=0;//8位波特率发生器,仅SPBRG1
35
36 SPBRG1 =0xcf;//设置传输波特率设置为9600bps,
37 //8Mhz OSC 9600=FOSC/(4([SPBRG1] + 1)),
38 //SPBRG1=207 11101111
39 TXSTA1bits.TXEN=1;//使能发送
40
41 //接收部分初始化
42 RCSTA1bits.SREN=0;//清零SREN
43 RCSTA1bits.CREN=0;//清零CREN
44 //若SREN和CREN均被置1,则CREN具有优先权
45 //RCSTA1bits.SREN=1;//置1 SREN
46 RCSTA1bits.CREN=1;//置1 CREN
47 //若SREN和CREN均被置1,则CREN具有优先权
48
49 PIE1bits.RCIE=1;//若需要中断,将此位置1,接收完后将产生一个中断
50
51 //INTCONbits.GIE=1;
52 //INTCONbits.PEIE=1;//若要使用中断,确保此两位为1
53 }
54
55 #pragma code InterruptVectorHigh=0x08//高优先级中断向量
56 void InterruptVectorHigh(void)
57 {
58 _asm
59 goto InterruptHandlerHigh //跳到中断程
60 _endasm
61 }
62
63 //高优先级中断服务程序
64 #pragma code
65 #pragma interrupt InterruptHandlerHigh
66 void InterruptHandlerHigh ()
67 {
68 while(PIR1bits.RCIF==1) //若接收中断标志不为1,则为误操作,返回
69 {
70 TXREG1=RCREG1; //将接收到的数据放入发送寄存器,并启动发送
71 }
72 }
73
74 void main()
75 {
76 osc_init();
77 uart_init();
78 TXREG1=0x55;////将数据装入TXREG1寄存器,启动发送
79 for(;;);
80 }