18b20的c程序+串口通讯+595显示温度
源代码在线查看: com.lst
C51 COMPILER V7.00 COM 03/24/2007 22:15:32 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN com.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE com.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************************************
2 ********************************************************************************
3 * 描述: *
4 * 单片机接收主机的数据,然后将数据传送到P0口, 并传回给主机; *
5 * 当按下K1时, 单片机发送字串"welcome! www.willar.com\n\r" 给主机 *
6 * *
7 *
8 *******************************************************************************/
9
10 #include
11 #include
12 #include
13 unsigned char key_s, key_v, tmp;
14
15 char code str[] = "I am a good boy!!! \n";
16
17 #define uint unsigned int
18 #define uchar unsigned char
19 #define nop() _nop_();_nop_();
20
21 sbit key0=P1^0;
22 uint16 temper;
23 sbit CLK=P0^6;
24 sbit DAT=P0^4;
25 sbit RCLK=P0^7;
26 //sbit CS=P2^3;
27 uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭
28
29 void send_str();
30 bit scan_key();
31 void key_pro();
32 void delayms(unsigned char ms);
33 void send_char(unsigned char txd);
34
35 sbit K1 = P1^0;
36 void delay(uint j)//延时
37 { uchar m;
38 1 for(;j>0;j--)
39 1 {
40 2 for(m=0;m 41 2 {;}
42 2 }
43 1 }
44 //=====================================================
45 void sendbyte(uchar byte)
46 {
47 1 uchar num,i;
48 1 num=tab[byte];
49 1
50 1 for(i=0;i 51 1 {
52 2 CLK=0;
53 2 DAT=num&0x80;
54 2 num=num 55 2
C51 COMPILER V7.00 COM 03/24/2007 22:15:32 PAGE 2
56 2 CLK=1;
57 2 }
58 1 // RCLK=0;
59 1 // nop();
60 1 // nop();
61 1 // RCLK=1;
62 1
63 1 }
64
65 void out595(void)
66 {
67 1 RCLK=1;
68 1 nop();
69 1 RCLK=0;
70 1 }
71
72 void display(uchar number)
73 {
74 1 uchar sw,gw;
75 1 sw=number/10;
76 1 gw=number-(10*sw);
77 1 sendbyte(gw);
78 1 sendbyte(sw);
79 1 //delay(18);
80 1 out595();
81 1 }
82
83 //=====================================================================
84 //=====================================================
85 //串口初始化
86 void initcom(void)
87 {
88 1
89 1 TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
90 1 TH1 = 0x0F3; // 波特率2400
91 1 TL1 = 0x0F3;
92 1
93 1 SCON = 0x50; // 设定串行口工作方式
94 1 PCON &= 0xef; // 波特率不倍增
95 1
96 1 ES=1; //允许串行口中断
97 1 TR1 = 1; // 启动定时器1
98 1 IE = 0x00; // 禁止任何中断
99 1
100 1 }
101
102 void send_char(unsigned char txd)
103 // 传送一个字符
104 {
105 1 SBUF = txd;
106 1 while(!TI); // 等特数据传送
107 1 TI = 0; // 清除数据传送标志
108 1 }
109
110 void send_str()
111 // 传送字串
112 {
113 1 unsigned char i = 0;
114 1 while(str[i] != '\0')
115 1 {
116 2 SBUF = str[i];
117 2 while(!TI); // 等特数据传送
C51 COMPILER V7.00 COM 03/24/2007 22:15:32 PAGE 3
118 2 TI = 0; // 清除数据传送标志
119 2 i++; // 下一个字符
120 2 }
121 1 }
122
123 void delayms(unsigned char ms)
124 // 延时子程序
125 {
126 1 unsigned char i;
127 1 while(ms--)
128 1 {
129 2 for(i = 0; i < 120; i++);
130 2 }
131 1 }
132
133
134
135 bit scan_key()
136 // 扫描按键
137 {
138 1 key_s = 0x00;
139 1 key_s |= K1;
140 1 return(key_s ^ key_v);
141 1 }
142 void key_pro()
143 {
144 1 if ((key_v&0x01)==0)
145 1 { send_str();}
146 1
147 1 }
148
149
150 uchar init_1820()//初始化1820
151 {
152 1 dat_1820=1;
153 1 delay(8);
154 1 dat_1820=0;
155 1 delay(80);
156 1 dat_1820=1;
157 1 delay(14);
158 1 if(dat_1820==0)
159 1 {
160 2 delay(20);
161 2 return(1);
162 2 }
163 1 else return(2);
164 1 dat_1820=1;
165 1 delay(20);
166 1
167 1 }
168
169 void wr_1820(uchar x)//写入1字节数据
170 {
171 1 uchar i;
172 1 for(i=8;i>0;i--)
173 1 {
174 2 dat_1820=1;
175 2 delay(1);
176 2 dat_1820=0;
177 2 delay(1);
178 2 if(x&0x01)dat_1820=1;
179 2 else dat_1820=0;
C51 COMPILER V7.00 COM 03/24/2007 22:15:32 PAGE 4
180 2 delay(20);
181 2
182 2 dat_1820=1;
183 2 // delay(1);
184 2 x>>=1;
185 2 }
186 1
187 1 }
188
189 void rd_1820()//读1字节数据
190 {
191 1 uint16 i;
192 1 uchar j;
193 1 i=0;
194 1 for(j=16;j>0;j--)
195 1 {
196 2 dat_1820=1;
197 2 delay(1);
198 2 dat_1820=0;
199 2 delay(1);
200 2 dat_1820=1;
201 2 if(dat_1820)
202 2 {
203 3 i>>=1;
204 3 i=i|0x8000;
205 3 }
206 2 else i>>=1;
207 2 delay(20);
208 2 dat_1820=1;
209 2
210 2 }
211 1 temper=i;
212 1 }
213
214
215 void get_temper()//进行温度测量并取温度数据
216 {
217 1 uchar i;
218 1 i=init_1820();//
219 1 if(i==1)//判断1820是否存在
220 1 {
221 2 wr_1820(0xcc);//跳过rom
222 2 wr_1820(0x44);//发送温度转换指令
223 2 delayms(3);
224 2 init_1820();
225 2 wr_1820(0xcc);//跳过rom
226 2 wr_1820(0xbe);//去温度数据
227 2 rd_1820();//读出数据
228 2 }
229 1
230 1 }
231
232 void init_sys()//系统初始化设置
233 {
234 1 // P0=0;//P0口清零
235 1 P2=0x86;//屏蔽其它模块
236 1 P1=P1&0X01;;//
237 1 }
238
239
240 void main()
241 { uchar t;
C51 COMPILER V7.00 COM 03/24/2007 22:15:32 PAGE 5
242 1 uint sw,gw,k;
243 1
244 1 initcom();
245 1 init_sys();
246 1
247 1
248 1
249 1 while(1)
250 1 {
251 2 get_temper();
252 2 if(!key0)
253 2 {
254 3 delayms(5);
255 3 if(!key0)
256 3 {
257 4 t=temper/16;
258 4 k=(temper*10/100);
259 4 sw=k/10;
260 4 gw=k%10;
261 4 send_char(t);
262 4
263 4 WriData(sw+0x30);WriData(gw+0x30);
*** WARNING C206 IN LINE 263 OF COM.C: 'WriData': missing function-prototype
*** ERROR C267 IN LINE 263 OF COM.C: 'WriData': requires ANSI-style prototype
264 4 }
265 3 }
266 2 delayms(5);
267 2 }
268 1 }
C51 COMPILATION COMPLETE. 1 WARNING(S), 1 ERROR(S)