📄 send.lst
字号:
C51 COMPILER V8.02 SEND 08/23/2007 13:37:02 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SEND
OBJECT MODULE PLACED IN send.OBJ
COMPILER INVOKED BY: D:\SOFTWARE\uv3\C51\BIN\C51.EXE send.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 uchar xstemp;
6 uchar tll=0;
7 uchar thh=50;
8 uchar inte,dec;
9
10
11 sbit DQ =P2^0; //定义通信端口
12 sbit rt=P1^0; //收发选择端口
13 sbit busy=P1^1; //收发忙标志
14 sbit enable=P1^7; //定义模块使能端
15 sbit beep=P1^3;
16 bit send_flag;
17
18
19 void delay1(unsigned int i)
20 {
21 1 while(i--);
22 1 }
23
24
25 reset(void)
26 {
27 1 unsigned char x=0;
28 1 DQ = 1; //DQ复位
29 1 delay1(8); //稍做延时
30 1 DQ = 0; //单片机将DQ拉低
31 1 delay1(80); //精确延时 大于 480us
32 1 DQ = 1; //拉高总线
33 1 delay1(14);
34 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
35 1 delay1(20);
36 1 }
37
38
39
40 //读一个字节
41 unsigned char read_byte(void)
42 {
43 1 unsigned char i=0;
44 1 unsigned char dat = 0;
45 1 for (i=8;i>0;i--)
46 1 {
47 2 DQ = 0; // 给脉冲信号
48 2 dat>>=1;
49 2 DQ = 1; // 给脉冲信号
50 2 if(DQ)
51 2 dat|=0x80; /*LSB to MSB*/
52 2 delay1(4);
53 2 }
54 1 return(dat);
55 1 }
C51 COMPILER V8.02 SEND 08/23/2007 13:37:02 PAGE 2
56
57
58
59 //写一个字节
60 write_byte(unsigned char dat)
61 {
62 1 unsigned char i=0;
63 1 for (i=8; i>0; i--)
64 1 {
65 2 DQ = 0;
66 2 DQ = dat&0x01;
67 2 delay1(5);
68 2 DQ = 1;
69 2 dat>>=1;
70 2 }
71 1 }
72
73
74
75
76
77 //读取温度
78 unsigned char read_temperature(void)
79 {
80 1 unsigned char a=0;
81 1 unsigned char b=0;
82 1
83 1 reset();
84 1 write_byte(0xCC); // 跳过读序号列号的操作
85 1 write_byte(0x44); // 启动温度转换
86 1 reset();
87 1 write_byte(0xCC); //跳过读序号列号的操作
88 1 write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
89 1 a=read_byte();
90 1 b=read_byte();
91 1 xstemp=a&0x0f;
92 1 b=b<<4;
93 1 a=a>>4;
94 1
95 1 return(a|b);
96 1 }
97
98 unsigned char read_temperature_dec(void) //读入小数
99 {
100 1 return(xstemp);
101 1 }
102
103
104 senddata(unsigned char dat) //串口发送数据
105 {SBUF=dat;
106 1 while(TI==0);
107 1 TI=0;
108 1 }
109
110
111
112
113 send_temperature() //发送温度
114 {
115 1
116 1 inte = read_temperature(); //整数部分温度
117 1 dec = read_temperature_dec(); //小数部分温度
C51 COMPILER V8.02 SEND 08/23/2007 13:37:02 PAGE 3
118 1
119 1 senddata(0xfe);
120 1 senddata(dec);
121 1 senddata(0xff); //发送标志,0xff表示后面是整数,0xfe表示后面是小数
122 1 senddata(inte);
123 1 send_flag=0;
124 1 delay1(100);
125 1 }
126
127
128 serial_init() //串口初始化
129 {
130 1 SCON=0X50; /* SCON: 串口方式1, 8位异步通信,接收使能*/
131 1 TMOD=0x20; /*波特率发生需用定时器1:TMOD: 定时器1, 8位自动重装 */
132 1 PCON=0x80; //双倍时钟
133 1 TH1=0xfd; /* TH1:自动重装值,19200baud ,晶振11.0592MHz */
134 1 TL1=0xfd;
135 1 TR1=1; /* TR1:启动定时器1 */
136 1 EA=1;
137 1 ES=1;
138 1
139 1 }
140
141 void receivedata() interrupt 4 using 1//接收中断
142 { uchar temp;
143 1 static bit flag_thh=0,flag_tll=0; //整数部分和小数部分的标志
144 1 temp=SBUF;
145 1 if(flag_thh==1)
146 1 {
147 2 thh=temp; //接收温度上限部分
148 2 flag_thh=0; // 清除温度上限标志
149 2
150 2 }
151 1 if(flag_tll==1)
152 1 {
153 2 tll=temp; //接收温度下限部分
154 2 flag_tll=0; // 清除温度下限标志
155 2
156 2 }
157 1
158 1 if(temp==0xfd) flag_thh=1; //表示下面发送的是温度上限部分
159 1
160 1
161 1 if(temp==0xfc) flag_tll=1; //表示下面发送的是温度下限部分
162 1
163 1
164 1 RI=0; //清除中断标志
165 1
166 1
167 1 }
168
169
170 main()
171 {
172 1
173 1 serial_init(); //串口初始化
174 1 enable=0; //使模块工作
175 1 //rt=0;
176 1 //发送使能 0发送,1接收
177 1 while(1)
178 1 {
179 2
C51 COMPILER V8.02 SEND 08/23/2007 13:37:02 PAGE 4
180 2
181 2 if(inte<tll||inte>=thh)
182 2 beep=0;
183 2 else if(inte>=tll&&inte<thh)
184 2 beep=1;
185 2
186 2 if(send_flag==1)
187 2 send_temperature(); //发送温度
188 2 delay1(20000); //适当延时,使其进入串口中断
189 2 send_flag=1;
190 2
191 2
192 2 }
193 1 }
194
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 319 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -