📄 main.lst
字号:
C51 COMPILER V8.05a MAIN 11/20/2008 22:47:21 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c DEBUG OBJECTEXTEND
line level source
1 #include <REG52.H>
2 #include <intrins.h>
3 #include<SCON.c>
4 #include<STRING.H>
5 #define uint unsigned int
6 #define uchar unsigned char
7 sbit DQ = P1^0; //温度传送数据IO口
8 uchar temp_value; //温度值
9 uchar TempBuffer[5];
10
11
12 /***********1602液晶显示部分子程序****************/
13
14 //Port Definitions**********************************************************
15 sbit LcdRs = P2^5;
16 sbit LcdRw = P2^6;
17 sbit LcdEn = P2^7;
18 sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
19
20 //内部等待函数**************************************************************************
21 unsigned char LCD_Wait(void)
22 {
23 1 LcdRs=0;
24 1 LcdRw=1; _nop_();
25 1 LcdEn=1; _nop_();
26 1
27 1 LcdEn=0;
28 1 return DBPort;
29 1 }
30 //向LCD写入命令或数据************************************************************
31 #define LCD_COMMAND 0 // Command
32 #define LCD_DATA 1 // Data
33 #define LCD_CLEAR_SCREEN 0x01 // 清屏
34 #define LCD_HOMING 0x02 // 光标返回原点
35 void LCD_Write(bit style, unsigned char input)
36 {
37 1 LcdEn=0;
38 1 LcdRs=style;
39 1 LcdRw=0; _nop_();
40 1 DBPort=input; _nop_();//注意顺序
41 1 LcdEn=1; _nop_();//注意顺序
42 1 LcdEn=0; _nop_();
43 1 LCD_Wait();
44 1 }
45
46 //设置显示模式************************************************************
47 #define LCD_SHOW 0x04 //显示开
48 #define LCD_HIDE 0x00 //显示关
49
50 #define LCD_CURSOR 0x02 //显示光标
51 #define LCD_NO_CURSOR 0x00 //无光标
52
53 #define LCD_FLASH 0x01 //光标闪动
54 #define LCD_NO_FLASH 0x00 //光标不闪动
55
C51 COMPILER V8.05a MAIN 11/20/2008 22:47:21 PAGE 2
56 void LCD_SetDisplay(unsigned char DisplayMode)
57 {
58 1 LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
59 1 }
60
61 //设置输入模式************************************************************
62 #define LCD_AC_UP 0x02
63 #define LCD_AC_DOWN 0x00 // default
64
65 #define LCD_MOVE 0x01 // 画面可平移
66 #define LCD_NO_MOVE 0x00 //default
67
68 void LCD_SetInput(unsigned char InputMode)
69 {
70 1 LCD_Write(LCD_COMMAND, 0x04|InputMode);
71 1 }
72
73 //初始化LCD************************************************************
74 void LCD_Initial()
75 {
76 1 LcdEn=0;
77 1 LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
78 1 LCD_Write(LCD_COMMAND,0x38);
79 1 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
80 1 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
81 1 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
82 1 }
83
84 //液晶字符输入的位置************************
85 void GotoXY(unsigned char x, unsigned char y)
86 {
87 1 if(y==0)
88 1 LCD_Write(LCD_COMMAND,0x80|x);
89 1 if(y==1)
90 1 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
91 1 }
92
93 //将字符输出到液晶显示
94 void Print(unsigned char *str)
95 {
96 1 while(*str!='\0')
97 1 {
98 2 LCD_Write(LCD_DATA,*str);
99 2 str++;
100 2 }
101 1 }
102
103
104 /***********ds18b20子程序*************************/
105
106 /***********ds18b20延迟子函数(晶振12MHz )*******/
107
108 void delay_18B20(unsigned int i)
109 {
110 1 while(i--);
111 1 }
112
113 /**********ds18b20初始化函数**********************/
114
115 void Init_DS18B20(void)
116 {
117 1 unsigned char x=0;
C51 COMPILER V8.05a MAIN 11/20/2008 22:47:21 PAGE 3
118 1 DQ = 1; //DQ复位
119 1 delay_18B20(8); //稍做延时
120 1 DQ = 0; //单片机将DQ拉低
121 1 delay_18B20(80); //精确延时 大于 480us
122 1 DQ = 1; //拉高总线
123 1 delay_18B20(14);
124 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
125 1 delay_18B20(20);
126 1 }
127
128 /***********ds18b20读一个字节**************/
129
130 unsigned char ReadOneChar(void)
131 {
132 1 uchar i=0;
133 1 uchar dat = 0;
134 1 for (i=8;i>0;i--)
135 1 {
136 2 DQ = 0; // 给脉冲信号
137 2 dat>>=1;
138 2 DQ = 1; // 给脉冲信号
139 2 if(DQ)
140 2 dat|=0x80;
141 2 delay_18B20(4);
142 2 }
143 1 return(dat);
144 1 }
145
146 /*************ds18b20写一个字节****************/
147
148 void WriteOneChar(uchar dat)
149 {
150 1 unsigned char i=0;
151 1 for (i=8; i>0; i--)
152 1 {
153 2 DQ = 0;
154 2 DQ = dat&0x01;
155 2 delay_18B20(5);
156 2 DQ = 1;
157 2 dat>>=1;
158 2 }
159 1 }
160
161 /**************读取ds18b20当前温度************/
162
163 void ReadTemp(void)
164 {
165 1 unsigned char a=0;
166 1 unsigned char b=0;
167 1 unsigned char t=0;
168 1
169 1 Init_DS18B20();
170 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
171 1 WriteOneChar(0x44); // 启动温度转换
172 1
173 1 delay_18B20(100); // this message is wery important
174 1
175 1 Init_DS18B20();
176 1 WriteOneChar(0xCC); //跳过读序号列号的操作
177 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
178 1
179 1 delay_18B20(100);
C51 COMPILER V8.05a MAIN 11/20/2008 22:47:21 PAGE 4
180 1
181 1 a=ReadOneChar(); //读取温度值低位
182 1 b=ReadOneChar(); //读取温度值高位
183 1 temp_value=b<<4;
184 1 temp_value+=(a&0xf0)>>4;
185 1 }
186 void temp_to_str() //温度数据转换成液晶字符显示
187 {
188 1 TempBuffer[0]=temp_value/10+'0'; //十位
189 1 TempBuffer[1]=temp_value%10+'0'; //个位
190 1 TempBuffer[2]=0xdf; //温度符号
191 1 TempBuffer[3]='C';
192 1 TempBuffer[4]='\0';
193 1 }
194 void Delay1ms(unsigned int count)
195 {
196 1 unsigned int i,j;
197 1 for(i=0;i<count;i++)
198 1 for(j=0;j<120;j++);
199 1 }
200
201 /*延时子程序*/
202 void mdelay(uint delay)
203 { uint i;
204 1 for(;delay>0;delay--)
205 1 {for(i=0;i<62;i++) //1ms延时.
206 2 {;}
207 2 }
208 1 }
209
210 void main(void)
211 {
212 1 unsigned char i;
213 1 LCD_Initial();
214 1 Init_DS18B20() ;
215 1 UART_Init();
216 1 mdelay(3000);
217 1 while(1)
218 1 {
219 2 GotoXY(0,0);
220 2 Print("THE TEMP IS:");
221 2 ReadTemp();
222 2 temp_to_str();
223 2 GotoXY(12,0);
224 2 Print(TempBuffer); //显示温度
225 2 for(i=0;i<2;i++)
226 2 {
227 3 SBUF=TempBuffer[i]; //发送数据
228 3 while(!TI){}
229 3 TI=0;
230 3 }
231 2 if(tmp1==0) //检测串口通信状况
232 2 {
233 3 GotoXY(0,1);
234 3 Print("SCOMM IS ERROR") ;
235 3 }
236 2 else
237 2 {
238 3 GotoXY(0,1);
239 3 Print("SCOMM IS OK") ;
240 3 }
241 2 mdelay(1000); //1秒延时
C51 COMPILER V8.05a MAIN 11/20/2008 22:47:21 PAGE 5
242 2 }
243 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 563 ----
CONSTANT SIZE = 40 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 2
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 + -