📄 lj.lst
字号:
C51 COMPILER V8.02 LJ 06/10/2007 21:33:29 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LJ
OBJECT MODULE PLACED IN lj.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lj.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.H>
2 #include <string.H>
3
4 sbit ds = P1^0;
5 int tempValue;
6
7 char code disp_scan[]={0x0e,0Xd,0x0b,0x07}; //显示扫描码
8 char code disp_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳LED数码管段码表“0”“1”
-“2”“3”“4”“5”“6”“7”“8”“9”
9 char code sd_data[]={'0','1','2','3','4','5','6','7','8','9'};
10
11 //延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.
12 void delay(unsigned int i)
13 {
14 1 unsigned int j;
15 1 while(i--)
16 1 {
17 2 for(j = 0; j < 125; j++);
18 2 }
19 1 }
20 //初始化DS18B20
21 //让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
22 void dsInit()
23 {
24 1 //对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
25 1 unsigned int i;
26 1 ds = 0;
27 1 i = 100; //拉低约800us, 符合协议要求的480us以上
28 1 while(i>0) i--;
29 1 ds = 1; //产生一个上升沿, 进入等待应答状态
30 1 i = 4;
31 1 while(i>0) i--;
32 1 }
33
34 void dsWait()
35 {
36 1 unsigned int i;
37 1 while(ds);
38 1 while(~ds); //检测到应答脉冲
39 1 i = 4;
40 1 while(i > 0) i--;
41 1 }
42
43 //向DS18B20读取一位数据
44 //读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,
45 //之后DS18B20则会输出持续一段时间的一位数据
46 bit readBit()
47 {
48 1 unsigned int i;
49 1 bit b;
50 1 ds = 0;
51 1 i++; //延时约8us, 符合协议要求至少保持1us
52 1 ds = 1;
53 1 i++; i++; //延时约16us, 符合协议要求的至少延时15us以上
54 1 b = ds;
C51 COMPILER V8.02 LJ 06/10/2007 21:33:29 PAGE 2
55 1 i = 8;
56 1 while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求
57 1 return b;
58 1 }
59
60 //读取一字节数据, 通过调用readBit()来实现
61 unsigned char readByte()
62 {
63 1 unsigned int i;
64 1 unsigned char j, dat;
65 1 dat = 0;
66 1 for(i=0; i<8; i++)
67 1 {
68 2 j = readBit();
69 2 //最先读出的是最低位数据
70 2 dat = (j << 7) | (dat >> 1);
71 2 }
72 1 return dat;
73 1 }
74
75 //向DS18B20写入一字节数据
76 void writeByte(unsigned char dat)
77 {
78 1 unsigned int i;
79 1 unsigned char j;
80 1 bit b;
81 1 for(j = 0; j < 8; j++)
82 1 {
83 2 b = dat & 0x01;
84 2 dat >>= 1;
85 2 //写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
86 2 if(b)
87 2 {
88 3 ds = 0;
89 3 i++; i++; //拉低约16us, 符号要求15~60us内
90 3 ds = 1;
91 3 i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求
92 3 }
93 2 else //写"0", 将DQ拉低60us~120us
94 2 {
95 3 ds = 0;
96 3 i = 8; while(i>0) i--; //拉低约64us, 符号要求
97 3 ds = 1;
98 3 i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
99 3 }
100 2 }
101 1 }
102
103 //向DS18B20发送温度转换命令
104 void sendChangeCmd()
105 {
106 1 dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化
107 1 dsWait(); //等待DS18B20应答
108 1 delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
109 1 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
110 1 writeByte(0x44); //写入温度转换命令字 Convert T
111 1 }
112
113 //向DS18B20发送读取数据命令
114 void sendReadCmd()
115 {
116 1 dsInit();
C51 COMPILER V8.02 LJ 06/10/2007 21:33:29 PAGE 3
117 1 dsWait();
118 1 delay(1);
119 1 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
120 1 writeByte(0xbe); //写入读取数据令字 Read Scratchpad
121 1 }
122
123 //获取当前温度值
124 int getTmpValue()
125 {
126 1 unsigned int tmpvalue;
127 1 int value; //存放温度数值
128 1 float t;
129 1 unsigned char low, high;
130 1 sendReadCmd();
131 1 //连续读取两个字节数据
132 1 low = readByte();
133 1 high = readByte();
134 1 //将高低两个字节合成一个整形变量
135 1 //计算机中对于负数是利用补码来表示的
136 1 //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
137 1 tmpvalue = high;
138 1 tmpvalue <<= 8;
139 1 tmpvalue |= low;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -