?? 串口接收1602.lst
字號:
C51 COMPILER V7.50 串口接收1602 11/05/2010 16:11:41 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 11/05/2010 16:11:41 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 V7.50 串口接收1602 11/05/2010 16:11:41 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 V7.50 串口接收1602 11/05/2010 16:11:41 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 + -