📄 temp.lst
字号:
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE TEMP
OBJECT MODULE PLACED IN temp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE temp.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************/
2 //
3 // DS18B20温度计C程序
4 // 2005.2.28通过调试
5 /*********************************************************************/
6 //使用AT89C2051单片机,12MHZ晶振,用共阳LED数码管
7 //P1口输出段码,P3口扫描
8 //#pragma src(d:\aa.asm)
9 #include "reg51.h"
10 #include "intrins.h" //_nop_();延时函数用
11 #define Disdata P1 //段码输出口
12 #define discan P3 //扫描口
13 #define uchar unsigned char
14 #define uint unsigned int
15 sbit DQ=P3^7; //温度输入口
16 sbit DIN=P1^7; //LED小数点控制
17 uint h;
18 //
19 //
20 //*******温度小数部分用查表法**********//
21 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
22 //
23 uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
24 /* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
25 uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 列扫描控制字
26 uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放
27 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
28 //
29 //
30 //
31 /***********11微秒延时函数**********/
32 //
33 void delay(uint t)
34 {
35 1 for(;t>0;t--);
36 1 }
37 //
38 /***********显示扫描函数**********/
39 scan()
40 {
41 1 char k;
42 1 for(k=0;k<4;k++) //四位LED扫描控制
43 1 {
44 2 Disdata=dis_7[display[k]];
45 2 if(k==1){DIN=0;}
46 2 discan=scan_con[k];delay(90);discan=0xff;
47 2 }
48 1 }
49 //
50 //
51 /***********18B20复位函数**********/
52 ow_reset(void)
53 {
54 1 char presence=1;
55 1 while(presence)
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 2
56 1 {
57 2 while(presence)
58 2 {
59 3 DQ=1;_nop_();_nop_();
60 3 DQ=0; //
61 3 delay(50); // 550us
62 3 DQ=1; //
63 3 delay(6); // 66us
64 3 presence=DQ; // presence=0继续下一步
65 3 }
66 2 delay(45); //延时500us
67 2 presence = ~DQ;
68 2 }
69 1 DQ=1;
70 1 }
71 //
72 //
73 /**********18B20写命令函数*********/
74 //向 1-WIRE 总线上写一个字节
75 void write_byte(uchar val)
76 {
77 1 uchar i;
78 1 for (i=8; i>0; i--) //
79 1 {
80 2 DQ=1;_nop_();_nop_();
81 2 DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
82 2 DQ = val&0x01; //最低位移出
83 2 delay(6); //66us
84 2 val=val/2; //右移一位
85 2 }
86 1 DQ = 1;
87 1 delay(1);
88 1 }
89 //
90 /*********18B20读1个字节函数********/
91 //从总线上读取一个字节
92 uchar read_byte(void)
93 {
94 1 uchar i;
95 1 uchar value = 0;
96 1 for (i=8;i>0;i--)
97 1 {
98 2 DQ=1;_nop_();_nop_();
99 2 value>>=1;
100 2 DQ = 0; //
101 2 _nop_();_nop_();_nop_();_nop_(); //4us
102 2 DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
103 2 if(DQ)value|=0x80;
104 2 delay(6); //66us
105 2 }
106 1 DQ=1;
107 1 return(value);
108 1 }
109 //
110 /***********读出温度函数**********/
111 //
112 read_temp()
113 {
114 1 ow_reset(); //总线复位
115 1 write_byte(0xCC); // 发Skip ROM命令
116 1 write_byte(0xBE); // 发读命令
117 1 temp_data[0]=read_byte(); //温度低8位
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 3
118 1 temp_data[1]=read_byte(); //温度高8位
119 1 ow_reset();
120 1 write_byte(0xCC); // Skip ROM
121 1 write_byte(0x44); // 发转换命令
122 1 }
123 //
124 /***********温度数据处理函数**********/
125 work_temp()
126 {
127 1 uchar n=0; //
128 1 if(temp_data[1]>127)
129 1 {temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//负温度求补码
130 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
131 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
132 1 display[3]=display[4]/100;
133 1 display[1]=display[4]%100;
134 1 display[2]=display[1]/10;
135 1 display[1]=display[1]%10;
136 1 if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=0x0A;}}//最高位为0时都不显示
137 1 if(n){display[3]=0x0B;}//负温度时最高位显示"-"
138 1 }
139 //
140 //
141 /**************主函数****************/
142 main()
143 {
144 1 Disdata=0xff; //初始化端口
145 1 discan=0xff;
146 1 for(h=0;h<4;h++){display[h]=8;}//开机显示8888
147 1 ow_reset(); // 开机先转换一次
148 1 write_byte(0xCC); // Skip ROM
149 1 write_byte(0x44); // 发转换命令
150 1 for(h=0;h<500;h++)
151 1 {scan();} //开机显示"8888"2秒
152 1 while(1)
153 1 {
154 2 read_temp(); //读出18B20温度数据
155 2 work_temp(); //处理温度数据
156 2 for(h=0;h<500;h++)
157 2 {scan();} //显示温度值2秒
158 2 }
159 1 }
160 //
161 //*********************结束**************************//
162
163
164
165
166
167
168
169
170
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 420 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = ---- ----
C51 COMPILER V7.00 TEMP 03/25/2005 11:12:51 PAGE 4
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 + -