📄 uart0.lst
字号:
C51 COMPILER V7.50 UART0 12/05/2005 16:18:59 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE UART0
OBJECT MODULE PLACED IN uart0.OBJ
COMPILER INVOKED BY: C:\KEIL750\C51\BIN\C51.EXE uart0.c DB OE
line level source
1 /***************************************************************
2 功能:实现ADC0采样芯片温度,通过LCD显示,并通过串口0(J13)发送到PC机,同时接收PC传回的一个字符并显示,
3 注:试验时把ADC0的工作基准VREF0(J7_5和J7_6或J7_2和J7_6)和LCD电源跳线(J18_1和J18_2)联接好!
4 作者:ZDP
5 时间:2005-11-30
6 版本:V1.0
7 用外部基准:
8 J7
9 NC 1 2 内部VREF
10 外部VREF 3 4 内部DAC工作基准输入
11 外部VREF 5---6 内部ADC0工作基准输入
12 外部VREF 7 8 内部ADC1工作基准输入
13 或用内部基准:
14 J7
15 NC 1 2- 内部VREF
16 外部VREF 3 4 | 内部DAC工作基准输入
17 外部VREF 5 6- 内部ADC0工作基准输入
18 外部VREF 7 8 内部ADC1工作基准输入
19 ***************************************************************/
20 #include <c8051f020.h> // SFR declarations
21 #include <stdio.h>
22 #include <INTRINS.H>
23 //-----------------------------------------------------------------------------
24 // 16-bit SFR Definitions for 'F02x
25 //-----------------------------------------------------------------------------
26
27 sfr16 DP = 0x82; // data pointer
28 sfr16 TMR3RL = 0x92; // Timer3 reload value
29 sfr16 TMR3 = 0x94; // Timer3 counter
30 sfr16 ADC0 = 0xbe; // ADC0 data
31 sfr16 ADC0GT = 0xc4; // ADC0 greater than window
32 sfr16 ADC0LT = 0xc6; // ADC0 less than window
33 sfr16 RCAP2 = 0xca; // Timer2 capture/reload
34 sfr16 T2 = 0xcc; // Timer2
35 sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
36 sfr16 T4 = 0xf4; // Timer4
37 sfr16 DAC0 = 0xd2; // DAC0 data
38 sfr16 DAC1 = 0xd5; // DAC1 data
39
40 #define BAUDRATE 115200 // Baud rate of UART in bps
41 #define SYSCLK 22118400 // SYSCLK frequency in Hz
42 #define SAMPLE_RATE 50000 // Sample frequency in Hz
43 #define INT_DEC 256 // integrate and decimate ratio
44 #define AMX0SL_AIN 8 // 0=AIN0....7=AIN7,8=TEMP
45
46 void SYSCLK_Init (void);
47 void PORT_Init (void);
48 void UART0_Init (void);
49 void ADC0_Init (void);
50 void Timer3_Init (int counts);
51 void ADC0_ISR (void);
52 void LCD_Init(void);
53
54 unsigned char xdata NCDdata[7]={0x30,0x30,0x30,0x2e,0x30,0x30,0x20};
55 long result;
C51 COMPILER V7.50 UART0 12/05/2005 16:18:59 PAGE 2
56 unsigned char *lcdpoint; //指向 lcddata数组的指针
57 unsigned char lcd_data_count; //要显示的数据个数
58
59 void main (void) {
60 1 long temperature,x;
61 1 int temp_int, temp_frac;
62 1 char data1;
63 1
64 1 WDTCN = 0xde; // disable watchdog timer
65 1 WDTCN = 0xad;
66 1
67 1 SYSCLK_Init (); // initialize oscillator
68 1 PORT_Init (); // initialize crossbar and GPIO
69 1 UART0_Init (); // initialize UART0
70 1 Timer3_Init (SYSCLK/SAMPLE_RATE); // initialize Timer3 to overflow at
71 1 // sample rate
72 1
73 1 ADC0_Init (); // init ADC
74 1
75 1 AD0EN = 1; // enable ADC
76 1
77 1 EA = 1;
78 1 while(result==0); //等于0,侧等待ADC0的第一个数据
79 1 while (1) {
80 2 EA = 0; // 关中断
81 2 temperature = result;
82 2 EA = 1; //开中断
83 2 //转换为实际温度数据
84 2 temperature = temperature - 42380;
85 2 temperature = (temperature * 100L) / 156;
86 2 temp_int = temperature / 100;
87 2 temp_frac = temperature - (temp_int * 100);
88 2 printf ("Temperature is %+02d.%02d\n", temp_int, temp_frac);//把温度数据通过串口发送至PC机
89 2 if(RI0==1)
90 2 {
91 3 NCDdata[6]=SBUF0;
92 3 RI0=0;
93 3 }
94 2 //在LCD上显示温度
95 2 //LCD显示数据处理
96 2 NCDdata[0]=temp_int/100+0x30;NCDdata[1]=(temp_int%100)/10+0x30;NCDdata[2]=(temp_int%100)%10+0x30;
97 2 NCDdata[4]=temp_frac/10+0x30;NCDdata[5]=temp_frac%10+0x30;
98 2
99 2
100 2 LCD_Init(); //LCD初始化
101 2 P2 = 0xA0; //准备送数据
102 2 lcdpoint=&NCDdata; //取地址
103 2 for(lcd_data_count=7;lcd_data_count>0;lcd_data_count--)
104 2 {
105 3 data1=*lcdpoint; //读出数据
106 3 P3 = data1; //写数据到端口
107 3 P2 = 0X20;
108 3 P2 = 0XA0; //控制LCD
109 3 lcdpoint++;
110 3 for(x=0;x<0x5000;x++);
111 3 }
112 2 for(data1=0;data1<0x7;data1++)
113 2 {
114 3 for(x=0;x<0xffff;x++)
115 3 {_nop_();}
116 3 }
117 2 }
C51 COMPILER V7.50 UART0 12/05/2005 16:18:59 PAGE 3
118 1 }
119
120 //-----------------------------------------------------------------------------
121 // SYSCLK配置
122 //-----------------------------------------------------------------------------
123 // 配置系统时钟使用外部晶振22.1184MHz
124
125 void SYSCLK_Init (void)
126 {
127 1 int i; // delay counter
128 1
129 1 OSCXCN = 0x67; // start external oscillator with
130 1 // 22.1184MHz crystal
131 1 for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
132 1
133 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
134 1
135 1 OSCICN = 0x88; // select external oscillator as SYSCLK
136 1 // source and enable missing clock
137 1 // detector
138 1 }
139
140 //-----------------------------------------------------------------------------
141 // PORT配置
142 //-----------------------------------------------------------------------------
143 void PORT_Init (void)
144 {
145 1 XBR0 = 0x04; // Enable UART0
146 1 XBR1 = 0x00;
147 1 XBR2 = 0x40; // Enable crossbar and weak pull-ups
148 1 P0MDOUT |= 0x01; // enable TX0 as a push-pull output
149 1 P2MDOUT = 0xe0; // P2口设为推挽方式
150 1 P3MDOUT = 0xff; // P2口设为推挽方式
151 1 }
152
153 //-----------------------------------------------------------------------------
154 // UART0配置
155 //-----------------------------------------------------------------------------
156 // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
157 void UART0_Init (void)
158 {
159 1 SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
160 1 TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
161 1 TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
162 1 TR1 = 1; // start Timer1
163 1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base
164 1 PCON |= 0x80; // SMOD00 = 1
165 1 TI0 = 1; // Indicate TX0 ready
166 1 }
167
168 //-----------------------------------------------------------------------------
169 // ADC0配置,T3定时启动ADC
170 //-----------------------------------------------------------------------------
171 void ADC0_Init (void)
172 {
173 1 ADC0CN = 0x05; // ADC0 T3定时采样,左对齐
174 1 REF0CN = 0x07; // 启用内部基准源
175 1 AMX0SL = AMX0SL_AIN; // 选择采样输入源
176 1 ADC0CF = (SYSCLK/2500000) << 3; // ADC conversion clock = 2.5MHz
177 1 ADC0CF |= 0x01; // PGA gain = 2
178 1
179 1 EIE2 |= 0x02; // 启用 ADC 中断
C51 COMPILER V7.50 UART0 12/05/2005 16:18:59 PAGE 4
180 1 }
181
182 //-----------------------------------------------------------------------------
183 // Timer3配置,T3定时启动ADC
184 //-----------------------------------------------------------------------------
185 void Timer3_Init (int counts)
186 {
187 1 TMR3CN = 0x02;
188 1 TMR3RL = -counts;
189 1 TMR3 = 0xffff;
190 1 EIE2 &= ~0x01;
191 1 TMR3CN |= 0x04;
192 1 }
193
194 //-----------------------------------------------------------------------------
195 // ADC0采样中断
196 //-----------------------------------------------------------------------------
197 void ADC0_ISR (void) interrupt 15
198 {
199 1 static unsigned int_dec=INT_DEC;
200 1 static long accumulator=0L;
201 1
202 1 AD0INT = 0; // 清 ADC 中断标志位
203 1
204 1
205 1 accumulator += ADC0; // 累加ADC采样数据
206 1 int_dec--; // 指针减1
207 1
208 1 if (int_dec == 0) { // 累加完了吗?
209 2 int_dec = INT_DEC; // 指针复位
210 2 result = accumulator >> 8;
211 2 accumulator = 0L; // 累加和变量清0
212 2 }
213 1 }
214 //LCD初始化
215 void LCD_Init(void)
216 {unsigned long x;
217 1 P2 = 0X80;
218 1 for(x=0;x<1000;x++);
219 1 //P7 = 0x30; /*一行显示*/
220 1 P3 = 0x38; /*两行显示*/
221 1 P2 = 0X00;//0x08;
222 1 P2 = 0X80;//0x09;
223 1 for(x=0;x<1000;x++);
224 1 P3 = 0x0e;
225 1 P2 = 0x00;
226 1 P2 = 0x80;
227 1 for(x=0;x<1000;x++);
228 1 P3= 0x06;
229 1 P2 = 0x00;
230 1 P2 = 0x80;
231 1 for(x=0;x<5000;x++);
232 1 P3 = 0x01;
233 1 P2 = 0x00;
234 1 P2 = 0x80;
235 1 for(x=0;x<5000;x++);
236 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 988 ----
CONSTANT SIZE = 27 ----
C51 COMPILER V7.50 UART0 12/05/2005 16:18:59 PAGE 5
XDATA SIZE = 7 ----
PDATA SIZE = ---- ----
DATA SIZE = 14 17
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 + -