?? lcmtemp.lst
字號:
C51 COMPILER V8.02 LCMTEMP 08/11/2007 11:03:53 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCMTEMP
OBJECT MODULE PLACED IN lcmtemp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcmtemp.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*==========================================================
2 -------------------------------------------------
3 |LCM-----51 | LCM-----51 | LCM------51 |
4 |-----------------------------------------------|
5 |DB0-----P1.0 | DB4-----P1.4 | RS-------P3.5 |
6 |DB1-----P1.1 | DB5-----P1.5 | RW-------P3.6 |
7 |DB2-----P1.2 | DB6-----P1.6 | E--------P3.7 |
8 |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K電阻到GND|
9 -------------------------------------------------
10 [AT89S52使用12M晶振]
11 注:高級功能函數被屏蔽,請選擇使用
12 =============================================================*/
13
14 /*=====================頭函數與宏定義===================*/
15 #include <reg52.h>
16 #include <pio.h>
17
18 sbit DQ=P3^6; //數據傳輸線接單片機的相應的引腳
19 unsigned char tempL=0; //設全局變量
20 unsigned char tempH=0;
21 unsigned int sdata;//測量到的溫度的整數部分
22 unsigned char xiaoshu1;//小數第一位
23 unsigned char xiaoshu2;//小數第二位
24 unsigned char xiaoshu;//兩位小數
25 bit fg=1; //溫度正負標志
26 /*======================================================*/
27 sbit LCM1602_RS=P2^0;
28 sbit LCM1602_RW=P2^1;
29 sbit LCM1602_E=P2^2;
30 #define LCM1602_DATA P1 //數據線
31 #define busy 0x80 //用于檢測LCM狀態字中的busy標識
32 /*======================================================*/
33
34 /*===================================================================================================*/
35 /* 函數聲明 */
36 /*===================================================================================================*/
37 void delay(unsigned char i)
38 {
39 1 for(i;i>0;i--);
40 1 }
41
42
43 //***********************************************************
44
45 // 延時子程序
46
47 //************************************************************
48 /*void delay1ms()
49 {
50 unsigned char i;
51 for(i=124;i>0;i--); //延時124*8+10=1002us
52 }
53
54 */
55
C51 COMPILER V8.02 LCMTEMP 08/11/2007 11:03:53 PAGE 2
56 //*****************************初始化程序 *********************************//
57
58 Init_DS18B20(void)
59 {
60 1 unsigned char x=0;
61 1 DQ=1; //DQ先置高
62 1 delay(8); //稍延時
63 1 DQ=0; //發送復位脈沖
64 1 delay(80); //延時(>480us)
65 1 DQ=1; //拉高數據線
66 1 delay(5); //等待(15~60us)
67 1 x=DQ; //用X的值來判斷初始化有沒有成功,18B20存在的話X=0,否則X=1
68 1 delay(20);
69 1 }
70 //**********讀一個字節************//
71
72 ReadOneChar(void) //主機數據線先從高拉至低電平1us以上,再使數據線升為高電平,從而產生讀信號
73 {
74 1 unsigned char i=0; //每個讀周期最短的持續時間為60us,各個讀周期之間必須有1us以上的高電平恢復期
75 1 unsigned char dat=0;
76 1 for (i=8;i>0;i--) //一個字節有8位
77 1 {
78 2 DQ=1;
79 2 delay(1);
80 2 DQ=0;
81 2 dat>>=1;
82 2 DQ=1;
83 2 if(DQ)
84 2 dat|=0x80;
85 2 delay(4);
86 2 }
87 1 return(dat);
88 1 }
89
90
91
92 //*********************** **寫一個字節**************************//
93
94 WriteOneChar(unsigned char dat)
95 {
96 1 unsigned char i=0; //數據線從高電平拉至低電平,產生寫起始信號。15us之內將所需寫的位送到數據線上,
97 1 for(i=8;i>0;i--) //在15~60us之間對數據線進行采樣,如果是高電平就寫1,低寫0發生。
98 1 {
99 2 DQ=0; //在開始另一個寫周期前必須有1us以上的高電平恢復期。
100 2 DQ=dat&0x01;
101 2 delay(5);
102 2 DQ=1;
103 2 dat>>=1;
104 2 }
105 1 delay(4);
106 1 }
107
108
109 //讀溫度值(低位放tempL;高位放tempH;)
110 ReadTemperature(void)
111 {
112 1 Init_DS18B20(); //初始化
113 1 WriteOneChar(0xcc); //跳過讀序列號的操作
114 1 WriteOneChar(0x44); //啟動溫度轉換
115 1 delay(125); //轉換需要一點時間,延時
116 1 Init_DS18B20(); //初始化
117 1 WriteOneChar(0xcc); //跳過讀序列號的操作
C51 COMPILER V8.02 LCMTEMP 08/11/2007 11:03:53 PAGE 3
118 1 WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
119 1 tempL=ReadOneChar(); //讀出溫度的低位LSB
120 1 tempH=ReadOneChar(); //讀出溫度的高位MSB
121 1
122 1 if(tempH>0x7f) //最高位為1時溫度是負
123 1 {
124 2 tempL=~tempL; //補碼轉換,取反加一
125 2 tempH=~tempH+1;
126 2 fg=0; //讀取溫度為負時fg=0
127 2 }
128 1 sdata = tempL/16+tempH*16; //整數部分
129 1 xiaoshu1 = (tempL&0x0f)*10/16; //小數第一位
130 1 xiaoshu2 = (tempL&0x0f)*100/16%10;//小數第二位
131 1 xiaoshu=xiaoshu1*10+xiaoshu2; //小數兩位
132 1 }
133
134
135 void initialize_1602(void);//LCM初始化
136
137 void write_1602_command(unsigned char command,BuysC); //寫控制
138 void write_1602_data(unsigned char Data); //寫數據
139 void read_1602_status(void); //讀狀態,等待空閑
140
141 void display_1602_onechar(unsigned char x, unsigned char y, unsigned char d); //按指定位置顯示一個字符
142 void display_1602_listchar(unsigned char x, unsigned char y, unsigned char *d); //按指定位置顯示一串字符
143
144 void cursor_1602(unsigned char work); //光標開關,work=0為關,work=1為開
145 void clear_1602(); //清屏
146 void delay1602(unsigned char t);
147
148 /*====================高級功能函數==========================================================
149 void movesreen_1602_rl(unsigned int time,unsigned char direction); //循環左(右)移動屏幕上的所有字符
150 void movedata_1602_left(unsigned char *d); //以左移動的方式顯示長于16字節的字符串
151 void movedata_1602_up(unsigned char *d); //以逐行上移的方式顯示文章
152 void turnpage_1602(unsigned char *d); //以翻頁的方式顯示文章
153 ============================================================================================*/
154
155 void display_1602_num(unsigned char x,unsigned char y,long int num); //在指定的位置顯示數字num
156
157 /*==================================================================================*/
158 /* 字符串 */
159 /*==================================================================================*/
160 unsigned char code first[]={"Temperature is:"};
161 unsigned char code second[]={"jim love zhou"};
162
163
164
165 /*===============================主函數==================================*/
166 void main()
167 {
168 1 while(1)
169 1 {
170 2
171 2
172 2
173 2 delay1602(100); //啟動等待,等LCM講入工作狀態
174 2 initialize_1602(); //LCM初始化
175 2
176 2
177 2 display_1602_listchar(0, 0, first); //在第一行顯示"welcome to use"
178 2 while(1)
179 2 {
C51 COMPILER V8.02 LCMTEMP 08/11/2007 11:03:53 PAGE 4
180 3 ReadTemperature();
181 3 display_1602_onechar(0,1,sdata/10+0x30);
182 3 display_1602_onechar(1,1,sdata%10+0x30);
183 3 display_1602_onechar(2,1,'.');
184 3 display_1602_onechar(3,1,xiaoshu/10+0x30);
185 3 display_1602_onechar(4,1,xiaoshu%10+0x30);
186 3 display_1602_onechar(5,1,'C');
187 3
188 3
189 3
190 3
191 3
192 3 }
193 2
194 2
195 2
196 2 }
197 1
198 1
199 1
200 1 }
201
202 /*=======================================================================*/
203
204
205 /*==========================================================================*/
206 /* 寫控制 */
207 /*==========================================================================*/
208 void write_1602_command(unsigned char command,BuysC) //BuysC為0時忽略忙檢測
209 {
210 1 if (BuysC) read_1602_status(); //檢測忙信號
211 1 LCM1602_DATA=command;
212 1 LCM1602_RS=0;
213 1 LCM1602_RW=0;
214 1 LCM1602_E=0;
215 1 LCM1602_E=0;
216 1 LCM1602_E=1;
217 1 }
218
219
220 /*=========================================================================*/
221 /* 寫數據 */
222 /*=========================================================================*/
223 void write_1602_data(unsigned char Data)
224 {
225 1 read_1602_status();//檢測忙
226 1 LCM1602_DATA=Data;
227 1 LCM1602_RS=1;
228 1 LCM1602_RW=0;
229 1 LCM1602_E=0; //若晶振速度太高可以在這后加小的延時
230 1 LCM1602_E=0; //延時
231 1 LCM1602_E=1;
232 1 }
233
234 /*==================================*/
235 /* 讀狀態,等待空閑 */
236 /*==================================*/
237 void read_1602_status(void)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -