📄 comint.lst
字号:
C51 COMPILER V6.12 COMINT 09/11/2005 10:58:55 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE COMINT
OBJECT MODULE PLACED IN E:\C51PRJ\COMINT\COMINT.OBJ
COMPILER INVOKED BY: d:\keil\c51\BIN\C51.EXE E:\C51PRJ\COMINT\COMINT.C DB SB OE
stmt level source
1 /****************************************************************************/
2 /* */
3 /* Copyright (c) 2005, 老树工作室 */
4 /* All rights reserved. */
5 /* */
6 /* http://www.saintone.net Email:hxm0902@163.com */
7 /* QQ:112431149 Tel:010-62966630 */
8 /* */
9 /****************************************************************************/
10 /****************************************************************************/
11 /* 文件名:comint.c */
12 /* 版 本:Version 1.0 */
13 /* 描 述:串行口中断演示代码 */
14 /* */
15 /* 作 者:spot */
16 /* 函 数: */
17 /* ext1_int_proc */
18 /* system_init */
19 /* */
20 /* 历史记录: */
21 /* spot 2005-07-10 Creat Inital version. (Version 1.0) */
22 /****************************************************************************/
23
24 #include <reg52.h>
25 #include <absacc.h>
26 #include <intrins.h>
27 #include <string.h>
28
29 #define MAX_RINTL 8 /* 串口接收缓冲区长度 */
30 typedef unsigned char u_char;
31 typedef unsigned int u_int;
32 u_char data pint_buf[MAX_RINTL]; /* 串口接收缓冲区 */
33 u_char data pint_read; /* 串口缓冲区读指针 */
34 u_char data pint_write; /* 串口缓冲区写指针 */
35 u_char data psend_int; /* 串口发送允许标志 */
36
37 char str_test[25] = "MCS51 COM INTERRUPT:";
38 char str_hello[10] = "HELLO";
39 char str_world[10] = "WORLD";
40
41 /* 串口中断服务程序,使用第3组寄存器 */
42 void com_int_proc(void) interrupt 4 using 3
43 {
44 1 u_char temp;
45 1 u_char temp1;
46 1
47 1 if (TI == 1) /* 是发送中断 */
48 1 {
49 2 TI = 0;
50 2 psend_int = 1; /* 可以发送 */
51 2 }
52 1
53 1 if (RI == 1) /* 是接收中断 */
54 1 {
55 2 RI = 0; /* 清串口接收中断 */
C51 COMPILER V6.12 COMINT 09/11/2005 10:58:55 PAGE 2
56 2 temp1 = SBUF;
57 2 temp = pint_write + 1; /* 判断是否可以写入 */
58 2 if (temp == MAX_RINTL)
59 2 {
60 3 temp=0;
61 3 }
62 2
63 2 if (temp != pint_read)
64 2 {
65 3 pint_buf[pint_write] = temp1; /* 读取数据 */
66 3 pint_write = temp;
67 3 }
68 2 }
69 1 }
70
71 /* 串口发送一个字节 */
72 void com_send_command(char onebyte)
73 {
74 1 psend_int = 0;
75 1 SBUF = onebyte;
76 1 while (psend_int != 1);
77 1 }
78
79 /* 串口接收数据处理 */
80 void com_command_receive(void)
81 {
82 1 u_char var1,var2;
83 1 u_char i;
84 1
85 1 var2 = pint_read;
86 1 if (var2 != pint_write)
87 1 {
88 2 var1=pint_buf[var2];
89 2 var2=var2+1;
90 2
91 2 if (var2 >= MAX_RINTL)
92 2 var2=0;
93 2
94 2 pint_read=var2;
95 2
96 2 if (var1 == 0x0A) /* 收到0x0A */
97 2 {
98 3 for (i=0; i<strlen(str_hello); i++)
99 3 {
100 4 com_send_command(str_hello[i]); /* 发送字符串HELLO */
101 4 }
102 3 com_send_command(0x0D);
103 3 return;
104 3 }
105 2 if (var1 ==0x0D) /* 收到0x0D */
106 2 {
107 3 for (i=0; i<strlen(str_world); i++)
108 3 {
109 4 com_send_command(str_world[i]); /* 发送字符串WORLD */
110 4 }
111 3 com_send_command(0x0D);
112 3 return;
113 3 }
114 2 }
115 1 }
116 void system_init()
117 {
C51 COMPILER V6.12 COMINT 09/11/2005 10:58:55 PAGE 3
118 1 u_char loop;
119 1
120 1 EA = 0; /* CPU关中断 */
121 1 pint_read = 0; /* 串口缓冲读指针 */
122 1 pint_write = 0; /* 串口缓冲写指针 */
123 1
124 1 SCON = 0x48;
125 1 PCON = 0x80;
126 1 TMOD = 0x20;
127 1 TCON = 0x50;
128 1 TH1 = 0xFD; /* 波特率为19200 */
129 1 TL1 = 0xFD;
130 1 TR1 = 1; /* 定时器1启动计数*/
131 1 ES = 1; /* 串口开中断 */
132 1 PS = 0; /* 串口低优先级 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -