📄 serial.lst
字号:
C51 COMPILER V7.10 SERIAL 07/01/2005 09:26:56 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: D:\PROGRAM FILES\KEIL\C51\BIN\C51.EXE serial.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 //**********************************************************************************
2 //本函数模块来自"51单片机世界",作者版主丁丁(聂小猛)。
3 //主页地址http://www.mcu51.com
4 //本程序为本站推出的"MCU51-63K仿真器"及"DX-51多功能试验板"而设计的,详情请到本站查看.
5 //"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途
6 //**********************************************************************************
7 //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
8 //串口输入设有缓冲区,大小可任意设置。
9 //可供使用的函数名:
10 /*
11 extern char getbyte(void);//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
12 extern putbyte(char c);//放入一个字节到发送缓冲区
13 extern putstring(uchar *puts);//发送一个字符串到串口
14 extern puthex(uchar c);//发送一个字节的hex码,分成两个字节发。
15 extern bit inbufsign;
16 #define CR putstring("\r\n")//发送一个回车换行
17 extern void serial_init (void);
18 extern putint(uint n);
19 */
20
21 //*************************************************************************
22 #include <reg52.h>
23 #define uchar unsigned char
24 #define uint unsigned int
25
26 #define ILEN 16 //32 //设置串口中断接收缓冲区大小
27 idata uchar inbuf[ILEN];
28 data uchar idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置
29 data uchar idata *getlast=inbuf; //最后取走的字节位置
30 bit inbufsign; //接收缓冲区非空标志 有=1
31 bit inbufful; //输入缓冲区满标志 满=1
32 #define CR putstring("\r\n") //CR=回车换行
33
34 //*****************************
35 //放入一个字节到发送缓冲区
36 putbyte(unsigned char c)
37 {
38 1 SBUF=c;
39 1 while(!TI);TI=0;
40 1 }
41
42 //***************************************
43 //发送一个定义在程序存储区的字符串到串口
44 putstring(uchar *puts)
45 {
46 1 for(;*puts!=0;puts++) //遇到停止符0结束
47 1 putbyte(*puts);
48 1 }
49 //*************************************
50 //发送一个字节的hex码,分成两个字节发。
51 uchar code hex_[]={"0123456789ABCDEF"};
52 puthex(unsigned char c)
53 {
54 1 int ch;
55 1 ch=(c>>4)&0x0f;
C51 COMPILER V7.10 SERIAL 07/01/2005 09:26:56 PAGE 2
56 1 putbyte(hex_[ch]);
57 1 ch=c&0x0f;
58 1 putbyte(hex_[ch]);
59 1 }
60 //*************************************
61 //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
62 uchar getbyte (void)
63 {
64 1 char idata c ;
65 1 while (!inbufsign); //缓冲区空等待
66 1 ES=0;
67 1 c= *getlast; //取数据
68 1 getlast++; //最后取走的数据位置加一
69 1 inbufful=0; //输入缓冲区的满标志清零
70 1 if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
71 1 if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
72 1 ES=1;
73 1 return (c); //取回数据
74 1 }
75 /*
76 //*************************
77 //以十进制的形式输出一个整型数到串口
78 putint(uint n)
79 {
80 uchar i[6];
81 i[0]=0x30+n/10000;
82 i[1]=0x30+(n%10000)/1000;
83 i[2]=0x30+(n%1000)/100;
84 i[3]=0x30+(n%100)/10;
85 i[4]=0x30+n%10;
86 i[5]=0;
87 putstring(i);
88 }
89
90 //*********************
91 //模拟接收到一个字符,
92 putinbuf(uchar c)
93 {ES=0; if(!inbufful)
94 {*inlast= c;
95 inlast++;
96 if (inlast==inbuf+ILEN) inlast=inbuf;
97 if (inlast==getlast) inbufful=1;
98 inbufsign=1;
99 }
100 ES=1;
101 }
102 */
103 //*****************************************
104 //串口中断处理
105
106 serial () interrupt 4
107 {
108 1 if (RI)
109 1 {
110 2 RI = 0;
111 2 if(!inbufful)
112 2 {
113 3 *inlast= SBUF; //放入数据
114 3 inlast++; //最后放入的位置加一
115 3 inbufsign=1;
116 3 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
117 3 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
C51 COMPILER V7.10 SERIAL 07/01/2005 09:26:56 PAGE 3
118 3 }
119 2 }
120 1 }
121
122 //*****************************
123 //串口初始化 11.0592M: 0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200 110592
124 void serial_init (void)
125 {
126 1 //用t1作波特率
127 1
128 1 SCON = 0x50; // mode 1: 8-bit UART, enable receiver
129 1 TMOD |= 0x21; // timer 1 mode 2: 8-Bit reload th0 1X16
130 1 PCON |= 0x80;
131 1 TH1 = 0xfd;//fa, //baud*2 /* reload value 19200 baud
132 1 TR1 = 1; // timer 1 run
133 1
134 1 //用t2作波特率
135 1 /*
136 1 T2CON=0x30;
137 1 RCAP2H=0xFF;
138 1 RCAP2L=0xb8;//70=4800,b8=9600,dc=19200,ee=38400,f4=57600,fa=115200
139 1 TR2=1;ET2=1;
140 1 SCON=0x50;//SCON=0xd0;
141 1 */
142 1
143 1 ES = 1;
144 1 REN=1;
145 1 EA=1;
146 1 SM2=1; //SM2=1时收到的第9位为1才置位RI标志
147 1
148 1 }
149
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 162 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = 16 1
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -