📄 serial.lst
字号:
C51 COMPILER V7.00 SERIAL 08/18/2007 19:53:32 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 ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "Serial.h"
2
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^7;
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 //P2_6 = 0;
55 1 SBUF = sdata;
C51 COMPILER V7.00 SERIAL 08/18/2007 19:53:32 PAGE 2
56 1 m_bSendEnd = 1;
57 1 while(m_bSendEnd){};
58 1 }
59
60 bit SerialCheck()
61 {
62 1 return inbufsign;
63 1 }
64 //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
65 uchar Getbyte (void)
66 {
67 1 char idata c ;
68 1 while (!inbufsign); //缓冲区空等待
69 1 ES=0;
70 1 c= *getlast; //取数据
71 1 getlast++; //最后取走的数据位置加一
72 1 inbufful=0; //输入缓冲区的满标志清零
73 1 if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
74 1 if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
75 1 ES=1;
76 1 return (c); //取回数据
77 1 }
78
79 //****************************
80 void putinbuf(uchar c)
81 {
82 1 ES=0;
83 1 if(!inbufful)
84 1 {
85 2 *inlast= c; //放入数据
86 2 inlast++; //最后放入的位置加一
87 2 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
88 2 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
89 2 inbufsign=1;
90 2 }
91 1 ES=1;
92 1 }
93
94 xdata WORD IspReset = 0;
95 //串行中断程序
96 void int_s(void) interrupt 4 {
97 1 if (TI )
98 1 {
99 2 TI = m_bSendEnd = 0;
100 2 //P2_6 = 1;
101 2 }
102 1 if (RI)
103 1 {
104 2 bSerialRSLed = 1;
105 2 RI = 0;
106 2 //---ISP重启
107 2 if(SBUF == 0x12)
108 2 {
109 3 IspReset = 0;
110 3 }
111 2 IspReset += SBUF;
112 2 if(SBUF == 0x78&&IspReset == 0x114)
113 2 {
114 3 WORD j;
115 3 for(j=0;j<60000;j++);for(j=0;j<20000;j++);
116 3 ISP_CONTR = 0x60;
117 3 }
C51 COMPILER V7.00 SERIAL 08/18/2007 19:53:32 PAGE 3
118 2 //-----------------------------------------------
119 2 if(!inbufful)
120 2 {
121 3 *inlast= SBUF; //放入数据
122 3 inlast++; //最后放入的位置加一
123 3 inbufsign=1;
124 3 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
125 3 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
126 3 }
127 2 }
128 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 545 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 36 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
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 + -