📄 yl-10-ds18b20
字号:
C51 COMPILER V9.00 18B20瞋蝊 06/01/2011 15:05:58 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE 18B20瞋蝊
OBJECT MODULE PLACED IN 18B20测温.OBJ
COMPILER INVOKED BY: D:\安装的软件\win7下keil\C51\BIN\C51.EXE 18B20测温.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h> //包含单片机寄存器的头文件
2 #include<intrins.h> //包含_nop_()函数定义的头文件
3 unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字
4 unsigned char code Str[]={"Test by DS18B20"}; //说明显示的是温度
5 unsigned char code Error[]={"Error!Check!"}; //说明没有检测到DS18B20
6 unsigned char code Temp[]={"Temp:"}; //说明显示的是温度
7 unsigned char code Cent[]={"Cent"}; //温度单位
8
9 /*******************************************************************************
10 以下是对液晶模块的操作程序
11 *******************************************************************************/
12 sbit RS=P2^6; //寄存器选择位,将RS位定义为P3.0引脚
13 sbit RW=P2^5; //读写选择位,将RW位定义为P3.1引脚
14 sbit E=P2^7; //使能信号位,将E位定义为P3.2引脚
15 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
16 /*****************************************************
17 函数功能:延时1ms
18 (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
19 ***************************************************/
20 void delay1ms()
21 {
22 1 unsigned char i,j;
23 1 for(i=0;i<4;i++)
24 1 for(j=0;j<33;j++)
25 1 ;
26 1 }
27 /*****************************************************
28 函数功能:延时若干毫秒
29 入口参数:n
30 ***************************************************/
31 void delaynms(unsigned char n)
32 {
33 1 unsigned char i;
34 1 for(i=0;i<n;i++)
35 1 delay1ms();
36 1 }
37 /*****************************************************
38 函数功能:判断液晶模块的忙碌状态
39 返回值:result。result=1,忙碌;result=0,不忙
40 ***************************************************/
41 bit BusyTest(void)
42 {
43 1 bit result;
44 1 RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
45 1 RW=1;
46 1 E=1; //E=1,才允许读写
47 1 _nop_(); //空操作
48 1 _nop_();
49 1 _nop_();
50 1 _nop_(); //空操作四个机器周期,给硬件反应时间
51 1 result=BF; //将忙碌标志电平赋给result
52 1 E=0; //将E恢复低电平
53 1 return result;
54 1 }
55 /*****************************************************
C51 COMPILER V9.00 18B20瞋蝊 06/01/2011 15:05:58 PAGE 2
56 函数功能:将模式设置指令或显示地址写入液晶模块
57 入口参数:dictate
58 ***************************************************/
59 void WriteInstruction (unsigned char dictate)
60 {
61 1 while(BusyTest()==1); //如果忙就等待
62 1 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
63 1 RW=0;
64 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
65 1 // 就是让E从0到1发生正跳变,所以应先置"0"
66 1 _nop_();
67 1 _nop_(); //空操作两个机器周期,给硬件反应时间
68 1 P0=dictate; //将数据送入P0口,即写入指令或地址
69 1 _nop_();
70 1 _nop_();
71 1 _nop_();
72 1 _nop_(); //空操作四个机器周期,给硬件反应时间
73 1 E=1; //E置高电平
74 1 _nop_();
75 1 _nop_();
76 1 _nop_();
77 1 _nop_(); //空操作四个机器周期,给硬件反应时间
78 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
79 1 }
80 /*****************************************************
81 函数功能:指定字符显示的实际地址
82 入口参数:x
83 ***************************************************/
84 void WriteAddress(unsigned char x)
85 {
86 1 WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
87 1 }
88 /*****************************************************
89 函数功能:将数据(字符的标准ASCII码)写入液晶模块
90 入口参数:y(为字符常量)
91 ***************************************************/
92 void WriteData(unsigned char y)
93 {
94 1 while(BusyTest()==1);
95 1 RS=1; //RS为高电平,RW为低电平时,可以写入数据
96 1 RW=0;
97 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
98 1 // 就是让E从0到1发生正跳变,所以应先置"0"
99 1 P0=y; //将数据送入P0口,即将数据写入液晶模块
100 1 _nop_();
101 1 _nop_();
102 1 _nop_();
103 1 _nop_(); //空操作四个机器周期,给硬件反应时间
104 1 E=1; //E置高电平
105 1 _nop_();
106 1 _nop_();
107 1 _nop_();
108 1 _nop_(); //空操作四个机器周期,给硬件反应时间
109 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
110 1 }
111 /*****************************************************
112 函数功能:对LCD的显示模式进行初始化设置
113 ***************************************************/
114 void LcdInitiate(void)
115 {
116 1 delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
117 1 WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
C51 COMPILER V9.00 18B20瞋蝊 06/01/2011 15:05:58 PAGE 3
118 1 delaynms(5); //延时5ms ,给硬件一点反应时间
119 1 WriteInstruction(0x38);
120 1 delaynms(5); //延时5ms ,给硬件一点反应时间
121 1 WriteInstruction(0x38); //连续三次,确保初始化成功
122 1 delaynms(5); //延时5ms ,给硬件一点反应时间
123 1 WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
124 1 delaynms(5); //延时5ms ,给硬件一点反应时间
125 1 WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
126 1 delaynms(5); //延时5ms ,给硬件一点反应时间
127 1 WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
128 1 delaynms(5); //延时5ms ,给硬件一点反应时间
129 1 }
130 /************************************************************************
131 以下是DS18B20的操作程序
132 ************************************************************************/
133 sbit DQ=P3^7;
134 unsigned char time; //设置全局变量,专门用于严格延时
135 /*****************************************************
136 函数功能:将DS18B20传感器初始化,读取应答信号
137 出口参数:flag
138 ***************************************************/
139 bit Init_DS18B20(void)
140 {
141 1 bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
142 1 DQ = 1; //先将数据线拉高
143 1 for(time=0;time<2;time++) //略微延时约6微秒
144 1 ;
145 1 DQ = 0; //再将数据线从高拉低,要求保持480~960us
146 1 for(time=0;time<200;time++) //略微延时约600微秒
147 1 ; //以向DS18B20发出一持续480~960us的低电平复位脉冲
148 1 DQ = 1; //释放数据线(将数据线拉高)
149 1 for(time=0;time<10;time++)
150 1 ; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
151 1 flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
152 1 for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕
153 1 ;
154 1 return (flag); //返回检测成功标志
155 1 }
156 /*****************************************************
157 函数功能:从DS18B20读取一个字节数据
158 出口参数:dat
159 ***************************************************/
160 unsigned char ReadOneChar(void)
161 {
162 1 unsigned char i=0;
163 1 unsigned char dat; //储存读出的一个字节数据
164 1 for (i=0;i<8;i++)
165 1 {
166 2
167 2 DQ =1; // 先将数据线拉高
168 2 _nop_(); //等待一个机器周期
169 2 DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
170 2 dat>>=1;
171 2 _nop_(); //等待一个机器周期
172 2 DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
173 2 for(time=0;time<2;time++)
174 2 ; //延时约6us,使主机在15us内采样
175 2 if(DQ==1)
176 2 dat|=0x80; //如果读到的数据是1,则将1存入dat
177 2 else
178 2 dat|=0x00;//如果读到的数据是0,则将0存入dat
179 2 //将单片机检测到的电平信号DQ存入r[i]
C51 COMPILER V9.00 18B20瞋蝊 06/01/2011 15:05:58 PAGE 4
180 2 for(time=0;time<8;time++)
181 2 ; //延时3us,两个读时序之间必须有大于1us的恢复期
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -