📄 ds18b20_pwm.lst
字号:
C51 COMPILER V8.02 DS18B20_PWM 01/02/2003 13:13:40 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20_PWM
OBJECT MODULE PLACED IN ds18b20_pwm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds18b20_pwm.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include "intrins.h"
3
4
5 #define uchar unsigned char
6 #define uint unsigned int
7 void keyscan();
8 void delay20ms(void);
9
10
11
12 //unsigned char code str1[]={"D/C: % T: 3S "};
13 //unsigned char code str2[]={"t C Set:50C"};
14
15 unsigned char code str1[]= {"t C Set:50C"};
16 unsigned char code str2[]= {"D/C: % T: 3S "};
17
18
19
20 uchar data disdata[5];
21 uint tvalue;//温度值
22 uchar tflag;//温度正负标志
23 //uint Tset=60; //设置周期
24
25 sbit Light = P2^7; //控制LED显示
26 sbit key = P1^5; //调整设置温度加
27 sbit key2 = P1^6; //调整设置温度减
28 sbit key3 = P1^7; //调整周期加,步进20
29 sbit key4 = P2^0; //调整周期减,步进20
30 int SetTemp=50; //温度初始值
31 unsigned long int Tset=60; //设置周期
32 int temp=0; //温度中间变量
33 uint count1=0;
34
35 unsigned long int count=0; //计数器
36
37 sbit DQ=P3^7;//ds18b20与单片机连接口
38 sbit RS=P1^1;
39 sbit RW=P2^1;
40 sbit EN=P1^0;
41
42
43
44
45 /*************************lcd1602程序**************************/
46 void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
47 {unsigned int i,j;
48 1 for(i=0;i<ms;i++)
49 1 for(j=0;j<100;j++);
50 1 }
51
52 void Write_Com(unsigned char com)//写指令//
53 { delay1ms(1);
54 1 RS=0;
55 1 RW=0;
C51 COMPILER V8.02 DS18B20_PWM 01/02/2003 13:13:40 PAGE 2
56 1 EN=0;
57 1 P0=com;
58 1 delay1ms(1);
59 1 EN=1;
60 1 delay1ms(1);
61 1 EN=0;
62 1 }
63
64 void Write_Dat(unsigned char dat)//写数据//
65 { delay1ms(1);;
66 1 RS=1;
67 1 RW=0;
68 1 EN=0;
69 1 P0=dat;
70 1 delay1ms(1);
71 1 EN=1;
72 1 delay1ms(1);
73 1 EN=0;
74 1 }
75
76 void lcd_init()//初始化设置//
77 {delay1ms(15);
78 1 Write_Com(0x38);delay1ms(5);
79 1 Write_Com(0x08);delay1ms(5);
80 1 Write_Com(0x01);delay1ms(5);
81 1 Write_Com(0x06);delay1ms(5);
82 1 Write_Com(0x0c);delay1ms(5);
83 1 }
84
85
86 void display(unsigned char *p)//显示//
87 {
88 1 while(*p!='\0')
89 1 {
90 2 Write_Dat(*p);
91 2 p++;
92 2 delay1ms(1);
93 2 }
94 1 }
95
96 init_play()//初始化显示
97 { lcd_init();
98 1 Write_Com(0x80);
99 1 display(str1);
100 1 Write_Com(0xc0);
101 1 display(str2);
102 1 }
103
104 /******************************ds1820程序***************************************/
105 void delay_18B20(unsigned int i)//延时1微秒
106 {
107 1 while(i--);
108 1 }
109
110 void ds1820rst()/*ds1820复位*/
111 { unsigned char x=0;
112 1 DQ = 1; //DQ复位
113 1 delay_18B20(4); //延时
114 1 DQ = 0; //DQ拉低
115 1 delay_18B20(100); //精确延时大于480us
116 1 DQ = 1; //拉高
117 1 delay_18B20(40);
C51 COMPILER V8.02 DS18B20_PWM 01/02/2003 13:13:40 PAGE 3
118 1 }
119
120 uchar ds1820rd()/*读数据*/
121 { unsigned char i=0;
122 1 unsigned char dat = 0;
123 1 for (i=8;i>0;i--)
124 1 { DQ = 0; //给脉冲信号
125 2 dat>>=1;
126 2 DQ = 1; //给脉冲信号
127 2 if(DQ)
128 2 dat|=0x80;
129 2 delay_18B20(10);
130 2 }
131 1 return(dat);
132 1 }
133
134 void ds1820wr(uchar wdata)/*写数据*/
135 {unsigned char i=0;
136 1 for (i=8; i>0; i--)
137 1 { DQ = 0;
138 2 DQ = wdata&0x01;
139 2 delay_18B20(10);
140 2 DQ = 1;
141 2 wdata>>=1;
142 2 }
143 1 }
144
145
146
147 read_temp()/*读取温度值并转换*/
148 {uchar a,b;
149 1 ds1820rst();
150 1 ds1820wr(0xcc);//*跳过读序列号*/
151 1 ds1820wr(0x44);//*启动温度转换*/
152 1 ds1820rst();
153 1 ds1820wr(0xcc);//*跳过读序列号*/
154 1 ds1820wr(0xbe);//*读取温度*/
155 1 a=ds1820rd();
156 1 b=ds1820rd();
157 1 tvalue=b;
158 1 tvalue<<=8;
159 1 tvalue=tvalue|a;
160 1 if(tvalue<0x0fff)
161 1 tflag=0;
162 1 else
163 1 {tvalue=~tvalue+1;
164 2 tflag=1;
165 2 }
166 1 tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
167 1 temp=tvalue/10;
168 1 return(tvalue);
169 1 }
170
171 /*******************************************************************/
172 void Disp()//温度值显示
173 { uchar flagdat;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -