📄 rount4.lst
字号:
C51 COMPILER V7.00 ROUNT4 06/14/2005 17:21:10 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE ROUNT4
OBJECT MODULE PLACED IN rount4.OBJ
COMPILER INVOKED BY: C:\PROGRA~1\KEILC5~1\C51\BIN\c51.exe rount4.c DB OE SMALL ROM(LARGE)
stmt level source
1 #include<rount3.h>
2 #include<reg51.h>
3 #include<intrins.h>
4 //???????????????????????????????????????????????????????
5 //???????????????????????????????????????????????????????
6 bit page_ch_flg;
7
8 unsigned char sla_adr0;
9 unsigned char sla_adr1;
10 unsigned char init_adr0;
11 unsigned char init_adr1;
12
13
14 //////////////////////////////////////////
15 //名称:测温子程序
16 //功能:读取64个DS18B20温度值,存放到扩展RAM区
17 //////////////////////////////////////////
18 void read_one_tmp(vs_rom) //读取ONE DS18B20温度值
19 unsigned char data *vs_rom;
20 {
21 1
22 1 unsigned char i;
23 1 unsigned char id_rom[8];
24 1
25 1 if(page_ch_flg==1)
26 1 {
27 2 sla_adr0|=pagel;
28 2 rdadr(&id_rom[0],sla_adr0,init_adr1,8);
29 2 goto next;
30 2 }
31 1 if(init_adr1==0xf8) //判断是否页溢出?
32 1 page_ch_flg =1;
33 1
34 1 rdadr(&id_rom[0],sla_adr0,init_adr1,8); //第一次发送EEPROM中DS18B20 ID存放首地址
35 1
36 1 next:init_adr1+=8;
37 1 if(!OWReset())
38 1 {
39 2 OWWriteByte(0x55); //写匹配ID命令
40 2 for(i=0;i<8;i++)
41 2 OWWriteByte(id_rom[i]); //发送8字节DS18B20 ID
42 2 OWWriteByte(0xBE);
43 2 for(i=0;i<2;i++)
44 2 *(vs_rom+i) =OWReadByte(); //读取2字节温度数据
45 2 // *(vs_rom+i) =0x01;
46 2 _nop_();
47 2 }
48 1 _nop_();
49 1 }
50
51 //////////////////////////////////////////////////////////////////
52 /////////////////////////////////////////////////////////////////
53
54 void do_one_tmp(us_rom,us_rom_bcd) //将读取的温度数据转换成十进制数
55 unsigned char data *us_rom;
C51 COMPILER V7.00 ROUNT4 06/14/2005 17:21:10 PAGE 2
56 unsigned char data *us_rom_bcd;
57 {
58 1 unsigned char i =0;
59 1 unsigned char temp,shift,mode;
60 1 unsigned char us_rom_var[2];
61 1 unsigned char us_bcd_var;
62 1 float us_tmp_bcd,mode_f;
63 1 unsigned char flag;
64 1
65 1 us_rom_var[0] =*us_rom; //温度整数位
66 1 us_rom_var[1] =*(us_rom+1); //温度小数位
67 1 flag =(us_rom_var[1]>>3)&0x01;
68 1 us_rom_var[1] =((us_rom_var[1]&0x03)<<4)|((us_rom_var[0]&0xf0)>>4);
69 1 us_rom_var[0] =us_rom_var[0]&0x0f;
70 1
71 1 while(1) //计算整数值,结果存tmp_rom_bcd[1]
72 1 {
73 2 shift =0x01;
74 2 mode =1;
75 2 while(i<6)
76 2 {
77 3 temp=us_rom_var[1]&shift;
78 3 if(temp) //此位为1,加上权值
79 3 us_bcd_var+=mode;
80 3
81 3 mode=mode*2;
82 3 shift=shift<<1;
83 3 i++;
84 3 }
85 2 if(flag) //判断是否为负数?yes,整数最高位置1
86 2 us_bcd_var|=0x80;
87 2 break;
88 2 }
89 1 *(us_rom_bcd+1) =us_bcd_var; //求得温度整数位
90 1
91 1 i =0;
92 1 shift =0x01; //计算小数值,结果存tmp_rom_bcd[0]
93 1 mode_f =6.25;
94 1 while(i<4)
95 1 {
96 2 temp=us_rom_var[0]&shift;
97 2 if(temp)
98 2 us_tmp_bcd+=mode_f;
99 2
100 2 mode_f=mode_f*2;
101 2 shift=shift<<1;
102 2 i++;
103 2 }
104 1 *us_rom_bcd=us_tmp_bcd; //求得温度小数位
105 1 }
106
107 void wr_tmp_ram(vs_rom_bcd) //将BCD码温度数据存EEPROM,小数在低地址
108 unsigned char data *vs_rom_bcd;
109 {
110 1 unsigned char *p;
111 1
112 1 p =vs_rom_bcd;
113 1 wradr(p,sla_adr1,init_adr0,2);
114 1 init_adr0+=2;
115 1 }
116
117 void read_all_tmp(void) //读取64个DS18B20温度值
C51 COMPILER V7.00 ROUNT4 06/14/2005 17:21:10 PAGE 3
118 {
119 1 unsigned char i;
120 1 unsigned char tmp_rom[2];
121 1 unsigned char tmp_rom_bcd[2];
122 1 //unsigned char test_rom[8];
123 1
124 1 init_adr0 =0x00; //EEPROM存放首地址0x0000/0x0200
125 1 init_adr1 =0x00;
126 1 sla_adr0 =0xA0; //24C02硬件地址
127 1 sla_adr1 =0xA0;
128 1 sla_adr1 =sla_adr1|pageh;
129 1 page_ch_flg =0; //初始化相关变量
130 1
131 1 for(i=0;i<64;i++)
132 1 {
133 2 read_one_tmp(tmp_rom);
134 2 do_one_tmp(tmp_rom,tmp_rom_bcd);
135 2 wr_tmp_ram(tmp_rom_bcd);
136 2
137 2 }
138 1 // init_adr0 =0x00; //test
139 1 // sla_adr1 =0xA4;
140 1 // rdadr(&test_rom[0],sla_adr1,init_adr0,8);
141 1 // _nop_();
142 1 }
143 ///////////////////////////////////////////////////////////////////////////
144
145
146 ///////////////////////////////////////////////////
147 //名称:温度采集
148 //功能:定时命令DS18B20采集温度数据,存入EEPROM中
149 //////////////////////////////////////////////////
150 void collect_ds_tmp(void)
151 {
152 1 if(!OWReset()) //命令DS18B20温度转
153 1 {
154 2 OWWriteByte(0xCC);
155 2 OWWriteByte(0x44);
156 2 }
157 1 delay_time_1s();
158 1 _nop_();
159 1 delay_time_1s();
160 1
161 1 read_all_tmp(); //读取温度转换数据,存入EEPROM中
162 1 }
163
164
165 //???????????????????????????????????????????????????????
166 //???????????????????????????????????????????????????????
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 403 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 30
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -