📄 can
字号:
C51 COMPILER V8.02 串口接收1602 04/07/2011 22:20:23 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 串口接收1602
OBJECT MODULE PLACED IN 串口接收1602.OBJ
COMPILER INVOKED BY: C:\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 V8.02 串口接收1602 04/07/2011 22:20:23 PAGE 2
56 * 名称 : enable(uchar del)
57 * 功能 : 1602命令函数
58 * 输入 : 输入的命令值
59 * 输出 : 无
60 ***********************************************************************/
61
62 void enable(uchar del)
63 {
64 1 P0 = del;
65 1 RS = 0;
66 1 RW = 0;
67 1 E = 0;
68 1 delay();
69 1 E = 1;
70 1 delay();
71 1 }
72
73 /********************************************************************
74 * 名称 : write(uchar del)
75 * 功能 : 1602写数据函数
76 * 输入 : 需要写入1602的数据
77 * 输出 : 无
78 ***********************************************************************/
79
80 void write(uchar del)
81 {
82 1 P0 = del;
83 1 RS = 1;
84 1 RW = 0;
85 1 E = 0;
86 1 delay();
87 1 E = 1;
88 1 delay();
89 1 }
90
91 /********************************************************************
92 * 名称 : L1602_init()
93 * 功能 : 1602初始化,请参考1602的资料
94 * 输入 : 无
95 * 输出 : 无
96 ***********************************************************************/
97 void L1602_init(void)
98 {
99 1 enable(0x01);
100 1 enable(0x38);
101 1 enable(0x0c);
102 1 enable(0x06);
103 1 enable(0xd0);
104 1 }
105
106 /********************************************************************
107 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
108 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
109 L1602_char(1,5,'b')
110 * 输入 : 行,列,需要输入1602的数据
111 * 输出 : 无
112 ***********************************************************************/
113 void L1602_char(uchar hang,uchar lie,char sign)
114 {
115 1 uchar a;
116 1 if(hang == 1) a = 0x80;
117 1 if(hang == 2) a = 0xc0;
C51 COMPILER V8.02 串口接收1602 04/07/2011 22:20:23 PAGE 3
118 1 a = a + lie - 1;
119 1 enable(a);
120 1 write(sign);
121 1 }
122
123 /********************************************************************
124 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
125 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
126 L1602_string(1,5,"ab cd ef;")
127 * 输入 : 行,列,需要输入1602的数据
128 * 输出 : 无
129 ***********************************************************************/
130 void L1602_string(uchar hang,uchar lie,uchar *p)
131 {
132 1 uchar a;
133 1 if(hang == 1) a = 0x80;
134 1 if(hang == 2) a = 0xc0;
135 1 a = a + lie - 1;
136 1 enable(a);
137 1 while(1)
138 1 {
139 2 if(*p == '\0') break;
140 2 write(*p);
141 2 p++;
142 2 }
143 1 }
144
145 /********************************************************************
146 * 名称 : Com_Int()
147 * 功能 : 串口中断子函数
148 * 输入 : 无
149 * 输出 : 无
150 ***********************************************************************/
151 void Com_Int(void) interrupt 4
152 {
153 1 EA = 0;
154 1 if(RI == 1) //当硬件接收到一个数据时,RI会置位
155 1 {
156 2 LED_Buffer[com_dat] = SBUF; //把从串口读出的数存到数组
157 2 RI = 0;
158 2 com_dat++;
159 2 if(com_dat == 16) com_dat = 0; //当com_dat = 16时,清0,防止数组溢出
160 2 }
161 1 EA = 1;
162 1 }
163
164 /********************************************************************
165 * 名称 : Com_Init()
166 * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
167 * 输入 : 无
168 * 输出 : 无
169 ***********************************************************************/
170 void Com_Init(void)
171 {
172 1 TMOD = 0x20; //定时器工作在定时器1的方式2
173 1 PCON = 0x00; //不倍频
174 1 SCON = 0x50; //串口工作在方式1,并且启动串行接收
175 1 TH1 = 0xFd; //设置波特率 9600
176 1 TL1 = 0xFd;
177 1 TR1 = 1; //启动定时器1
178 1 ES = 1; //开串口中断
179 1 EA = 1; //开总中断
C51 COMPILER V8.02 串口接收1602 04/07/2011 22:20:23 PAGE 4
180 1 }
181
182 /********************************************************************
183 * 名称 : Main()
184 * 功能 : 主函数
185 * 输入 : 无
186 * 输出 : 无
187 ***********************************************************************/
188 void Main()
189 {
190 1 uchar i = 0, com_dat = 0;
191 1 L1602_init();
192 1 Delay(100);
193 1 Com_Init();
194 1 P2 = 0x00;
195 1 while(1)
196 1 {
197 2 q = LED_Buffer;
198 2 L1602_string(1,1,q);
199 2 com_dat = 0;
200 2 Delay(100);
201 2 }
202 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 300 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 2
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 + -