📄 bak3.lst
字号:
C51 COMPILER V8.05a BAK3 03/19/2008 15:17:06 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE BAK3
OBJECT MODULE PLACED IN bak3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE bak3.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /************************************************************************************/
2 /*********************************DS18B20温度采样模块********************************/
3
4 #include<STC12C5410AD.h>
5 #include <intrins.h>
6 #define uchar unsigned char
7 #define uint unsigned int
8
9 sbit DAT = P3^4;
10 sbit P3_7 = P3^7;
11 sbit WDT = P3^5;
12
13 uchar comData;
14
15 void UART_init();
16 void send(uchar);
17 void mdelay(uchar);
18 void restDS(void);
19 void writeDS(uchar);
20 uchar readDS(void);
21 void initDS(void);
22 uint readtemp(void);
23
24
25 //主函数
26 void main()
27 { uint TMP;
28 1 uchar temp;
29 1
30 1 UART_init();
31 1
32 1 while(1)
33 1 { WDT = !WDT;
34 2 if(comData == 0x03)
35 2 { EA = 0;
36 3 comData = 0;
37 3 TMP = readtemp;
38 3 temp = (TMP >>8)&0x00FF;
39 3 send(temp);
40 3 temp = TMP &0x00FF;
41 3 send(temp);
42 3 EA = 1;
43 3 }
44 2 }
45 1 }
46
47
48
49 //串行口初始化
50 void UART_init(void)
51 { P1M0 = 0x01; //设置P32,P33,P34,P35,P37为推挽输出状态
52 1 P1M1 = 0x01;
53 1 P3M0 = 0x10;
54 1 P3M1 = 0x10;
55 1
C51 COMPILER V8.05a BAK3 03/19/2008 15:17:06 PAGE 2
56 1 //初始化串行口和波特率发生器
57 1 SCON = 0x50; //选择串口工作方式1,打开接收允许
58 1 TMOD = 0x20; //定时器1工作在方式2,定时器0工作在方式1
59 1
60 1 TH1 = 0xFD; //当SMOD=0时,其初值计算如下:初值 = 256 -(F/B/32/X)(其中X为分频数) X = 6
61 1 TL1 = 0XFD; //实现波特率9600(系统时钟 11.0592 MHZ)
62 1
63 1 TR1 = 1; //启动定时器T1
64 1 ET1 = 0; //禁止T1中断
65 1 AUXR = 0xBF; //此句改为AUXR = 0x40 ,波特率可以加倍12倍
66 1 ES = 1; //允许串行口中断
67 1 //PS = 1; //设置串行口中断优先级
68 1 EA = 0; //禁止所有中断
69 1 P3_7 = 0;
70 1 }
71
72
73 //串口发送子程序
74 void send(uchar cmd)
75 {
76 1 P3_7 = 1;
77 1 SBUF = cmd;
78 1 while(!TI);
79 1 TI=0;
80 1 P3_7 = 0;
81 1
82 1 }
83
84
85 //延时
86 void mdelay(uchar time) //短延时time*8.68us(在keil里计算出的)
87 {
88 1 for(;time>0;time--);
89 1 }
90
91 //复位程序
92 void restDS(void)
93 {
94 1 do
95 1 { DAT=0;
96 2 mdelay(80);
97 2 DAT=1;
98 2 mdelay(5);
99 2 }while(DAT);
100 1 mdelay(15);
101 1 DAT=1;
102 1 mdelay(70);
103 1 }
104
105
106 //写一个字节
107 void writeDS(uchar wdat)
108 { unsigned char i;
109 1
110 1 for(i=0;i<8;i++)
111 1 { DAT=1;
112 2 _nop_();
113 2 DAT=0;
114 2 mdelay(1);
115 2 DAT=wdat&0x01;
116 2 wdat=wdat>>1;
117 2 mdelay(8);
C51 COMPILER V8.05a BAK3 03/19/2008 15:17:06 PAGE 3
118 2 }
119 1
120 1 DAT=1;
121 1 }
122
123
124 //读一个字节
125 uchar readDS(void)
126 { uchar i;
127 1 uchar rdat=0;
128 1
129 1 for(i=0;i<8;i++)
130 1 { rdat>>=1;//地位在前,高位在后
131 2 DAT=0;
132 2 _nop_();
133 2 DAT=1;
134 2 mdelay(1);
135 2 _nop_();
136 2 _nop_();
137 2 if(DAT)
138 2 rdat|=0x80;
139 2 mdelay(7);
140 2 }
141 1
142 1 DAT=1;
143 1 return(rdat);
144 1 }
145
146
147 //初始化程序
148 void initDS(void)
149 {
150 1 restDS(); //复位
151 1 writeDS(0xCC); //跳过读序列号操作
152 1 writeDS(0x4E); //写报警温度指令
153 1 writeDS(0x1A); //报警温度上限
154 1 writeDS(0x00); //报警温度下限
155 1 writeDS(precision); //采样精度设置
*** ERROR C202 IN LINE 155 OF BAK3.C: 'precision': undefined identifier
156 1 }
157
158
159 //读取温度
160 uint readtemp(void)
161 { uchar templ = 0,temph = 0;
162 1 uint temp=0;
163 1
164 1 restDS(); //复位
165 1 writeDS(0xCC); //跳过读序列号
166 1 writeDS(0x44); //启动温度转换
167 1 mdelay(80);
168 1
169 1 restDS();
170 1 writeDS(0xCC); //跳过读序列号
171 1 writeDS(0xBE); //读温度寄存器指令
172 1
173 1 templ = readDS(); //采样值低8位
174 1 temph = readDS(); //采样值高8位
175 1
176 1 temp = temph;
177 1 temp <<= 8;
178 1 temp = temp|templ;
C51 COMPILER V8.05a BAK3 03/19/2008 15:17:06 PAGE 4
179 1
180 1 return(temp);
181 1 }
182
183
184 //串口接收中断
185 void uart_isr() interrupt 4
186 {
187 1 EA = 0;
188 1
189 1 comData = SBUF; //接收数据
190 1 RI = 0;
191 1
192 1 EA = 1;
193 1 }
C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -