📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 07/15/2007 21:35:23 PAGE 1
C51 COMPILER V8.02, 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 <c8051f020.h>
2 #include <absacc.h>
3 #include <intrins.h>
4 #include "lcd_driver.h"
5 #include "delay.h"
6 #include "crc.h"
7
8 //------------------------
9 #define uchar unsigned char
10 #define uint unsigned int
11
12
13 sfr16 DP = 0x82; // data pointer
14 sfr16 TMR3RL = 0x92; // Timer3 reload value
15 sfr16 TMR3 = 0x94; // Timer3 counter
16 sfr16 ADC0 = 0xbe; // ADC0 data
17 sfr16 ADC0GT = 0xc4; // ADC0 greater than window
18 sfr16 ADC0LT = 0xc6; // ADC0 less than window
19 sfr16 RCAP2 = 0xca; // Timer2 capture/reload
20 sfr16 T2 = 0xcc; // Timer2
21 sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
22 sfr16 T4 = 0xf4; // Timer4
23 sfr16 DAC0 = 0xd2; // DAC0 data
24 sfr16 DAC1 = 0xd5; // DAC1 data
25
26
27 void SYSCLK_Init(void);
28 void PORT_Init(void);
29 void Uart0_Init(void);
30 void uart0_sentbyte(uchar dat);
31 void uart0_recbyte(uchar dat);
32 void PCA0_Init(void);
33 void ADC0_Init(void);
34 void adc_cns(void);
35 void get_value(void);
36
37 #define sysclk 22118400 // SYSCLK frequency in Hz
38 #define baudrate 2400 // Baud rate of UART in bps
39 #define freq 38000 // Frequency to generate in Hz
40 #define length 18 //数据长度 + 两字节CRC值
41 #define begin 10
42
43
44 uchar code welcome[]=" Welcome Innovation Lab ";
45
46
47 float value;
48 uchar xdata buffer[length+1]="00Tempera:000.00^C";
49
50 extern uchar a;
51
52 //-----------------------------------------------------------------------------
53 // MAIN Routine
54 //-----------------------------------------------------------------------------
55
C51 COMPILER V8.02 MAIN 07/15/2007 21:35:23 PAGE 2
56 void main (void)
57 { uchar i;
58 1 SYSCLK_Init(); // initialize oscillator
59 1 PORT_Init(); // initialize crossbar and GPIO
60 1 LCD_Init();
61 1 LCD_string(1,1,welcome); // 欢迎使用界面
62 1
63 1 Uart0_Init();
64 1 PCA0_Init();
65 1 ADC0_Init();
66 1 buffer[length] = 0;
67 1
68 1 for (i=0;i<200;i++)
69 1 delay(100,100);
70 1 LCD_cmd(0x01); //清屏
71 1 EA = 1;
72 1 while(1)
73 1 {
74 2 get_value();
75 2 CRC16_Get(buffer,length);
76 2 LCD_string(1,1,buffer+2);
77 2
78 2 uart0_sentbyte(0xff); //起始码
79 2 for(i=0;i<length;i++)
80 2 {
81 3 uart0_sentbyte(buffer[i]);
82 3 }
83 2 uart0_sentbyte(0xfe); //结束码
84 2
85 2 for (i=0;i<200;i++)
86 2 delay(100,100);
87 2 }
88 1
89 1 }
90
91
92 void SYSCLK_Init (void)
93 {
94 1 int i; // delay counter
95 1 WDTCN = 0xde; // disable watchdog timer
96 1 WDTCN = 0xad;
97 1
98 1 OSCXCN = 0x67; // start external oscillator with
99 1 for (i=0; i < 256; i++); // XTLVLD blanking interval (>1ms)
100 1 while (!(OSCXCN & 0x80)); // Wait for crystal osc. to settle
101 1 OSCICN = 0x88; // select external oscillator as SYSCLK
102 1 // source and enable missing clock
103 1 // detector
104 1 }
105
106 //-----------------------------------------------------------------------------
107 // PORT_Init
108 //-----------------------------------------------------------------------------
109 //
110 // Configure the Crossbar and GPIO ports
111 //
112 void PORT_Init (void)
113 {
114 1 XBR0 = 0x0c; // 串口0允许
115 1 XBR1 = 0x00;
116 1 XBR2 = 0x40; // Enable crossbar and weak pull-ups
117 1
C51 COMPILER V8.02 MAIN 07/15/2007 21:35:23 PAGE 3
118 1 P0MDOUT |= 0x07;
119 1 P1MDOUT = 0xff;
120 1 //P2MDOUT = 0xff;
121 1 //P3MDOUT = 0xff;
122 1 P74OUT = 0xff; // P4-P7配置为推挽方式
123 1
124 1 }
125
126
127 void Uart0_Init(void)
128 {
129 1 SCON0 = 0x40; // SCON0: mode 1, 8-bit UART, disenable RX //0x50 enable RX
130 1 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
131 1 TH1 = -(sysclk/baudrate/192); // set Timer1 reload value for baudrate
132 1 CKCON |= 0x00; // Timer1 uses SYSCLK/12 as time base
133 1 PCON |= 0x80; // SMOD0 = 1
134 1 TR1 = 1; // start Timer1
135 1 // ES0 = 1; // enable UART0 interrupts
136 1 }
137
138 void uart0_sentbyte(uchar dat)
139 {
140 1 SBUF0 = dat;
141 1 while(TI0 == 0);
142 1 TI0 = 0;
143 1 }
144
145 void uart0_recbyte(uchar dat)
146 {
147 1 while(RI0 == 0);
148 1 dat = SBUF0;
149 1 RI0 = 0;
150 1 }
151
152 //-----------------------------------------------------------------------------
153 // PCA0_Init
154 //-----------------------------------------------------------------------------
155 //
156 // Configure PCA0: PCA uses SYSCLK as time base; overflow interrupt
157 // disabled.
158 // Module 0 configured in Frequency Output mode to generate a frequency equal
159 // to the constant FREQ.
160 //
161 void PCA0_Init (void)
162 {
163 1 // configure PCA time base to use SYSCLK; overflow interrupt disabled
164 1 PCA0CN = 0x00; // Stop counter; clear all flags
165 1 PCA0MD = 0x02; // 系统时钟四分频
166 1
167 1 // Configure Module 0 to Frequency Output mode to toggle at 2*FREQ
168 1 PCA0CPM0 = 0x46; // Frequency Output mode
169 1 PCA0CPH0 = sysclk/freq/8; // Set frequency
170 1
171 1 // Start PCA counter
172 1 CR = 1;
173 1 }
174
175 void ADC0_Init(void)
176 {
177 1 ADC0CN = 0x00; // ADC0 禁止; 正常跟踪模式向AD0BUSY写‘1’启动ADC0转换 ADC0数据右对齐
178 1 REF0CN = 0x03; // 禁止温度传感器, 片内 VREF,和 VREF 输出缓冲器
179 1 AMX0CF = 0x00; //
C51 COMPILER V8.02 MAIN 07/15/2007 21:35:23 PAGE 4
180 1 AMX0SL = 0x00; // 选择AIN0作为ADC多路转换输出
181 1 ADC0CF = (sysclk/2500000) << 3; // ADC转换时钟2.5MHz
182 1 ADC0CF &= ~0x07; // PGA增益 = 1
183 1 EIE2 &= ~0x02; // 禁止ADC0中断
184 1 AD0EN = 1; // 使能ADC0
185 1 }
186
187 void adc_cns(void)
188 {
189 1 uint i;
190 1 uint v;
191 1 value = 0x00000000;
192 1
193 1 for(i=0;i<10000;i++)
194 1 {
195 2 AD0INT = 0;
196 2 AD0BUSY = 1; // 向AD0BUSY写1将启动转换
197 2 while(AD0INT == 0);
198 2 v = ADC0H*256;
199 2 v |= ADC0L;
200 2 value = value+v;
201 2 }
202 1
203 1 value = value/10000;
204 1 value = value*2.43/4096;
205 1 }
206
207
208 void get_value(void)
209 {
210 1 float res,res0;
211 1 int tempera;
212 1 adc_cns(); //(res/(10K+res)-100/10100)*4*51 = value
213 1 res = value*101+204; //4V基准,51倍放大倍数
214 1 res0= 20400-101*value;
215 1 res = res*10000/res0; //得到铂丝电阻值
216 1
217 1 tempera = (res-100)*100/0.3851; //得到温度值并放大100倍
218 1
219 1 if(tempera&0x8000) //如果温度为负数,转化为正数
220 1 {
221 2 tempera = ~tempera;
222 2 tempera += 1;
223 2 buffer[begin]='-';
224 2 }
225 1 else
226 1 buffer[begin]='+';
227 1
228 1 buffer[begin+1]=(uchar)(tempera/1000)+'0';
229 1 buffer[begin+2]=(uchar)(tempera/100)%10+'0';
230 1 buffer[begin+3]='.';
231 1 buffer[begin+4]=(uchar)(tempera/10)%10+'0';
232 1 buffer[begin+5]=(uchar)tempera%10+'0';
233 1
234 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 700 ----
CONSTANT SIZE = 33 ----
XDATA SIZE = 19 ----
PDATA SIZE = ---- ----
C51 COMPILER V8.02 MAIN 07/15/2007 21:35:23 PAGE 5
DATA SIZE = 4 13
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 + -