一些51单片机基础模块的程序
源代码在线查看: 温度采集ds18b20lcd.lst
C51 COMPILER V7.50 温度采集DS18B20LCD 04/10/2009 19:54:21 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 温度采集DS18B20LCD
OBJECT MODULE PLACED IN 温度采集DS18B20LCD.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE 温度采集DS18B20LCD.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 * 文件名 : 温度采集DS18B20.c
3 * 描述 : 该文件实现了用温度传感器件DS18B20对温度的采集,并在液晶1602
4 上显示出来。
5 * 创建人 : 东流,2009年4月10日
6 * 版本号 : 2.0
7 * 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
8 * 感谢“中国自动化资讯网”对本工作室的大力支持。
9 ***********************************************************************/
10 #include
11 #define uchar unsigned char
12 #define uint unsigned int
13
14 #define jump_ROM 0xCC
15 #define start 0x44
16 #define read_EEROM 0xBE
17
18 sbit DQ = P3^4; //DS18B20数据口
19
20 unsigned char TMPH,TMPL;
21
22 //这三个引脚参考资料
23 sbit E=P2^7; //1602使能引脚
24 sbit RW=P2^6; //1602读写引脚
25 sbit RS=P2^5; //1602数据/命令选择引脚
26
27 /********************************************************************
28 * 名称 : delay()
29 * 功能 : 延时,延时时间大概为140US。
30 * 输入 : 无
31 * 输出 : 无
32 ***********************************************************************/
33
34 void delay_1()
35 {
36 1 int i,j;
37 1 for(i=0; i 38 1 for(j=0; j 39 1 ;
40 1 }
41
42 /********************************************************************
43 * 名称 : Convert(uchar In_Date)
44 * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
45 * 输入 : 1602资料上的值
46 * 输出 : 送到1602的值
47 ***********************************************************************/
48 uchar Convert(uchar In_Date)
49 {
50 1 uchar i, Out_Date = 0, temp = 0;
51 1 for(i=0; i 52 1 {
53 2 temp = (In_Date >> i) & 0x01;
54 2 Out_Date |= (temp 55 2 }
C51 COMPILER V7.50 温度采集DS18B20LCD 04/10/2009 19:54:21 PAGE 2
56 1 return Out_Date;
57 1 }
58 /********************************************************************
59 * 名称 : enable(uchar del)
60 * 功能 : 1602命令函数
61 * 输入 : 输入的命令值
62 * 输出 : 无
63 ***********************************************************************/
64
65 void enable(uchar del)
66 {
67 1 P0 = Convert(del);
68 1 RS = 0;
69 1 RW = 0;
70 1 E = 0;
71 1 delay_1();
72 1 E = 1;
73 1 delay_1();
74 1 }
75
76 /********************************************************************
77 * 名称 : write(uchar del)
78 * 功能 : 1602写数据函数
79 * 输入 : 需要写入1602的数据
80 * 输出 : 无
81 ***********************************************************************/
82
83 void write(uchar del)
84 {
85 1 P0 = Convert(del);
86 1 RS = 1;
87 1 RW = 0;
88 1 E = 0;
89 1 delay_1();
90 1 E = 1;
91 1 delay_1();
92 1 }
93
94 /********************************************************************
95 * 名称 : L1602_init()
96 * 功能 : 1602初始化,请参考1602的资料
97 * 输入 : 无
98 * 输出 : 无
99 ***********************************************************************/
100 void L1602_init(void)
101 {
102 1 enable(0x01);
103 1 enable(0x38);
104 1 enable(0x0c);
105 1 enable(0x06);
106 1 enable(0xd0);
107 1 }
108
109 /********************************************************************
110 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
111 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
112 L1602_char(1,5,'b')
113 * 输入 : 行,列,需要输入1602的数据
114 * 输出 : 无
115 ***********************************************************************/
116 void L1602_char(uchar hang,uchar lie,char sign)
117 {
C51 COMPILER V7.50 温度采集DS18B20LCD 04/10/2009 19:54:21 PAGE 3
118 1 uchar a;
119 1 if(hang == 1) a = 0x80;
120 1 if(hang == 2) a = 0xc0;
121 1 a = a + lie - 1;
122 1 enable(a);
123 1 write(sign);
124 1 }
125
126 /********************************************************************
127 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
128 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
129 L1602_string(1,5,"ab cd ef;")
130 * 输入 : 行,列,需要输入1602的数据
131 * 输出 : 无
132 ***********************************************************************/
133 void L1602_string(uchar hang,uchar lie,uchar *p)
134 {
135 1 uchar a;
136 1 if(hang == 1) a = 0x80;
137 1 if(hang == 2) a = 0xc0;
138 1 a = a + lie - 1;
139 1 enable(a);
140 1 while(1)
141 1 {
142 2 if(*p == '\0') break;
143 2 write(*p);
144 2 p++;
145 2 }
146 1 }
147
148 /********************************************************************
149 * 名称 : delay()
150 * 功能 : 延时函数
151 * 输入 : 无
152 * 输出 : 无
153 ***********************************************************************/
154 void delay(uint N)
155 {
156 1 int i;
157 1 for(i=0; i 158 1 ;
159 1 }
160
161 /********************************************************************
162 * 名称 : Reset()
163 * 功能 : 复位DS18B20
164 * 输入 : 无
165 * 输出 : 无
166 ***********************************************************************/
167 uchar Reset(void)
168 {
169 1 uchar deceive_ready;
170 1 DQ = 0;
171 1 delay(29);
172 1 DQ = 1;
173 1 delay(3);
174 1 deceive_ready = DQ;
175 1 delay(25);
176 1 return(deceive_ready);
177 1 }
178
179 /********************************************************************
C51 COMPILER V7.50 温度采集DS18B20LCD 04/10/2009 19:54:21 PAGE 4
180 * 名称 : read_bit()
181 * 功能 : 从DS18B20读一个位值
182 * 输入 : 无
183 * 输出 : 从DS18B20读出的一个位值
184 ***********************************************************************/
185 uchar read_bit(void)
186 {
187 1 uchar i;
188 1 DQ = 0;
189 1 DQ = 1;
190 1 for(i=0; i 191 1 return(DQ);
192 1 }
193
194 /********************************************************************
195 * 名称 : write_bit()
196 * 功能 : 向DS18B20写一位
197 * 输入 : bitval(要对DS18B20写入的位值)
198 * 输出 : 无
199 ***********************************************************************/
200 void write_bit(uchar bitval)
201 {
202 1 DQ=0;if(bitval==1)
203 1 DQ=1;
204 1 delay(5);
205 1 DQ=1;
206 1 }
207
208 /********************************************************************
209 * 名称 : read_byte()
210 * 功能 : 从DS18B20读一个字节
211 * 输入 : 无
212 * 输出 : 从DS18B20读到的值
213 ***********************************************************************/
214 uchar read_byte(void)
215 {
216 1 uchar i,m,receive_data;
217 1 m = 1;
218 1 receive_data = 0;
219 1 for(i=0; i 220 1 {
221 2 if(read_bit())
222 2 {
223 3 receive_data = receive_data + (m 224 3 }
225 2 delay(6);
226 2 }
227 1 return(receive_data);
228 1 }
229
230 /********************************************************************
231 * 名称 : write_byte()
232 * 功能 : 向DS18B20写一个字节
233 * 输入 : val(要对DS18B20写入的命令值)
234 * 输出 : 无
235 ***********************************************************************/
236 void write_byte(uchar val)
237 {
238 1 uchar i,temp;
239 1 for(i=0; i 240 1 {
241 2 temp = val >> i;
C51 COMPILER V7.50 温度采集DS18B20LCD 04/10/2009 19:54:21 PAGE 5
242 2 temp = temp & 0x01;
243 2 write_bit(temp);
244 2 delay(5);
245 2 }
246 1 }
247
248
249 /********************************************************************
250 * 名称 : Main()
251 * 功能 : 主函数
252 * 输入 : 无
253 * 输出 : 无
254 ***********************************************************************/
255 void main()
256 {
257 1 float tt;
258 1 uint temp;
259 1 P2 = 0x00;
260 1 L1602_init();
261 1 L1602_string(1,1," DS18B20 TEST ");
262 1 L1602_string(2,1,"Temperature:00`C");
263 1 while(1)
264 1 {
265 2 Reset();
266 2 write_byte(jump_ROM);
267 2 write_byte(start);
268 2 Reset();
269 2 write_byte(jump_ROM);
270 2 write_byte(read_EEROM);
271 2 TMPL = read_byte();
272 2 TMPH = read_byte();
273 2 temp = TMPH;
274 2 temp 275 2 temp = temp | TMPL;
276 2 tt = TMPL * 0.0625;
277 2 temp = TMPL / 16 + TMPH * 16;
278 2 L1602_char(2,13,temp/10%10 + 48);
279 2 L1602_char(2,14,temp%10 + 48);
280 2 }
281 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 551 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)