📄 main.lst
字号:
C51 COMPILER V9.00 MAIN 06/13/2013 18:10:17 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2
3 #define LCD_DB P1
4
5 unsigned char s1[5];
6 unsigned char s2[5];
7 sbit LCD_RS=P2^4;
8 sbit LCD_RW=P2^5;
9 sbit LCD_E=P2^6;
10 sbit P2_0=P2^0;
11 sbit moshi=P2^1;
12 sbit INC=P2^2;
13 sbit DEC=P2^3;
14 sbit SPK=P2^7;
15 /******定义函数****************/
16 #define uchar unsigned char
17 #define uint unsigned int
18 typedef unsigned char U8;/*无符号8位整型变量*/
19 typedef unsigned int U16;/* 无符号16位整型变量*/
20 uchar count1=95,count2=35;
21 uchar moshicount=0; uchar TD=0;//定时次数
22
23 U8 U8FLAG;
24 U8 U8count,U8temp;
25 U8 U8T_data_H,U8T_data_L,U8RH_data_H, U8RH_data_L,U8checkdata;
26 U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
27 U8 U8comdata;
28 void LCD_init(void);//初始化函数
29 void LCD_write_command(uchar command);//写指令函数
30 void LCD_write_data(uchar dat);
31
32 //写数据函数
33 void LCD_disp_char(uchar x, uchar y,uchar dat); //在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
34 void delay_n40us(uint n);//延时函数
35
36 /*******液晶初始化函数***************/
37 void LCD_init(void)
38 {
39 1 LCD_write_command(0x38); //设置8位格式,2行,5x7
40 1 LCD_write_command(0x0c);//整体显示,关光标,不闪烁
41 1 LCD_write_command(0x06);//设定输入方式,增量不移位
42 1 LCD_write_command(0x03);//清除屏幕显示
43 1 delay_n40us(100);
44 1 }
45
46 /*******定时器初始化函数**********/
47 void timerinit()
48 {
49 1 TMOD=0x01;
50 1 TH0=-50000/256;
51 1 TL0=-50000%256;
52 1 EA=1;
53 1 ET0=1;
54 1 }
55
C51 COMPILER V9.00 MAIN 06/13/2013 18:10:17 PAGE 2
56 /********写指令函数************/
57 void LCD_write_command(uchar dat)
58 {
59 1 LCD_DB=dat;
60 1 LCD_RS=0;//指令
61 1 LCD_RW=0;//写入
62 1 LCD_E=1;//允许
63 1 delay_n40us(1);
64 1 LCD_E=0;
65 1 delay_n40us(1);
66 1 }
67 /********写数据函数*************/
68 void LCD_write_data(uchar dat)
69 {
70 1 LCD_DB=dat;
71 1 LCD_RS=1;//数据
72 1 LCD_RW=0;//写入
73 1 LCD_E=1;//允许
74 1 delay_n40us(1);
75 1 LCD_E=0;
76 1 delay_n40us(1);
77 1 }
78 /*******显示一个字符函数*********/
79 void LCD_disp_char(uchar x,uchar y,uchar dat)
80 {
81 1 uchar address;
82 1 if(y==1)
83 1 address=0x80+x;
84 1 else
85 1 address=0xc0+x;
86 1 LCD_write_command(address);
87 1 LCD_write_data(dat);
88 1 }
89 /********延时函数***************/
90
91 void delay_n40us(uint n)
92 {
93 1 uint i;
94 1 uchar j;
95 1 for(i=n;i>0;i--)
96 1 for(j=0;j<2;j++);
97 1 }
98 void Delay_10us(void)
99 {
100 1 U8 i;
101 1 i--;
102 1 i--;
103 1 i--;
104 1 i--;
105 1 i--;
106 1 i--;
107 1 }
108 void Delay(U16 j)
109 {
110 1 U8 i;
111 1 for(;j>0;j--)
112 1 for(i=0;i<27;i++);
113 1 }
114 /*******一字节数据传送函数*********/
115 void COM(void)
116 {
117 1 U8 i;
C51 COMPILER V9.00 MAIN 06/13/2013 18:10:17 PAGE 3
118 1 for(i=0;i<8;i++)
119 1 {
120 2 U8FLAG=2;
121 2 while((!P2_0)&&U8FLAG++);
122 2 Delay_10us();
123 2 Delay_10us();
124 2 Delay_10us();
125 2 U8temp=0;
126 2 if(P2_0)U8temp=1;
127 2 U8FLAG=2;
128 2 while((P2_0)&&U8FLAG++);//超时则跳出for循环
129 2 if(U8FLAG==1)break;//判断数据位是0还是1,如果高电平高过预定0高电平值则数据位为1
130 2 U8comdata<<=1;
131 2 U8comdata|=U8temp;
132 2 }
133 1 }
134 /*******单片机与传感器通信函数*********/
135 void RH(void)
136 {
137 1 //主机拉低18ms
138 1 P2_0=0;
139 1 Delay(180);
140 1 P2_0=1;
141 1 //总线由上拉电阻拉高 主机延时20us
142 1 Delay_10us();
143 1 Delay_10us();
144 1 Delay_10us();
145 1 Delay_10us();
146 1 //主机设为输入 判断从机响应信号
147 1 P2_0=1;
148 1 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
149 1 if(!P2_0) //T !
150 1 {
151 2 U8FLAG=2;
152 2 //判断从机是否发出 80us 的低电平响应信号是否结束
153 2 while((!P2_0)&&U8FLAG++);
154 2 U8FLAG=2;
155 2 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
156 2 while((P2_0)&&U8FLAG++);
157 2 //数据接收状态
158 2 COM();
159 2 U8RH_data_H_temp=U8comdata;
160 2 COM();
161 2 U8RH_data_L_temp=U8comdata;
162 2 COM();
163 2 U8T_data_H_temp=U8comdata;
164 2 COM();
165 2 U8T_data_L_temp=U8comdata;
166 2 COM();
167 2 U8checkdata_temp=U8comdata;
168 2 P2_0=1;
169 2 //数据校验
170 2
171 2 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
172 2 if(U8temp==U8checkdata_temp)
173 2 {
174 3 U8RH_data_H=U8RH_data_H_temp;
175 3 U8RH_data_L=U8RH_data_L_temp;
176 3 U8T_data_H=U8T_data_H_temp;
177 3 U8T_data_L=U8T_data_L_temp;
178 3 U8checkdata=U8checkdata_temp;
179 3 }//fi
C51 COMPILER V9.00 MAIN 06/13/2013 18:10:17 PAGE 4
180 2
181 2 s1[0]=(char)(0X30+U8RH_data_H/10); //湿度整数部分
182 2 s1[1]=(char)(0X30+U8RH_data_H%10);//湿度小数部分
183 2 s1[2]=(char)(0X30+U8RH_data_L/10);//温度整数部分
184 2 s2[0]=(char)(0X30+U8T_data_H/10);
185 2 s2[1]=(char)(0X30+U8T_data_H%10);//温度小数部分
186 2 s2[2]=(char)(0X30+U8T_data_L/10);
187 2 }//fi
188 1 }
189
190 /***液晶显示函数***/
191 void disp()
192 {
193 1 LCD_disp_char(0,1,'s');
194 1 LCD_disp_char(1,1,'h');
195 1 LCD_disp_char(2,1,'i');
196 1 LCD_disp_char(3,1,'d');
197 1 LCD_disp_char(4,1,'u');
198 1 LCD_disp_char(5,1,':');
199 1 LCD_disp_char(6,1,s1[0]);
200 1 LCD_disp_char(7,1,s1[1]);
201 1 LCD_disp_char(8,1,'.');
202 1 LCD_disp_char(9,1,s1[2]);
203 1 LCD_disp_char(10,1,'%');
204 1 LCD_disp_char(11,1,'R');
205 1 LCD_disp_char(12,1,'H');
206 1 LCD_disp_char(14,1,s1[3]);
207 1 LCD_disp_char(15,1,s1[4]);
208 1
209 1 LCD_disp_char(0,2,'w');
210 1 LCD_disp_char(1,2,'e');
211 1 LCD_disp_char(2,2,'n');
212 1 LCD_disp_char(3,2,'d');
213 1 LCD_disp_char(4,2,'u');
214 1 LCD_disp_char(5,2,':');
215 1 LCD_disp_char(6,2,s2[0]);
216 1 LCD_disp_char(7,2,s2[1]);
217 1 LCD_disp_char(8,2,'.');
218 1 LCD_disp_char(9,2,s2[2]);
219 1 LCD_disp_char(10,2,0xDF);
220 1 LCD_disp_char(11,2,'C');
221 1 LCD_disp_char(14,2,s2[3]);
222 1 LCD_disp_char(15,2,s2[4]);
223 1 }
224 /*****阈值设置函数****/
225 void shezhi()
226 {
227 1 //初值
228 1 s1[3]=(char)(0X30+count1/10);
229 1 s1[4]=(char)(0X30+count1%10);
230 1 //初值
231 1 s2[3]=(char)(0X30+count2/10);
232 1 s2[4]=(char)(0X30+count2%10);
233 1 moshi=1;
234 1 if(moshi==0)
235 1 {
236 2 Delay_10us();
237 2 while(moshi==0);
238 2 moshicount++;
239 2 }
240 1 switch(moshicount)
241 1 { case 1:
C51 COMPILER V9.00 MAIN 06/13/2013 18:10:17 PAGE 5
242 2 { INC=1;
243 3 DEC=1;
244 3 if(INC==0)
245 3 { Delay_10us();
246 4 while(INC==0);
247 4 count1++;
248 4 }
249 3 else if(DEC==0)
250 3 { Delay_10us();
251 4 while(DEC==0);
252 4 count1--;
253 4 }
254 3 LCD_disp_char(14,1,s1[3]);
255 3 LCD_disp_char(15,1,s1[4]);
256 3 LCD_disp_char(14,2,s2[3]);
257 3 LCD_disp_char(15,2,s2[4]);
258 3 }break;
259 2 case 2:
260 2 {//moshicount=0;
261 3 INC=1;DEC=1;
262 3 if(INC==0)
263 3 { Delay_10us();
264 4 while(INC==0);
265 4 count2++;
266 4 }
267 3 else if(DEC==0)
268 3 {
269 4 Delay_10us();
270 4 while(DEC==0);
271 4 count2--;
272 4 }
273 3 LCD_disp_char(14,1,s1[3]);
274 3 LCD_disp_char(15,1,s1[4]);
275 3 LCD_disp_char(14,2,s2[3]);
276 3 LCD_disp_char(15,2,s2[4]);
277 3 }break;
278 2 case 3:
279 2 {
280 3 moshicount=0;
281 3 LCD_disp_char(14,1,' ');
282 3 LCD_disp_char(15,1,' ');
283 3 LCD_disp_char(14,2,' ');
284 3 LCD_disp_char(15,2,' ');
285 3 }break;
286 2 default :break;
287 2 }
288 1 }
289 /*****蜂鸣器报警程序******/
290 void laba()
291 {
292 1
293 1 if((U8RH_data_H>=count1)||(U8T_data_H>=count2))
294 1 SPK=1;
295 1 else SPK=0;
296 1 }
297 /*****定时器0中断程序,每次定时50ms****/
298 timer0() interrupt 1
299 {
300 1 TD++;
301 1 if(TD>=100)
302 1 { TH0=-50000/256;
303 2 TL0=-50000%256;
C51 COMPILER V9.00 MAIN 06/13/2013 18:10:17 PAGE 6
304 2 TR0=0;
305 2 TD=0;
306 2 }
307 1 TH0=-50000/256;
308 1 TL0=-50000%256;
309 1 }
310 /*********主函数*****************/
311 void main(void)
312 { LCD_init();
313 1 timerinit();
314 1 Delay(4);
315 1 while(1)
316 1 {
317 2 RH();
318 2 disp();
319 2 laba();
320 2 TR0=1;
321 2 while((TD>=1)&&(TD<=100))
322 2 {shezhi();
323 3 }
324 2
325 2 }
326 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 965 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 28 3
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 + -