📄 串口接收1602.lst
字号:
C51 COMPILER V7.50 串口接收1602 04/10/2009 19:11:40 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 串口接收1602
OBJECT MODULE PLACED IN 串口接收1602.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE 串口接收1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 * 文件名 : 串口接收试验.c
3 * 描述 : 该程序从串口接收数据,通过LCD显示数据。在LCD的第一行显示出来,
4 当数据过多时(超过16个字符),LCD第一行将会被覆盖。
5 该试验使用的晶振是11.0592,如果使用12M晶振,会出现串口接收
6 不正常的情况。原因是用12M晶振,波特率9600时的误差率达 8%。
7 * 创建人 : 东流,2009年4月8日
8 * 版本号 : 2.0
9 * 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
10 * 感谢“中国自动化资讯网”对本工作室的大力支持。
11 ***********************************************************************/
12 #include<reg52.h>
13 #include<intrins.h>
14
15 #define uchar unsigned char
16 #define uint unsigned int
17
18 /*LED_Buffer[16]用来存储串口发送的数据,com_dat用来记录串口发送的个数*/
19 uchar LED_Buffer[16], *q, com_dat; //从串口接收的数据
20
21 //这三个引脚参考资料
22 sbit E=P2^7; //1602使能引脚
23 sbit RW=P2^6; //1602读写引脚
24 sbit RS=P2^5; //1602数据/命令选择引脚
25
26 /********************************************************************
27 * 名称 : Delay(uint del)
28 * 功能 : 延时10ms * del
29 * 输入 : 无
30 * 输出 : 无
31 ***********************************************************************/
32 void Delay(uint del)
33 {
34 1 uint i,j;
35 1 for(i=0; i<del; i++)
36 1 for(j=0; j<1827; j++)
37 1 ;
38 1 }
39
40 /********************************************************************
41 * 名称 : delay()
42 * 功能 : 延时,延时时间大概为140US。
43 * 输入 : 无
44 * 输出 : 无
45 ***********************************************************************/
46
47 void delay()
48 {
49 1 int i,j;
50 1 for(i=0;i<=10;i++)
51 1 for(j=0;j<=2;j++)
52 1 ;
53 1 }
54
55 /********************************************************************
C51 COMPILER V7.50 串口接收1602 04/10/2009 19:11:40 PAGE 2
56 * 名称 : Convert(uchar In_Date)
57 * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
58 * 输入 : 1602资料上的值
59 * 输出 : 送到1602的值
60 ***********************************************************************/
61 uchar Convert(uchar In_Date)
62 {
63 1 uchar i, Out_Date = 0, temp = 0;
64 1 for(i=0; i<8; i++)
65 1 {
66 2 temp = (In_Date >> i) & 0x01;
67 2 Out_Date |= (temp << (7 - i));
68 2 }
69 1 return Out_Date;
70 1 }
71 /********************************************************************
72 * 名称 : enable(uchar del)
73 * 功能 : 1602命令函数
74 * 输入 : 输入的命令值
75 * 输出 : 无
76 ***********************************************************************/
77
78 void enable(uchar del)
79 {
80 1 P0 = Convert(del);
81 1 RS=0;
82 1 RW=0;
83 1 E=0;
84 1 delay();
85 1 E=1;
86 1 delay();
87 1 }
88
89 /********************************************************************
90 * 名称 : write(uchar del)
91 * 功能 : 1602写数据函数
92 * 输入 : 需要写入1602的数据
93 * 输出 : 无
94 ***********************************************************************/
95
96 void write(uchar del)
97 {
98 1 P0 = Convert(del);
99 1 RS=1;
100 1 RW=0;
101 1 E=0;
102 1 delay();
103 1 E=1;
104 1 delay();
105 1 }
106
107 /********************************************************************
108 * 名称 : L1602_init()
109 * 功能 : 1602初始化,请参考1602的资料
110 * 输入 : 无
111 * 输出 : 无
112 ***********************************************************************/
113 void L1602_init(void)
114 {
115 1 enable(0x01);
116 1 enable(0x38);
117 1 enable(0x0c);
C51 COMPILER V7.50 串口接收1602 04/10/2009 19:11:40 PAGE 3
118 1 enable(0x06);
119 1 enable(0xd0);
120 1 }
121
122 /********************************************************************
123 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
124 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
125 L1602_char(1,5,'b')
126 * 输入 : 行,列,需要输入1602的数据
127 * 输出 : 无
128 ***********************************************************************/
129 void L1602_char(uchar hang,uchar lie,char sign)
130 {
131 1 uchar a;
132 1 if(hang==1) a=0x80;
133 1 if(hang==2) a=0xc0;
134 1 a=a+lie-1;
135 1
136 1 enable(a);
137 1
138 1 write(sign);
139 1 }
140
141 /********************************************************************
142 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
143 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
144 L1602_string(1,5,"ab cd ef;")
145 * 输入 : 行,列,需要输入1602的数据
146 * 输出 : 无
147 ***********************************************************************/
148 void L1602_string(uchar hang,uchar lie,uchar *p)
149 {
150 1 uchar a;
151 1 if(hang==1) a=0x80;
152 1 if(hang==2) a=0xc0;
153 1 a=a+lie-1;
154 1
155 1 enable(a);
156 1 while(1)
157 1 {
158 2 if(*p=='\0') break;
159 2 write(*p);
160 2 p++;
161 2 }
162 1 }
163
164 /********************************************************************
165 * 名称 : Main()
166 * 功能 : 主函数
167 * 输入 : 无
168 * 输出 : 无
169 ***********************************************************************/
170
171
172 /********************************************************************
173 * 名称 : Com_Int()
174 * 功能 : 串口中断子函数
175 * 输入 : 无
176 * 输出 : 无
177 ***********************************************************************/
178 void Com_Int(void) interrupt 4
179 {
C51 COMPILER V7.50 串口接收1602 04/10/2009 19:11:40 PAGE 4
180 1 EA = 0;
181 1 if(RI == 1) //当硬件接收到一个数据时,RI会置位
182 1 {
183 2 LED_Buffer[com_dat] = SBUF; //把从串口读出的数存到数组
184 2 RI = 0;
185 2 com_dat++;
186 2 if(com_dat == 16) com_dat = 0; //当com_dat = 16时,清0,防止数组溢出
187 2 }
188 1 EA = 1;
189 1 }
190
191 /********************************************************************
192 * 名称 : Com_Init()
193 * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
194 * 输入 : 无
195 * 输出 : 无
196 ***********************************************************************/
197 void Com_Init(void)
198 {
199 1 TMOD = 0x20;
200 1 PCON = 0x00;
201 1 SCON = 0x50;
202 1 TH1 = 0xFd; //设置波特率 9600
203 1 TL1 = 0xFd;
204 1 TR1 = 1; //启动定时器1
205 1 ES = 1; //开串口中断
206 1 EA = 1; //开总中断
207 1 }
208
209 /********************************************************************
210 * 名称 : Main()
211 * 功能 : 主函数
212 * 输入 : 无
213 * 输出 : 无
214 ***********************************************************************/
215 void Main()
216 {
217 1 uchar i = 0, com_dat = 0;
218 1 L1602_init();
219 1 Delay(100);
220 1 Com_Init();
221 1 P2 = 0x00;
222 1 while(1)
223 1 {
224 2 q = LED_Buffer;
225 2 L1602_string(1,1,q);
226 2 com_dat = 0;
227 2 Delay(100);
228 2 }
229 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 365 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 5
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -