📄 ds18b20.lst
字号:
C51 COMPILER V7.20 DS18B20 03/15/2007 21:24:33 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************
2
3 DS18B20温度测量实验
4 网址:http://www.kaifaban.com
5
6 功能:在数码管上显示当前DS18B20测到的温度
7 小数部分为4位,温度为负时,最高位显示"-"
8 测量范围:-55℃ ~ +125℃
9
10 *******************************************************/
11 #include <reg52.h>
12 #include <intrins.h>
13 #define uint unsigned int
14 #define uchar unsigned char
15 uchar Code[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; //共阳数码管编码表
16 uchar Bit[8]={11,0,0,0,0,0,0,0}; //数码管各位显示的数字
17 sbit DQ=P1^4; //定义连接DS18B20的IO口
18 sbit DsySelect=P3^6; //控制数码管的74HC244所在IO口
19 uchar BitCode=0x80; //数码管位码初值
20 uchar MSB; //温度高字节
21 uchar LSB; //温度低字节
22 int t1=0; //温度整数部分数值
23 uint t2=0; //温度小数部分数值
24 uchar flag; //负温度标志
25 //延时函数
26 void delay(uchar count){
27 1 uchar i;
28 1 for(i=0;i<count;i++);
29 1 }
30 //初始化DS18B20
31 void DS18B20Init(){
32 1 DQ=0; //下拉500us
33 1 delay(60);
34 1 DQ=1; //释放总线
35 1 delay(6);
36 1 while(DQ); //等待应答信号
37 1 while(~DQ); //等待释放总线
38 1 }
39 //读一个字节
40 uchar ReadByte(){
41 1 uchar i;
42 1 uchar ReadData=0;
43 1 for(i=0;i<8;i++){
44 2 DQ=0;
45 2 ReadData>>=1;
46 2 DQ=1;
47 2 if(DQ) ReadData|=0x80;
48 2 delay(4);
49 2 }
50 1 return ReadData;
51 1 }
52 //写一个字节
53 WriteByte(uchar WriteData){
54 1 uchar i;
55 1 uchar tmpData;
C51 COMPILER V7.20 DS18B20 03/15/2007 21:24:33 PAGE 2
56 1 for(i=0;i<8;i++){
57 2 tmpData=WriteData&0x01;
58 2 WriteData>>=1;
59 2 if(tmpData){
60 3 DQ=0;
61 3 DQ=1;
62 3 delay(4);
63 3 }else{
64 3 DQ=0;
65 3 delay(4);
66 3 DQ=1;
67 3 }
68 2 }
69 1 }
70 //数码管扫描显示程序
71 void Display(){
72 1 uchar i;
73 1 for(i=0;i<8;i++){
74 2 P2=BitCode; //输出位码
75 2 if(i==3){ //输出段码,如果第三位显示小数点
76 3 P0=Code[Bit[i]]&0x7F;
77 3 }else{
78 3 P0=Code[Bit[i]];
79 3 }
80 2 BitCode=_cror_(BitCode,1); //位码循环右移一位
81 2 delay(125); //延时1ms
82 2 P0=0xFF;
83 2 }
84 1 }
85 //温度计算程序
86 void GetT(){
87 1 if((MSB&0xF0)>0){ //判断是否为负温度
88 2 flag=1;
89 2 }else{
90 2 flag=0;
91 2 }
92 1 if(flag){ //如果为负温度取反加1
93 2 MSB=~MSB;
94 2 LSB=~LSB+1;
95 2 }
96 1 t1=MSB<<4; //得到温度整数部分
97 1 t1|=(LSB>>4);
98 1 t2=(LSB&0x0F)*0.0625*10000; //得到温度小数部分并扩大10000倍
99 1 //计算各位数码管要显示的数值
100 1 if(flag){
101 2 Bit[1]=10; //如果为负温度则显示"-"
102 2 }else{
103 2 Bit[1]=t1/100;
104 2 }
105 1 Bit[2]=t1%100/10;
106 1 Bit[3]=t1%10;
107 1 Bit[4]=t2/1000;
108 1 Bit[5]=t2%1000/100;
109 1 Bit[6]=t2%100/10;
110 1 Bit[7]=t2%10;
111 1 }
112 //主程序
113 main(){
114 1 DsySelect=0; //打开数码管
115 1 P0=0xFF; //复位P0口
116 1 P2=0xFF; //复位P2口
117 1 while(1){
C51 COMPILER V7.20 DS18B20 03/15/2007 21:24:33 PAGE 3
118 2 DS18B20Init(); //复位DS18B20
119 2 WriteByte(0xCC); //跳过ROM配置
120 2 WriteByte(0x44); //启动温度转换
121 2 DS18B20Init();
122 2 WriteByte(0xCC);
123 2 WriteByte(0xBE); //读温度寄存器
124 2 LSB=ReadByte(); //读温度数据低字节
125 2 MSB=ReadByte(); //读温度数据高字节
126 2 GetT(); //计算温度
127 2 Display(); //温度显示程序
128 2 }
129 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 428 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 28 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -