📄 serial.lst
字号:
C51 COMPILER V7.00 SERIAL 10/16/2007 16:20:00 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN Serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Serial.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "Serial.h"
2 #include "STC89C51RC_RD_PLUS.H"
3 //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
4 //出入均设有缓冲区,大小可任意设置。
5 //可供使用的函数名:
6 //char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
7 //*************************************************************************
8 bit m_bSendEnd = 0;
9 #define ILEN 30 /* size of serial receiving buffer */
10 xdata unsigned char inbuf[ILEN];
11 xdata uchar xdata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置
12 xdata uchar xdata *getlast=inbuf; //最后取走的字节位置
13 bit inbufsign; //接收缓冲区非空标志 有=1
14 bit inbufful; //输入缓冲区满标志 满=1
15
16 //#define StateIO StateIO_3
17 //#define bSerialRSLed bSerialRSLed_3
18 //char bdata StateIO _at_ 0x20;
19 //sbit bSerialRSLed = StateIO^5;
20
21 //串口初始化 晶振为11.0592M 方式1 波特率300-57600
22 void InitCom(uchar BaudRate)
23 {
24 1 uchar THTL;
25 1 switch (BaudRate)
26 1 {
27 2 case 1: THTL = 64; break; //波特率300
28 2 case 2: THTL = 160; break; //600
29 2 case 3: THTL = 208; break; //1200
30 2 case 4: THTL = 232; break; //2400
31 2 case 5: THTL = 244; break; //4800
32 2 case 6: THTL = 250; break; //9600
33 2 case 7: THTL = 253; break; //19200
34 2 case 8: THTL = 255; break; //57600
35 2 default: THTL = 208;
36 2 }
37 1
38 1 SCON = 0x50; //串口方式1,允许接收
39 1 TMOD |= 0x20; //定时器1定时方式2
40 1 TCON |= 0x40; //设定时器1开始计数
41 1 TH1 = THTL;
42 1 TL1 = THTL;
43 1 PCON = 0x80; //波特率加倍控制,SMOD位
44 1 RI = 0; //清收发标志
45 1 TI = 0;
46 1 TR1 = 1; //启动定时器
47 1 ES = 1;
48 1 }
49
50 //串口发送
51 void Send(uchar sdata)
52 {
53 1 //bSerialRSLed = 1;
54 1 SBUF = sdata;
55 1 m_bSendEnd = 1;
C51 COMPILER V7.00 SERIAL 10/16/2007 16:20:00 PAGE 2
56 1 while(m_bSendEnd){};
57 1 }
58
59 bit SerialCheck()
60 {
61 1 return inbufsign;
62 1 }
63 //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
64 uchar Getbyte (void)
65 {
66 1 char idata c ;
67 1 while (!inbufsign); //缓冲区空等待
68 1 ES=0;
69 1 c= *getlast; //取数据
70 1 getlast++; //最后取走的数据位置加一
71 1 inbufful=0; //输入缓冲区的满标志清零
72 1 if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
73 1 if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
74 1 ES=1;
75 1 return (c); //取回数据
76 1 }
77
78 //****************************
79 void putinbuf(uchar c)
80 {
81 1 ES=0;
82 1 if(!inbufful)
83 1 {
84 2 *inlast= c; //放入数据
85 2 inlast++; //最后放入的位置加一
86 2 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
87 2 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
88 2 inbufsign=1;
89 2 }
90 1 ES=1;
91 1 }
92
93 xdata unsigned long IspReset = 0;
94 //串行中断程序
95 void int_s(void) interrupt 4 {
96 1 if (TI )
97 1 {
98 2 TI = m_bSendEnd = 0;
99 2 }
100 1 if (RI)
101 1 {
102 2 //bSerialRSLed = 1;
103 2 RI = 0;
104 2 //---ISP重启
105 2 if(SBUF == 0x12)
106 2 {
107 3 IspReset = 0;
108 3 }
109 2 IspReset += SBUF;
110 2 if(SBUF == 0x78&&IspReset == 0x114)
111 2 {
112 3 unsigned long j;
113 3 for(j=0;j<60000;j++);for(j=0;j<60000;j++);
114 3 ISP_CONTR = 0x60;
115 3 }
116 2 //-----------------------------------------------
117 2 if(!inbufful)
C51 COMPILER V7.00 SERIAL 10/16/2007 16:20:00 PAGE 3
118 2 {
119 3 *inlast= SBUF; //放入数据
120 3 inlast++; //最后放入的位置加一
121 3 inbufsign=1;
122 3 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
123 3 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
124 3 }
125 2 }
126 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 630 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 38 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
IDATA SIZE = ---- 1
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -