📄 2.lst
字号:
C51 COMPILER V8.08 2 08/29/2008 23:37:54 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 2
OBJECT MODULE PLACED IN 2.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //********************************************* C程序 *******************************************
-**********************************//
2 //*MCU: AT89C51 //
3 //*MCU-crystal: 12M //
4 //*Version: 01 //
5 //*Last Updata: 2008-4-22 //
6 //*Author: //
7 //*Description: //
8 //DS18B20的读写程序,数据脚P3.4 //
9 //温度传感器汇编程序,采用器件默认的12位转化 //
10 //最大转化时间750微秒,显示温度-55到+125度,显示精度 //
11 //为0.1度,显示采用4位LED共阳显示测温值 //
12 //P1口为段码输入,P0~P3为位选 //
13 //***************WAVE-E6000/T**********************//
14 #include "reg52.h"
15 #define uchar unsigned char
16 #define uint unsigned int
17 #define Disdata P0 // 段码入口
18 sbit DQ=P3^5; // 温度输入口
19 uint temp; // variable of temperature 定义一个变量
20 uchar flag1; // 定义一个标志,标志温度是负还是正,1为负,0为正
21 sbit DIN=P0^7; // 小数点控制
22 #define discan P2 //扫描口
23 uchar h; // 定义变量
24 //位选位定义
25 sbit DEC=P3^0; // 小数
26 sbit POS=P3^1; // 个位
27 sbit TEN=P3^2; // 十位
28 sbit HUN=P3^3; // 百位,符号位
29
30 unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
31 //共阳数码管段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "灭" "-"
32 unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的编码
33 //共阳数码管带小数点段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
34 uchar data temp_data[2]={0x00,0x00};//读出温度暂放
35 uchar data Dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
36 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
37 //小数部分对应十进制 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F"
38 uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列扫描控制字
39 /***************************************/
40 /* 延时子程序 */
41 /***************************************/
42 void delay(uint i) //delay
43 {
44 1 while(i--);
45 1 }
46 /************************************************/
47 /* 初始化ds18b2子函数* */
48 /************************************************/
49 Init_DS18B20(void)
50 {
51 1 uchar x=0;
52 1 DQ = 1; //DQ复位
53 1 delay(8); //稍做延时
54 1 DQ = 0; //单片机将DQ拉低
C51 COMPILER V8.08 2 08/29/2008 23:37:54 PAGE 2
55 1 delay(80); //精确延时 大于 480us
56 1 DQ = 1; //拉高总线
57 1 delay(14);
58 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
59 1 delay(20);
60 1 }
61
62 /*************************************************/
63 /* 读字节子函数 */
64 /*************************************************/
65 ReadOneChar(void)
66 {
67 1 uchar i = 0;
68 1 uchar dat = 0;
69 1 for (i=8;i>0;i--)
70 1 {
71 2 DQ = 0; // 给脉冲信号
72 2 dat>>=1; // 数据右移一位
73 2 DQ = 1; // 给脉冲信号
74 2 if(DQ) // DQ为1
75 2 dat|=0x80; // 读出数据
76 2 delay(4); // 延时
77 2 }
78 1 return(dat);
79 1 }
80 /*************************************************/
81 /* 写字节子函数 */
82 /*************************************************/
83 WriteOneChar(unsigned char dat)
84 {
85 1 uchar i = 0;
86 1 for (i=8; i>0; i--)
87 1 {
88 2 DQ = 0;
89 2 DQ = dat&0x01; //写入一位数据
90 2 delay(5);
91 2 DQ = 1;
92 2 dat>>=1; //右移一位数据
93 2 }
94 1 }
95 /*************************************************/
96 /* DS18B20写命令函数 */
97 /*************************************************/
98 /*void tmpwritebyte(uchar dat) // write a byte to ds18b20
99 { // 给温度传感器写一个字节
100 uint i;
101 uchar j;
102 bit testb;
103 for(j=1;j<=8;j++)
104 {
105 testb=dat&0x01;
106 dat=dat>>1;
107 if(testb) //写入 1
108 {
109 DQ=0;
110 i++;i++;
111 DQ=1;
112 i=8;while(i>0)i--; // 适当延时
113 }
114 else //写入 0
115 {
116 DQ=0;
C51 COMPILER V8.08 2 08/29/2008 23:37:54 PAGE 3
117 i=8;while(i>0)i--; // 适当延时
118 DQ=1;
119 i++;i++;
120 }
121 }
122 }*/
123 /******************************************/
124 /* 发送温度转换命令 */
125 /******************************************/
126 void tmpchange(void) // DS18B20 begin change
127 {
128 1 Init_DS18B20(); // 初始化DS18B20
129 1 delay(200); // 延时
130 1 WriteOneChar(0xcc); // 跳过序列号命令
131 1 WriteOneChar(0x44); // 发送温度转换命令
132 1 }
133 /******************************************/
134 /* 读出温度函数 */
135 /******************************************/
136 uint tmp() //get the temperature
137 {
138 1 // float tt;
139 1 Init_DS18B20(); // 初始化ds18b2子函数
140 1 delay(1);
141 1 WriteOneChar(0xcc); // 跳过ROM命令
142 1 WriteOneChar(0xbe); // 发送读取数据命令
143 1 temp_data[0]=ReadOneChar(); // 连续读两个字节数据
144 1 temp_data[1]=ReadOneChar();
145 1 temp=temp_data[1];
146 1 temp<<=8;
147 1 temp=temp|temp_data[0]; // 两字节合成一个整型变量。
148 1 // tt=temp*0.0625; // 得到真实十进制温度值,因为DS18B20
149 1 // 可以精确到0.0625度,所以读回数据的最低位代表的是
150 1 // 0.0625度。
151 1 // temp=tt*10+0.5; // 放大十倍,这样做的目的将小数点后第一位
152 1 // 也转换为可显示数字,同时进行一个四舍五入操作。
153 1 return temp; // 返回温度值
154 1 }
155 /******************************************/
156 /* 读出序列号函数 */
157 /******************************************/
158 /*void readrom() // read the serial 读取温度传感器的序列号
159 { // 本程序中没有用到此函数
160 uchar sn1,sn2;
161 Init_DS18B20(); // DS18B20初始化
162 delay(1);
163 WriteOneChar(0x33); // Read ROM
164 sn1=ReadOneChar(); // 8位系列编码
165 sn2=ReadOneChar(); // 8位CRC码
166 }*/
167 /******************************************/
168 /* 温度数据显示处理函数 */
169 /******************************************/
170 void tem_deal(uint tem)
171 {
172 1 /*************温度数据处理*****************/
173 1 if(tem>6348) // 温度值正负判断
174 1 {tem=65536-tem;flag1=1;} // 负温度求补码,标志位置1
175 1 Dis_play[4]=tem&0x0f; // 取小数部分的值
176 1 Dis_play[0]=ditab[Dis_play[4]]; // 存入小数部分显示值
177 1 Dis_play[4]=tem>>4; // 取中间八位,即整数部分的值
178 1 Dis_play[3]=Dis_play[4]/100; // 取百位数据暂存
C51 COMPILER V8.08 2 08/29/2008 23:37:54 PAGE 4
179 1 Dis_play[1]=Dis_play[4]%100; // 取后两位数据暂存
180 1 Dis_play[2]=Dis_play[1]/10; // 取十位数据暂存
181 1 Dis_play[1]=Dis_play[1]%10; // 取个位数据暂存
182 1 if(!Dis_play[3]) // 最高位为0都不显示
183 1 {
184 2 Dis_play[3]=0x0a; // 先判断百位是否为0
185 2 if(!Dis_play[2])
186 2 {
187 3 Dis_play[2]=0x0a; // 再判断十位是否为0
188 3 }
189 2 }
190 1 if(flag1)
191 1 {
192 2 Dis_play[3]=0x0b; // 为负数时,最高位显示 "-"
193 2 }
194 1 }
195 /******************温度数据显示********************/
196
197 void display()
198 {
199 1 char k;
200 1 for(k=0;k<4;k++) //4位LED扫描控制
201 1 {
202 2 Disdata=table[Dis_play[k]]; //数据显示
203 2 if (k==1){DIN=0;} //小数点显示
204 2 discan=scan_con[k]; //位选
205 2 delay(90); //延时
206 2 discan=0xff;
207 2 }
208 1 }
209 /******************************************/
210 /* 主函数 */
211 /******************************************/
212 void main()
213 {
214 1 Disdata=0xff; //端口初始化
215 1 P3=0xff;
216 1 //开机显示"888.8";这段程序可以不要.
217 1 for(h=0; h<4; h++)
218 1 {
219 2 Dis_play[h]=8;
220 2 }
221 1 for(h=0; h<50; h++)
222 1 {
223 2 display(); //显示数据
224 2 delay(1000); //延时
225 2 }
226 1 //温度显示
227 1 do
228 1 {
229 2 tmpchange(); //温度转换
230 2 tem_deal(tmp()); //显示温度值
231 2 display();
232 2 }
233 1 while(1);
234 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 381 ----
CONSTANT SIZE = 42 ----
XDATA SIZE = ---- ----
C51 COMPILER V8.08 2 08/29/2008 23:37:54 PAGE 5
PDATA SIZE = ---- ----
DATA SIZE = 11 ----
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 + -