📄 uart1.lst
字号:
C51 COMPILER V7.02b UART1 08/27/2008 10:59:03 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE UART1
OBJECT MODULE PLACED IN uart1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe uart1.c DB OE
stmt level source
1 /***************************************************************
2 功能:实现ADC0采样芯片温度,通过LCD显示,并通过串口1(J13)发送到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
41 sbit LIGHTH = P2^6;
42 sbit LIGHTL = P2^7;
43 #define BAUDRATE 115200 // Baud rate of UART in bps
44 #define SYSCLK 22118400 // SYSCLK frequency in Hz
45 #define SAMPLE_RATE 50000 // Sample frequency in Hz
46 #define INT_DEC 256 // integrate and decimate ratio
47 #define AMX0SL_AIN 8 // 0=AIN0....7=AIN7,8=TEMP
48
49 void SYSCLK_Init (void);
50 void PORT_Init (void);
51 void UART1_Init (void);
52 void ADC0_Init (void);
53 void Timer3_Init (int counts);
54 void ADC0_ISR (void);
55 void LCD_Init(void);
C51 COMPILER V7.02b UART1 08/27/2008 10:59:03 PAGE 2
56
57 unsigned char xdata NCDdata[6]={0x30,0x30,0x30,0x2e,0x30,0x30};
58 long result;
59 unsigned char *lcdpoint; //指向 lcddata数组的指针
60 unsigned char lcd_data_count; //要显示的数据个数
61
62 void main (void) {
63 1 long temperature,x;
64 1 int temp_int, temp_frac,a;
*** ERROR C100 IN LINE 64 OF UART1.C: unprintable character 0xA3 skipped
*** ERROR C100 IN LINE 64 OF UART1.C: unprintable character 0xAC skipped
65 1 char data1;
66 1
67 1 WDTCN = 0xde; // disable watchdog timer
68 1 WDTCN = 0xad;
69 1
70 1 SYSCLK_Init (); // initialize oscillator
71 1 PORT_Init (); // initialize crossbar and GPIO
72 1 UART1_Init (); // initialize UART0
73 1 Timer3_Init (SYSCLK/SAMPLE_RATE); // initialize Timer3 to overflow at
74 1 // sample rate
75 1 for(a=0;a<0xffffffff;a++)
*** ERROR C202 IN LINE 75 OF UART1.C: 'a': undefined identifier
76 1 {
77 2 LIGHTH = 1;
78 2 LIGHTL = 0;
79 2 delay(999999);
80 2 LIGHTH = 0;
81 2 LIGHTL = 1;
82 2 }
83 1 ADC0_Init (); // init ADC
84 1
85 1 AD0EN = 1; // enable ADC
86 1
87 1 EA = 1;
88 1 while(result==0); //等于0,侧等待ADC0的第一个数据
89 1 while (1) {
90 2 EA = 0; // 关中断
91 2 temperature = result;
92 2 EA = 1; //开中断
93 2 //转换为实际温度数据
94 2 temperature = temperature - 42380;
95 2 temperature = (temperature * 100L) / 156;
96 2 temp_int = temperature / 100;
97 2 temp_frac = temperature - (temp_int * 100);
98 2 printf ("Temperature is %+02d.%02d\n", temp_int, temp_frac);//把温度数据通过串口发送至PC机
99 2 //在LCD上显示温度
100 2 //LCD显示数据处理
101 2
102 2 NCDdata[0]=temp_int/100+0x30;NCDdata[1]=(temp_int%100)/10+0x30;NCDdata[2]=(temp_int%100)%10+0x30;
103 2 NCDdata[4]=temp_frac/10+0x30;NCDdata[5]=temp_frac%10+0x30;
104 2
105 2
106 2 LCD_Init(); //LCD初始化
107 2 P2 = 0xA0; //准备送数据
108 2 lcdpoint=&NCDdata; //取地址
109 2 for(lcd_data_count=6;lcd_data_count>0;lcd_data_count--)
110 2 {
111 3 data1=*lcdpoint; //读出数据
112 3 P3 = data1; //写数据到端口
113 3 P2 = 0X20;
114 3 P2 = 0XA0; //控制LCD
C51 COMPILER V7.02b UART1 08/27/2008 10:59:03 PAGE 3
115 3 lcdpoint++;
116 3 for(x=0;x<0x5000;x++);
117 3 }
118 2 for(data1=0;data1<0x6;data1++)
119 2 {
120 3 for(x=0;x<0xffff;x++)
121 3 {_nop_();}
122 3 }
123 2 }
124 1 }
125
126 //-----------------------------------------------------------------------------
127 // SYSCLK配置
128 //-----------------------------------------------------------------------------
129 // 配置系统时钟使用外部晶振22.1184MHz
130
131 void SYSCLK_Init (void)
132 {
133 1 int i; // delay counter
134 1
135 1 OSCXCN = 0x67; // start external oscillator with
136 1 // 22.1184MHz crystal
137 1 for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
138 1
139 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
140 1
141 1 OSCICN = 0x88; // select external oscillator as SYSCLK
142 1 // source and enable missing clock
143 1 // detector
144 1 }
145
146 //-----------------------------------------------------------------------------
147 // PORT配置
148 //-----------------------------------------------------------------------------
149 void PORT_Init (void)
150 {
151 1 // XBR0 = 0x07; // Enable UART0
152 1 // XBR1 = 0x00;
153 1 XBR2 = 0x44; // Enable crossbar and weak pull-ups
154 1 P0MDOUT |= 0x01; // enable TX0 as a push-pull output
155 1 P1MDOUT |= 0x01;
156 1 P2MDOUT = 0xe0; // P2口设为推挽方式
157 1 P3MDOUT = 0xff; // P2口设为推挽方式
158 1 }
159
160 //-----------------------------------------------------------------------------
161 // UART0配置
162 //-----------------------------------------------------------------------------
163 // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
164 void UART1_Init (void)
165 {
166 1 SCON1 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
167 1 TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
168 1 TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
169 1 TR1 = 1; // start Timer1
170 1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base
171 1 PCON |= 0x10; // SMOD01 = 1
172 1 SCON1 |= 0x2; // Indicate TX0 ready
173 1 }
174
175 //-----------------------------------------------------------------------------
176 // ADC0配置,T3定时启动ADC
C51 COMPILER V7.02b UART1 08/27/2008 10:59:03 PAGE 4
177 //-----------------------------------------------------------------------------
178 void ADC0_Init (void)
179 {
180 1 ADC0CN = 0x05; // ADC0 T3定时采样,左对齐
181 1 REF0CN = 0x07; // 启用内部基准源
182 1 AMX0SL = AMX0SL_AIN; // 选择采样输入源
183 1 ADC0CF = (SYSCLK/2500000) << 3; // ADC conversion clock = 2.5MHz
184 1 ADC0CF |= 0x01; // PGA gain = 2
185 1
186 1 EIE2 |= 0x02; // 启用 ADC 中断
187 1 }
188
189 //-----------------------------------------------------------------------------
190 // Timer3配置,T3定时启动ADC
191 //-----------------------------------------------------------------------------
192 void Timer3_Init (int counts)
193 {
194 1 TMR3CN = 0x02;
195 1 TMR3RL = -counts;
196 1 TMR3 = 0xffff;
197 1 EIE2 &= ~0x01;
198 1 TMR3CN |= 0x04;
199 1 }
200
201 //-----------------------------------------------------------------------------
202 // ADC0采样中断
203 //-----------------------------------------------------------------------------
204 void ADC0_ISR (void) interrupt 15
205 {
206 1 static unsigned int_dec=INT_DEC;
207 1 static long accumulator=0L;
208 1
209 1 AD0INT = 0; // 清 ADC 中断标志位
210 1
211 1
212 1 accumulator += ADC0; // 累加ADC采样数据
213 1 int_dec--; // 指针减1
214 1
215 1 if (int_dec == 0) { // 累加完了吗?
216 2 int_dec = INT_DEC; // 指针复位
217 2 result = accumulator >> 8;
218 2 accumulator = 0L; // 累加和变量清0
219 2 }
220 1 }
221 //LCD初始化
222 void LCD_Init(void)
223 {unsigned long x;
224 1 P2 = 0X80;
225 1 for(x=0;x<1000;x++);
226 1 //P7 = 0x30; /*一行显示*/
227 1 P3 = 0x38; /*两行显示*/
228 1 P2 = 0X00;//0x08;
229 1 P2 = 0X80;//0x09;
230 1 for(x=0;x<1000;x++);
231 1 P3 = 0x0e;
232 1 P2 = 0x00;
233 1 P2 = 0x80;
234 1 for(x=0;x<1000;x++);
235 1 P3= 0x06;
236 1 P2 = 0x00;
237 1 P2 = 0x80;
238 1 for(x=0;x<5000;x++);
C51 COMPILER V7.02b UART1 08/27/2008 10:59:03 PAGE 5
239 1 P3 = 0x01;
240 1 P2 = 0x00;
241 1 P2 = 0x80;
242 1 for(x=0;x<5000;x++);
243 1 }
C51 COMPILATION COMPLETE. 0 WARNING(S), 3 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -