📄 test.lst
字号:
C51 COMPILER V7.02a TEST 04/18/2006 12:47:18 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c ROM(SMALL) OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <AT89X52.H>
2
3 #include "string.h"
4 sbit LED1 = P1^1;
5 sbit LED2 = P1^2;
6 sbit W_IN = P2^2;
7 sbit W_OUT = P2^0;
8 sbit DQ =P2^1;
9 unsigned char Te=0;//温度整数部分
10 unsigned char Te_D=0;//温度小数部分
11 unsigned char T0_last;
12 unsigned char w_data; //接收时用于存储两次上升沿之间的时长,发送时存储前半周
13 unsigned char send_busy = 0;//存储发送时后半周
14 unsigned char recv_timer = 0;
15 bit w_stat, last_w_stat;
16 unsigned char jiffies=0;
17
18
19
20
21 //定义通信端口
22 //延时函数
23
24 void delay(unsigned int i)
25 {
26 1 while(i--);
27 1
28 1 }
29 //初始化函数
30 Init_DS18B20(void)
31 {
32 1 unsigned char x=0;
33 1 DQ = 1; //DQ复位
34 1 delay(8); //稍做延时
35 1 DQ = 0; //单片机将DQ拉低
36 1 delay(50); //精确延时 大于 480us
37 1 DQ = 1; //拉高总线
38 1 delay(14);
39 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
40 1 delay(20);
41 1 }
42 //读一个字节
43 ReadOneChar(void)
44 {
45 1 unsigned char i=0;
46 1 unsigned char dat = 0;
47 1 for (i=8;i>0;i--)
48 1 {
49 2 DQ = 0; // 给脉冲信号
50 2 dat>>=1;
51 2 DQ = 1; // 给脉冲信号
52 2 if(DQ)
53 2 dat|=0x80;
54 2 delay(4);
55 2 }
C51 COMPILER V7.02a TEST 04/18/2006 12:47:18 PAGE 2
56 1 return(dat);
57 1 }
58 //写一个字节
59 WriteOneChar(unsigned char dat)
60 {
61 1 unsigned char i=0;
62 1 for (i=8; i>0; i--)
63 1 {
64 2 DQ = 0;
65 2 DQ = dat&0x01;
66 2 delay(5);
67 2 DQ = 1;
68 2 dat>>=1;
69 2 }
70 1 delay(4);
71 1 }
72 //读取温度
73 void ReadTemperature(void)
74 {
75 1 unsigned char a=0;
76 1 unsigned char b=0;
77 1 unsigned char e=0;
78 1 //unsigned char t;
79 1 unsigned char c,d;
80 1
81 1 //unsigned char t=0;
82 1 Init_DS18B20();
83 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
84 1 WriteOneChar(0x44); // 启动温度转换
85 1 Init_DS18B20();
86 1 WriteOneChar(0xCC); //跳过读序号列号的操作
87 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
88 1 a=ReadOneChar(); //读取温度值低位
89 1 b=ReadOneChar(); //读取温度值高位
90 1
91 1 e=a&0x0f;//小数部分
92 1 c=(e*10)/16;
93 1 d=((e*10)%16)*10/16;
94 1 Te_D=c*10+d;
95 1 a=a>>4;
96 1 Te=b<<4;
97 1 Te=Te|a;
98 1
99 1 }
100
101 void clock_timer(void) interrupt 1 using 1{
102 1
103 1 if (send_busy){
104 2 if(w_data){
105 3 w_data--;
106 3 w_stat = 0;
107 3 }else{
108 3 send_busy--;
109 3 w_stat = 1;
110 3 }
111 2 W_OUT = w_stat;
112 2 }else{
113 2 w_stat = W_IN;
114 2 if (w_stat != last_w_stat){
115 3 last_w_stat = w_stat;
116 3 if (w_stat){
117 4 w_data = recv_timer;
C51 COMPILER V7.02a TEST 04/18/2006 12:47:18 PAGE 3
118 4 recv_timer = 0;
119 4 }
120 3 }
121 2 if (~recv_timer)//if(recv_busy != 0xff)
122 2 recv_timer++;
123 2 }
124 1 jiffies++;
125 1 T0_last=TL0;
126 1 }
127
128 void clock_init(void){
129 1 jiffies = 0;
130 1 TMOD=0x02;
131 1 TH0=TL0=0x0ce;//12M,50us
132 1 // TH0=TL0=0x7a;//16M
133 1 // TH0=TL0=0x75;//16.59M
134 1 // TH0=TL0=0x72;//17M
135 1 // TH0=TL0=0x37;//24M
136 1 // TH0=TL0=0x47;//22.1844M, 100us
137 1 // TH0=TL0=0xa3;//22.1844M, 50us
138 1 EA=1;
139 1 ET0=1;
140 1
141 1 TR0=1;
142 1 }
143
144
145 void clock_init_again(void){
146 1
147 1 TMOD=0x02;
148 1 TH0=0x0ce;//12M,50us
149 1 TL0=T0_last;
150 1 // TH0=TL0=0x7a;//16M
151 1 // TH0=TL0=0x75;//16.59M
152 1 // TH0=TL0=0x72;//17M
153 1 // TH0=TL0=0x37;//24M
154 1 // TH0=TL0=0x47;//22.1844M, 100us
155 1 // TH0=TL0=0xa3;//22.1844M, 50us
156 1 EA=1;
157 1 ET0=1;
158 1 jiffies=0;
159 1 TR0=1;
160 1 }
161
162
163 void init_serialcomm(void)
164 {
165 1 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
166 1 TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
167 1 PCON |= 0x80; //SMOD=1;
168 1 TH1 = 0x0e6; //Baud:2400 fosc=11.0592MHz :f4
169 1 TL1 = 0x0e6;
170 1 //IE |= 0x90; //Enable Serial Interrupt
171 1 TR1 = 1; // timer 1 run
172 1 RI=0;
173 1 TI=1;
174 1 }
175
176 void serial_out(char d){
177 1 while(!TI);
178 1 TI=0;
179 1 SBUF=(d);
C51 COMPILER V7.02a TEST 04/18/2006 12:47:18 PAGE 4
180 1 }
181
182
183
184 void send_string_com(char *str,int strlen)//串口程序
185 { char sum;
186 1
187 1 int k=0;
188 1 serial_out(02);
189 1 do
190 1 { sum^=*(str+k);
191 2 serial_out(*(str + k));
192 2 k++;
193 2 } while(k < strlen);
194 1 serial_out(sum);
195 1 serial_out(03);
196 1 }
197
198 //等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
199 //超时单位为time_out * 100uS
200 bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
201 1 unsigned int time=jiffies;
202 1 unsigned char n=0;
203 1 do{
204 2 if (RI){
205 3 p[n++]=SBUF;
206 3 RI=0;
207 3 if(n==len)
208 3 return 0;
209 3 time=jiffies;
210 3 }
211 2 }while(jiffies-time < time_out);
212 1 return 1;
213 1 }
214
215 sys_init(){
216 1 clock_init();
217 1 init_serialcomm();
218 1 }
219
220
221
222
223 //=============================================================
224 //发送程序 开始
225 //=============================================================
226
227 #define PULS_0_WIDTH 8 //低电平脉宽
228 #define PULS_1_WIDTH 16 //高电平脉宽
229 #define PULS_HEAD_WIDTH 8 //前导信号脉宽
230 #define PULS_START_WIDTH 24 //引导信号脉宽
231 #define PULS_STOP_WIDTH 8 //结束码脉宽
232
233 #define PULS_HEAD_COUNTS 16 //前导信号长度
234
235
236 unsigned char send_buf[16];
237 #define send_byts send_buf[0] //剩余字节数,发送完后为0
238 unsigned char sending_byte; //当前正在发送的字节
239 unsigned char send_byte_p; //已发送字节数(含正在发送的字节)
240 unsigned char send_bit_p; //当前正在发送的字节已发送位数(含正在发送的位)
241
C51 COMPILER V7.02a TEST 04/18/2006 12:47:18 PAGE 5
242 #define SEND_PROGRESSING 0x41
243 #define SEND_FAILED 0x21
244 #define SEND_SUCCESS 0x31
245 unsigned char send_stat = 0; //发送程序当前状态,为0时正常
246 unsigned char head_counts; //前导信号计数器(包括引导信号)
247
248 void start_send(){
249 1 send_byte_p = 0;
250 1 send_bit_p = 0;
251 1 send_stat = SEND_PROGRESSING;
252 1 head_counts = 16;
253 1 }
254
255 #define START_SEND(byts) send_buf[0]=byts;send_byts=byts;start_send()
256
257 //发送前应清除send_byte_p,send_bit_p,send_stat,并设置send_byts
258 //发送过程中可根据send_byts的值得到剩余字节数,根据send_byte_p的值得到已发送字节数.注意,将正在发送的字节当
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -