?? text.lst
字號:
C51 COMPILER V7.08 TEXT 04/28/2007 09:34:37 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE TEXT
OBJECT MODULE PLACED IN Text.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************
2 壓力測試儀
3 系統描述;輸入 15--115kPA壓力信號
4 輸出 00h--ffh數字信號(adc0809)
5 在LED上顯示實際的壓力值,如果超限則報警
6
7 線性區間標度變換公式: y=(115-15)/(243-13)*X+15kpa
8
9 作者:yiwei /一維 QQ:284997953
10 單位:eeec-shaanxi university of techmology
11 日期:2007.4.28
12 問題描述: 仿真時顯示值不隨模擬輸入壓力信號的變換而變換
13
14 注意事項: 在實際電路板上測試時一切均正常,顯示值隨模
15 擬輸入壓力信號的變換而變換。
16
17 ********************************************************/
18
19 #include<reg51.h>
20 #include<intrins.h>
21 #include <absacc.h>
22 #include <math.h>
23
24 #define uchar unsigned char
25 #define uint unsigned int
26 #define BUSY 0x80 //常量定義
27 #define DATAPORT P0
28 #define ADC_adress XBYTE[0X7FF8] //AD的地址
29
30
31 sbit LCM_RS=P2^0;
32 sbit LCM_RW=P2^1;
33 sbit LCM_EN=P2^2;
34 sbit ad_busy=P3^2;
35 uchar ad_data; //采樣值存儲
36 sbit Alarm_led_red =P1^5; //超過壓力表量程最大值紅色led報警定義
37 sbit Alarm_led_green=P1^6; //低于壓力表量程最小值綠色led報警定義
38 unsigned char ad_data; //adc采樣值存儲單元
39 char press_data; //標度變換存儲單元
40 unsigned char ad_alarm; //報警值存儲單元
41 unsigned char press_bai=0; //顯示值百位
42 unsigned char press_shi=0; //顯示值十位
43 unsigned char press_ge=0; //顯示值個位
44 unsigned char press_dot=0; //顯示值十分位
45
46 uchar code str0[]={" press: . kpa "};
47 uchar code str1[]={" yi wei dian zi "};
48
49 void delay(uint);
50 void lcd_wait(void);
51 void delay_LCM(uint); //LCD延時子程序
52 void initLCM( void); //LCD初始化子程序
53 void lcd_wait(void); //LCD檢測忙子程序
54 void WriteCommandLCM(uchar WCLCM,uchar BusyC); //寫指令到ICM子函數
55 void WriteDataLCM(uchar WDLCM); //寫數據到LCM子函數
C51 COMPILER V7.08 TEXT 04/28/2007 09:34:37 PAGE 2
56 void DisplayOneChar(uchar X,uchar Y,uchar DData); //顯示指定坐標的一個字符子函數
57 void DisplayListChar(uchar X,uchar Y,uchar code *DData); //顯示指定坐標的一串字符子函數
58 void display(void); //系統顯示子函數
59 void adc0809(void);
60 void alarm(void);
61 void data_pro(void);
62
63
64 /**********main funcation************/
65
66 void main(void)
67 {
68 1 delay(500); //系統延時500ms啟動
69 1 ad_data=0; //采樣值存儲單元初始化為0
70 1 initLCM( );
71 1
72 1 WriteCommandLCM(0x01,1); //清顯示屏
73 1 DisplayListChar(0,0,str0);
74 1 DisplayListChar(0,1,str1);
75 1
76 1 while(1)
77 1 {
78 2
79 2 adc0809();
80 2 data_pro();
81 2 alarm();
82 2 display();
83 2
84 2 }
85 1 }
86
87
88 /*********延時K*1ms,12.000mhz**********/
89
90 void delay(uint k)
91 {
92 1 uint i,j;
93 1 for(i=0;i<k;i++)
94 1 {
95 2 for(j=0;j<60;j++)
96 2 {;}
97 2 }
98 1 }
99 /**********寫指令到ICM子函數************/
100
101 void WriteCommandLCM(uchar WCLCM,uchar BusyC)
102 {
103 1 if(BusyC)lcd_wait();
104 1 DATAPORT=WCLCM;
105 1 LCM_RS=0; // 選中指令寄存器
106 1 LCM_RW=0; // 寫模式
107 1 LCM_EN=1;
108 1 _nop_();
109 1 _nop_();
110 1 _nop_();
111 1 LCM_EN=0;
112 1
113 1 }
114
115 /**********寫數據到LCM子函數************/
116
117 void WriteDataLCM(uchar WDLCM)
C51 COMPILER V7.08 TEXT 04/28/2007 09:34:37 PAGE 3
118 {
119 1 lcd_wait( ); //檢測忙信號
120 1 DATAPORT=WDLCM;
121 1 LCM_RS=1; // 選中數據寄存器
122 1 LCM_RW=0; // 寫模式
123 1 LCM_EN=1;
124 1 _nop_();
125 1 _nop_();
126 1 _nop_();
127 1 LCM_EN=0;
128 1 }
129
130 /***********lcm內部等待函數*************/
131
132 void lcd_wait(void)
133 {
134 1 DATAPORT=0xff; //讀LCD前若單片機輸出低電平,而讀出LCD為高電平,則沖突,Proteus仿真會有顯示邏輯黃色
135 1 LCM_EN=1;
136 1 LCM_RS=0;
137 1 LCM_RW=1;
138 1 _nop_();
139 1 _nop_();
140 1 _nop_();
141 1 while(DATAPORT&BUSY)
142 1 { LCM_EN=0;
143 2 _nop_();
144 2 _nop_();
145 2 LCM_EN=1;
146 2 _nop_();
147 2 _nop_();
148 2 }
149 1 LCM_EN=0;
150 1
151 1 }
152
153 /**********LCM初始化子函數***********/
154
155 void initLCM( )
156 {
157 1 DATAPORT=0;
158 1 delay(15);
159 1 WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
160 1 delay(5);
161 1 WriteCommandLCM(0x38,0);
162 1 delay(5);
163 1 WriteCommandLCM(0x38,0);
164 1 delay(5);
165 1
166 1 WriteCommandLCM(0x38,1); //8bit數據傳送,2行顯示,5*7字型,檢測忙信號
167 1 WriteCommandLCM(0x08,1); //關閉顯示,檢測忙信號
168 1 WriteCommandLCM(0x01,1); //清屏,檢測忙信號
169 1 WriteCommandLCM(0x06,1); //顯示光標右移設置,檢測忙信號
170 1 WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
171 1 }
172
173 /****顯示指定坐標的一個字符子函數****/
174
175 void DisplayOneChar(uchar X,uchar Y,uchar DData)
176
177 {
178 1 Y&=1;
179 1 X&=15;
C51 COMPILER V7.08 TEXT 04/28/2007 09:34:37 PAGE 4
180 1 if(Y)X|=0x40; //若y為1(顯示第二行),地址碼+0X40
181 1 X|=0x80; //指令碼為地址碼+0X80
182 1 WriteCommandLCM(X,0);
183 1 WriteDataLCM(DData);
184 1 }
185
186 /*******顯示指定坐標的一串字符子函數*****/
187
188 void DisplayListChar(uchar X,uchar Y,uchar code *DData)
189 {
190 1 uchar ListLength=0;
191 1 Y&=0x01;
192 1 X&=0x0f;
193 1 while(X<16)
194 1 {
195 2 DisplayOneChar(X,Y,DData[ListLength]);
196 2 ListLength++;
197 2 X++;
198 2 }
199 1 }
200
201 /*****************系統顯示子函數*****************/
202
203 void display(void)
204 {
205 1 WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
206 1 DisplayListChar(0,0,str0);
207 1 DisplayListChar(0,1,str1);
208 1
209 1
210 1 DisplayOneChar(7,0,press_bai+0x30);
211 1 DisplayOneChar(8,0,press_shi+0x30);
212 1 DisplayOneChar(9,0,press_ge +0x30);
213 1 DisplayOneChar(11,0,press_dot+0x30);
214 1 delay(1000); //穩定顯示
215 1 }
216
217 /******************adc0809采樣子函數******************/
218
219 void adc0809(void)
220 {
221 1 ADC_adress=0; //啟動adc轉換
222 1 delay(1); //延時5ms
223 1 ad_data=ADC_adress; //將采集數據送到 ad_data變量中
224 1
225 1 }
226
227 /***********************數據處理子函數************************/
228
229 void data_pro(void)
230 {
231 1 unsigned int temp;
232 1 float press;
233 1
234 1 if(14<ad_data<243) //當壓力值介于15kpa到115kpa之間時,遵循線性變換
235 1 {
236 2 int vary=ad_data; //y=(115-15)/(243-13)*X+15kpa
237 2 press=((10.0/23.0)*vary)+10; //測試時補償值為10
238 2
239 2 temp=(int)(press*10); //放大10倍,便于后面的計算
240 2
241 2
C51 COMPILER V7.08 TEXT 04/28/2007 09:34:37 PAGE 5
242 2 press_bai=temp/1000; //取壓力值百位
243 2 press_shi=(temp%1000)/100; //取壓力值十位
244 2 press_ge=((temp%1000)%100)/10; //取壓力值個位
245 2 press_dot=((temp%1000)%100)%10; //取壓力值十分位
246 2
247 2 }
248 1
249 1
250 1
251 1 }
252 /*****************報警子函數*******************/
253
254 void alarm(void)
255 {
256 1 if(ad_data>=244) //如果當前壓力值大于115kpa,
257 1
258 1 { Alarm_led_red=0; } //則啟動red led報警
259 1
260 1 else
261 1 { Alarm_led_red=1; } //關閉red led 報警
262 1
263 1
264 1 if(ad_data<=13) //如果當前壓力值小于15kpa
265 1
266 1 { Alarm_led_green=0; } //則啟動green led報警
267 1
268 1 else
269 1 { Alarm_led_green=1; } //關閉green led 報警
270 1
271 1 }
272
273
274
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 629 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 14
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 + -