1 /*-------------------------------------------
2 簡單的串口通信
3 -------------------------------------------*/
4 #include
5
6 #define uint unsigned int
7 #define uchar unsigned char
8
9
10 uchar flag,a,i; //標志接收串口中斷標志,接收SBUF內容
11 uchar code table[]="I get ";
12 /*--------------------------------------------
13 延時函數(shù)
14 ---------------------------------------------*/
15 void delay_ms(uint z)
16 {
17 uint y;
18 while(z--)
19 for(y=110;y>0;y--);
20 }
21 /*--------------------------------------------
22 USAR初始函數(shù)
23 ---------------------------------------------*/
24 void USRT_init()
25 {
26 TMOD=0x20; //設置T1定時器工作方式2
27 TH1=0xfd; //T1定時器裝初值
28 TL1=0xfd;
29 TR1=1; //啟動T1定時器
30 REN=1; //允許串口中斷接收
31 SM0=0; //設定串口工作方式
32 SM1=1;
33 EA=1; //開總中斷
34 ES=1; //開串口中斷
35 }
36 /*--------------------------------------------
37 串口中斷程序
38 ---------------------------------------------*/
39 void ser()interrupt 4
40 {
41 RI=0;
42 a=SBUF;
43 flag=1;
44 }
45 /*--------------------------------------------
46 主函數(shù)
47 ---------------------------------------------*/
48 void main()
49 {
50 USRT_init();
51 while(1)
52 {
53 if(flag==1) //檢測到串口中斷。表示有數(shù)據(jù)傳過來了
54 {
55 ES=0; //關閉串口中斷,接下來要發(fā)送數(shù)據(jù),如果不關閉每次發(fā)送之后串口中斷都會執(zhí)行又進入if(flag==1)那里,然后死循環(huán)
56 for(i=0;i<6;i++) //將table[]中的前6個發(fā)送出去
57 {
58 SBUF=table[i];
59 while(!TI); //每次等待發(fā)送完畢,再執(zhí)行下一條
60 TI=0; //手動清0
61 }
62 SBUF=a; //將收到的數(shù)據(jù)發(fā)送出去
63 while(!TI);
64 TI=0;
65 ES=1;
66 flag=0;
67 }
68 }
69 }