📄 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 + -